Skip to content

Commit c0d69ca

Browse files
committed
fix(stage-ui,stage-pages): yes re-implemented useLocalStorageManualReset as refManualReset will not propagate
1 parent e38366d commit c0d69ca

File tree

17 files changed

+112
-74
lines changed

17 files changed

+112
-74
lines changed

packages/stage-pages/src/pages/settings/connection/ConnectionSettings.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<script setup lang="ts">
2+
import { useLocalStorageManualReset } from '@proj-airi/stage-shared/composables'
23
import { FieldInput } from '@proj-airi/ui'
3-
import { refManualReset, useLocalStorage } from '@vueuse/core'
44
import { useI18n } from 'vue-i18n'
55
66
const { t } = useI18n()
77
88
const defaultWebSocketUrl = import.meta.env.VITE_AIRI_WS_URL || 'ws://localhost:6121/ws'
9-
const websocketUrl = refManualReset<string>(useLocalStorage('settings/connection/websocket-url', defaultWebSocketUrl))
9+
const websocketUrl = useLocalStorageManualReset('settings/connection/websocket-url', defaultWebSocketUrl)
1010
</script>
1111

1212
<template>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './use-local-storage-manual-reset'
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import type { ManualResetRefReturn, UseStorageOptions } from '@vueuse/core'
2+
import type { MaybeRefOrGetter, WatchOptions } from 'vue'
3+
4+
import { refManualReset, useLocalStorage } from '@vueuse/core'
5+
import { unref, watch } from 'vue'
6+
7+
export function useLocalStorageManualReset<T>(key: MaybeRefOrGetter<string>, initialValue: MaybeRefOrGetter<T>, options?: UseStorageOptions<T> & WatchOptions): ManualResetRefReturn<T> {
8+
const value = unref(initialValue)
9+
const localStorageState = useLocalStorage<T>(key, value, options)
10+
const state = refManualReset<T>(localStorageState)
11+
12+
const { resume, pause } = watch(state, newValue => localStorageState.value = newValue, options)
13+
watch(localStorageState, (newValue) => {
14+
pause()
15+
state.value = newValue
16+
resume()
17+
}, options)
18+
19+
return state
20+
}

