🚸(frontend) improve share screen UX
Enhanced the share screen button by adding a tooltip and improving contrast for better accessibility. Created a temporary icon by combining two from Remix, but it’s bulky and will need refactoring soon.
This commit is contained in:
committed by
aleb_the_flash
parent
c51058e6ac
commit
31051cd6c4
@@ -0,0 +1,54 @@
|
|||||||
|
import { Div, ToggleButton } from '@/primitives'
|
||||||
|
import { RiArrowUpLine, RiCloseFill, RiRectangleLine } from '@remixicon/react'
|
||||||
|
import { useTranslation } from 'react-i18next'
|
||||||
|
import { useTrackToggle, UseTrackToggleProps } from '@livekit/components-react'
|
||||||
|
import { Track } from 'livekit-client'
|
||||||
|
import React from 'react'
|
||||||
|
|
||||||
|
export const ScreenShareToggle = (
|
||||||
|
props: Omit<
|
||||||
|
UseTrackToggleProps<Track.Source.ScreenShare>,
|
||||||
|
'source' | 'captureOptions'
|
||||||
|
>
|
||||||
|
) => {
|
||||||
|
const { t } = useTranslation('rooms', { keyPrefix: 'controls' })
|
||||||
|
const { buttonProps, enabled } = useTrackToggle({
|
||||||
|
...props,
|
||||||
|
source: Track.Source.ScreenShare,
|
||||||
|
captureOptions: { audio: true, selfBrowserSurface: 'include' },
|
||||||
|
})
|
||||||
|
|
||||||
|
const Icon = enabled ? RiCloseFill : RiArrowUpLine
|
||||||
|
|
||||||
|
// fixme - remove ToggleButton custom styles when we design a proper icon
|
||||||
|
return (
|
||||||
|
<ToggleButton
|
||||||
|
isSelected={enabled}
|
||||||
|
square
|
||||||
|
legacyStyle
|
||||||
|
tooltip={t(enabled ? 'stopScreenShare' : 'shareScreen')}
|
||||||
|
onPress={(e) =>
|
||||||
|
buttonProps.onClick?.(
|
||||||
|
e as unknown as React.MouseEvent<HTMLButtonElement, MouseEvent>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
style={{
|
||||||
|
maxWidth: '46px',
|
||||||
|
maxHeight: '46px',
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<Div position="relative">
|
||||||
|
<RiRectangleLine size={28} />
|
||||||
|
<Icon
|
||||||
|
size={16}
|
||||||
|
style={{
|
||||||
|
position: 'absolute',
|
||||||
|
top: '50%',
|
||||||
|
left: '50%',
|
||||||
|
transform: 'translate(-50%, -50%)',
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
</Div>
|
||||||
|
</ToggleButton>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -4,7 +4,6 @@ import * as React from 'react'
|
|||||||
import { supportsScreenSharing } from '@livekit/components-core'
|
import { supportsScreenSharing } from '@livekit/components-core'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
TrackToggle,
|
|
||||||
useMaybeLayoutContext,
|
useMaybeLayoutContext,
|
||||||
usePersistentUserChoices,
|
usePersistentUserChoices,
|
||||||
} from '@livekit/components-react'
|
} from '@livekit/components-react'
|
||||||
@@ -12,13 +11,13 @@ import {
|
|||||||
import { mergeProps } from '@/utils/mergeProps.ts'
|
import { mergeProps } from '@/utils/mergeProps.ts'
|
||||||
import { StartMediaButton } from '../components/controls/StartMediaButton'
|
import { StartMediaButton } from '../components/controls/StartMediaButton'
|
||||||
import { useMediaQuery } from '../hooks/useMediaQuery'
|
import { useMediaQuery } from '../hooks/useMediaQuery'
|
||||||
import { useTranslation } from 'react-i18next'
|
|
||||||
import { OptionsButton } from '../components/controls/Options/OptionsButton'
|
import { OptionsButton } from '../components/controls/Options/OptionsButton'
|
||||||
import { ParticipantsToggle } from '../components/controls/Participants/ParticipantsToggle'
|
import { ParticipantsToggle } from '../components/controls/Participants/ParticipantsToggle'
|
||||||
import { ChatToggle } from '../components/controls/ChatToggle'
|
import { ChatToggle } from '../components/controls/ChatToggle'
|
||||||
import { HandToggle } from '../components/controls/HandToggle'
|
import { HandToggle } from '../components/controls/HandToggle'
|
||||||
import { SelectToggleDevice } from '../components/controls/SelectToggleDevice'
|
import { SelectToggleDevice } from '../components/controls/SelectToggleDevice'
|
||||||
import { LeaveButton } from '../components/controls/LeaveButton'
|
import { LeaveButton } from '../components/controls/LeaveButton'
|
||||||
|
import { ScreenShareToggle } from '../components/controls/ScreenShareToggle'
|
||||||
|
|
||||||
/** @public */
|
/** @public */
|
||||||
export type ControlBarControls = {
|
export type ControlBarControls = {
|
||||||
@@ -66,7 +65,6 @@ export function ControlBar({
|
|||||||
onDeviceError,
|
onDeviceError,
|
||||||
...props
|
...props
|
||||||
}: ControlBarProps) {
|
}: ControlBarProps) {
|
||||||
const { t } = useTranslation('rooms', { keyPrefix: 'controls' })
|
|
||||||
const [isChatOpen, setIsChatOpen] = React.useState(false)
|
const [isChatOpen, setIsChatOpen] = React.useState(false)
|
||||||
const layoutContext = useMaybeLayoutContext()
|
const layoutContext = useMaybeLayoutContext()
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
@@ -82,26 +80,8 @@ export function ControlBar({
|
|||||||
const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose'
|
const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose'
|
||||||
variation ??= defaultVariation
|
variation ??= defaultVariation
|
||||||
|
|
||||||
const showIcon = React.useMemo(
|
|
||||||
() => variation === 'minimal' || variation === 'verbose',
|
|
||||||
[variation]
|
|
||||||
)
|
|
||||||
const showText = React.useMemo(
|
|
||||||
() => variation === 'textOnly' || variation === 'verbose',
|
|
||||||
[variation]
|
|
||||||
)
|
|
||||||
|
|
||||||
const browserSupportsScreenSharing = supportsScreenSharing()
|
const browserSupportsScreenSharing = supportsScreenSharing()
|
||||||
|
|
||||||
const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false)
|
|
||||||
|
|
||||||
const onScreenShareChange = React.useCallback(
|
|
||||||
(enabled: boolean) => {
|
|
||||||
setIsScreenShareEnabled(enabled)
|
|
||||||
},
|
|
||||||
[setIsScreenShareEnabled]
|
|
||||||
)
|
|
||||||
|
|
||||||
const htmlProps = mergeProps({ className: 'lk-control-bar' }, props)
|
const htmlProps = mergeProps({ className: 'lk-control-bar' }, props)
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@@ -146,18 +126,11 @@ export function ControlBar({
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
{browserSupportsScreenSharing && (
|
{browserSupportsScreenSharing && (
|
||||||
<TrackToggle
|
<ScreenShareToggle
|
||||||
source={Track.Source.ScreenShare}
|
|
||||||
captureOptions={{ audio: true, selfBrowserSurface: 'include' }}
|
|
||||||
showIcon={showIcon}
|
|
||||||
onChange={onScreenShareChange}
|
|
||||||
onDeviceError={(error) =>
|
onDeviceError={(error) =>
|
||||||
onDeviceError?.({ source: Track.Source.ScreenShare, error })
|
onDeviceError?.({ source: Track.Source.ScreenShare, error })
|
||||||
}
|
}
|
||||||
>
|
/>
|
||||||
{showText &&
|
|
||||||
t(isScreenShareEnabled ? 'stopScreenShare' : 'shareScreen')}
|
|
||||||
</TrackToggle>
|
|
||||||
)}
|
)}
|
||||||
<HandToggle />
|
<HandToggle />
|
||||||
<ChatToggle />
|
<ChatToggle />
|
||||||
|
|||||||
Reference in New Issue
Block a user