import React, { createContext, useContext, useEffect, useState } from "react"; import ExtensionOptions from "./ExtensionOptions"; import GeneratorOptions from "./GeneratorOptions"; const defaultOptions: IStorage = { generatorOptions: new GeneratorOptions(), extOptions: new ExtensionOptions(), updateStorage: async () => { } }; const Storage = createContext(defaultOptions); export const useStorage = () => useContext(Storage); export const StorageProvider: React.FC = (props) => { const [storage, setStorage] = useState(null); const getStorage = async () => setStorage({ extOptions: await browser.storage.sync.get(defaultOptions.extOptions) as ExtensionOptions, generatorOptions: await browser.storage.sync.get(defaultOptions.generatorOptions) as GeneratorOptions, updateStorage: async (options) => await browser.storage.sync.set(options) }); useEffect(() => { getStorage(); browser.storage.sync.onChanged.addListener(getStorage); return () => browser.storage.sync.onChanged.removeListener(getStorage); }, []); return ( { storage ? props.children : props.loader } ); }; // #region Types interface IStorage { generatorOptions: GeneratorOptions; extOptions: ExtensionOptions; updateStorage: (options: Partial) => Promise; } interface IStorageProviderProps extends React.PropsWithChildren { loader?: JSX.Element; } // #endregion