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 {