{"version":3,"file":"useBrowserPreferences.cjs","sources":["../../../../src/hooks/useBrowserPreferences/useBrowserPreferences.tsx"],"sourcesContent":["import { type Reducer, useEffect, useReducer, useState } from \"react\";\nimport type { ColorScheme } from \"../../core/types.js\";\nimport {\n    addMediaQueryListener,\n    getInitialMediaQueryMatch,\n    removeMediaQueryListener,\n} from \"../mediaQueryUtils.js\";\n\ntype BrowserPreferences = {\n    prefersReducedMotion: boolean;\n    prefersColorScheme: ColorScheme;\n    forcedColors: boolean;\n};\n\nconst ActionType = {\n    PrefersColorScheme: \"COLOR_SCHEME_CHANGED\",\n    PrefersReducedMotion: \"REDUCED_MOTION_CHANGED\",\n    ForcedColors: \"FORCED_COLORS_CHANGED\",\n} as const;\n\ntype Action =\n    | {\n          type: typeof ActionType.PrefersColorScheme;\n          value: ColorScheme;\n      }\n    | {\n          type: typeof ActionType.PrefersReducedMotion;\n          value: boolean;\n      }\n    | {\n          type: typeof ActionType.ForcedColors;\n          value: boolean;\n      };\n\nconst PREFERS_REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\nconst PREFERS_LIGHT_COLOR_SCHEME = \"(prefers-color-scheme: light)\";\nconst FORCED_COLORS = \"(forced-colors: active)\";\n\nconst initialState: BrowserPreferences = {\n    prefersReducedMotion: false,\n    prefersColorScheme: \"light\",\n    forcedColors: false,\n};\n\nconst reducer: Reducer<BrowserPreferences, Action> = (state, action) => {\n    switch (action.type) {\n        case ActionType.PrefersColorScheme:\n            return {\n                ...state,\n                prefersColorScheme: action.value,\n            };\n        case ActionType.PrefersReducedMotion:\n            return {\n                ...state,\n                prefersReducedMotion: action.value,\n            };\n        case ActionType.ForcedColors:\n            return {\n                ...state,\n                forcedColors: action.value,\n            };\n        default:\n            return state;\n    }\n};\n\n/**\n * Hook som gir informasjon om brukerens foretrukne konfigurasjon.\n * @returns Objekt med informasjon om brukerens foretrukne tema (lyst vs mørkt), redusert bevegelse, og høykontrast (forced colors).\n */\nexport const useBrowserPreferences = (): BrowserPreferences => {\n    const [hasMounted, setHasMounted] = useState(false);\n\n    const [state, dispatch] = useReducer(reducer, initialState);\n\n    useEffect(() => {\n        setHasMounted(true);\n        const prefersReducedMotion = getInitialMediaQueryMatch(\n            PREFERS_REDUCED_MOTION,\n        );\n        const prefersColorScheme = getInitialMediaQueryMatch(\n            PREFERS_LIGHT_COLOR_SCHEME,\n        )\n            ? \"light\"\n            : \"dark\";\n        const forcedColors = getInitialMediaQueryMatch(FORCED_COLORS);\n        dispatch({\n            type: ActionType.PrefersReducedMotion,\n            value: prefersReducedMotion,\n        });\n        dispatch({\n            type: ActionType.PrefersColorScheme,\n            value: prefersColorScheme,\n        });\n        dispatch({ type: ActionType.ForcedColors, value: forcedColors });\n    }, []);\n\n    useEffect(() => {\n        if (!hasMounted || !window.matchMedia) {\n            return;\n        }\n        const onPrefersReducedMotionChange = (e: MediaQueryListEvent) => {\n            dispatch({\n                type: ActionType.PrefersReducedMotion,\n                value: e.matches,\n            });\n        };\n        const onPrefersColorSchemeChange = (e: MediaQueryListEvent) => {\n            dispatch({\n                type: ActionType.PrefersColorScheme,\n                value: e.matches ? \"light\" : \"dark\",\n            });\n        };\n        const onForcedColorsChange = (e: MediaQueryListEvent) => {\n            dispatch({ type: ActionType.ForcedColors, value: e.matches });\n        };\n\n        addMediaQueryListener(\n            window.matchMedia(PREFERS_REDUCED_MOTION),\n            onPrefersReducedMotionChange,\n        );\n        addMediaQueryListener(\n            window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n            onPrefersColorSchemeChange,\n        );\n        addMediaQueryListener(\n            window.matchMedia(FORCED_COLORS),\n            onForcedColorsChange,\n        );\n\n        return () => {\n            removeMediaQueryListener(\n                window.matchMedia(PREFERS_REDUCED_MOTION),\n                onPrefersReducedMotionChange,\n            );\n            removeMediaQueryListener(\n                window.matchMedia(PREFERS_LIGHT_COLOR_SCHEME),\n                onPrefersColorSchemeChange,\n            );\n            removeMediaQueryListener(\n                window.matchMedia(FORCED_COLORS),\n                onForcedColorsChange,\n            );\n        };\n    }, [hasMounted]);\n\n    return { ...state };\n};\n"],"names":["ActionType","PREFERS_REDUCED_MOTION","PREFERS_LIGHT_COLOR_SCHEME","FORCED_COLORS","initialState","prefersReducedMotion","prefersColorScheme","forcedColors","reducer","state","action","type","value","hasMounted","setHasMounted","useState","dispatch","useReducer","useEffect","getInitialMediaQueryMatch","window","matchMedia","onPrefersReducedMotionChange","e","matches","onPrefersColorSchemeChange","onForcedColorsChange","addMediaQueryListener","removeMediaQueryListener"],"mappings":"6IAcMA,EACkB,uBADlBA,EAEoB,yBAFpBA,EAGY,wBAiBZC,EAAyB,mCACzBC,EAA6B,gCAC7BC,EAAgB,0BAEhBC,EAAmC,CACrCC,sBAAsB,EACtBC,mBAAoB,QACpBC,cAAc,GAGZC,EAA+C,CAACC,EAAOC,KACzD,OAAQA,EAAOC,MACX,KAAKX,EACD,MAAO,IACAS,EACHH,mBAAoBI,EAAOE,OAEnC,KAAKZ,EACD,MAAO,IACAS,EACHJ,qBAAsBK,EAAOE,OAErC,KAAKZ,EACD,MAAO,IACAS,EACHF,aAAcG,EAAOE,OAE7B,QACI,OAAOH,kCAQkB,KACjC,MAAOI,EAAYC,GAAiBC,EAAAA,UAAS,IAEtCN,EAAOO,GAAYC,EAAAA,WAAWT,EAASJ,GAE9Cc,OAAAA,EAAAA,UAAU,KACNJ,GAAc,GACd,MAAMT,EAAuBc,EAAAA,0BACzBlB,GAEEK,EAAqBa,EAAAA,0BACvBjB,GAEE,QACA,OACAK,EAAeY,EAAAA,0BAA0BhB,GAC/Ca,EAAS,CACLL,KAAMX,EACNY,MAAOP,IAEXW,EAAS,CACLL,KAAMX,EACNY,MAAON,IAEXU,EAAS,CAAEL,KAAMX,EAAyBY,MAAOL,KAClD,IAEHW,EAAAA,UAAU,KACN,IAAKL,IAAeO,OAAOC,WACvB,OAEJ,MAAMC,EAAgCC,IAClCP,EAAS,CACLL,KAAMX,EACNY,MAAOW,EAAEC,WAGXC,EAA8BF,IAChCP,EAAS,CACLL,KAAMX,EACNY,MAAOW,EAAEC,QAAU,QAAU,UAG/BE,EAAwBH,IAC1BP,EAAS,CAAEL,KAAMX,EAAyBY,MAAOW,EAAEC,WAGvDG,OAAAA,EAAAA,sBACIP,OAAOC,WAAWpB,GAClBqB,GAEJK,EAAAA,sBACIP,OAAOC,WAAWnB,GAClBuB,GAEJE,EAAAA,sBACIP,OAAOC,WAAWlB,GAClBuB,GAGG,KACHE,EAAAA,yBACIR,OAAOC,WAAWpB,GAClBqB,GAEJM,EAAAA,yBACIR,OAAOC,WAAWnB,GAClBuB,GAEJG,EAAAA,yBACIR,OAAOC,WAAWlB,GAClBuB,KAGT,CAACb,IAEG,IAAKJ"}