diff --git a/src/components/Config.jsx b/src/components/Config.jsx index ac1fd5679..6dc15b306 100644 --- a/src/components/Config.jsx +++ b/src/components/Config.jsx @@ -42,7 +42,7 @@ export default function Config({ children }) { }) } - /** @type {{ state: import('@hooks/useMemory').UseStorage}} */ + /** @type {{ state: import('@hooks/useStorage').UseStorage}} */ const localState = JSON.parse( localStorage.getItem('local-state') || '{ "state": {} }', ) diff --git a/src/components/layout/FloatingBtn.jsx b/src/components/layout/FloatingBtn.jsx index bcdd2b1fe..3a70d06e2 100644 --- a/src/components/layout/FloatingBtn.jsx +++ b/src/components/layout/FloatingBtn.jsx @@ -26,7 +26,8 @@ import { DomEvent } from 'leaflet' import { FAB_BUTTONS } from '@services/queries/config' import useLocation from '@hooks/useLocation' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { useScanStore } from './dialogs/scanner/store' diff --git a/src/components/layout/dialogs/BadgeSelection.jsx b/src/components/layout/dialogs/BadgeSelection.jsx index f7a32bad1..239e73902 100644 --- a/src/components/layout/dialogs/BadgeSelection.jsx +++ b/src/components/layout/dialogs/BadgeSelection.jsx @@ -7,7 +7,7 @@ import { apolloClient, apolloCache } from '@services/apollo' import Query from '@services/Query' import { ENUM_BADGES } from '@assets/constants' -import { useLayoutStore } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Header from '../general/Header' import Footer from '../general/Footer' diff --git a/src/components/layout/dialogs/DialogWrapper.jsx b/src/components/layout/dialogs/DialogWrapper.jsx index 44704aac4..5f2e1ed60 100644 --- a/src/components/layout/dialogs/DialogWrapper.jsx +++ b/src/components/layout/dialogs/DialogWrapper.jsx @@ -1,7 +1,8 @@ // @ts-check import * as React from 'react' import Dialog from '@mui/material/Dialog' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' /** * diff --git a/src/components/layout/dialogs/DonorPage.jsx b/src/components/layout/dialogs/DonorPage.jsx index 80160dccd..10f840330 100644 --- a/src/components/layout/dialogs/DonorPage.jsx +++ b/src/components/layout/dialogs/DonorPage.jsx @@ -5,7 +5,8 @@ import { useQuery } from '@apollo/client' import Dialog from '@mui/material/Dialog' import { CUSTOM_COMPONENT } from '@services/queries/config' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import DialogWrapper from '../custom/DialogWrapper' import CustomTile from '../custom/CustomTile' diff --git a/src/components/layout/dialogs/Feedback.jsx b/src/components/layout/dialogs/Feedback.jsx index 4b267a33d..515de03c8 100644 --- a/src/components/layout/dialogs/Feedback.jsx +++ b/src/components/layout/dialogs/Feedback.jsx @@ -7,7 +7,8 @@ import Button from '@mui/material/Button' import Divider from '@mui/material/Divider' import { useTranslation } from 'react-i18next' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Header from '../general/Header' import Footer from '../general/Footer' diff --git a/src/components/layout/dialogs/Help.jsx b/src/components/layout/dialogs/Help.jsx index 2b87a001a..85bbc433e 100644 --- a/src/components/layout/dialogs/Help.jsx +++ b/src/components/layout/dialogs/Help.jsx @@ -1,7 +1,7 @@ // @ts-check import * as React from 'react' -import { useLayoutStore } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Help from './tutorial/Advanced' import { DialogWrapper } from './DialogWrapper' diff --git a/src/components/layout/dialogs/Motd.jsx b/src/components/layout/dialogs/Motd.jsx index d63c021b4..af758a928 100644 --- a/src/components/layout/dialogs/Motd.jsx +++ b/src/components/layout/dialogs/Motd.jsx @@ -6,7 +6,7 @@ import Dialog from '@mui/material/Dialog' import Box from '@mui/material/Box' import { useQuery } from '@apollo/client' -import { useLayoutStore } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { CUSTOM_COMPONENT, MOTD_CHECK } from '@services/queries/config' import Utility from '@services/Utility' diff --git a/src/components/layout/dialogs/NestSubmission.jsx b/src/components/layout/dialogs/NestSubmission.jsx index c6a56f7ca..ad33de4e2 100644 --- a/src/components/layout/dialogs/NestSubmission.jsx +++ b/src/components/layout/dialogs/NestSubmission.jsx @@ -6,7 +6,8 @@ import { useMutation } from '@apollo/client' import { useTranslation } from 'react-i18next' import Query from '@services/Query' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Header from '../general/Header' import Footer from '../general/Footer' diff --git a/src/components/layout/dialogs/ResetFilters.jsx b/src/components/layout/dialogs/ResetFilters.jsx index 7b1a1caa7..100d32b71 100644 --- a/src/components/layout/dialogs/ResetFilters.jsx +++ b/src/components/layout/dialogs/ResetFilters.jsx @@ -5,7 +5,7 @@ import Button from '@mui/material/Button' import { Navigate } from 'react-router-dom' import { useTranslation } from 'react-i18next' -import { useLayoutStore } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Header from '../general/Header' import Footer from '../general/Footer' diff --git a/src/components/layout/dialogs/Search.jsx b/src/components/layout/dialogs/Search.jsx index 04045e7cf..24c5afafc 100644 --- a/src/components/layout/dialogs/Search.jsx +++ b/src/components/layout/dialogs/Search.jsx @@ -25,7 +25,8 @@ import { useTranslation } from 'react-i18next' import { useLazyQuery, useQuery } from '@apollo/client' import NameTT from '@components/popups/common/NameTT' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import Utility from '@services/Utility' import Query from '@services/Query' diff --git a/src/components/layout/dialogs/UserOptions.jsx b/src/components/layout/dialogs/UserOptions.jsx index 8ab7666f0..1c1323401 100644 --- a/src/components/layout/dialogs/UserOptions.jsx +++ b/src/components/layout/dialogs/UserOptions.jsx @@ -10,7 +10,8 @@ import { import { useTranslation, Trans } from 'react-i18next' import Utility from '@services/Utility' -import { useLayoutStore, useMemory, toggleDialog } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { toggleDialog, useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { getPermission } from '@services/desktopNotification' diff --git a/src/components/layout/dialogs/filters/Advanced.jsx b/src/components/layout/dialogs/filters/Advanced.jsx index 0b1d772d3..3c1486ac8 100644 --- a/src/components/layout/dialogs/filters/Advanced.jsx +++ b/src/components/layout/dialogs/filters/Advanced.jsx @@ -5,7 +5,8 @@ import Grid2 from '@mui/material/Unstable_Grid2/Grid2' import { useTranslation } from 'react-i18next' import Utility from '@services/Utility' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useDeepStore, useStorage } from '@hooks/useStorage' import Header from '@components/layout/general/Header' import Footer from '@components/layout/general/Footer' diff --git a/src/components/layout/dialogs/filters/FilterMenu.jsx b/src/components/layout/dialogs/filters/FilterMenu.jsx index 61f697757..0f22176da 100644 --- a/src/components/layout/dialogs/filters/FilterMenu.jsx +++ b/src/components/layout/dialogs/filters/FilterMenu.jsx @@ -2,7 +2,7 @@ import * as React from 'react' import Menu from '@components/layout/general/Menu' -import { toggleDialog, useLayoutStore } from '@hooks/useMemory' +import { toggleDialog, useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { StandardItem } from '@components/layout/drawer/SelectorItem' diff --git a/src/components/layout/dialogs/filters/MenuTile.jsx b/src/components/layout/dialogs/filters/MenuTile.jsx index 28cb02f36..c203c4fa7 100644 --- a/src/components/layout/dialogs/filters/MenuTile.jsx +++ b/src/components/layout/dialogs/filters/MenuTile.jsx @@ -6,7 +6,7 @@ import FormatSize from '@mui/icons-material/FormatSize' import Settings from '@mui/icons-material/Settings' import { Grid, IconButton, Typography } from '@mui/material' import Utility from '@services/Utility' -import { useLayoutStore } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' export default function MenuTile({ data, rowIndex, columnIndex, style }) { const [name, setName] = useState(true) diff --git a/src/components/layout/dialogs/filters/SlotSelection.jsx b/src/components/layout/dialogs/filters/SlotSelection.jsx index 5babc879e..08b6e3d20 100644 --- a/src/components/layout/dialogs/filters/SlotSelection.jsx +++ b/src/components/layout/dialogs/filters/SlotSelection.jsx @@ -7,7 +7,8 @@ import DialogContent from '@mui/material/DialogContent' import IconButton from '@mui/material/IconButton' import Divider from '@mui/material/Divider' -import { basicEqualFn, useLayoutStore, useMemory } from '@hooks/useMemory' +import { basicEqualFn, useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage, useDeepStore } from '@hooks/useStorage' import { Img } from '@components/layout/general/Img' import { DualBoolToggle } from '@components/layout/drawer/BoolToggle' diff --git a/src/components/layout/dialogs/profile/GymBadges.jsx b/src/components/layout/dialogs/profile/GymBadges.jsx index f14f82d42..b75bc8d31 100644 --- a/src/components/layout/dialogs/profile/GymBadges.jsx +++ b/src/components/layout/dialogs/profile/GymBadges.jsx @@ -6,7 +6,8 @@ import { useTranslation } from 'react-i18next' import { useQuery } from '@apollo/client' import { useMap } from 'react-leaflet' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Query from '@services/Query' import { VirtualGrid } from '@components/layout/general/VirtualGrid' diff --git a/src/components/layout/dialogs/profile/index.jsx b/src/components/layout/dialogs/profile/index.jsx index 44fc9fe4c..e716de1bd 100644 --- a/src/components/layout/dialogs/profile/index.jsx +++ b/src/components/layout/dialogs/profile/index.jsx @@ -2,7 +2,8 @@ import * as React from 'react' import { DialogContent, AppBar, Tabs, Tab, Box } from '@mui/material' import { useTranslation } from 'react-i18next' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Utility from '@services/Utility' import Header from '../../general/Header' diff --git a/src/components/layout/dialogs/tutorial/Sidebar.jsx b/src/components/layout/dialogs/tutorial/Sidebar.jsx index 51a8ee0bc..335ac18de 100644 --- a/src/components/layout/dialogs/tutorial/Sidebar.jsx +++ b/src/components/layout/dialogs/tutorial/Sidebar.jsx @@ -19,7 +19,8 @@ import { import { useTranslation } from 'react-i18next' -import { useMemory, toggleDialog } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { toggleDialog } from '@hooks/useLayoutStore' import Utility from '@services/Utility' import data from './data' diff --git a/src/components/layout/dialogs/tutorial/Welcome.jsx b/src/components/layout/dialogs/tutorial/Welcome.jsx index dac054152..1b91cc744 100644 --- a/src/components/layout/dialogs/tutorial/Welcome.jsx +++ b/src/components/layout/dialogs/tutorial/Welcome.jsx @@ -5,7 +5,8 @@ import { DialogContent, Grid, Typography, Fab } from '@mui/material' import { useTranslation } from 'react-i18next' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import LocaleSelection from '@components/layout/general/LocaleSelection' export default function TutWelcome() { diff --git a/src/components/layout/dialogs/webhooks/Manage.jsx b/src/components/layout/dialogs/webhooks/Manage.jsx index 48024d762..cfb4211a1 100644 --- a/src/components/layout/dialogs/webhooks/Manage.jsx +++ b/src/components/layout/dialogs/webhooks/Manage.jsx @@ -10,7 +10,8 @@ import Collapse from '@mui/material/Collapse' import Box from '@mui/material/Box' import { useTranslation } from 'react-i18next' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Poracle from '@services/Poracle' import Utility from '@services/Utility' import Footer from '@components/layout/general/Footer' diff --git a/src/components/layout/drawer/Actions.jsx b/src/components/layout/drawer/Actions.jsx index 619bca26b..f4ad00227 100644 --- a/src/components/layout/drawer/Actions.jsx +++ b/src/components/layout/drawer/Actions.jsx @@ -18,7 +18,8 @@ import FeedbackIcon from '@mui/icons-material/Feedback' import HeartIcon from '@mui/icons-material/Favorite' import { downloadJson } from '@services/functions/downloadJson' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { I } from '../general/I' diff --git a/src/components/layout/drawer/Drawer.jsx b/src/components/layout/drawer/Drawer.jsx index 1f660c921..3964753fd 100644 --- a/src/components/layout/drawer/Drawer.jsx +++ b/src/components/layout/drawer/Drawer.jsx @@ -8,7 +8,8 @@ import ListItem from '@mui/material/ListItem' import ListItemText from '@mui/material/ListItemText' import ListItemIcon from '@mui/material/ListItemIcon' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import Actions from './Actions' import { DrawerSectionMemo } from './Section' diff --git a/src/components/layout/drawer/Section.jsx b/src/components/layout/drawer/Section.jsx index 718563456..dfe28a7a1 100644 --- a/src/components/layout/drawer/Section.jsx +++ b/src/components/layout/drawer/Section.jsx @@ -16,7 +16,8 @@ import { import { useTranslation } from 'react-i18next' -import { useMemory, toggleDialog, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { toggleDialog, useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import Utility from '@services/Utility' diff --git a/src/components/layout/drawer/SelectorItem.jsx b/src/components/layout/drawer/SelectorItem.jsx index 2130237fe..1d2897ab4 100644 --- a/src/components/layout/drawer/SelectorItem.jsx +++ b/src/components/layout/drawer/SelectorItem.jsx @@ -8,7 +8,8 @@ import Box from '@mui/material/Box' import Typography from '@mui/material/Typography' import { useTranslateById } from '@hooks/useTranslateById' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage, useDeepStore } from '@hooks/useStorage' import { Img } from '../general/Img' import { ColoredTile } from '../general/ColoredTile' diff --git a/src/components/layout/drawer/SelectorList.jsx b/src/components/layout/drawer/SelectorList.jsx index d4edbe9f5..1495a6f7f 100644 --- a/src/components/layout/drawer/SelectorList.jsx +++ b/src/components/layout/drawer/SelectorList.jsx @@ -13,7 +13,8 @@ import Box from '@mui/material/Box' import { useTranslation } from 'react-i18next' import { useTranslateById } from '@hooks/useTranslateById' -import { useLayoutStore, useMemory } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import { BoolToggle } from './BoolToggle' diff --git a/src/components/layout/drawer/Settings.jsx b/src/components/layout/drawer/Settings.jsx index fa0b808ba..04d9ec7fc 100644 --- a/src/components/layout/drawer/Settings.jsx +++ b/src/components/layout/drawer/Settings.jsx @@ -23,7 +23,8 @@ import LogoDevIcon from '@mui/icons-material/LogoDev' import { useTranslation } from 'react-i18next' -import { useMemory, toggleDialog } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { toggleDialog } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import Utility from '@services/Utility' import { diff --git a/src/components/layout/general/Menu.jsx b/src/components/layout/general/Menu.jsx index 760c516e6..3bb26b875 100644 --- a/src/components/layout/general/Menu.jsx +++ b/src/components/layout/general/Menu.jsx @@ -7,7 +7,8 @@ import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import Collapse from '@mui/material/Collapse' import IconButton from '@mui/material/IconButton' import Utility from '@services/Utility' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import useFilter from '@hooks/useFilter' import Header from '@components/layout/general/Header' diff --git a/src/components/popups/Gym.jsx b/src/components/popups/Gym.jsx index e22df4730..2789e1035 100644 --- a/src/components/popups/Gym.jsx +++ b/src/components/popups/Gym.jsx @@ -15,7 +15,8 @@ import { import { useTranslation } from 'react-i18next' import { useSyncData } from '@components/layout/dialogs/webhooks/hooks' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import useWebhook from '@hooks/useWebhook' import Utility from '@services/Utility' diff --git a/src/components/popups/Nest.jsx b/src/components/popups/Nest.jsx index 845d89227..093ffa862 100644 --- a/src/components/popups/Nest.jsx +++ b/src/components/popups/Nest.jsx @@ -13,7 +13,8 @@ import { import { useTranslation } from 'react-i18next' -import { useMemory, useLayoutStore } from '@hooks/useMemory' +import { useMemory } from '@hooks/useMemory' +import { useLayoutStore } from '@hooks/useLayoutStore' import { useStorage } from '@hooks/useStorage' import Utility from '@services/Utility' import ErrorBoundary from '@components/ErrorBoundary' diff --git a/src/hooks/useLayoutStore.js b/src/hooks/useLayoutStore.js new file mode 100644 index 000000000..702bc0c3d --- /dev/null +++ b/src/hooks/useLayoutStore.js @@ -0,0 +1,99 @@ +import { create } from 'zustand' + +import Utility from '@services/Utility' +import { useStorage } from './useStorage' + +/** + * @typedef {{ + * nestSubmissions: string | number, + * help: { + * open: boolean, + * category: string, + * }, + * motd: boolean, + * donorPage: boolean, + * search: boolean, + * userProfile: boolean, + * resetFilters: boolean, + * feedback: boolean, + * drawer: boolean, + * advancedFilter: { + * open: boolean, + * category: import('@rm/types').AdvCategories, + * id: string, + * selectedIds: string[], + * }, + * dialog: { + * open: boolean, + * category: string, + * type: string, + * }, + * gymBadge: { + * open: boolean, + * gymId: string, + * badge: number, + * }, + * slotSelection: string, + * }} UseLayoutStore + * + * @type {import("zustand").UseBoundStore>} + */ +export const useLayoutStore = create(() => ({ + nestSubmissions: '0', + help: { open: false, category: '' }, + motd: false, + donorPage: false, + search: false, + userProfile: false, + resetFilters: false, + feedback: false, + drawer: false, + slotSelection: '', + advancedFilter: { + open: false, + category: 'pokemon', + id: '', + selectedIds: [], + }, + dialog: { + open: false, + category: '', + type: '', + }, + gymBadge: { + open: false, + gymId: '', + badge: 0, + }, +})) + +export const toggleDialog = (open, category, type, filter) => (event) => { + Utility.analytics( + 'Menu Toggle', + `Open: ${open}`, + `Category: ${category} Menu: ${type}`, + ) + if ( + event.type === 'keydown' && + (event.key === 'Tab' || event.key === 'Shift') + ) { + return + } + useLayoutStore.setState({ dialog: { open, category, type } }) + if (filter && type === 'filters') { + useStorage.setState((prev) => ({ + filters: { + ...prev.filters, + [category]: { ...prev.filters[category], filter }, + }, + })) + } + if (filter && type === 'options') { + useStorage.setState((prev) => ({ + userSettings: { + ...prev.userSettings, + [category]: filter, + }, + })) + } +} diff --git a/src/hooks/useMemory.js b/src/hooks/useMemory.js index e678ad45e..492965b09 100644 --- a/src/hooks/useMemory.js +++ b/src/hooks/useMemory.js @@ -1,6 +1,4 @@ -import Utility from '@services/Utility' import { create } from 'zustand' -import { useStorage } from './useStorage' /** * TODO: Finish this @@ -138,101 +136,6 @@ export const useMemory = create((set) => ({ }, })) -/** - * @typedef {{ - * nestSubmissions: string | number, - * help: { - * open: boolean, - * category: string, - * }, - * motd: boolean, - * donorPage: boolean, - * search: boolean, - * userProfile: boolean, - * resetFilters: boolean, - * feedback: boolean, - * drawer: boolean, - * advancedFilter: { - * open: boolean, - * category: import('@rm/types').AdvCategories, - * id: string, - * selectedIds: string[], - * }, - * dialog: { - * open: boolean, - * category: string, - * type: string, - * }, - * gymBadge: { - * open: boolean, - * gymId: string, - * badge: number, - * }, - * slotSelection: string, - * }} UseLayoutStore - * - * @type {import("zustand").UseBoundStore>} - */ -export const useLayoutStore = create(() => ({ - nestSubmissions: '0', - help: { open: false, category: '' }, - motd: false, - donorPage: false, - search: false, - userProfile: false, - resetFilters: false, - feedback: false, - drawer: false, - slotSelection: '', - advancedFilter: { - open: false, - category: 'pokemon', - id: '', - selectedIds: [], - }, - dialog: { - open: false, - category: '', - type: '', - }, - gymBadge: { - open: false, - gymId: '', - badge: 0, - }, -})) - -export const toggleDialog = (open, category, type, filter) => (event) => { - Utility.analytics( - 'Menu Toggle', - `Open: ${open}`, - `Category: ${category} Menu: ${type}`, - ) - if ( - event.type === 'keydown' && - (event.key === 'Tab' || event.key === 'Shift') - ) { - return - } - useLayoutStore.setState({ dialog: { open, category, type } }) - if (filter && type === 'filters') { - useStorage.setState((prev) => ({ - filters: { - ...prev.filters, - [category]: { ...prev.filters[category], filter }, - }, - })) - } - if (filter && type === 'options') { - useStorage.setState((prev) => ({ - userSettings: { - ...prev.userSettings, - [category]: filter, - }, - })) - } -} - /** * @template {string | number | boolean} T * @param {T[]} p