'use client'; import { useState } from 'react'; import { useRouter } from 'next/navigation'; import PasswordModal from './PasswordModal'; import { useToast } from './ui/Toast'; import { apiUrl } from '@/lib/constants'; import { withAdminTokenHeader } from '@/lib/adminAuth'; export default function CreateClipboardCard() { const [isLoading, setIsLoading] = useState(false); const [showPasswordModal, setShowPasswordModal] = useState(false); const [customCode, setCustomCode] = useState(''); const [codeError, setCodeError] = useState(''); const router = useRouter(); const { addToast } = useToast(); const handleCreateClipboard = async (withPassword = false) => { if (withPassword) { setShowPasswordModal(true); return; } await createClipboard(); }; const createClipboard = async (passwordToUse?: string) => { setIsLoading(true); try { setCodeError(''); const roomCode = customCode.trim().toUpperCase(); if (roomCode) { if (roomCode.length < 4 || roomCode.length > 6) { setCodeError('Code must be between 4 and 6 characters.'); return; } if (!/^[A-Z0-9]+$/.test(roomCode)) { setCodeError('Only letters and numbers are allowed.'); return; } } const payload: Record = {}; if (passwordToUse) { payload.password = passwordToUse; } if (roomCode) { payload.roomCode = roomCode; } const response = await fetch(`${apiUrl}/clipboard/create`, { method: 'POST', headers: withAdminTokenHeader({ 'Content-Type': 'application/json', }), body: Object.keys(payload).length ? JSON.stringify(payload) : undefined, }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.message || 'Failed to create clipboard'); } const data = await response.json(); if (data.roomCode) { router.push(`/${data.roomCode}`); } else { throw new Error('Room code not received from server'); } } catch (err: any) { console.error('Error creating clipboard:', err); addToast(err.message || 'An unexpected error occurred', 'error', 'Error'); } finally { setIsLoading(false); setShowPasswordModal(false); } }; const handlePasswordSubmit = (password: string) => { createClipboard(password); }; return ( <>
{/* Background elements */}

New Clipboard

Start a new shared clipboard. Choose your own 4-6 character code or leave it blank to get a random one.

{ const value = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, ''); setCustomCode(value); if (codeError) setCodeError(''); }} placeholder="e.g. CLIP4" className="w-full px-4 py-3 rounded-lg bg-surface/50 border-2 border-surface-hover focus:border-primary focus:outline-none focus:ring-0 transition-colors duration-300 ease-in-out text-text-primary placeholder-text-secondary/50 font-mono" aria-invalid={!!codeError} /> {codeError && (

{codeError}

)}
{/* Error is now displayed as a toast notification */}
{/* Password Modal */} setShowPasswordModal(false)} onSubmit={handlePasswordSubmit} isLoading={isLoading} /> ); }