All files / src/contexts DiscoverViewModeContext.tsx

90.69% Statements 39/43
70% Branches 7/10
60% Functions 3/5
90.69% Lines 39/43

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 731x                                   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);
}