From 5ca89d71adccbbe2b1b8b1e2a803b8863e69b9e7 Mon Sep 17 00:00:00 2001 From: david_bai Date: Thu, 23 Oct 2025 20:47:49 +0800 Subject: [PATCH] chore(code):Add cache room ID feature, no need to manually input room ID --- frontend/components/ClipboardApp.tsx | 1 + .../ClipboardApp/RetrieveTabPanel.tsx | 50 +++++++++++++++- .../components/ClipboardApp/SendTabPanel.tsx | 60 +++++++++++++++++++ frontend/constants/messages/de.ts | 8 +++ frontend/constants/messages/en.ts | 8 +++ frontend/constants/messages/es.ts | 8 +++ frontend/constants/messages/fr.ts | 9 +++ frontend/constants/messages/ja.ts | 7 +++ frontend/constants/messages/ko.ts | 9 +++ frontend/constants/messages/zh.ts | 12 +++- frontend/lib/roomIdCache.ts | 37 ++++++++++++ frontend/types/messages.ts | 7 +++ 12 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 frontend/lib/roomIdCache.ts diff --git a/frontend/components/ClipboardApp.tsx b/frontend/components/ClipboardApp.tsx index f5a9b8d..a6ae5bf 100644 --- a/frontend/components/ClipboardApp.tsx +++ b/frontend/components/ClipboardApp.tsx @@ -202,6 +202,7 @@ const ClipboardApp = () => { shareMessage={shareMessage} currentValidatedShareRoomId={shareRoomId} handleLeaveSenderRoom={handleLeaveSenderRoom} + putMessageInMs={putMessageInMs} /> ) : ( (false); + useEffect(() => { + setHasCachedId(!!getCachedId()); + }, []); + const onLocationPick = useCallback(async (): Promise => { if (!messages) return false; // Should not happen if panel is rendered if (!window.showDirectoryPicker) { @@ -111,6 +119,46 @@ export function RetrieveTabPanel({ title={messages.text.ClipboardApp.html.readClipboard_dis} onRead={setRetrieveRoomIdInput} /> + {/* Save/Use Cached ID Button placed after Paste button */} + + + + + void; // New prop for leaving room + putMessageInMs: ( + message: string, + isShareEnd?: boolean, + displayTimeMs?: number + ) => void; } export function SendTabPanel({ @@ -53,6 +60,7 @@ export function SendTabPanel({ shareMessage, currentValidatedShareRoomId, handleLeaveSenderRoom, + putMessageInMs, }: SendTabPanelProps) { // Get the status from the store const { @@ -69,12 +77,18 @@ export function SendTabPanel({ ); // State to track ID generation mode (false = will show simple next, true = will show random next) const [isSimpleIdMode, setIsSimpleIdMode] = useState(true); + // Cached ID state + const [hasCachedId, setHasCachedId] = useState(false); // When the validatedShareRoomId from the parent component changes (e.g., after initial fetch), synchronize the local input field's value useEffect(() => { setInputFieldValue(currentValidatedShareRoomId); }, [currentValidatedShareRoomId]); + useEffect(() => { + setHasCachedId(!!getCachedId()); + }, []); + const handleInputChange = useCallback( (e: React.ChangeEvent) => { const newValue = e.target.value; @@ -127,6 +141,31 @@ export function SendTabPanel({ setIsSimpleIdMode(!isSimpleIdMode); }, [isSimpleIdMode, processRoomIdInput, setInputFieldValue]); + // Save/Use cached ID button handlers + const isSaveEnabled = (inputFieldValue || "").trim().length >= 8; + const handleSaveOrUseCachedId = useCallback(() => { + if (hasCachedId) { + const cached = getCachedId(); + if (cached) { + setInputFieldValue(cached); + } + return; + } + // Save current input to cache + const trimmed = (inputFieldValue || "").trim(); + if (trimmed.length >= 8) { + setCachedId(trimmed); + setHasCachedId(true); + // Notify via messages on sender side + putMessageInMs(messages.text.ClipboardApp.saveId_success, true); + } + }, [ + hasCachedId, + inputFieldValue, + putMessageInMs, + messages.text.ClipboardApp.saveId_success, + ]); + return (
@@ -183,6 +222,27 @@ export function SendTabPanel({ ? messages.text.ClipboardApp.html.generateRandomId_tips : messages.text.ClipboardApp.html.generateSimpleId_tips} + {/* Save/Use Cached ID Button in between */} + + + + +