diff --git a/src/frontend/src/features/rooms/components/Conference.tsx b/src/frontend/src/features/rooms/components/Conference.tsx
index 093d3af4..b99ec661 100644
--- a/src/frontend/src/features/rooms/components/Conference.tsx
+++ b/src/frontend/src/features/rooms/components/Conference.tsx
@@ -1,4 +1,4 @@
-import { useEffect, useMemo, useState } from 'react'
+import { useMemo, useState } from 'react'
import { useQuery } from '@tanstack/react-query'
import { useTranslation } from 'react-i18next'
import {
@@ -9,7 +9,6 @@ import {
import { Room, RoomOptions } from 'livekit-client'
import { keys } from '@/api/queryKeys'
import { queryClient } from '@/api/queryClient'
-import { navigateTo } from '@/navigation/navigateTo'
import { Screen } from '@/layout/Screen'
import { QueryAware } from '@/components/QueryAware'
import { ErrorScreen } from '@/components/ErrorScreen'
@@ -79,25 +78,6 @@ export const Conference = ({
const [showInviteDialog, setShowInviteDialog] = useState(mode === 'create')
- /**
- * checks for actual click on the leave button instead of
- * relying on LiveKitRoom onDisconnected because onDisconnected
- * triggers even on page reload, it's not a user "onLeave" event really.
- * Here we want to react to the user actually deciding to leave.
- */
- useEffect(() => {
- const checkOnLeaveClick = (event: MouseEvent) => {
- const target = event.target as HTMLElement
- if (target.classList.contains('lk-disconnect-button')) {
- navigateTo('feedback')
- }
- }
- document.body.addEventListener('click', checkOnLeaveClick)
- return () => {
- document.body.removeEventListener('click', checkOnLeaveClick)
- }
- }, [])
-
const { t } = useTranslation('rooms')
if (isCreateError) {
// this error screen should be replaced by a proper waiting room for anonymous user.
diff --git a/src/frontend/src/features/rooms/livekit/components/controls/LeaveButton.tsx b/src/frontend/src/features/rooms/livekit/components/controls/LeaveButton.tsx
new file mode 100644
index 00000000..600dbf7e
--- /dev/null
+++ b/src/frontend/src/features/rooms/livekit/components/controls/LeaveButton.tsx
@@ -0,0 +1,36 @@
+import { useConnectionState, useRoomContext } from '@livekit/components-react'
+import { Button } from '@/primitives'
+import { navigateTo } from '@/navigation/navigateTo'
+import { RiPhoneFill } from '@remixicon/react'
+import { useTranslation } from 'react-i18next'
+import { ConnectionState } from 'livekit-client'
+
+export const LeaveButton = () => {
+ const { t } = useTranslation('rooms', { keyPrefix: 'controls' })
+ const room = useRoomContext()
+ const connectionState = useConnectionState(room)
+ return (
+
+ )
+}
diff --git a/src/frontend/src/features/rooms/livekit/prefabs/ControlBar.tsx b/src/frontend/src/features/rooms/livekit/prefabs/ControlBar.tsx
index c60eb1dc..7fc24085 100644
--- a/src/frontend/src/features/rooms/livekit/prefabs/ControlBar.tsx
+++ b/src/frontend/src/features/rooms/livekit/prefabs/ControlBar.tsx
@@ -4,8 +4,6 @@ import * as React from 'react'
import { supportsScreenSharing } from '@livekit/components-core'
import {
- DisconnectButton,
- LeaveIcon,
TrackToggle,
useMaybeLayoutContext,
usePersistentUserChoices,
@@ -16,10 +14,11 @@ import { StartMediaButton } from '../components/controls/StartMediaButton'
import { useMediaQuery } from '../hooks/useMediaQuery'
import { useTranslation } from 'react-i18next'
import { OptionsButton } from '../components/controls/Options/OptionsButton'
-import { ParticipantsToggle } from '@/features/rooms/livekit/components/controls/Participants/ParticipantsToggle'
-import { ChatToggle } from '@/features/rooms/livekit/components/controls/ChatToggle'
-import { HandToggle } from '@/features/rooms/livekit/components/controls/HandToggle'
-import { SelectToggleDevice } from '@/features/rooms/livekit/components/controls/SelectToggleDevice'
+import { ParticipantsToggle } from '../components/controls/Participants/ParticipantsToggle'
+import { ChatToggle } from '../components/controls/ChatToggle'
+import { HandToggle } from '../components/controls/HandToggle'
+import { SelectToggleDevice } from '../components/controls/SelectToggleDevice'
+import { LeaveButton } from '../components/controls/LeaveButton'
/** @public */
export type ControlBarControls = {
@@ -168,10 +167,7 @@ export function ControlBar({
-
- {showIcon && }
- {showText && t('controls.leave')}
-
+
)