✨(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:
committed by
aleb_the_flash
parent
b4b4ff79d9
commit
2d393f9f70
@@ -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>
|
||||||
|
|||||||
@@ -197,6 +197,7 @@
|
|||||||
"disable": ""
|
"disable": ""
|
||||||
},
|
},
|
||||||
"effects": "",
|
"effects": "",
|
||||||
"muteParticipant": ""
|
"muteParticipant": "",
|
||||||
|
"fullScreen": ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user