From 2b484aec007501a6da3dc620e9d4066c1bbe7b56 Mon Sep 17 00:00:00 2001 From: Igor Loskutov Date: Thu, 5 Feb 2026 19:49:14 -0500 Subject: [PATCH] refactor: data-driven FatalErrorScreen, cover all DailyFatalErrorType cases --- www/app/[roomName]/components/DailyRoom.tsx | 118 +++++++------------- 1 file changed, 38 insertions(+), 80 deletions(-) diff --git a/www/app/[roomName]/components/DailyRoom.tsx b/www/app/[roomName]/components/DailyRoom.tsx index 9790a5e0..61250e22 100644 --- a/www/app/[roomName]/components/DailyRoom.tsx +++ b/www/app/[roomName]/components/DailyRoom.tsx @@ -48,6 +48,24 @@ const RAW_TRACKS_NAMESPACE = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"; const RECORDING_START_DELAY_MS = 2000; const RECORDING_START_MAX_RETRIES = 5; +const FATAL_ERROR_MESSAGES: Partial< + Record +> = { + "connection-error": { + message: "Connection lost. Please check your network.", + rejoinable: true, + }, + "exp-room": { message: "The meeting time has ended." }, + "exp-token": { message: "Your session has expired.", rejoinable: true }, + ejected: { message: "You were removed from this meeting." }, + "meeting-full": { message: "This meeting is full." }, + "not-allowed": { message: "You are not allowed to join this meeting." }, + "nbf-room": { message: "This meeting hasn't started yet." }, + "nbf-token": { message: "This meeting hasn't started yet." }, + "no-room": { message: "This room does not exist." }, + "end-of-life": { message: "This meeting room is no longer available." }, +}; + function FatalErrorScreen({ error, roomName, @@ -56,14 +74,17 @@ function FatalErrorScreen({ roomName: string; }) { const router = useRouter(); - switch (error.type) { - case "connection-error": - return ( -
- - - Connection lost. Please check your network. - + const info = + error.type !== "unknown" ? FATAL_ERROR_MESSAGES[error.type] : undefined; + const message = info?.message ?? `Something went wrong: ${error.message}`; + const rejoinable = info?.rejoinable ?? false; + + return ( +
+ + {message} + {rejoinable ? ( + <> @@ -73,78 +94,15 @@ function FatalErrorScreen({ > Leave - -
- ); - case "exp-room": - return ( -
- - The meeting time has ended. - - -
- ); - case "ejected": - return ( -
- - You were removed from this meeting. - - -
- ); - case "meeting-full": - return ( -
- - This meeting is full. - - -
- ); - case "not-allowed": - return ( -
- - - You are not allowed to join this meeting. - - - -
- ); - case "exp-token": - return ( -
- - Your session has expired. - - -
- ); - default: - return ( -
- - Something went wrong: {error.message} - - -
- ); - } + + ) : ( + + )} +
+
+ ); } type Meeting = components["schemas"]["Meeting"];