diff --git a/packages/frontend/src/components/MkAsUi.vue b/packages/frontend/src/components/MkAsUi.vue index 18e8e7542e3..bb050e2c640 100644 --- a/packages/frontend/src/components/MkAsUi.vue +++ b/packages/frontend/src/components/MkAsUi.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ c.text }} @@ -56,7 +56,7 @@ SPDX-License-Identifier: AGPL-3.0-only
@@ -75,8 +75,8 @@ import MkFolder from '@/components/MkFolder.vue'; import MkPostForm from '@/components/MkPostForm.vue'; const props = withDefaults(defineProps<{ - component: AsUiComponent; - components: Ref[]; + cid: string; + components: Map>; size: 'small' | 'medium' | 'large'; align: 'left' | 'center' | 'right'; }>(), { @@ -84,10 +84,10 @@ const props = withDefaults(defineProps<{ align: 'left', }); -const c = props.component; +const c = props.components.get(props.cid).value; function g(id) { - const v = props.components.find(x => x.value.id === id)?.value; + const v = props.components.get(id).value; if (v) return v; return { diff --git a/packages/frontend/src/pages/flash/flash.vue b/packages/frontend/src/pages/flash/flash.vue index a6a99ba6332..96c4446938e 100644 --- a/packages/frontend/src/pages/flash/flash.vue +++ b/packages/frontend/src/pages/flash/flash.vue @@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
@@ -179,8 +179,7 @@ const parser = new Parser(); const started = ref(false); const aiscript = shallowRef(null); -const root = ref(); -const components = ref[]>([]); +const components = ref>>(new Map()); function start() { started.value = true; @@ -190,14 +189,13 @@ function start() { async function run() { if (aiscript.value) aiscript.value.abort(); if (!flash.value) return; + components.value.clear(); aiscript.value = new Interpreter({ ...createAiScriptEnv({ storageKey: 'flash:' + flash.value.id, }), - ...registerAsUiLib(components.value, (_root) => { - root.value = _root.value; - }), + ...registerAsUiLib(components.value), THIS_ID: values.STR(flash.value.id), THIS_URL: values.STR(`${url}/play/${flash.value.id}`), }, { diff --git a/packages/frontend/src/pages/scratchpad.vue b/packages/frontend/src/pages/scratchpad.vue index 9aaa8ff9c63..c171b3d6664 100644 --- a/packages/frontend/src/pages/scratchpad.vue +++ b/packages/frontend/src/pages/scratchpad.vue @@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
@@ -58,8 +58,7 @@ const parser = new Parser(); let aiscript: Interpreter; const code = ref(''); const logs = ref([]); -const root = ref(); -const components = ref[]>([]); +const components = ref>>(new Map()); const uiKey = ref(0); const saved = miLocalStorage.getItem('scratchpad'); @@ -74,7 +73,7 @@ watch(code, () => { async function run() { if (aiscript) aiscript.abort(); root.value = undefined; - components.value = []; + components.value.clear(); uiKey.value++; logs.value = []; aiscript = new Interpreter(({ @@ -82,9 +81,7 @@ async function run() { storageKey: 'widget', token: $i?.token, }), - ...registerAsUiLib(components.value, (_root) => { - root.value = _root.value; - }), + ...registerAsUiLib(components.value), }), { in: aiScriptReadline, out: (value) => { diff --git a/packages/frontend/src/scripts/aiscript/ui.ts b/packages/frontend/src/scripts/aiscript/ui.ts index fa3fcac2e79..7cd3d186654 100644 --- a/packages/frontend/src/scripts/aiscript/ui.ts +++ b/packages/frontend/src/scripts/aiscript/ui.ts @@ -502,8 +502,8 @@ function getPostFormOptions(def: values.Value | undefined, call: (fn: values.VFn }; } -export function registerAsUiLib(components: Ref[], done: (root: Ref) => void) { - const instances = {}; +export function registerAsUiLib(components: Map>, done?: (root: Ref) => void) { + const instances = new Map(); function createComponentInstance(type: AsUiComponent['type'], def: values.Value | undefined, id: values.Value | undefined, getOptions: (def: values.Value | undefined, call: (fn: values.VFn, args: values.Value[]) => Promise) => any, call: (fn: values.VFn, args: values.Value[]) => Promise) { if (id) utils.assertString(id); @@ -513,7 +513,7 @@ export function registerAsUiLib(components: Ref[], done: (root: R type, id: _id, }); - components.push(component); + components.set(_id, component); const instance = values.OBJ(new Map([ ['id', values.STR(_id)], ['update', values.FN_NATIVE(([def], opts) => { @@ -525,12 +525,12 @@ export function registerAsUiLib(components: Ref[], done: (root: R } })], ])); - instances[_id] = instance; + instances.set(_id, instance); return instance; } const rootInstance = createComponentInstance('root', utils.jsToVal({ children: [] }), utils.jsToVal('___root___'), getRootOptions, () => {}); - const rootComponent = components[0] as Ref; + const rootComponent = components.get('___root___') as Ref; done(rootComponent); return { @@ -544,7 +544,7 @@ export function registerAsUiLib(components: Ref[], done: (root: R 'Ui:get': values.FN_NATIVE(([id], opts) => { utils.assertString(id); - const instance = instances[id.value]; + const instance = instances.get(id.value); if (instance) { return instance; } else { diff --git a/packages/frontend/src/widgets/WidgetAiscriptApp.vue b/packages/frontend/src/widgets/WidgetAiscriptApp.vue index fa79e4aeb73..3079d7bcf5c 100644 --- a/packages/frontend/src/widgets/WidgetAiscriptApp.vue +++ b/packages/frontend/src/widgets/WidgetAiscriptApp.vue @@ -7,7 +7,7 @@ SPDX-License-Identifier: AGPL-3.0-only
- +
@@ -51,18 +51,16 @@ const { widgetProps, configure } = useWidgetPropsManager(name, const parser = new Parser(); -const root = ref(); -const components = ref[]>([]); +const components = ref>>(new Map()); async function run() { + components.value.clear(); const aiscript = new Interpreter({ ...createAiScriptEnv({ storageKey: 'widget', token: $i?.token, }), - ...registerAsUiLib(components.value, (_root) => { - root.value = _root.value; - }), + ...registerAsUiLib(components.value), }, { in: aiScriptReadline, out: (value) => {