Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
NathanVss committed Dec 18, 2024
1 parent dc74709 commit 5b4420c
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 13 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@
import { Button } from '@/primitives'
import { useMediaDeviceSelect } from '@livekit/components-react'
import { RiCameraSwitchLine } from '@remixicon/react'
import { useState } from 'react'
import { ButtonProps } from 'react-aria-components'
import { useTranslation } from 'react-i18next'

enum FacingMode {
USER = 'user',
ENVIRONMENT = 'environment',
}

export const CameraSwitchButton = (props: Partial<ButtonProps>) => {
const { t } = useTranslation('rooms')

const { devices, activeDeviceId, setActiveMediaDevice } =
useMediaDeviceSelect({
kind: 'videoinput',
requestPermissions: true,
})

// getCapabilities type is not available.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const getDeviceFacingMode = (device: any): string[] => {
if (!device.getCapabilities) {
return []
}
const capabilities = device.getCapabilities()
if (!capabilities) {
return []
}
if (typeof capabilities.facingMode !== 'object') {
return []
}
return capabilities.facingMode
}

const detectCurrentFacingMode = (): FacingMode | null => {
console.log('detectCurrentFacingMode')
if (!activeDeviceId) {
return null
}
const activeDevice = devices.find(
(device) => device.deviceId === activeDeviceId
)
console.log('activeDevice', activeDevice, activeDeviceId)
if (!activeDevice) {
return null
}
const facingMode = getDeviceFacingMode(activeDevice)
console.log('facingMode', facingMode)
if (facingMode.indexOf(FacingMode.USER) >= 0) {
return FacingMode.USER
}
if (facingMode.indexOf(FacingMode.ENVIRONMENT) >= 0) {
return FacingMode.ENVIRONMENT
}
return null
}

const guessCurrentFacingMode = () => {
const facingMode = detectCurrentFacingMode()
if (facingMode) {
return facingMode
}
// We consider by default if we have no clue that the user camera is used.
return FacingMode.USER
}

const [facingMode, setFacingMode] = useState<FacingMode | null>(
guessCurrentFacingMode()
)

const getUserDevice = (
facingMode: FacingMode
): MediaDeviceInfo | undefined => {
return devices.find((device) => {
return getDeviceFacingMode(device).indexOf(facingMode) >= 0
})
}

const toggle = () => {
let target: FacingMode
if (facingMode === FacingMode.USER) {
target = FacingMode.ENVIRONMENT
} else {
target = FacingMode.USER
}
console.log('toggle', facingMode, 'target', target)
const device = getUserDevice(target)
console.log('device', device, device?.label, device?.kind)
if (device) {
setActiveMediaDevice(device.deviceId)
setFacingMode(target)
} else {
console.error('Cannot get user device with facingMode ' + target)
}
}

console.log('facingMode', facingMode)
console.log('detectCurrentFacingMode', detectCurrentFacingMode())
console.log('guessCurrentFacingMode', guessCurrentFacingMode())
console.log('getUserDevice(target) user', getUserDevice(FacingMode.USER))
console.log(
'getUserDevice(target) ENVIRONMENT',
getUserDevice(FacingMode.ENVIRONMENT)
)

return (
<Button
onPress={(e) => {
toggle()
props.onPress?.(e)
}}
variant="primaryTextDark"
aria-label={t('options.items.switch_camera')}
tooltip={t('options.items.switch_camera')}
description={true}
>
<RiCameraSwitchLine size={20} />
</Button>
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ export const SelectToggleDevice = <T extends ToggleSource>({
const trackProps = useTrackToggle(props)

const { devices, activeDeviceId, setActiveMediaDevice } =
useMediaDeviceSelect({ kind: config.kind })
useMediaDeviceSelect({ kind: config.kind, requestPermissions: true })

const selectLabel = t('choose', { keyPrefix: `join.${config.kind}` })

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { HandToggle } from '../../components/controls/HandToggle'
import { Button } from '@/primitives/Button'
import {
RiAccountBoxLine,
RiCameraSwitchLine,
RiMegaphoneLine,
RiMore2Line,
RiSettings3Line,
Expand All @@ -24,6 +23,7 @@ import { LinkButton } from '@/primitives'
import { useSettingsDialog } from '../../components/controls/SettingsDialogContext'
import { ResponsiveMenu } from './ResponsiveMenu'
import { TranscriptToggle } from '../../components/controls/TranscriptToggle'
import { CameraSwitchButton } from '../../components/controls/CameraSwitchButton'

export function MobileControlBar({
onDeviceError,
Expand Down Expand Up @@ -177,17 +177,7 @@ export function MobileControlBar({
>
<RiSettings3Line size={20} />
</Button>
<Button
onPress={() => {
setIsMenuOpened(false)
}}
variant="primaryTextDark"
aria-label={t('options.items.switch_camera')}
tooltip={t('options.items.switch_camera')}
description={true}
>
<RiCameraSwitchLine size={20} />
</Button>
<CameraSwitchButton onPress={() => setIsMenuOpened(false)} />
</div>
</div>
</ResponsiveMenu>
Expand Down

0 comments on commit 5b4420c

Please sign in to comment.