/* global browser */ import React, { useState, useEffect } from "react"; import { createMuiTheme, Chip, IconButton, Input, Switch, ThemeProvider, Typography } from "@material-ui/core"; import { Add } from "@material-ui/icons"; import "./App.css"; function App() { const [ advanced, setAdvanced ] = useState(undefined); const [ words, setWords ] = useState(undefined); const [ word, setWord ] = useState(""); const [ regex, setRegex ] = useState(undefined); const [ flags, setFlags ] = useState(undefined); const [ darkMode, setDarkMode ] = useState(undefined); function removeWord(idx) { setWords([...words.slice(0, idx), ...words.slice(idx+1)]); } /* * Get inital state from storage. * * setterDefaultValue is key: [setter, defaultValue] object where each * setter sets the state while the defaultValue is set if the value is * undefined */ useEffect(() => { const setterDefaultValue = { advanced: [ setAdvanced, false ], words: [ setWords, ["attendance", "roll number", "present"] ], regex: [ setRegex, "" ], flags: [ setFlags, "" ], darkMode: [setDarkMode, false] }; Object.keys(setterDefaultValue).forEach(key => { const [ setter, defaultValue ] = setterDefaultValue[key]; browser.storage.local.get(key) .then(value => { if (key in value) setter(value[key]); else { browser.storage.local.set({ [key]: defaultValue }); setter(defaultValue); } }) .catch(() => { browser.storage.local.set({ [key]: defaultValue }); setter(defaultValue); }); }); }, []); /* Sync state to storage * * For some reason browser.storage.local.set doesn't work unless I call it * from the callback of browser.storage.local.get. Don't touch. */ useEffect(() => { browser.storage.local.get("regex") .then((() => regex !== undefined && browser.storage.local.set({ regex: regex }))); }, [regex]); useEffect(() => { browser.storage.local.get("words") .then((() => words !== undefined && browser.storage.local.set({ words: words }))); }, [words]); useEffect(() => { browser.storage.local.get("advanced") .then((() => advanced !== undefined && browser.storage.local.set({ advanced: advanced }))); }, [advanced]); useEffect(() => { browser.storage.local.get("flags") .then((() => flags !== undefined && browser.storage.local.set({ flags: flags }))); }, [flags]); useEffect(() => { browser.storage.local.get("darkMode") .then(() => { if (darkMode === undefined) return; browser.storage.local.set({ darkMode }); document.querySelector("body").style.backgroundColor = darkMode ? "#424242" : "#FFFFFF"; }); }, [darkMode]); // Show Loading till all values are synced from storage to state if ([advanced, words, regex, flags, darkMode].map(i => i === undefined).reduce((i, j) => i || j)) return
Loading
; const theme = createMuiTheme({ palette: { type: darkMode ? "dark": "light", } }); return (
setAdvanced(e.target.checked)} checked={advanced} color="primary" />
setDarkMode(e.target.checked)} checked={darkMode} color="primary" />
{words.map((word, idx) => (removeWord(idx))} /> )}
setWord(e.target.value)} placeholder="Enter phrase to match and send notification" style={{ flexGrow: 1, }} /> {setWords([...words, word]); setWord(""); e.preventDefault();}} type="submit" disabled={word === ""} color="primary" variant="contained" >
/ setRegex(e.target.value)} placeholder="RegEx" style={{ width: "85%" }} /> / setFlags(e.target.value)} placeholder="Flags" style={{ width: "13%" }} />
); } export default App;