packages/stage-ui-live2d/src/components/scenes/Live2D.vue

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,17 +40,13 @@ withDefaults(defineProps<{
4040
})
4141
4242
const componentState = defineModel<'pending' | 'loading' | 'mounted'>('state', { default: 'pending' })
43-
4443
const componentStateCanvas = defineModel<'pending' | 'loading' | 'mounted'>('canvasState', { default: 'pending' })
4544
const componentStateModel = defineModel<'pending' | 'loading' | 'mounted'>('modelState', { default: 'pending' })
4645
4746
const live2dCanvasRef = ref<InstanceType<typeof Live2DCanvas>>()
4847
4948
const live2d = useLive2d()
50-
const {
51-
scale,
52-
position,
53-
} = storeToRefs(live2d)
49+
const { scale, position } = storeToRefs(live2d)
5450
5551
watch([componentStateModel, componentStateCanvas], () => {
5652
componentState.value = (componentStateModel.value === 'mounted' && componentStateCanvas.value === 'mounted')

packages/stage-ui-live2d/src/stores/live2d.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { refManualReset, useBroadcastChannel, useLocalStorage } from '@vueuse/core'
1+
import { useLocalStorageManualReset } from '@proj-airi/stage-shared/composables'
2+
import { useBroadcastChannel } from '@vueuse/core'
23
import { defineStore } from 'pinia'
34
import { computed, ref, watch } from 'vue'
45

@@ -56,18 +57,18 @@ export const useLive2d = defineStore('live2d', () => {
5657
}
5758
})
5859

59-
const position = refManualReset<{ x: number, y: number }>(useLocalStorage('settings/live2d/position', { x: 0, y: 0 })) // position is relative to the center of the screen, units are %
60+
const position = useLocalStorageManualReset<{ x: number, y: number }>('settings/live2d/position', { x: 0, y: 0 }) // position is relative to the center of the screen, units are %
6061
const positionInPercentageString = computed(() => ({
6162
x: `${position.value.x}%`,
6263
y: `${position.value.y}%`,
6364
}))
64-
const currentMotion = refManualReset<{ group: string, index?: number }>(() => ({ group: 'Idle', index: 0 }))
65-
const availableMotions = refManualReset<{ motionName: string, motionIndex: number, fileName: string }[]>(() => [])
66-
const motionMap = refManualReset<Record<string, string>>(useLocalStorage('settings/live2d/motion-map', {}))
67-
const scale = refManualReset<number>(useLocalStorage('settings/live2d/scale', 1))
65+
const currentMotion = useLocalStorageManualReset<{ group: string, index?: number }>('settings/live2d/current-motion', () => ({ group: 'Idle', index: 0 }))
66+
const availableMotions = useLocalStorageManualReset<{ motionName: string, motionIndex: number, fileName: string }[]>('settings/live2d/available-motions', () => [])
67+
const motionMap = useLocalStorageManualReset<Record<string, string>>('settings/live2d/motion-map', {})
68+
const scale = useLocalStorageManualReset('settings/live2d/scale', 1)
6869

6970
// Live2D model parameters
70-
const modelParameters = refManualReset<Record<string, number>>(useLocalStorage('settings/live2d/parameters', defaultModelParameters))
71+
const modelParameters = useLocalStorageManualReset<Record<string, number>>('settings/live2d/parameters', defaultModelParameters)
7172

7273
function resetState() {
7374
position.reset()

packages/stage-ui/src/components/scenarios/settings/model-settings/index.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,16 @@ watch(selectedModel, async () => {
8585
Select Model
8686
</Button>
8787
</ModelSelectorDialog>
88-
<Live2D v-if="stageModelRenderer === 'live2d'" :palette="palette" @extract-colors-from-model="$emit('extractColorsFromModel')" />
89-
<VRM v-if="stageModelRenderer === 'vrm'" :palette="palette" @extract-colors-from-model="$emit('extractColorsFromModel')" />
88+
<Live2D
89+
v-if="stageModelRenderer === 'live2d'"
90+
:palette="palette"
91+
@extract-colors-from-model="$emit('extractColorsFromModel')"
92+
/>
93+
<VRM
94+
v-if="stageModelRenderer === 'vrm'"
95+
:palette="palette"
96+
@extract-colors-from-model="$emit('extractColorsFromModel')"
97+
/>
9098
</div>
9199
<!-- Live2D component for 2D stage view -->
92100
<template v-if="stageModelRenderer === 'live2d'">

packages/stage-ui/src/components/scenarios/settings/model-settings/live2d.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,13 @@ defineEmits<{
1919
const { t } = useI18n()
2020
2121
const settings = useSettings()
22-
const { live2dDisableFocus, live2dIdleAnimationEnabled, live2dAutoBlinkEnabled, live2dForceAutoBlinkEnabled, live2dShadowEnabled } = storeToRefs(settings)
22+
const {
23+
live2dDisableFocus,
24+
live2dIdleAnimationEnabled,
25+
live2dAutoBlinkEnabled,
26+
live2dForceAutoBlinkEnabled,
27+
live2dShadowEnabled,
28+
} = storeToRefs(settings)
2329
2430
const live2d = useLive2d()
2531
const {

packages/stage-ui/src/components/scenes/Stage.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -527,8 +527,9 @@ defineExpose({
527527
<Live2DScene
528528
v-if="stageModelRenderer === 'live2d' && showStage"
529529
ref="live2dSceneRef"
530-
v-model:state="componentState" min-w="50% <lg:full" min-h="100 sm:100" h-full w-full
531-
flex-1
530+
v-model:state="componentState"
531+
min-w="50% <lg:full" min-h="100 sm:100"
532+
h-full w-full flex-1
532533
:model-src="stageModelSelectedUrl"
533534
:model-id="stageModelSelected"
534535
:focus-at="focusAt"

packages/stage-ui/src/stores/mcp.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import { refManualReset, useLocalStorage } from '@vueuse/core'
21
import { defineStore } from 'pinia'
32

3+
import { useLocalStorageManualReset } from '../../../stage-shared/src/composables/use-local-storage-manual-reset'
4+
45
export const useMcpStore = defineStore('mcp', () => {
5-
const serverCmd = refManualReset<string>(useLocalStorage<string>('settings/mcp/server-cmd', ''))
6-
const serverArgs = refManualReset<string>(useLocalStorage<string>('settings/mcp/server-args', ''))
7-
const connected = refManualReset<boolean>(useLocalStorage<boolean>('mcp/connected', false)) // use local storage to sync between windows
6+
const serverCmd = useLocalStorageManualReset<string>('settings/mcp/server-cmd', '')
7+
const serverArgs = useLocalStorageManualReset<string>('settings/mcp/server-args', '')
8+
const connected = useLocalStorageManualReset<boolean>('mcp/connected', false) // use local storage to sync between windows
89

910
function resetState() {
1011
serverCmd.reset()

packages/stage-ui/src/stores/modules/airi-card.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Card, ccv3 } from '@proj-airi/ccc'
22

3-
import { refManualReset, useLocalStorage } from '@vueuse/core'
3+
import { useLocalStorageManualReset } from '@proj-airi/stage-shared/composables'
44
import { nanoid } from 'nanoid'
55
import { defineStore, storeToRefs } from 'pinia'
66
import { computed, watch } from 'vue'
@@ -57,8 +57,8 @@ export interface AiriCard extends Card {
5757
export const useAiriCardStore = defineStore('airi-card', () => {
5858
const { t } = useI18n()
5959

60-
const cards = refManualReset<Map<string, AiriCard>>(useLocalStorage('airi-cards', new Map()))
61-
const activeCardId = refManualReset<string>(useLocalStorage('airi-card-active-id', 'default'))
60+
const cards = useLocalStorageManualReset<Map<string, AiriCard>>('airi-cards', new Map())
61+
const activeCardId = useLocalStorageManualReset<string>('airi-card-active-id', 'default')
6262

6363
const activeCard = computed(() => cards.value.get(activeCardId.value))
6464

0 commit comments

Comments
 (0)