import React, {createContext, useCallback, useEffect, useState} from "react"; import {ColorPreset} from "../models/Colors"; import {DataTarget} from "../models/Shared"; import {unimplemented} from "../helpers/misc"; import {listColorPresets} from "../actions/ColorPresets"; interface DataContextValue { colorPresets: ColorPreset[] ready(target?: DataTarget): boolean refresh(target?: DataTarget): void } const DataContext = createContext({ colorPresets: [], ready: unimplemented, refresh: unimplemented, }); export const DataContextProvider: React.FC = ({children}) => { const [colorPresets, setColorPresets] = useState([]); const [readyMap, setReadyMap] = useState<{ [key: string]: boolean }>({ [DataTarget.Default]: false, [DataTarget.ColorPresets]: false, }); const ready = useCallback((target: DataTarget = DataTarget.Default) => { return readyMap[target] || false; }, [readyMap]); const refresh = useCallback((target: DataTarget = DataTarget.Default) => { const refreshing: Promise[] = []; if ([DataTarget.Default, DataTarget.ColorPresets].includes(target)) { refreshing.push(listColorPresets().then(setColorPresets)); } Promise.all(refreshing).then(() => setReadyMap(prev => ({...prev, [target]: true}))); }, []); useEffect(() => { refresh(); }, [refresh]); return ( {children} ); }; export default DataContext;