Use observables for more of the media devices logic

This commit is contained in:
Robin
2024-12-13 15:37:29 -05:00
parent de276b1fc3
commit f9e3fe3176

View File

@@ -16,7 +16,7 @@ import {
useState, useState,
} from "react"; } from "react";
import { createMediaDeviceObserver } from "@livekit/components-core"; import { createMediaDeviceObserver } from "@livekit/components-core";
import { startWith } from "rxjs"; import { map, startWith } from "rxjs";
import { useObservableEagerState } from "observable-hooks"; import { useObservableEagerState } from "observable-hooks";
import { logger } from "matrix-js-sdk/src/logger"; import { logger } from "matrix-js-sdk/src/logger";
@@ -83,8 +83,11 @@ function useMediaDevice(
).pipe(startWith([])), ).pipe(startWith([])),
[kind, requestPermissions], [kind, requestPermissions],
); );
const availableRaw = useObservableEagerState(deviceObserver); const available = useObservableEagerState(
const available = useMemo(() => { useMemo(
() =>
deviceObserver.pipe(
map((availableRaw) => {
// Sometimes browsers (particularly Firefox) can return multiple device // Sometimes browsers (particularly Firefox) can return multiple device
// entries for the exact same device ID; using a map deduplicates them // entries for the exact same device ID; using a map deduplicates them
let available = new Map<string, DeviceLabel>( let available = new Map<string, DeviceLabel>(
@@ -112,7 +115,11 @@ function useMediaDevice(
// entirely, because requesting a media stream from deviceId "" won't // entirely, because requesting a media stream from deviceId "" won't
// automatically track the default device. // automatically track the default device.
return available; return available;
}, [kind, availableRaw]); }),
),
[kind, deviceObserver],
),
);
const [preferredId, select] = useSetting(setting); const [preferredId, select] = useSetting(setting);
const selectedId = useMemo(() => { const selectedId = useMemo(() => {
@@ -130,9 +137,17 @@ function useMediaDevice(
} }
return undefined; return undefined;
}, [available, preferredId]); }, [available, preferredId]);
const selectedGroupId = useMemo( const selectedGroupId = useObservableEagerState(
() => availableRaw.find((d) => d.deviceId === selectedId)?.groupId, useMemo(
[availableRaw, selectedId], () =>
deviceObserver.pipe(
map(
(availableRaw) =>
availableRaw.find((d) => d.deviceId === selectedId)?.groupId,
),
),
[deviceObserver, selectedId],
),
); );
return useMemo( return useMemo(