'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import OtpInput from 'react-otp-input'; import axios from 'axios'; import { useSavedClipboards } from '../lib/hooks/useSavedClipboards'; import SavedClipboardsButton from './SavedClipboardsButton'; import { LogIn, AlertCircle, Loader } from 'lucide-react'; import { apiUrl } from '@/lib/constants'; import { getAdminToken } from '@/lib/adminAuth'; export default function JoinClipboardCard() { const [roomCode, setRoomCode] = useState(''); const [isLoading, setIsLoading] = useState(false); const [clipboardExists, setClipboardExists] = useState(true); const [isComplete, setIsComplete] = useState(false); const [lastVisitedClipboard, setLastVisitedClipboard] = useState(''); const router = useRouter(); const { addClipboard, savedClipboards } = useSavedClipboards(); // Get the last visited clipboard when component mounts and pre-fill the input useEffect(() => { if (savedClipboards.length > 0) { // Sort by lastVisited date and get the most recent one const sorted = [...savedClipboards].sort((a, b) => new Date(b.lastVisited).getTime() - new Date(a.lastVisited).getTime() ); const lastCode = sorted[0].roomCode; setLastVisitedClipboard(lastCode); // Pre-fill the input with the last visited clipboard code setRoomCode(lastCode); // Check if it's valid const isValid = lastCode.length === 4 && isValidRoomCode(lastCode); setIsComplete(isValid); } }, [savedClipboards]); // Validate room code format (6 alphanumeric characters, uppercase) const isValidRoomCode = (code: string): boolean => { const roomCodeRegex = /^[A-Z0-9]{4}$/; return roomCodeRegex.test(code); }; const handleJoinClipboard = async (e?: React.FormEvent) => { // If called from a form submit, prevent default if (e) e.preventDefault(); // Reset states setClipboardExists(true); // Validate room code is not empty if (!roomCode.trim()) { return; } // Validate room code format if (!isValidRoomCode(roomCode)) { return; } // Set loading state and check if clipboard exists setIsLoading(true); try { // Check if clipboard exists const token = getAdminToken(); const response = await axios.get(`${apiUrl}/clipboard/${roomCode}/exists`, { headers: token ? { 'x-admin-token': token } : undefined, params: token ? { token } : undefined, }); if (response.data.exists) { // Save to recently visited clipboards addClipboard(roomCode); // Clipboard exists, navigate to it router.push(`/${roomCode}`); } else { // Clipboard doesn't exist setClipboardExists(false); setIsLoading(false); } } catch (error) { // Error checking clipboard existence setClipboardExists(false); setIsLoading(false); } }; return (
Enter a 4-character code to join an existing clipboard.