AppBar.jsx 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { h, Fragment } from 'preact';
  2. import BaseAppBar from './components/AppBar';
  3. import LinkedLogo from './components/LinkedLogo';
  4. import Menu, { MenuItem, MenuSeparator } from './components/Menu';
  5. import AutoAwesomeIcon from './icons/AutoAwesome';
  6. import LightModeIcon from './icons/LightMode';
  7. import DarkModeIcon from './icons/DarkMode';
  8. import FrigateRestartIcon from './icons/FrigateRestart';
  9. import Dialog from './components/Dialog';
  10. import { useDarkMode } from './context';
  11. import { useCallback, useRef, useState } from 'preact/hooks';
  12. import { useRestart } from './api/mqtt';
  13. export default function AppBar() {
  14. const [showMoreMenu, setShowMoreMenu] = useState(false);
  15. const [showDialog, setShowDialog] = useState(false);
  16. const [showDialogWait, setShowDialogWait] = useState(false);
  17. const { setDarkMode } = useDarkMode();
  18. const { send: sendRestart } = useRestart();
  19. const handleSelectDarkMode = useCallback(
  20. (value, label) => {
  21. setDarkMode(value);
  22. setShowMoreMenu(false);
  23. },
  24. [setDarkMode, setShowMoreMenu]
  25. );
  26. const moreRef = useRef(null);
  27. const handleShowMenu = useCallback(() => {
  28. setShowMoreMenu(true);
  29. }, [setShowMoreMenu]);
  30. const handleDismissMoreMenu = useCallback(() => {
  31. setShowMoreMenu(false);
  32. }, [setShowMoreMenu]);
  33. const handleClickRestartDialog = useCallback(() => {
  34. setShowDialog(false);
  35. setShowDialogWait(true);
  36. sendRestart();
  37. }, [setShowDialog]); // eslint-disable-line react-hooks/exhaustive-deps
  38. const handleDismissRestartDialog = useCallback(() => {
  39. setShowDialog(false);
  40. }, [setShowDialog]);
  41. const handleRestart = useCallback(() => {
  42. setShowMoreMenu(false);
  43. setShowDialog(true);
  44. }, [setShowDialog]);
  45. return (
  46. <Fragment>
  47. <BaseAppBar title={LinkedLogo} overflowRef={moreRef} onOverflowClick={handleShowMenu} />
  48. {showMoreMenu ? (
  49. <Menu onDismiss={handleDismissMoreMenu} relativeTo={moreRef}>
  50. <MenuItem icon={AutoAwesomeIcon} label="Auto dark mode" value="media" onSelect={handleSelectDarkMode} />
  51. <MenuSeparator />
  52. <MenuItem icon={LightModeIcon} label="Light" value="light" onSelect={handleSelectDarkMode} />
  53. <MenuItem icon={DarkModeIcon} label="Dark" value="dark" onSelect={handleSelectDarkMode} />
  54. <MenuSeparator />
  55. <MenuItem icon={FrigateRestartIcon} label="Restart Frigate" onSelect={handleRestart} />
  56. </Menu>
  57. ) : null}
  58. {showDialog ? (
  59. <Dialog
  60. onDismiss={handleDismissRestartDialog}
  61. title="Restart Frigate"
  62. text="Are you sure?"
  63. actions={[
  64. { text: 'Yes', color: 'red', onClick: handleClickRestartDialog },
  65. { text: 'Cancel', onClick: handleDismissRestartDialog },
  66. ]}
  67. />
  68. ) : null}
  69. {showDialogWait ? (
  70. <Dialog
  71. title="Restart in progress"
  72. text="Please wait a few seconds for the restart to complete before reloading the page."
  73. />
  74. ) : null}
  75. </Fragment>
  76. );
  77. }