import { AuthService } from '../../../auth/authService.ts' import { useEffect, useState, useRef, MouseEvent } from 'react' import { SignupCode } from '../../../auth/signupCode.ts' import { Temporal } from '@js-temporal/polyfill' import Button from '../../../../components/buttons/Button.tsx' interface SignupCodesManagementPageProps { authService: AuthService } export default function SignupCodesManagementPage({ authService }: SignupCodesManagementPageProps) { const [codes, setCodes] = useState([]) const [code, setCode] = useState('') const [name, setName] = useState('') const [email, setEmail] = useState('') const [isLoading, setIsLoading] = useState(false) const [error, setError] = useState(null) const dialogRef = useRef(null) const [tooltipPosition, setTooltipPosition] = useState<{ x: number; y: number } | null>(null) const [activeCode, setActiveCode] = useState(null) const fetchCodes = async () => { try { setCodes(await authService.listSignupCodes()) } catch (err) { console.error('Failed to fetch signup codes:', err) } } useEffect(() => { const timeoutId = setTimeout(fetchCodes) return () => clearTimeout(timeoutId) }, [authService]) const handleCreateCode = async (e: React.FormEvent) => { e.preventDefault() setIsLoading(true) setError(null) try { await authService.createSignupCode(code, email, name) setCode('') setName('') setEmail('') dialogRef.current?.close() fetchCodes() // Refresh the table } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create signup code') } finally { setIsLoading(false) } } const openDialog = () => { dialogRef.current?.showModal() } const closeDialog = () => { dialogRef.current?.close() setError(null) } const formatDate = (date: Temporal.Instant | null) => { if (!date) return 'Never' try { const jsDate = new Date(date.epochMilliseconds) // Format as: "Jan 1, 2023, 12:00 PM" return jsDate.toLocaleString('en-US', { year: 'numeric', month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit', }) } catch (err: unknown) { console.error(err) return date.toString() } } const copyCodeToClipboard = (code: string, e: MouseEvent) => { e.preventDefault() const host = window.location.origin const url = `${host}?c=${code}` navigator.clipboard.writeText(url) .then(() => { // Optional: Show a success message or notification console.log('Copied to clipboard:', url) }) .catch(err => { console.error('Failed to copy:', err) }) setTooltipPosition(null) setActiveCode(null) } const showTooltip = (code: string, e: MouseEvent) => { const rect = (e.currentTarget as HTMLElement).getBoundingClientRect() setTooltipPosition({ x: rect.left + rect.width / 2, y: rect.top - 10 }) setActiveCode(code) } const hideTooltip = () => { setTooltipPosition(null) setActiveCode(null) } return ( <>

Signup Codes

{codes.map((code) => ( ))} {codes.length === 0 && ( )}
Code Email Redeemed By Expires On
{code.email} {code.redeemedBy || 'Not redeemed'} {formatDate(code.expiresOn)}
No signup codes found

Create New Signup Code

{error && (
{error}
)}
setCode(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md" required />
setName(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md" required />
setEmail(e.target.value)} className="w-full px-3 py-2 border border-gray-300 rounded-md" required />
{tooltipPosition && activeCode && ( Copy to clipboard )} ) }