diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Options/OptionsMenuItems.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Options/OptionsMenuItems.tsx
index 72f5fc54..8e36b030 100644
--- a/src/frontend/src/features/rooms/livekit/components/controls/Options/OptionsMenuItems.tsx
+++ b/src/frontend/src/features/rooms/livekit/components/controls/Options/OptionsMenuItems.tsx
@@ -10,6 +10,7 @@ import { DialogState } from './OptionsButton'
import { Separator } from '@/primitives/Separator'
import { useSidePanel } from '../../../hooks/useSidePanel'
import { menuRecipe } from '@/primitives/menuRecipe.ts'
+import { TranscriptMenuItem } from './TranscriptMenuItem'
// @todo try refactoring it to use MenuList component
export const OptionsMenuItems = ({
@@ -34,6 +35,7 @@ export const OptionsMenuItems = ({
{t('effects')}
+
diff --git a/src/frontend/src/features/rooms/livekit/components/controls/Options/TranscriptMenuItem.tsx b/src/frontend/src/features/rooms/livekit/components/controls/Options/TranscriptMenuItem.tsx
new file mode 100644
index 00000000..c9f57ad2
--- /dev/null
+++ b/src/frontend/src/features/rooms/livekit/components/controls/Options/TranscriptMenuItem.tsx
@@ -0,0 +1,60 @@
+import { RiRecordCircleLine, RiStopCircleLine } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { menuRecipe } from '@/primitives/menuRecipe'
+import { MenuItem } from 'react-aria-components'
+import {
+ RecordingMode,
+ useStartRecording,
+} from '@/features/rooms/api/startRecording'
+import { useStopRecording } from '@/features/rooms/api/stopRecording'
+import { useRoomContext } from '@livekit/components-react'
+import { useRoomData } from '@/features/rooms/livekit/hooks/useRoomData'
+
+export const TranscriptMenuItem = () => {
+ const { t } = useTranslation('rooms', { keyPrefix: 'options.items' })
+
+ const data = useRoomData()
+
+ const { mutateAsync: startRecordingRoom } = useStartRecording()
+ const { mutateAsync: stopRecordingRoom } = useStopRecording()
+
+ const room = useRoomContext()
+
+ const handleTranscript = async () => {
+ const roomId = data?.livekit?.room
+
+ if (!roomId) {
+ console.warn('No room ID found')
+ return
+ }
+
+ try {
+ if (room.isRecording) {
+ await stopRecordingRoom({ id: roomId })
+ } else {
+ await startRecordingRoom({ id: roomId, mode: RecordingMode.Transcript })
+ }
+ } catch (error) {
+ console.error('Failed to handle transcript:', error)
+ }
+ }
+
+ return (
+
+ )
+}
diff --git a/src/frontend/src/locales/de/rooms.json b/src/frontend/src/locales/de/rooms.json
index e4bab587..1531db47 100644
--- a/src/frontend/src/locales/de/rooms.json
+++ b/src/frontend/src/locales/de/rooms.json
@@ -79,7 +79,11 @@
"support": "",
"settings": "",
"username": "",
- "effects": ""
+ "effects": "",
+ "transcript": {
+ "start": "",
+ "stop": ""
+ }
}
},
"effects": {
diff --git a/src/frontend/src/locales/en/rooms.json b/src/frontend/src/locales/en/rooms.json
index d935af54..24d96555 100644
--- a/src/frontend/src/locales/en/rooms.json
+++ b/src/frontend/src/locales/en/rooms.json
@@ -78,7 +78,11 @@
"support": "Get Help on Tchap",
"settings": "Settings",
"username": "Update Your Name",
- "effects": "Apply effects"
+ "effects": "Apply effects",
+ "transcript": {
+ "start": "Start meeting transcription",
+ "stop": "Stop ongoing transcription"
+ }
}
},
"effects": {
diff --git a/src/frontend/src/locales/fr/rooms.json b/src/frontend/src/locales/fr/rooms.json
index c2a82eab..3c82c328 100644
--- a/src/frontend/src/locales/fr/rooms.json
+++ b/src/frontend/src/locales/fr/rooms.json
@@ -78,7 +78,11 @@
"support": "Obtenir de l'aide sur Tchap",
"settings": "Paramètres",
"username": "Choisir votre nom",
- "effects": "Appliquer des effets"
+ "effects": "Appliquer des effets",
+ "transcript": {
+ "start": "Démarrer la transcription",
+ "stop": "Arrêter la transcription en cours"
+ }
}
},
"effects": {