From d0ca24ae6f37f47b86137baf894ae79d904bfa4e Mon Sep 17 00:00:00 2001 From: Dan Ditomaso Date: Sat, 25 Jan 2025 16:41:42 -0500 Subject: [PATCH] feat: debounce message draft state updates to reduce zustand/immer store writes on Messages page --- .../PageComponents/Messages/MessageInput.tsx | 28 +++++++++++++++---- src/core/utils/debounce.ts | 13 +++++++++ 2 files changed, 35 insertions(+), 6 deletions(-) create mode 100644 src/core/utils/debounce.ts diff --git a/src/components/PageComponents/Messages/MessageInput.tsx b/src/components/PageComponents/Messages/MessageInput.tsx index 9a7c865a..29dc673d 100644 --- a/src/components/PageComponents/Messages/MessageInput.tsx +++ b/src/components/PageComponents/Messages/MessageInput.tsx @@ -1,8 +1,12 @@ +import { debounce } from "@app/core/utils/debounce"; import { Button } from "@components/UI/Button.tsx"; import { Input } from "@components/UI/Input.tsx"; import { useDevice } from "@core/stores/deviceStore.ts"; import type { Types } from "@meshtastic/js"; import { SendIcon } from "lucide-react"; +import { useCallback, useState, useMemo } from "react"; + + export interface MessageInputProps { to: Types.Destination; @@ -20,10 +24,15 @@ export const MessageInput = ({ setMessageDraft, hardware, } = useDevice(); - const myNodeNum = hardware.myNodeNum; + const [localDraft, setLocalDraft] = useState(messageDraft); - const sendText = async (message: string) => { + const debouncedSetMessageDraft = useMemo( + () => debounce(setMessageDraft, 300), + [setMessageDraft] + ); + + const sendText = useCallback(async (message: string) => { await connection ?.sendText(message, to, true, channel) .then((id) => @@ -46,6 +55,12 @@ export const MessageInput = ({ e.error, ), ); + }, [channel, connection, myNodeNum, setMessageState, to]); + + const handleInputChange = (e: React.ChangeEvent) => { + const newValue = e.target.value; + setLocalDraft(newValue); + debouncedSetMessageDraft(newValue); }; return ( @@ -54,7 +69,8 @@ export const MessageInput = ({ className="w-full" onSubmit={(e) => { e.preventDefault(); - sendText(messageDraft); + sendText(localDraft); + setLocalDraft(""); setMessageDraft(""); }} > @@ -64,8 +80,8 @@ export const MessageInput = ({ autoFocus={true} minLength={1} placeholder="Enter Message" - value={messageDraft} - onChange={(e) => setMessageDraft(e.target.value)} + value={localDraft} + onChange={handleInputChange} />