import React, { useCallback, useEffect, useState } from "react"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { ReadClipboardButton, WriteClipboardButton, } from "@/components/common/clipboard_btn"; import CachedIdActionButton from "@/components/ClipboardApp/CachedIdActionButton"; import FileListDisplay from "@/components/ClipboardApp/FileListDisplay"; import type { Messages } from "@/types/messages"; import type { FileMeta } from "@/types/webrtc"; import { useFileTransferStore } from "@/stores/fileTransferStore"; interface RetrieveTabPanelProps { messages: Messages; putMessageInMs: ( message: string, isShareEnd?: boolean, displayTimeMs?: number ) => void; // For onLocationPick setRetrieveRoomIdInput: (value: string) => void; joinRoom: (isSender: boolean, roomId: string) => void; retrieveJoinRoomBtnRef: React.RefObject; richTextToPlainText: (html: string) => string; handleDownloadFile: (meta: FileMeta) => void; // Functions for WebRTC interaction, passed from parent via useWebRTCConnection requestFile: (fileId: string, peerId?: string) => void; requestFolder: (folderName: string, peerId?: string) => void; setReceiverDirectoryHandle: ( directoryHandle: FileSystemDirectoryHandle ) => Promise; getReceiverSaveType: () => { [fileId: string]: boolean } | undefined; retrieveMessage: string; handleLeaveRoom: () => void; } export function RetrieveTabPanel({ messages, putMessageInMs, setRetrieveRoomIdInput, joinRoom, retrieveJoinRoomBtnRef, richTextToPlainText, handleDownloadFile, requestFile, requestFolder, setReceiverDirectoryHandle, getReceiverSaveType, retrieveMessage, handleLeaveRoom, }: RetrieveTabPanelProps) { // Get the status from the store const { retrieveRoomStatusText, retrieveRoomIdInput, retrievedContent, retrievedFileMetas, receiveProgress, isAnyFileTransferring, isReceiverInRoom, } = useFileTransferStore(); const onLocationPick = useCallback(async (): Promise => { if (!messages) return false; // Should not happen if panel is rendered if (!window.showDirectoryPicker) { putMessageInMs(messages.text.ClipboardApp.pickSaveUnsupported, false); return false; } if (!window.confirm(messages.text.ClipboardApp.pickSaveMsg)) return false; try { const directoryHandle = await window.showDirectoryPicker(); await setReceiverDirectoryHandle(directoryHandle); putMessageInMs(messages.text.ClipboardApp.pickSaveSuccess, false); return true; } catch (err: any) { if (err.name !== "AbortError") { console.error("Failed to set up folder receive:", err); putMessageInMs(messages.text.ClipboardApp.pickSaveError, false); } return false; } }, [messages, putMessageInMs, setReceiverDirectoryHandle]); const handleFileRequestFromPanel = useCallback( (meta: FileMeta) => { if (meta.folderName) { requestFolder(meta.folderName); } else if (meta.fileId) { requestFile(meta.fileId); } else { console.warn("Cannot request file from panel: missing fileId", meta); // Optionally use putMessageInMs to inform user } }, [requestFile, requestFolder] ); return (
{retrieveRoomStatusText || (isReceiverInRoom ? messages.text.ClipboardApp.roomStatus.connected_dis : messages.text.ClipboardApp.roomStatus.receiverEmptyMsg)}
{/* Room ID input section */}
{/* Save/Use Cached ID Button placed after Paste button */} retrieveRoomIdInput} setInputValue={setRetrieveRoomIdInput} putMessageInMs={putMessageInMs} isShareEnd={false} /> setRetrieveRoomIdInput(e.target.value)} placeholder={ messages.text.ClipboardApp.html.retrieveRoomId_placeholder } className="flex-1 min-w-0" />
{/* Action buttons */}
{retrievedContent && (
)} {retrieveMessage && (

{retrieveMessage}

)}
); }