diff --git a/gui/package.json b/gui/package.json index 7e7e6ce88..a49288483 100644 --- a/gui/package.json +++ b/gui/package.json @@ -9,6 +9,7 @@ "@fontsource/poppins": "^5.1.0", "@formatjs/intl-localematcher": "^0.2.32", "@hookform/resolvers": "^3.6.0", + "@react-hookz/deep-equal": "^3.0.3", "@react-three/drei": "^9.114.3", "@react-three/fiber": "^8.17.10", "@sentry/react": "^9.9.0", @@ -26,6 +27,7 @@ "flatbuffers": "22.10.26", "intl-pluralrules": "^2.0.1", "ip-num": "^1.5.1", + "jotai": "^2.12.2", "prompts": "^2.4.2", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/gui/src/components/ClearMountingButton.tsx b/gui/src/components/ClearMountingButton.tsx index 995cd719c..384ab4aa2 100644 --- a/gui/src/components/ClearMountingButton.tsx +++ b/gui/src/components/ClearMountingButton.tsx @@ -3,17 +3,17 @@ import { ClearMountingResetRequestT, RpcMessage } from 'solarxr-protocol'; import { useWebsocketAPI } from '@/hooks/websocket-api'; import { BigButton } from './commons/BigButton'; import { TrashIcon } from './commons/icon/TrashIcon'; -import { useTrackers } from '@/hooks/tracker'; import { Quaternion } from 'three'; import { QuaternionFromQuatT, similarQuaternions } from '@/maths/quaternion'; import { useMemo } from 'react'; +import { useAtomValue } from 'jotai'; +import { assignedTrackersAtom } from '@/store/app-store'; const _q = new Quaternion(); export function ClearMountingButton() { const { sendRPCPacket } = useWebsocketAPI(); - const { useAssignedTrackers } = useTrackers(); - const assignedTrackers = useAssignedTrackers(); + const assignedTrackers = useAtomValue(assignedTrackersAtom); const trackerWithMounting = useMemo( () => diff --git a/gui/src/components/TopBar.tsx b/gui/src/components/TopBar.tsx index 5c54811fa..76b1fb183 100644 --- a/gui/src/components/TopBar.tsx +++ b/gui/src/components/TopBar.tsx @@ -21,7 +21,6 @@ import { QuestionIcon } from './commons/icon/QuestionIcon'; import { useBreakpoint, useIsTauri } from '@/hooks/breakpoint'; import { GearIcon } from './commons/icon/GearIcon'; import { invoke } from '@tauri-apps/api/core'; -import { useTrackers } from '@/hooks/tracker'; import { TrackersStillOnModal } from './TrackersStillOnModal'; import { useConfig } from '@/hooks/config'; import { listen, TauriEvent } from '@tauri-apps/api/event'; @@ -35,6 +34,8 @@ import { getCurrentWindow, UserAttentionType, } from '@tauri-apps/api/window'; +import { useAtomValue } from 'jotai'; +import { connectedIMUTrackersAtom } from '@/store/app-store'; export function VersionTag() { return ( @@ -63,8 +64,7 @@ export function TopBar({ const isTauri = useIsTauri(); const { isMobile } = useBreakpoint('mobile'); const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); - const { useConnectedIMUTrackers } = useTrackers(); - const connectedIMUTrackers = useConnectedIMUTrackers(); + const connectedIMUTrackers = useAtomValue(connectedIMUTrackersAtom); const { config, setConfig, saveConfig } = useConfig(); const version = useContext(VersionContext); const [localIp, setLocalIp] = useState(null); diff --git a/gui/src/components/UnknownDeviceModal.tsx b/gui/src/components/UnknownDeviceModal.tsx index 847214fd8..779ac86de 100644 --- a/gui/src/components/UnknownDeviceModal.tsx +++ b/gui/src/components/UnknownDeviceModal.tsx @@ -11,13 +11,14 @@ import { UnknownDeviceHandshakeNotificationT, } from 'solarxr-protocol'; import { useDebouncedEffect } from '@/hooks/timeout'; -import { useAppContext } from '@/hooks/app'; +import { useAtom } from 'jotai'; +import { ignoredTrackersAtom } from '@/store/app-store'; export function UnknownDeviceModal() { const { l10n } = useLocalization(); const [open, setOpen] = useState(0); const { pathname } = useLocation(); - const { state, dispatch } = useAppContext(); + const [ignoredTrackers, setIgnoredTracker] = useAtom(ignoredTrackersAtom); const [currentTracker, setCurrentTracker] = useState(null); const { useRPCPacket, sendRPCPacket } = useWebsocketAPI(); @@ -28,7 +29,7 @@ export function UnknownDeviceModal() { ['/onboarding/connect-trackers', '/settings/firmware-tool'].includes( pathname ) || - state.ignoredTrackers.has(macAddress as string) || + (macAddress && ignoredTrackers.has(macAddress?.toString())) || (currentTracker !== null && currentTracker !== macAddress) ) return; @@ -91,9 +92,10 @@ export function UnknownDeviceModal() {