diff --git a/packages/web/src/components/CommandPalette/index.tsx b/packages/web/src/components/CommandPalette/index.tsx index ab6403ea..1de78dc6 100644 --- a/packages/web/src/components/CommandPalette/index.tsx +++ b/packages/web/src/components/CommandPalette/index.tsx @@ -70,7 +70,7 @@ export const CommandPalette = () => { } = useAppStore(); const { getDevices } = useDeviceStore(); const { setDialogOpen, connection } = useDevice(); - const { getNode } = useNodeDB(); + const { getNode, removeAllNodeErrors, removeAllNodes } = useNodeDB(); const { pinnedItems, togglePinnedItem } = usePinnedItems({ storageName: "pinnedCommandMenuGroups", }); @@ -199,6 +199,8 @@ export const CommandPalette = () => { icon: TrashIcon, action() { connection?.resetNodes(); + removeAllNodeErrors(); + removeAllNodes(true); }, }, { @@ -215,6 +217,8 @@ export const CommandPalette = () => { icon: FactoryIcon, action() { connection?.factoryResetDevice(); + removeAllNodeErrors(); + removeAllNodes(); }, }, { diff --git a/packages/web/src/core/stores/index.ts b/packages/web/src/core/stores/index.ts index 76fde626..e6c73d19 100644 --- a/packages/web/src/core/stores/index.ts +++ b/packages/web/src/core/stores/index.ts @@ -1,9 +1,13 @@ +import { useDeviceContext } from "@app/core/stores/utils/useDeviceContext"; import { type Device, useDeviceStore } from "@core/stores/deviceStore"; import { type NodeDB, useNodeDBStore } from "@core/stores/nodeDBStore"; -import { useDeviceContext } from "@core/stores/utils/deviceContext"; +export { + CurrentDeviceContext, + type DeviceContext, + useDeviceContext, +} from "@app/core/stores/utils/useDeviceContext"; export { useAppStore } from "@core/stores/appStore"; - export { type Device, type Page, @@ -11,27 +15,18 @@ export { type ValidConfigType, type ValidModuleConfigType, } from "@core/stores/deviceStore"; - export { MessageState, type MessageStore, MessageType, useMessageStore, // TODO: Bring hook into this file } from "@core/stores/messageStore"; - export { type NodeDB, useNodeDBStore } from "@core/stores/nodeDBStore"; - export { SidebarProvider, useSidebar, // TODO: Bring hook into this file } from "@core/stores/sidebarStore"; -export { - CurrentDeviceContext, - type DeviceContext, - useDeviceContext, -} from "@core/stores/utils/deviceContext"; - // Define hooks to access the stores export const useNodeDB = (): NodeDB => { const { deviceId } = useDeviceContext(); diff --git a/packages/web/src/core/stores/nodeDBStore/index.ts b/packages/web/src/core/stores/nodeDBStore/index.ts index 77ddc7e7..b5a228e9 100644 --- a/packages/web/src/core/stores/nodeDBStore/index.ts +++ b/packages/web/src/core/stores/nodeDBStore/index.ts @@ -18,6 +18,7 @@ export interface NodeDB { addNode: (nodeInfo: Protobuf.Mesh.NodeInfo) => void; removeNode: (nodeNum: number) => void; + removeAllNodes: (keepMyNode?: boolean) => void; processPacket: (data: ProcessPacketParams) => void; addUser: (user: Types.PacketMetadata) => void; addPosition: (position: Types.PacketMetadata) => void; @@ -26,6 +27,7 @@ export interface NodeDB { setNodeNum: (nodeNum: number) => void; setNodeError: (nodeNum: number, error: NodeErrorType) => void; clearNodeError: (nodeNum: number) => void; + removeAllNodeErrors: () => void; getNodesLength: () => number; getNode: (nodeNum: number) => Protobuf.Mesh.NodeInfo | undefined; @@ -98,6 +100,29 @@ function nodeDBFactory( }), ), + removeAllNodes: (keepMyNode) => + set( + produce((draft) => { + const nodeDB = draft.nodeDBs.get(id); + if (!nodeDB) { + throw new Error(`No nodeDB found (id: ${id})`); + } + const newNodeMap = new Map(); + if ( + keepMyNode && + nodeDB.myNodeNum !== undefined && + nodeDB.nodeMap.has(nodeDB.myNodeNum) + ) { + newNodeMap.set( + nodeDB.myNodeNum, + nodeDB.nodeMap.get(nodeDB.myNodeNum) ?? + create(Protobuf.Mesh.NodeInfoSchema), + ); + } + nodeDB.nodeMap = newNodeMap; + }), + ), + setNodeError: (nodeNum, error) => set( produce((draft) => { @@ -120,6 +145,17 @@ function nodeDBFactory( }), ), + removeAllNodeErrors: () => + set( + produce((draft) => { + const nodeDB = draft.nodeDBs.get(id); + if (!nodeDB) { + throw new Error(`No nodeDB found (id: ${id})`); + } + nodeDB.nodeErrors = new Map(); + }), + ), + processPacket: (data) => set( produce((draft) => { @@ -326,10 +362,10 @@ export const useNodeDBStore = createStore()( return nodeDB; }, - removeNodeDB: (userId) => { + removeNodeDB: (id) => { set( produce((draft) => { - draft.nodeDBs.delete(userId); + draft.nodeDBs.delete(id); }), ); }, diff --git a/packages/web/src/core/stores/utils/deviceContext.ts b/packages/web/src/core/stores/utils/useDeviceContext.ts similarity index 100% rename from packages/web/src/core/stores/utils/deviceContext.ts rename to packages/web/src/core/stores/utils/useDeviceContext.ts