Add preference
This commit is contained in:
		
							parent
							
								
									e607944ad1
								
							
						
					
					
						commit
						4828e3a691
					
				
					 4 changed files with 61 additions and 3 deletions
				
			
		|  | @ -1,5 +1,11 @@ | |||
| import db from "./db"; | ||||
| 
 | ||||
| export const UI_MODE = { | ||||
|   DARK: "dark", | ||||
|   LIGHT: "light", | ||||
|   SYSTEM: "system", | ||||
| }; | ||||
| 
 | ||||
| class Prefs { | ||||
|   constructor(dbImpl) { | ||||
|     this.db = dbImpl; | ||||
|  | @ -40,6 +46,15 @@ class Prefs { | |||
|   async setWebPushEnabled(enabled) { | ||||
|     await this.db.prefs.put({ key: "webPushEnabled", value: enabled }); | ||||
|   } | ||||
| 
 | ||||
|   async uiMode() { | ||||
|     const uiMode = await this.db.prefs.get("uiMode"); | ||||
|     return uiMode?.value ?? UI_MODE.SYSTEM; | ||||
|   } | ||||
| 
 | ||||
|   async setUIMode(mode) { | ||||
|     await this.db.prefs.put({ key: "uiMode", value: mode }); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| const prefs = new Prefs(db()); | ||||
|  |  | |||
|  | @ -22,24 +22,41 @@ import Login from "./Login"; | |||
| import Signup from "./Signup"; | ||||
| import Account from "./Account"; | ||||
| import "../app/i18n"; // Translations! | ||||
| import prefs, { UI_MODE } from "../app/Prefs"; | ||||
| 
 | ||||
| export const AccountContext = createContext(null); | ||||
| 
 | ||||
| const darkModeEnabled = (prefersDarkMode, uiModePreference) => { | ||||
|   switch (uiModePreference) { | ||||
|     case UI_MODE.DARK: | ||||
|       return true; | ||||
| 
 | ||||
|     case UI_MODE.LIGHT: | ||||
|       return false; | ||||
| 
 | ||||
|     case UI_MODE.SYSTEM: | ||||
|     default: | ||||
|       return prefersDarkMode; | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| const App = () => { | ||||
|   const [account, setAccount] = useState(null); | ||||
|   const accountMemo = useMemo(() => ({ account, setAccount }), [account, setAccount]); | ||||
| 
 | ||||
|   const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)"); | ||||
| 
 | ||||
|   const uiModePreference = useLiveQuery(() => prefs.uiMode()); | ||||
| 
 | ||||
|   const theme = React.useMemo( | ||||
|     () => | ||||
|       createTheme({ | ||||
|         ...themeOptions, | ||||
|         palette: { | ||||
|           ...(prefersDarkMode ? darkPalette : lightPalette), | ||||
|           ...(darkModeEnabled(prefersDarkMode, uiModePreference) ? darkPalette : lightPalette), | ||||
|         }, | ||||
|       }), | ||||
|     [prefersDarkMode] | ||||
|     [prefersDarkMode, uiModePreference] | ||||
|   ); | ||||
| 
 | ||||
|   return ( | ||||
|  |  | |||
|  | @ -43,7 +43,7 @@ import accountApi, { Permission, Role } from "../app/AccountApi"; | |||
| import { Pref, PrefGroup } from "./Pref"; | ||||
| import { AccountContext } from "./App"; | ||||
| import { Paragraph } from "./styles"; | ||||
| import prefs from "../app/Prefs"; | ||||
| import prefs, { UI_MODE } from "../app/Prefs"; | ||||
| import { PermissionDenyAll, PermissionRead, PermissionReadWrite, PermissionWrite } from "./ReserveIcons"; | ||||
| import { ReserveAddDialog, ReserveDeleteDialog, ReserveEditDialog } from "./ReserveDialogs"; | ||||
| import { UnauthorizedError } from "../app/errors"; | ||||
|  | @ -86,6 +86,7 @@ const Notifications = () => { | |||
|         {t("prefs_notifications_title")} | ||||
|       </Typography> | ||||
|       <PrefGroup> | ||||
|         <UIMode /> | ||||
|         <Sound /> | ||||
|         <MinPriority /> | ||||
|         <DeleteAfter /> | ||||
|  | @ -237,6 +238,27 @@ const DeleteAfter = () => { | |||
|   ); | ||||
| }; | ||||
| 
 | ||||
| const UIMode = () => { | ||||
|   const { t } = useTranslation(); | ||||
|   const labelId = "prefUIMode"; | ||||
|   const enabled = useLiveQuery(async () => prefs.uiMode()); | ||||
|   const handleChange = async (ev) => { | ||||
|     await prefs.setUIMode(ev.target.value); | ||||
|   }; | ||||
| 
 | ||||
|   return ( | ||||
|     <Pref labelId={labelId} title={t("prefs_ui_mode_title")}> | ||||
|       <FormControl fullWidth variant="standard" sx={{ m: 1 }}> | ||||
|         <Select value={enabled ?? false} onChange={handleChange} aria-labelledby={labelId}> | ||||
|           <MenuItem value={UI_MODE.SYSTEM}>{t("prefs_ui_mode_system")}</MenuItem> | ||||
|           <MenuItem value={UI_MODE.DARK}>{t("prefs_ui_mode_dark")}</MenuItem> | ||||
|           <MenuItem value={UI_MODE.LIGHT}>{t("prefs_ui_mode_light")}</MenuItem> | ||||
|         </Select> | ||||
|       </FormControl> | ||||
|     </Pref> | ||||
|   ); | ||||
| }; | ||||
| 
 | ||||
| const WebPushEnabled = () => { | ||||
|   const { t } = useTranslation(); | ||||
|   const labelId = "prefWebPushEnabled"; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue