diff --git a/ai-prompts/00-welcome-agent.md b/ai-prompts/00-welcome-agent.md index e3ce3eb..659a5ca 100644 --- a/ai-prompts/00-welcome-agent.md +++ b/ai-prompts/00-welcome-agent.md @@ -149,10 +149,3 @@ VotoFocolari/ 6. **Success Modal Interrompibile**: Se durante il carosello di benvenuto si passa un nuovo badge, la modal si chiude e viene caricato subito il nuovo utente. - ---- - -## TODO (da concordare con committenti) - -- [ ] Verificare se il badge validatore debba essere validato anche lato server -- [ ] Test automatici E2E per regression detection diff --git a/dev.sh b/dev.sh index f3a9abf..b92f83d 100755 --- a/dev.sh +++ b/dev.sh @@ -346,6 +346,15 @@ cmd_test_e2e_ui() { npm run test:e2e:ui } +# Type-check frontend (senza build) +cmd_check() { + check_prereqs + info "Type-check frontend (tsc --noEmit)..." + cd "$FRONTEND_DIR" + npm run check + success "Type-check completato senza errori!" +} + # Help cmd_help() { echo "============================================" @@ -359,6 +368,7 @@ cmd_help() { echo " dev Avvia frontend (dev) + backend (api-only) in parallelo" echo " build Builda il frontend per produzione" echo " build:debug Builda il frontend in modalità DEBUG (no minify, sourcemap)" + echo " check Type-check TypeScript (senza build)" echo " server Builda frontend (se cambiato) e avvia server completo" echo " server:debug Builda DEBUG + avvia server (per debug con Chrome DevTools)" echo " backend Avvia solo il backend (api-only)" @@ -401,6 +411,9 @@ case "${1:-help}" in "build:debug") cmd_build_debug ;; + check) + cmd_check + ;; server) shift cmd_server "$@" diff --git a/frontend/package.json b/frontend/package.json index 11a731c..c4ec9b0 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "vite", "build": "tsc -b && vite build", + "check": "tsc --noEmit", "lint": "eslint .", "preview": "vite preview", "test": "vitest", diff --git a/frontend/src/components/FullscreenButton.tsx b/frontend/src/components/FullscreenButton.tsx new file mode 100644 index 0000000..65c2bd1 --- /dev/null +++ b/frontend/src/components/FullscreenButton.tsx @@ -0,0 +1,52 @@ +/** + * Fullscreen Toggle Button - Focolari Voting System + */ + +import {useCallback, useEffect, useState} from 'react'; + +export function FullscreenButton() { + const [isFullscreen, setIsFullscreen] = useState(false); + + useEffect(() => { + const handleChange = () => { + setIsFullscreen(!!document.fullscreenElement); + }; + document.addEventListener('fullscreenchange', handleChange); + return () => document.removeEventListener('fullscreenchange', handleChange); + }, []); + + const toggleFullscreen = useCallback(() => { + if (!document.fullscreenElement) { + document.documentElement.requestFullscreen().catch((err) => { + console.warn('[UI] Fullscreen non disponibile:', err); + }); + } else { + document.exitFullscreen(); + } + }, []); + + return ( + + ); +} + +export default FullscreenButton; + diff --git a/frontend/src/components/UserCard.tsx b/frontend/src/components/UserCard.tsx index c8580cc..b94e390 100644 --- a/frontend/src/components/UserCard.tsx +++ b/frontend/src/components/UserCard.tsx @@ -47,13 +47,13 @@ export function UserCard({user, size = 'full'}: UserCardProps) { } return ( -
+
Badge: {user.badge_code}
+
⚠️ {user.warning}
{roomInfo.room_name}
-ID: {roomInfo.meeting_id}
+{roomInfo.room_name}
+ID: {roomInfo.meeting_id}