1313
1414import type { RemovableRef } from '@vueuse/core'
1515import { useLocalStorage } from '@vueuse/core'
16- import type { UserPreferences } from '#shared/schemas/userPreferences'
16+ import { DEFAULT_USER_PREFERENCES , type UserPreferences } from '#shared/schemas/userPreferences'
1717
1818const STORAGE_KEY = 'npmx-user-preferences'
1919
20+ function arePreferencesEqual ( a : UserPreferences , b : UserPreferences ) : boolean {
21+ const keys = Object . keys ( DEFAULT_USER_PREFERENCES ) as ( keyof typeof DEFAULT_USER_PREFERENCES ) [ ]
22+ return keys . every ( key => a [ key ] === b [ key ] )
23+ }
24+
2025export type HydratedUserPreferences = Required < Omit < UserPreferences , 'updatedAt' > > &
2126 Pick < UserPreferences , 'updatedAt' >
2227
2328let dataRef : RemovableRef < HydratedUserPreferences > | null = null
2429let syncInitialized = false
2530
26- /**
27- * User preferences provider with server sync support.
28- */
29- export function useUserPreferencesProvider ( defaultValue : HydratedUserPreferences ) {
31+ export function useUserPreferencesProvider (
32+ defaultValue : HydratedUserPreferences = DEFAULT_USER_PREFERENCES ,
33+ ) {
3034 if ( ! dataRef ) {
3135 dataRef = useLocalStorage < HydratedUserPreferences > ( STORAGE_KEY , defaultValue , {
3236 mergeDefaults : true ,
@@ -63,7 +67,10 @@ export function useUserPreferencesProvider(defaultValue: HydratedUserPreferences
6367 if ( isAuthenticated . value ) {
6468 const serverPrefs = await loadFromServer ( )
6569 if ( serverPrefs ) {
66- preferences . value = { ...preferences . value , ...serverPrefs }
70+ const merged = { ...preferences . value , ...serverPrefs }
71+ if ( ! arePreferencesEqual ( preferences . value , merged ) ) {
72+ preferences . value = merged
73+ }
6774 }
6875 }
6976
@@ -81,7 +88,10 @@ export function useUserPreferencesProvider(defaultValue: HydratedUserPreferences
8188 if ( newIsAuth ) {
8289 const serverPrefs = await loadFromServer ( )
8390 if ( serverPrefs ) {
84- preferences . value = { ...defaultValue , ...preferences . value , ...serverPrefs }
91+ const merged = { ...defaultValue , ...preferences . value , ...serverPrefs }
92+ if ( ! arePreferencesEqual ( preferences . value , merged ) ) {
93+ preferences . value = merged
94+ }
8595 }
8696 }
8797 } )
0 commit comments