Use observables for more of the media devices logic
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user