mirror of
https://github.com/zoriya/v10.git
synced 2026-08-15 02:14:06 +00:00
30 lines
1.4 KiB
TypeScript
30 lines
1.4 KiB
TypeScript
import { useEffect } from 'react';
|
|
import { currentFramework as frameworkStore, currentStyle as styleStore } from '@/stores/preferences';
|
|
import { getDefaultStyle, type SupportedFramework } from '@/types/docs';
|
|
import { getStylePreferenceClient } from '@/utils/docs/preferences';
|
|
|
|
interface PreferenceUpdaterProps {
|
|
currentFramework: SupportedFramework;
|
|
}
|
|
|
|
/**
|
|
* PreferenceUpdater component updates the preference nanostore based on URL params and localStorage.
|
|
* This component is loaded with client:idle directive on docs pages, making it non-blocking.
|
|
* It updates the framework store from URL params and style store from localStorage.
|
|
* PreferenceSync handles persisting framework to cookies.
|
|
*/
|
|
export function PreferenceUpdater({ currentFramework }: PreferenceUpdaterProps) {
|
|
useEffect(() => {
|
|
// Update framework store from URL
|
|
frameworkStore.set(currentFramework);
|
|
|
|
// Read style from localStorage (StyleInit guarantees a valid value exists)
|
|
// Fallback to default if React hydrates before StyleInit completes
|
|
const style = getStylePreferenceClient(currentFramework) ?? getDefaultStyle(currentFramework);
|
|
styleStore.set(style);
|
|
}, [currentFramework]);
|
|
|
|
// biome-ignore lint/complexity/noUselessFragments: Astro SSR logs false "Invalid hook call" when a React component with hooks returns null. See withastro/astro#12283.
|
|
return <></>;
|
|
}
|