Files
meet/src/frontend/src/routes.ts
T
lebaudantoine 8072d2c950 ♻️(frontend) refactor disconnection reason handling and state
Refactor the duplicateIdentity boolean URL parameter into an extensible string
reason parameter, making it easier to customize the disconnection message
shown to users.

Avoid passing this value via URL parameters, which are easy to manipulate.
Instead, use Wouter’s built-in navigation state to pass data across pages.

This was initially missed because navigateTo is a wrapper around Wouter’s
official navigation function, and its arguments were easy to overlook. This is
now fixed.

This prepares the ground for supporting additional disconnection reasons in
upcoming commits.
2026-01-11 23:07:54 +01:00

82 lines
2.2 KiB
TypeScript

import {
FeedbackRoute,
RoomRoute,
flexibleRoomIdPattern,
} from '@/features/rooms'
import { HomeRoute } from '@/features/home'
import { LegalTermsRoute } from '@/features/legalsTerms/LegalTermsRoute'
import { AccessibilityRoute } from '@/features/legalsTerms/Accessibility'
import { TermsOfServiceRoute } from '@/features/legalsTerms/TermsOfService'
import { CreatePopup } from '@/features/sdk/routes/CreatePopup'
import { CreateMeetingButton } from '@/features/sdk/routes/CreateMeetingButton'
import { RecordingDownloadRoute } from '@/features/recording'
export const routes: Record<
| 'home'
| 'room'
| 'feedback'
| 'legalTerms'
| 'accessibility'
| 'termsOfService'
| 'sdkCreatePopup'
| 'sdkCreateButton'
| 'recordingDownload',
{
name: RouteName
path: RegExp | string
Component: () => JSX.Element
// eslint-disable-next-line @typescript-eslint/no-explicit-any
to?: (...args: any[]) => string | URL
}
> = {
home: {
name: 'home',
path: '/',
Component: HomeRoute,
},
room: {
name: 'room',
to: (roomId: string) => `/${roomId.trim()}`,
path: new RegExp(`^[/](?<roomId>${flexibleRoomIdPattern})$`),
Component: RoomRoute,
},
feedback: {
name: 'feedback',
path: '/feedback',
Component: FeedbackRoute,
},
legalTerms: {
name: 'legalTerms',
path: '/mentions-legales',
Component: LegalTermsRoute,
},
accessibility: {
name: 'accessibility',
path: '/accessibilite',
Component: AccessibilityRoute,
},
termsOfService: {
name: 'termsOfService',
path: '/conditions-utilisation',
Component: TermsOfServiceRoute,
},
sdkCreatePopup: {
name: 'sdkCreatePopup',
path: '/sdk/create-popup',
Component: CreatePopup,
},
sdkCreateButton: {
name: 'sdkCreateButton',
path: '/sdk/create-button',
Component: CreateMeetingButton,
},
recordingDownload: {
name: 'recordingDownload',
path: /^\/recording\/(?<recordingId>[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/,
to: (recordingId: string) => `/recording/${recordingId.trim()}`,
Component: RecordingDownloadRoute,
},
}
export type RouteName = keyof typeof routes