From f390ad46d5b8b31ffc7a6aceeb5451d2e602d51d Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Wed, 9 Apr 2025 23:02:40 +0200 Subject: [PATCH] wip page to download a recording --- .../features/recording/api/fetchRecording.ts | 19 ++++ src/frontend/src/features/recording/index.ts | 1 + .../features/recording/routes/Recording.tsx | 107 ++++++++++++++++++ src/frontend/src/routes.ts | 9 ++ 4 files changed, 136 insertions(+) create mode 100644 src/frontend/src/features/recording/api/fetchRecording.ts create mode 100644 src/frontend/src/features/recording/index.ts create mode 100644 src/frontend/src/features/recording/routes/Recording.tsx diff --git a/src/frontend/src/features/recording/api/fetchRecording.ts b/src/frontend/src/features/recording/api/fetchRecording.ts new file mode 100644 index 00000000..15bac9dd --- /dev/null +++ b/src/frontend/src/features/recording/api/fetchRecording.ts @@ -0,0 +1,19 @@ +import { fetchApi } from '@/api/fetchApi' +import { ApiRoom } from '@/features/rooms/api/ApiRoom' +import { RecordingMode } from '@/features/rooms/api/startRecording' + +export type RecordingApi = { + id: string + room: Pick + created_at: string + mode: RecordingMode +} + +export const fetchRecording = ({ + recordingId, +}: { + roomId: string + username?: string +}) => { + return fetchApi(`/recordings/${recordingId}/`) +} diff --git a/src/frontend/src/features/recording/index.ts b/src/frontend/src/features/recording/index.ts new file mode 100644 index 00000000..4e717d20 --- /dev/null +++ b/src/frontend/src/features/recording/index.ts @@ -0,0 +1 @@ +export { Recording as RecordingRoute } from './routes/Recording' diff --git a/src/frontend/src/features/recording/routes/Recording.tsx b/src/frontend/src/features/recording/routes/Recording.tsx new file mode 100644 index 00000000..a2d83911 --- /dev/null +++ b/src/frontend/src/features/recording/routes/Recording.tsx @@ -0,0 +1,107 @@ +import { Center, VStack } from '@/styled-system/jsx' +import { Bold, Button, Field, H, Input, LinkButton, Text } from '@/primitives' +import { Screen } from '@/layout/Screen.tsx' +import { useParams } from 'wouter' +import { fetchRecording } from '../api/fetchRecording' +import { useQuery } from '@tanstack/react-query' +import { Spinner } from '@/primitives/Spinner' +import { UserAware, useUser } from '@/features/auth' +import { CenteredContent } from '@/layout/CenteredContent.tsx' +import { useState } from 'react' +import fourthSlide from '@/assets/intro-slider/4_record.png' +import { css } from '@/styled-system/css' +import { RecordingMode } from '@/features/rooms/api/startRecording.ts' + +function formatDate(date, format = 'YYYY-MM-DD') { + // Accept Date object or create one from string + const dateObj = date instanceof Date ? date : new Date(date) + + // Check if the date is valid + if (isNaN(dateObj.getTime())) { + return 'Invalid Date' + } + + const year = dateObj.getFullYear() + const month = dateObj.getMonth() + 1 // getMonth() returns 0-11 + const day = dateObj.getDate() + const hours = dateObj.getHours() + const minutes = dateObj.getMinutes() + const seconds = dateObj.getSeconds() + + // Pad numbers with leading zeros + const pad = (num) => String(num).padStart(2, '0') + + // Replace format tokens with actual values + return format + .replace('YYYY', year) + .replace('MM', pad(month)) + .replace('DD', pad(day)) + .replace('HH', pad(hours)) + .replace('mm', pad(minutes)) + .replace('ss', pad(seconds)) +} + +export const Recording = () => { + const { recordingId } = useParams() + const { isLoggedIn } = useUser() + + const { data, isLoading, isError } = useQuery({ + queryKey: ['recording', recordingId], + queryFn: () => fetchRecording({ recordingId }), + retry: false, + }) + + if (isLoading) { + return ( + + + + + + ) + } + + if (isError || !isLoggedIn) { + return ( + + + + Vous ne pouvez pas accéder à ce lien d'enregistrement + + + + ) + } + + return ( + + +
+ + {''} + + Votre enregistrement est prêt ! + + + Enregistrement de la réunion {data.room.name} du{' '} + {formatDate(data.created_at, 'YYYY-MM-DD HH:mm')}.
Cet + enregistrement est disponible pendant 7 jours. +
+ + Télécharger + +
+
+
+
+ ) +} diff --git a/src/frontend/src/routes.ts b/src/frontend/src/routes.ts index 0783a15d..f6b5e9f9 100644 --- a/src/frontend/src/routes.ts +++ b/src/frontend/src/routes.ts @@ -5,6 +5,7 @@ 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 { DownloadRoute, RecordingRoute } from '@/features/recording' export const routes: Record< | 'home' @@ -34,6 +35,14 @@ export const routes: Record< to: (roomId: string) => `/${roomId.trim()}`, Component: RoomRoute, }, + recording: { + name: 'recording', + path: new RegExp( + `^[/]recording[/](?[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: RecordingRoute, + }, feedback: { name: 'feedback', path: '/feedback',