Bluesky app fork with some witchin' additions 💫
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

fix: improve schema parsing and post replacement sync

+30 -33
+24 -27
src/state/persisted/__tests__/schema.test.ts
··· 1 1 import {defaults, tryParse, tryStringify} from '../schema' 2 2 3 3 describe('persisted schema helpers', () => { 4 + const partialState = { 5 + colorMode: 'system', 6 + darkTheme: 'dim', 7 + colorScheme: 'material3', 8 + hue: 0, 9 + session: {accounts: []}, 10 + reminders: {}, 11 + languagePrefs: defaults.languagePrefs, 12 + requireAltTextEnabled: true, 13 + invites: {copiedInvites: []}, 14 + onboarding: {step: 'Home'}, 15 + mutedThreads: [], 16 + translationServicePreference: 'google', 17 + postReplacement: { 18 + enabled: false, 19 + postName: 'skeet', 20 + postsName: 'skeets', 21 + }, 22 + } 23 + 4 24 it('applies schema defaults when reading partial data', () => { 5 - const parsed = tryParse( 6 - JSON.stringify({ 7 - colorMode: 'system', 8 - darkTheme: 'dim', 9 - colorScheme: 'material3', 10 - hue: 0, 11 - session: {accounts: []}, 12 - reminders: {}, 13 - languagePrefs: defaults.languagePrefs, 14 - requireAltTextEnabled: true, 15 - invites: {copiedInvites: []}, 16 - onboarding: {step: 'Home'}, 17 - mutedThreads: [], 18 - translationServicePreference: 'google', 19 - postReplacement: { 20 - enabled: false, 21 - postName: 'skeet', 22 - postsName: 'skeets', 23 - }, 24 - }), 25 - ) 25 + const parsed = tryParse(JSON.stringify(partialState)) 26 26 27 27 expect(parsed?.material3Accent).toBe('#ee6300') 28 28 expect(parsed?.material3Style).toBe('TONAL_SPOT') 29 29 }) 30 30 31 - it('writes schema defaults back into storage payloads', () => { 32 - const raw = tryStringify({ 33 - ...defaults, 34 - material3Accent: undefined as never, 35 - material3Style: undefined as never, 36 - }) 31 + it('preserves hydrated defaults on later writes', () => { 32 + const hydrated = tryParse(JSON.stringify(partialState)) 33 + const raw = tryStringify(hydrated!) 37 34 38 35 expect(raw).toBeDefined() 39 36
+3 -3
src/state/persisted/schema.ts
··· 410 410 411 411 export function tryStringify(value: Schema): string | undefined { 412 412 try { 413 - const parsed = schema.parse(value) 414 - return JSON.stringify(parsed) 413 + schema.parse(value) 414 + return JSON.stringify(value) 415 415 } catch (e) { 416 416 logger.error(`persisted state: failed stringifying root state`, { 417 - message: e, 417 + safeMessage: String(e), 418 418 }) 419 419 return undefined 420 420 }
+3 -3
src/state/preferences/post-name-replacement.tsx
··· 65 65 66 66 useEffect(() => { 67 67 return persisted.onUpdate('postReplacement', next => { 68 - setState({ 68 + _setState({ 69 69 postName: next.postName ?? 'skeet', 70 70 postsName: next.postsName ?? 'skeets', 71 - enabled: next.enabled ?? true, 71 + enabled: next.enabled ?? false, 72 72 }) 73 73 }) 74 - }, [setState]) 74 + }, []) 75 75 76 76 return ( 77 77 <stateContext.Provider value={state}>