// This code is more or less redundant, but settings has so little state // updates that I can't be asked to pass everything through props each // time when I can just use the Context API. // // Replace references to SettingsContext with connectState in the future // if it does cause problems though. // // This now also supports Audio stuff. import defaultsDeep from "lodash.defaultsdeep"; import { createContext } from "preact"; import { useMemo } from "preact/hooks"; import { connectState } from "../redux/connector"; import { DEFAULT_SOUNDS, Settings, SoundOptions, } from "../redux/reducers/settings"; import { playSound, Sounds } from "../assets/sounds/Audio"; import { Children } from "../types/Preact"; export const SettingsContext = createContext({}); export const SoundContext = createContext<(sound: Sounds) => void>(null!); interface Props { children?: Children; settings: Settings; } function SettingsProvider({ settings, children }: Props) { const play = useMemo(() => { const enabled: SoundOptions = defaultsDeep( settings.notification?.sounds ?? {}, DEFAULT_SOUNDS, ); return (sound: Sounds) => { if (enabled[sound]) { playSound(sound); } }; }, [settings.notification]); return ( {children} ); } export default connectState>( SettingsProvider, (state) => { return { settings: state.settings, }; }, );