From 82a089605fec24babc57fb71451aba9e39ab93f6 Mon Sep 17 00:00:00 2001 From: Neko Ayaka Date: Wed, 8 Oct 2025 17:15:35 +0800 Subject: [PATCH] feat(stage-tamagotchi): stage-web like ControlsIsland --- .../renderer/components/InteractiveArea.vue | 25 ++++-------- .../Widgets/ControlsIsland/ControlButton.vue | 13 +++++++ .../Widgets/ControlsIsland/index.vue | 38 +++++++++++++++++++ .../src/renderer/pages/index.vue | 5 ++- 4 files changed, 62 insertions(+), 19 deletions(-) create mode 100644 apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/ControlButton.vue create mode 100644 apps/stage-tamagotchi/src/renderer/components/Widgets/ControlsIsland/index.vue diff --git a/apps/stage-tamagotchi/src/renderer/components/InteractiveArea.vue b/apps/stage-tamagotchi/src/renderer/components/InteractiveArea.vue index 04c8a02fc..0c90d6e0b 100644 --- a/apps/stage-tamagotchi/src/renderer/components/InteractiveArea.vue +++ b/apps/stage-tamagotchi/src/renderer/components/InteractiveArea.vue @@ -8,7 +8,7 @@ import { useProvidersStore } from '@proj-airi/stage-ui/stores/providers' import { useSettingsAudioDevice } from '@proj-airi/stage-ui/stores/settings' import { BasicTextarea } from '@proj-airi/ui' import { storeToRefs } from 'pinia' -import { onMounted, ref, watch } from 'vue' +import { ref, watch } from 'vue' import { useI18n } from 'vue-i18n' import TamagotchiChatHistory from './ChatHistory.vue' @@ -17,7 +17,7 @@ const messageInput = ref('') const listening = ref(false) const attachments = ref<{ type: 'image', data: string, mimeType: string, url: string }[]>([]) -// const { askPermission } = useSettingsAudioDevice() +const { askPermission } = useSettingsAudioDevice() const { enabled, selectedAudioInput } = storeToRefs(useSettingsAudioDevice()) const { send, onAfterMessageComposed, discoverToolsCompatibility } = useChatStore() const { messages } = storeToRefs(useChatStore()) @@ -116,21 +116,16 @@ function handleTranscription(_buffer: Float32Array) { alert('Transcription is not implemented yet') } -// async function handleAudioInputChange(event: Event) { -// const target = event.target as HTMLSelectElement -// const found = audioInputs.value.find(d => d.deviceId === target.value) -// if (!found) { -// selectedAudioDevice.value = undefined -// return -// } - -// selectedAudioDevice.value = found -// } - watch(enabled, async (value) => { if (value === false) { destroy() } + else { + await askPermission() + start() + } +}, { + immediate: true, }) watch([activeProvider, activeModel], async () => { @@ -144,10 +139,6 @@ onAfterMessageComposed(async () => { attachments.value.forEach(att => URL.revokeObjectURL(att.url)) attachments.value = [] }) - -onMounted(() => { - start() -})