'use client'; import { useState, useRef, useEffect } from 'react'; import { useSavedClipboards } from '../lib/hooks/useSavedClipboards'; import { createPortal } from 'react-dom'; import { History, X, Check, Edit, Clipboard, Clock, Trash2, Lock, AlertCircle } from 'lucide-react'; interface SavedClipboardsButtonProps { onSelectClipboard: (roomCode: string) => void; } export default function SavedClipboardsButton({ onSelectClipboard }: SavedClipboardsButtonProps) { const { savedClipboards, removeClipboard, renameClipboard, clearClipboards } = useSavedClipboards(); const [isOpen, setIsOpen] = useState(false); const [editingRoomCode, setEditingRoomCode] = useState(null); const [newName, setNewName] = useState(''); const [isMounted, setIsMounted] = useState(false); const buttonRef = useRef(null); const inputRef = useRef(null); // Check if there are saved clipboards const hasSavedClipboards = savedClipboards.length > 0; // Handle client-side rendering for the portal useEffect(() => { setIsMounted(true); return () => setIsMounted(false); }, []); useEffect(() => { if (editingRoomCode !== null && inputRef.current) { inputRef.current.focus(); } }, [editingRoomCode]); // Handle ESC key to close the panel useEffect(() => { const handleEscKey = (event: KeyboardEvent) => { if (event.key === 'Escape' && isOpen) { setIsOpen(false); setEditingRoomCode(null); } }; document.addEventListener('keydown', handleEscKey); return () => { document.removeEventListener('keydown', handleEscKey); }; }, [isOpen]); const handleRename = (roomCode: string) => { if (editingRoomCode === roomCode) { // Save the new name renameClipboard(roomCode, newName); setEditingRoomCode(null); } else { // Start editing const clipboard = savedClipboards.find(item => item.roomCode === roomCode); setNewName(clipboard?.name || ''); setEditingRoomCode(roomCode); } }; const formatDate = (dateString: string) => { const date = new Date(dateString); const now = new Date(); const yesterday = new Date(now); yesterday.setDate(yesterday.getDate() - 1); // If it's today, show only the time if (date.toDateString() === now.toDateString()) { return `Today at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`; } // If it's yesterday, show "Yesterday" if (date.toDateString() === yesterday.toDateString()) { return `Yesterday at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`; } // Otherwise show the date return date.toLocaleDateString([], { month: 'short', day: 'numeric' }) + ` at ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`; }; return ( <> {/* Slide-in panel for saved clipboards */} {isMounted && isOpen && hasSavedClipboards && createPortal(
setIsOpen(false)} />
e.stopPropagation()} > {/* Header */}

Clipboards History

{/* Clipboard list */}
{savedClipboards.length === 0 ? (

Empty

) : ( savedClipboards.map((clipboard, index) => (
{/* Hover indicator */}
{ onSelectClipboard(clipboard.roomCode); setIsOpen(false); }} > {editingRoomCode === clipboard.roomCode ? (
setNewName(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') { handleRename(clipboard.roomCode); } else if (e.key === 'Escape') { setEditingRoomCode(null); } }} className="w-full px-3 py-2 rounded bg-background border border-surface-hover text-text-primary text-sm focus:outline-none focus:ring-1 focus:ring-primary/50 focus:border-primary/50" placeholder="Enter a name..." onClick={(e) => e.stopPropagation()} autoComplete="off" />
) : (
{clipboard.name ? ( {clipboard.name} ) : null} {clipboard.roomCode} {clipboard.isPasswordProtected && ( )}
{formatDate(clipboard.lastVisited)} {clipboard.isExpired && ( Expired )}
)}
)) )}
{/* Footer with clear button */} {savedClipboards.length > 0 && (
)}
, document.body )} ); }