Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | 1x 1x 1x 4x 4x 4x 4x 4x 4x 1x 1x 1x 1x 1x 1x 1x 1x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 4x 1x 6x 6x | import {
createContext,
useCallback,
useContext,
useEffect,
useMemo,
useState,
type ReactNode,
} from 'react';
export type DiscoverViewMode = 'list' | 'map';
interface DiscoverViewModeContextValue {
viewMode: DiscoverViewMode;
setViewMode: (mode: DiscoverViewMode) => void;
toggleViewMode: () => void;
}
const STORAGE_KEY = 'sem_discover_view_mode';
const DEFAULT_VIEW_MODE: DiscoverViewMode = 'map';
function readInitialViewMode(): DiscoverViewMode {
if (typeof window === 'undefined') return DEFAULT_VIEW_MODE;
try {
const stored = window.localStorage.getItem(STORAGE_KEY);
if (stored === 'list' || stored === 'map') return stored;
} catch {
/* ignore */
}
return DEFAULT_VIEW_MODE;
}
const DiscoverViewModeContext = createContext<DiscoverViewModeContextValue>({
viewMode: DEFAULT_VIEW_MODE,
setViewMode: () => undefined,
toggleViewMode: () => undefined,
});
export function DiscoverViewModeProvider({ children }: { children: ReactNode }) {
const [viewMode, setViewModeState] = useState<DiscoverViewMode>(readInitialViewMode);
useEffect(() => {
try {
window.localStorage.setItem(STORAGE_KEY, viewMode);
} catch {
/* ignore */
}
}, [viewMode]);
const setViewMode = useCallback((mode: DiscoverViewMode) => {
setViewModeState(mode);
}, []);
const toggleViewMode = useCallback(() => {
setViewModeState((prev) => (prev === 'map' ? 'list' : 'map'));
}, []);
const value = useMemo(
() => ({ viewMode, setViewMode, toggleViewMode }),
[viewMode, setViewMode, toggleViewMode],
);
return (
<DiscoverViewModeContext.Provider value={value}>
{children}
</DiscoverViewModeContext.Provider>
);
}
export function useDiscoverViewMode(): DiscoverViewModeContextValue {
return useContext(DiscoverViewModeContext);
}
|