From c2a2e0ac19926ca011e696428e8b274c877ab127 Mon Sep 17 00:00:00 2001 From: Tilen Komel Date: Tue, 4 Feb 2025 22:52:14 +0100 Subject: [PATCH] Add direct message button --- src/components/Dialog/NodeOptionsDialog.tsx | 19 +++++++++++++++++-- src/core/stores/appStore.ts | 15 +++++++++++++++ src/pages/Messages.tsx | 11 ++++------- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/components/Dialog/NodeOptionsDialog.tsx b/src/components/Dialog/NodeOptionsDialog.tsx index 83a01426..d62e4065 100644 --- a/src/components/Dialog/NodeOptionsDialog.tsx +++ b/src/components/Dialog/NodeOptionsDialog.tsx @@ -24,8 +24,13 @@ export const NodeOptionsDialog = ({ open, onOpenChange, }: NodeOptionsDialogProps): JSX.Element => { - const { setDialogOpen, connection } = useDevice(); - const { setNodeNumToBeRemoved, setNodeNumDetails } = useAppStore(); + const { setDialogOpen, connection, setActivePage } = useDevice(); + const { + setNodeNumToBeRemoved, + setNodeNumDetails, + setChatType, + setActiveChat, + } = useAppStore(); const longName = node?.user?.longName ?? (node ? `!${numberToHexUnpadded(node?.num)}` : "Unknown"); @@ -33,6 +38,13 @@ export const NodeOptionsDialog = ({ node?.user?.shortName ?? (node ? `${numberToHexUnpadded(node?.num).substring(0, 4)}` : "UNK"); + function handleDirectMessage() { + if (!node) return; + setChatType("direct"); + setActiveChat(node.num); + setActivePage("messages"); + } + function handleRequestPosition() { if (!node) return; toast({ @@ -66,6 +78,9 @@ export const NodeOptionsDialog = ({ {`${longName} (${shortName})`}
+
+ +
diff --git a/src/core/stores/appStore.ts b/src/core/stores/appStore.ts index 2e311e6e..d9e213c8 100644 --- a/src/core/stores/appStore.ts +++ b/src/core/stores/appStore.ts @@ -1,3 +1,4 @@ +import { Types } from "@meshtastic/js"; import { produce } from "immer"; import { create } from "zustand"; @@ -30,6 +31,8 @@ interface AppState { accent: AccentColor; connectDialogOpen: boolean; nodeNumDetails: number; + activeChat: number; + chatType: "broadcast" | "direct"; setRasterSources: (sources: RasterSource[]) => void; addRasterSource: (source: RasterSource) => void; @@ -44,6 +47,8 @@ interface AppState { setAccent: (color: AccentColor) => void; setConnectDialogOpen: (open: boolean) => void; setNodeNumDetails: (nodeNum: number) => void; + setActiveChat: (chat: number) => void; + setChatType: (type: "broadcast" | "direct") => void; } export const useAppStore = create()((set) => ({ @@ -60,6 +65,8 @@ export const useAppStore = create()((set) => ({ connectDialogOpen: false, nodeNumToBeRemoved: 0, nodeNumDetails: 0, + activeChat: Types.ChannelNumber.Primary, + chatType: "broadcast", setRasterSources: (sources: RasterSource[]) => { set( @@ -131,4 +138,12 @@ export const useAppStore = create()((set) => ({ set((state) => ({ nodeNumDetails: nodeNum, })), + setActiveChat: (chat) => + set(() => ({ + activeChat: chat, + })), + setChatType: (type) => + set(() => ({ + chatType: type, + })), })); diff --git a/src/pages/Messages.tsx b/src/pages/Messages.tsx index c06ce08f..7fe99f69 100644 --- a/src/pages/Messages.tsx +++ b/src/pages/Messages.tsx @@ -1,3 +1,4 @@ +import { useAppStore } from "@app/core/stores/appStore"; import { ChannelChat } from "@components/PageComponents/Messages/ChannelChat.tsx"; import { PageLayout } from "@components/PageLayout.tsx"; import { Sidebar } from "@components/Sidebar.tsx"; @@ -5,21 +6,17 @@ import { Avatar } from "@components/UI/Avatar.tsx"; import { SidebarSection } from "@components/UI/Sidebar/SidebarSection.tsx"; import { SidebarButton } from "@components/UI/Sidebar/sidebarButton.tsx"; import { useToast } from "@core/hooks/useToast.ts"; -import { Device, useDevice, useDeviceStore } from "@core/stores/deviceStore.ts"; +import { useDevice } from "@core/stores/deviceStore.ts"; import { Protobuf, Types } from "@meshtastic/js"; import { numberToHexUnpadded } from "@noble/curves/abstract/utils"; import { getChannelName } from "@pages/Channels.tsx"; import { HashIcon, LockIcon, LockOpenIcon, WaypointsIcon } from "lucide-react"; import { useState } from "react"; -const MessagesPage = () => { +export const MessagesPage = () => { const { channels, nodes, hardware, messages, traceroutes, connection } = useDevice(); - const [chatType, setChatType] = - useState("broadcast"); - const [activeChat, setActiveChat] = useState( - Types.ChannelNumber.Primary, - ); + const { activeChat, chatType, setActiveChat, setChatType } = useAppStore(); const [searchTerm, setSearchTerm] = useState(""); const filteredNodes = Array.from(nodes.values()).filter((node) => { if (node.num === hardware.myNodeNum) return false;