From 9ae795a8318c8df6750a317dbc46c88a8cc218cd Mon Sep 17 00:00:00 2001 From: Lilia_Chen Date: Mon, 23 Mar 2026 19:46:52 +0000 Subject: [PATCH] refactor(tamagotchi/stage-*): remove duplicated scene in the setting page for tamagotchi (#1460) * refactor(tamagotchi): remove setting window duplicate scene * refactor(tamagotchi): some changes * [autofix.ci] apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> --- apps/stage-tamagotchi/electron.vite.config.ts | 1 + .../model-settings-runtime-snapshot.ts | 67 ++++++++ .../src/renderer/pages/index.vue | 81 +++++++++- .../renderer/pages/settings/models/index.vue | 56 +++++++ .../src/shared/model-settings-runtime.ts | 8 + packages/cap-vite/src/native.ts | 11 +- .../src/pages/settings/models/index.vue | 11 +- .../settings/model-settings/index.ts | 2 + .../settings/model-settings/index.vue | 137 +++++----------- .../settings/model-settings/live2d.vue | 14 +- .../settings/model-settings/panel.vue | 93 +++++++++++ .../settings/model-settings/preview-stage.vue | 147 ++++++++++++++++++ .../settings/model-settings/runtime.ts | 40 +++++ .../scenarios/settings/model-settings/vrm.vue | 57 ++++--- pnpm-workspace.yaml | 2 +- 15 files changed, 578 insertions(+), 149 deletions(-) create mode 100644 apps/stage-tamagotchi/src/renderer/composables/model-settings-runtime-snapshot.ts create mode 100644 apps/stage-tamagotchi/src/renderer/pages/settings/models/index.vue create mode 100644 apps/stage-tamagotchi/src/shared/model-settings-runtime.ts create mode 100644 packages/stage-ui/src/components/scenarios/settings/model-settings/panel.vue create mode 100644 packages/stage-ui/src/components/scenarios/settings/model-settings/preview-stage.vue create mode 100644 packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts diff --git a/apps/stage-tamagotchi/electron.vite.config.ts b/apps/stage-tamagotchi/electron.vite.config.ts index d4e2a88b7..741c8ad6e 100644 --- a/apps/stage-tamagotchi/electron.vite.config.ts +++ b/apps/stage-tamagotchi/electron.vite.config.ts @@ -208,6 +208,7 @@ export default defineConfig({ ...base, '**/settings/connection/index.vue', '**/settings/data/index.vue', + '**/settings/models/index.vue', '**/settings/system/general.vue', '**/settings/modules/mcp.vue', ], diff --git a/apps/stage-tamagotchi/src/renderer/composables/model-settings-runtime-snapshot.ts b/apps/stage-tamagotchi/src/renderer/composables/model-settings-runtime-snapshot.ts new file mode 100644 index 000000000..ee7e8d615 --- /dev/null +++ b/apps/stage-tamagotchi/src/renderer/composables/model-settings-runtime-snapshot.ts @@ -0,0 +1,67 @@ +import type { + ModelSettingsRuntimeSnapshot, +} from '@proj-airi/stage-ui/components/scenarios/settings/model-settings/runtime' + +import type { ModelSettingsRuntimeChannelEvent } from '../../shared/model-settings-runtime' + +import { + createEmptyModelSettingsRuntimeSnapshot, +} from '@proj-airi/stage-ui/components/scenarios/settings/model-settings/runtime' +import { useBroadcastChannel } from '@vueuse/core' +import { onMounted, onUnmounted, ref, watch } from 'vue' + +import { + modelSettingsRuntimeSnapshotChannelName, +} from '../../shared/model-settings-runtime' + +export function useModelSettingsRuntimeSnapshot() { + const runtimeSnapshot = ref(createEmptyModelSettingsRuntimeSnapshot()) + const { data, post } = useBroadcastChannel({ + name: modelSettingsRuntimeSnapshotChannelName, + }) + + const requestCurrent = () => { + post({ type: 'request-current' }) + } + + const syncFromOwner = () => { + requestCurrent() + } + const syncFromOwnerWhenVisible = () => { + if (document.visibilityState === 'visible') + requestCurrent() + } + + onMounted(() => { + requestCurrent() + window.addEventListener('focus', syncFromOwner) + document.addEventListener('visibilitychange', syncFromOwnerWhenVisible) + }) + + onUnmounted(() => { + window.removeEventListener('focus', syncFromOwner) + document.removeEventListener('visibilitychange', syncFromOwnerWhenVisible) + }) + + watch(data, (event) => { + if (!event) + return + + if (event.type === 'snapshot') { + runtimeSnapshot.value = event.snapshot + return + } + + if (event.type === 'owner-gone') { + if (runtimeSnapshot.value.ownerInstanceId !== event.ownerInstanceId) + return + + runtimeSnapshot.value = createEmptyModelSettingsRuntimeSnapshot() + } + }) + + return { + runtimeSnapshot, + requestCurrent, + } +} diff --git a/apps/stage-tamagotchi/src/renderer/pages/index.vue b/apps/stage-tamagotchi/src/renderer/pages/index.vue index 4be884bbd..305fbe768 100644 --- a/apps/stage-tamagotchi/src/renderer/pages/index.vue +++ b/apps/stage-tamagotchi/src/renderer/pages/index.vue @@ -1,6 +1,9 @@ + + + + +meta: + layout: settings + titleKey: settings.pages.models.title + subtitleKey: settings.title + descriptionKey: settings.pages.models.description + icon: i-solar:people-nearby-bold-duotone + settingsEntry: true + order: 4 + stageTransition: + name: slide + pageSpecificAvailable: true + diff --git a/apps/stage-tamagotchi/src/shared/model-settings-runtime.ts b/apps/stage-tamagotchi/src/shared/model-settings-runtime.ts new file mode 100644 index 000000000..9fc51d9df --- /dev/null +++ b/apps/stage-tamagotchi/src/shared/model-settings-runtime.ts @@ -0,0 +1,8 @@ +import type { ModelSettingsRuntimeSnapshot } from '@proj-airi/stage-ui/components/scenarios/settings/model-settings/runtime' + +export const modelSettingsRuntimeSnapshotChannelName = 'airi-model-settings-runtime-snapshot' + +export type ModelSettingsRuntimeChannelEvent + = | { type: 'request-current' } + | { type: 'snapshot', snapshot: ModelSettingsRuntimeSnapshot } + | { type: 'owner-gone', ownerInstanceId: string } diff --git a/packages/cap-vite/src/native.ts b/packages/cap-vite/src/native.ts index a8da4e361..559ffe2ee 100644 --- a/packages/cap-vite/src/native.ts +++ b/packages/cap-vite/src/native.ts @@ -91,15 +91,16 @@ export function resolveCapRunArgs(capArgs: string[], env: NodeJS.ProcessEnv = pr const [platformArg, ...rest] = capArgs const platform = parseCapacitorPlatform(platformArg) - let target: string | undefined; + let target: string | undefined if (platform === 'ios') { - target = env.CAPACITOR_DEVICE_ID_IOS; - } else if (platform === 'android') { - target = env.CAPACITOR_DEVICE_ID_ANDROID; + target = env.CAPACITOR_DEVICE_ID_IOS + } + else if (platform === 'android') { + target = env.CAPACITOR_DEVICE_ID_ANDROID } if (!target) { - return capArgs; + return capArgs } return [platformArg, '--target', target, ...rest] diff --git a/packages/stage-pages/src/pages/settings/models/index.vue b/packages/stage-pages/src/pages/settings/models/index.vue index 87ee8ab09..d3adf830d 100644 --- a/packages/stage-pages/src/pages/settings/models/index.vue +++ b/packages/stage-pages/src/pages/settings/models/index.vue @@ -1,19 +1,13 @@ diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue b/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue index 27296f45e..00512b617 100644 --- a/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue @@ -1,4 +1,6 @@ + + diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/preview-stage.vue b/packages/stage-ui/src/components/scenarios/settings/model-settings/preview-stage.vue new file mode 100644 index 000000000..2ff0c5455 --- /dev/null +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/preview-stage.vue @@ -0,0 +1,147 @@ + + + diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts b/packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts new file mode 100644 index 000000000..25b920798 --- /dev/null +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/runtime.ts @@ -0,0 +1,40 @@ +export type ModelSettingsRuntimeRenderer = 'disabled' | 'live2d' | 'vrm' +export type ModelSettingsRuntimePhase = 'pending' | 'loading' | 'binding' | 'mounted' | 'no-model' | 'error' + +export interface ModelSettingsRuntimeSnapshot { + ownerInstanceId: string + renderer: ModelSettingsRuntimeRenderer + phase: ModelSettingsRuntimePhase + controlsLocked: boolean + previewAvailable: boolean + canCapturePreview: boolean + lastError?: string + updatedAt: number +} + +export function createEmptyModelSettingsRuntimeSnapshot( + overrides: Partial = {}, +): ModelSettingsRuntimeSnapshot { + return { + ownerInstanceId: '', + renderer: 'disabled', + phase: 'pending', + controlsLocked: false, + previewAvailable: false, + canCapturePreview: false, + updatedAt: 0, + ...overrides, + } +} + +export function resolveComponentStateToRuntimePhase( + componentState: 'pending' | 'loading' | 'mounted', + options: { + hasModel?: boolean + } = {}, +): ModelSettingsRuntimePhase { + if (options.hasModel === false) + return 'no-model' + + return componentState +} diff --git a/packages/stage-ui/src/components/scenarios/settings/model-settings/vrm.vue b/packages/stage-ui/src/components/scenarios/settings/model-settings/vrm.vue index 27d49f567..773c36194 100644 --- a/packages/stage-ui/src/components/scenarios/settings/model-settings/vrm.vue +++ b/packages/stage-ui/src/components/scenarios/settings/model-settings/vrm.vue @@ -1,4 +1,6 @@