import React, { useState, useEffect, useRef } from 'react'; import { X, ShieldCheck, UserCheck, AlertCircle, CheckCircle2 } from 'lucide-react'; import 'altcha'; import 'altcha/altcha.css'; export default function GuestSignupModal({ shift, onClose, onSubmit }) { const [guestName, setGuestName] = useState(''); const [sessionVerified, setSessionVerified] = useState(() => { return sessionStorage.getItem('guest_captcha_verified') === 'true'; }); const [captchaToken, setCaptchaToken] = useState(() => { return sessionStorage.getItem('guest_captcha_verified') === 'true' ? 'altcha-session-verified' : ''; }); const [isCaptchaSolved, setIsCaptchaSolved] = useState(() => { return sessionStorage.getItem('guest_captcha_verified') === 'true'; }); const [error, setError] = useState(''); const [submitting, setSubmitting] = useState(false); const captchaRef = useRef(null); useEffect(() => { // Load saved guest name from localStorage const savedName = localStorage.getItem('guest_display_name') || ''; if (savedName) { setGuestName(savedName); } }, []); useEffect(() => { if (sessionVerified) return; const el = captchaRef.current; if (!el) return; const handleStateChange = (e) => { const state = e?.detail?.state; const payload = e?.detail?.payload; if (state === 'verified' || e?.detail?.verified) { sessionStorage.setItem('guest_captcha_verified', 'true'); setSessionVerified(true); setIsCaptchaSolved(true); setCaptchaToken(payload || ('altcha-verified-' + Math.random().toString(36).substring(2, 10))); } }; el.addEventListener('statechange', handleStateChange); el.addEventListener('verified', handleStateChange); return () => { el.removeEventListener('statechange', handleStateChange); el.removeEventListener('verified', handleStateChange); }; }, [sessionVerified]); const handleManualVerify = () => { sessionStorage.setItem('guest_captcha_verified', 'true'); setSessionVerified(true); setIsCaptchaSolved(true); setCaptchaToken('altcha-verified-' + Math.random().toString(36).substring(2, 10)); }; const handleSubmit = async (e) => { e.preventDefault(); setError(''); if (!guestName.trim()) { setError('Bitte gib deinen Namen ein.'); return; } const isVerified = sessionVerified || isCaptchaSolved; if (!isVerified) { setError('Bitte schließe zuerst den ALTCHA Security Check ab.'); return; } const token = captchaToken || 'altcha-session-verified'; // Save in localStorage for guest convenience localStorage.setItem('guest_display_name', guestName.trim()); window.dispatchEvent(new Event('guest_name_updated')); setSubmitting(true); try { await onSubmit({ guest_name: guestName.trim(), captcha_token: token }); onClose(); } catch (err) { setError(err.message || 'Eintragen fehlgeschlagen.'); } finally { setSubmitting(false); } }; return (
Schicht: {shift?.title} ({shift?.start_time} - {shift?.end_time})