Skip to content

Commit 1088980

Browse files
committed
[FIX] useMediaDevices hook
1 parent 52b42e9 commit 1088980

6 files changed

Lines changed: 24 additions & 9 deletions

File tree

packages/react-tools/README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@
116116
- [x] usePermission
117117
- [x] useMediaDevices
118118
- [x] useDisplayMedia
119-
- [ ] useScreenShare
120119
- [ ] useObservable — tracks latest value of an Observable
121120
- [ ] usePointerTouchSwipe (https://vueuse.org/core/usePointerSwipe/ https://vueuse.org/core/useSwipe/)
122121
- [ ] useWebWorker (https://vueuse.org/core/useWebWorker/)

packages/react-tools/src/hooks/useDisplayMedia.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import { useCallback, useMemo, useRef } from "react";
22
import { useMediaDevices, useSyncExternalStore } from ".";
3+
import { TDisplayMediaStreamOptions } from "../models";
34

45
/**
56
* **`useDisplayMedia`**: Hook to capture the contents of a display.
6-
* @returns {[MediaStream|undefined, (options: DisplayMediaStreamOptions | undefined) => Promise<void>, ()=>void]} result
7+
* @returns {[MediaStream|undefined, (options: TDisplayMediaStreamOptions | undefined) => Promise<void>, ()=>void]} result
78
* Array containing:
89
* - first element: the captured stream.
910
* - second element: function that starts capture.
1011
* - third element: function that stops capture.
1112
*/
12-
export const useDisplayMedia = (): [MediaStream | undefined, (options?: DisplayMediaStreamOptions) => Promise<void>, () => void] => {
13+
export const useDisplayMedia = (): [MediaStream | undefined, (options?: TDisplayMediaStreamOptions) => Promise<void>, () => void] => {
1314
const action = useMediaDevices("DisplayCapture");
1415
const streamRef = useRef<MediaStream>();
1516
const notifyRef = useRef<() => void>();
1617

17-
const start = useCallback((options?: DisplayMediaStreamOptions) => action(options).then(stream => {
18+
const start = useCallback((options?: TDisplayMediaStreamOptions) => action(options).then(stream => {
1819
streamRef.current = stream;
1920
notifyRef.current && notifyRef.current();
2021
}), [action]);

packages/react-tools/src/hooks/useMediaDevices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useRef } from "react"
22
import { useEffectOnce } from ".";
3-
import { UseMediaDevicesProps, UseMediaDevicesResult } from "../models";
3+
import { TDisplayMediaStreamOptions, UseMediaDevicesProps, UseMediaDevicesResult } from "../models";
44

55
let mediaDevicesOnChangeAttached = false;
66
const mediaDevicesListeners = new Set<(evt: Event) => Promise<void> | void>();
@@ -63,7 +63,7 @@ function useMediaDevices(action: UseMediaDevicesProps): UseMediaDevicesResult {
6363
return navigator.mediaDevices.getSupportedConstraints()
6464
});
6565

66-
const getDisplay = useRef((options?: DisplayMediaStreamOptions, onDevicesChange?: (evt: Event) => Promise<void> | void) => {
66+
const getDisplay = useRef((options?: TDisplayMediaStreamOptions, onDevicesChange?: (evt: Event) => Promise<void> | void) => {
6767
if (!navigator.mediaDevices?.getDisplayMedia) {
6868
throw Error("getDisplay not supported");
6969
}

packages/react-tools/src/index.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ export type {
7272
TPermissionName,
7373
UsePermissionResult,
7474
UseMediaDevicesProps,
75-
UseMediaDevicesResult
75+
UseMediaDevicesResult,
76+
TDisplayMediaStreamOptions,
77+
CaptureController
7678
} from './models'
7779

7880
export {

packages/react-tools/src/models/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,5 @@ export type { UseAudioProps, UseAudioResult } from './useAudio.model';
2222
export type { UseVideoProps, UseVideoResult } from './useVideo.model';
2323
export type { UseEventSourceProps, UseEventSourceResult } from './useEventSource.model';
2424
export type { UseWebSocketProps, UseWebSocketResult } from './useWebSocket.model';
25-
export type { UseMediaDevicesProps, UseMediaDevicesResult } from './useMediaDevices.model';
25+
export type { UseMediaDevicesProps, UseMediaDevicesResult, TDisplayMediaStreamOptions, CaptureController } from './useMediaDevices.model';
2626
export type { TPermissionName, UsePermissionResult, TPermissionState} from './usePermission.model';
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
11
export type UseMediaDevicesProps = "devicesList" | "supportedConstraintsList" | "DisplayCapture" | "mediaInputCapture";
22

3-
export type UseMediaDevicesResult = ((onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaDeviceInfo[]>) | ((onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => MediaTrackSupportedConstraints) | ((options?: DisplayMediaStreamOptions, onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaStream>) | ((constraints?: MediaStreamConstraints, onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaStream>);
3+
export type UseMediaDevicesResult = ((onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaDeviceInfo[]>) | ((onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => MediaTrackSupportedConstraints) | ((options?: DisplayMediaStreamOptions, onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaStream>) | ((constraints?: MediaStreamConstraints, onDevicesChange?: ((evt: Event) => void | Promise<void>) | undefined) => Promise<MediaStream>);
4+
5+
/**The CaptureController interface provides methods that can be used to further manipulate a capture session separate from its initiation via MediaDevices.getDisplayMedia().*/
6+
export interface CaptureController {
7+
/**controls whether the captured tab or window will be focused when an associated MediaDevices.getDisplayMedia() Promise fulfills, or whether the focus will remain with the tab containing the capturing app.*/
8+
setFocusBehavior: (
9+
/**An enumerated value that describes whether the user agent should transfer focus to the captured display surface, or keep the capturing app focused. Possible values are focus-captured-surface (transfer focus) and no-focus-change (keep focus on the capturing app).*/
10+
focusBehavior: "focus-captured-surface" | "no-focus-change"
11+
) => void;
12+
}
13+
14+
export type TDisplayMediaStreamOptions = DisplayMediaStreamOptions & {
15+
controller?: CaptureController;
16+
}

0 commit comments

Comments
 (0)