(frontend) add controls for full screen screenshare

Requested by several users.
Inspired by Jitsi.

Yet imperfect implementation. Controls on video element of
a screenshare should be disabled.
This commit is contained in:
lebaudantoine
2025-02-01 15:05:55 +01:00
committed by aleb_the_flash
parent b4b4ff79d9
commit 2d393f9f70
4 changed files with 48 additions and 7 deletions

View File

@@ -2,6 +2,7 @@ import { css } from '@/styled-system/css'
import { HStack } from '@/styled-system/jsx' import { HStack } from '@/styled-system/jsx'
import { Button } from '@/primitives' import { Button } from '@/primitives'
import { import {
RiFullscreenLine,
RiImageCircleAiFill, RiImageCircleAiFill,
RiMicLine, RiMicLine,
RiMicOffLine, RiMicOffLine,
@@ -15,11 +16,39 @@ import {
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { TrackReferenceOrPlaceholder } from '@livekit/components-core' import { TrackReferenceOrPlaceholder } from '@livekit/components-core'
import { useEffect, useState } from 'react' import { useEffect, useState } from 'react'
import { useSidePanel } from '@/features/rooms/livekit/hooks/useSidePanel' import { useSidePanel } from '../hooks/useSidePanel'
import { useFullScreen } from '../hooks/useFullScreen'
import { Participant, Track } from 'livekit-client' import { Participant, Track } from 'livekit-client'
import { MuteAlertDialog } from './MuteAlertDialog' import { MuteAlertDialog } from './MuteAlertDialog'
import { useMuteParticipant } from '../api/muteParticipant' import { useMuteParticipant } from '../api/muteParticipant'
const ZoomButton = ({
trackRef,
}: {
trackRef: TrackReferenceOrPlaceholder
}) => {
const { t } = useTranslation('rooms', { keyPrefix: 'participantTileFocus' })
const { toggleFullScreen, isFullscreenAvailable } = useFullScreen({
trackRef,
})
if (!isFullscreenAvailable) {
return
}
return (
<Button
size="sm"
variant="primaryTextDark"
square
tooltip={t('fullScreen')}
onPress={() => toggleFullScreen()}
>
<RiFullscreenLine />
</Button>
)
}
const FocusButton = ({ const FocusButton = ({
trackRef, trackRef,
}: { }: {
@@ -118,6 +147,9 @@ export const ParticipantTileFocus = ({
const participant = trackRef.participant const participant = trackRef.participant
const isScreenShare = trackRef.source == Track.Source.ScreenShare
const isLocal = trackRef.participant.isLocal
return ( return (
<div <div
className={css({ className={css({
@@ -157,10 +189,16 @@ export const ParticipantTileFocus = ({
})} })}
> >
<FocusButton trackRef={trackRef} /> <FocusButton trackRef={trackRef} />
{participant.isLocal ? ( {!isScreenShare ? (
<EffectsButton /> <>
{participant.isLocal ? (
<EffectsButton />
) : (
<MuteButton participant={participant} />
)}
</>
) : ( ) : (
<MuteButton participant={participant} /> !isLocal && <ZoomButton trackRef={trackRef} />
)} )}
</HStack> </HStack>
</div> </div>

View File

@@ -197,6 +197,7 @@
"disable": "" "disable": ""
}, },
"effects": "", "effects": "",
"muteParticipant": "" "muteParticipant": "",
"fullScreen": ""
} }
} }

View File

@@ -196,6 +196,7 @@
"disable": "Unpin" "disable": "Unpin"
}, },
"effects": "Apply visual effects", "effects": "Apply visual effects",
"muteParticipant": "Mute {{name}}" "muteParticipant": "Mute {{name}}",
"fullScreen": "Full screen"
} }
} }

View File

@@ -196,6 +196,7 @@
"disable": "Annuler l'épinglage" "disable": "Annuler l'épinglage"
}, },
"effects": "Appliquer des effets", "effects": "Appliquer des effets",
"muteParticipant": "Couper le micro de {{name}}" "muteParticipant": "Couper le micro de {{name}}",
"fullScreen": "Plein écran"
} }
} }