diff --git a/.Jules/palette.md b/.Jules/palette.md index 2802bd6..b47479d 100644 --- a/.Jules/palette.md +++ b/.Jules/palette.md @@ -15,3 +15,7 @@ ## 2026-10-24 - Form Success State Feedback **Learning:** Temporarily disabling the submit button and changing its state to a success message without wiping the form inputs asynchronously prevents data loss while maintaining clear feedback for the user on successful submissions. **Action:** For successful form submissions, temporarily (e.g., 2s) disable the submit button, change its text to a success message, and reset the form inputs immediately rather than inside the timeout. + +## 2026-10-25 - Soft Confirmation Pattern +**Learning:** Native `window.confirm()` dialogs create blocking, inaccessible experiences and lack styling options. State-based soft confirmations require explicit 'Cancel' options to prevent trapping users and need `role="status"` to ensure warning text is announced to screen readers. +**Action:** Replace `window.confirm()` with state-based UI containing confirm/cancel buttons and dynamic warning text with `role="status"`. diff --git a/src/components/facilitator/SessionConsole.tsx b/src/components/facilitator/SessionConsole.tsx index 252dde2..6f120c8 100644 --- a/src/components/facilitator/SessionConsole.tsx +++ b/src/components/facilitator/SessionConsole.tsx @@ -1,5 +1,6 @@ 'use client'; +import { useState } from 'react'; import { Socket } from 'socket.io-client'; import type { SessionStatePayload } from '@/types/websocket'; @@ -10,6 +11,8 @@ interface SessionConsoleProps { } export function SessionConsole({ sessionId, sessionState, socket }: SessionConsoleProps) { + const [showEndConfirm, setShowEndConfirm] = useState(false); + const handleStartSession = () => { socket.emit('facilitator', { type: 'startSession', @@ -25,12 +28,16 @@ export function SessionConsole({ sessionId, sessionState, socket }: SessionConso }; const handleEndSession = () => { - if (confirm('Are you sure you want to end this session? This will generate the session summary.')) { - socket.emit('facilitator', { - type: 'endSession', - payload: { sessionId }, - }); + if (!showEndConfirm) { + setShowEndConfirm(true); + return; } + + socket.emit('facilitator', { + type: 'endSession', + payload: { sessionId }, + }); + setShowEndConfirm(false); }; if (!sessionState) { @@ -84,12 +91,36 @@ export function SessionConsole({ sessionId, sessionState, socket }: SessionConso ) : null} {sessionState.status !== 'ENDED' && ( - +