diff --git a/src/component.ts b/src/component.ts index 417f6e674..4f0aaf154 100644 --- a/src/component.ts +++ b/src/component.ts @@ -1,4 +1,4 @@ -import {Awaitable, Promisify, Random, Time} from "@zhinjs/shared"; +import {Awaitable, Random, Time} from "@zhinjs/shared"; import {Context} from "@/context"; import {Session} from "@/session"; import {Element, h} from "@/element"; @@ -9,19 +9,21 @@ export type DefineComponent

; } & ThisType>; -export type FunctionalComponent

=(this:ThisType>,props:P,children:Element[])=>Promisify -export function defineComponent

(options: DefineComponent|FunctionalComponent): DefineComponent { - if(typeof options === 'function') options={ - render:options +export type FunctionalComponent

= (this: Component.Runtime

, props: P, children: Element[]) => Element.Fragment | Promise; + +export function defineComponent

(options: DefineComponent | FunctionalComponent): DefineComponent { + if (typeof options === 'function') options = { + render: options } return options } + export interface Component extends DefineComponent { } export namespace Component { export const name = 'builtComponent' - export const type='built' + export const type = 'built' type Data = Record; export type ObjectPropsOptions

= { @@ -43,7 +45,7 @@ export namespace Component { } : never; export type PropType = PropConstructor | PropConstructor[]; - export type Prop =PropType; + export type Prop = PropType; export type ComponentPropsOptions

= ObjectPropsOptions

| string[]; export interface MethodOptions { @@ -97,7 +99,7 @@ export namespace Component { & M; export interface OptionsBase extends LegacyOptions { - render(this:Component.Runtime,props:Props,children:Element[]):Awaitable + render(this: Component.Runtime, props: Props, children: Element[]): Awaitable } export function createRuntime(old: Runtime, component: Component, attrs) { @@ -115,48 +117,37 @@ export namespace Component { export function install(ctx: Context) { // 内置组件 ctx - .component('template', defineComponent({ - async render(attrs, children) { - return await this.session.render(children,this) - } - })) - .component('execute', defineComponent({ - async render(attrs, children) { - const template=(await this.session.render(children,this)).join('') - return this.session.execute(template) - } - })) - .component('forward',defineComponent({ - async render(attrs, children) { - return h('node',{ - user_id:this.session.self_id, - user_name:this.session.nickname, - children:Element.toElementArray(await this.session.render(children,this)) - }) - } - })) - .component('prompt', defineComponent({ - props: { - type: String - }, - async render(props, children) { - return await this.session.prompt[this.type ||= 'text'](children.join(''), props) - } - })) - .component('random', defineComponent({ - async render(attrs, children) { - return Random.pick(children) - } - })) - .component('time', defineComponent({ - props: { - value: Number, - format: String - }, - render() { - let ms = this.value || Date.now() - return Time.template(this.format || 'yyyy-MM-dd hh:mm:ss', new Date(ms)) - } - })) + .component(async function template(attrs, children) { + return await this.session.render(children, this) + }) + .component(async function execute(attrs, children) { + const template = (await this.session.render(children, this)).join('') + return this.session.execute(template) + }) + .component(async function forward(attrs: { + user_id?: string | number + user_name?: string + }, children) { + return h('node', { + user_id: attrs.user_id || this.session.user_id, + user_name: attrs.user_name || this.session.user_name, + children: Element.toElementArray(await this.session.render(children, this)) + }) + }) + .component(async function prompt(props: { + type?: string + }, children) { + return await this.session.prompt[this.type ||= 'text'](children.join(''), props) + }) + .component(async function random(attrs, children) { + return Random.pick(children) + }) + .component(function time(props: { + value?: number + format?: string + }) { + let ms = props.value || Date.now() + return Time.template(props.format || 'yyyy-MM-dd hh:mm:ss', new Date(ms)) + }) } } diff --git a/src/element.ts b/src/element.ts index cf339ec2f..f1285243b 100644 --- a/src/element.ts +++ b/src/element.ts @@ -108,7 +108,7 @@ export namespace Element { text: { text: string }, mention: { user_id: string | number } face: { id: number } - node: { user_id: string, user_name?: string, time?: number, message?: Element.Fragment[] } + node: { user_id: string|number, user_name?: string, time?: number, message?: Element.Fragment[] } } export interface BaseChildren {