blob: d432c56a7fca55770545483f262cb11607f35a01 [file] [log] [blame]
Charliec2c012f2022-10-05 14:09:28 -04001/*
2 * Copyright (C) 2022 Savoir-faire Linux Inc.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License as
6 * published by the Free Software Foundation; either version 3 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU Affero General Public License for more details.
13 *
14 * You should have received a copy of the GNU Affero General Public
15 * License along with this program. If not, see
16 * <https://www.gnu.org/licenses/>.
17 */
simon1170c322022-10-31 14:51:31 -040018import { Dispatch, ReactNode, SetStateAction } from 'react';
Charliec2c012f2022-10-05 14:09:28 -040019
20export type WithChildren = {
21 children: ReactNode;
22};
simon1170c322022-10-31 14:51:31 -040023
simon1e2bf342022-12-02 12:19:40 -050024type AsyncDispatch<A> = (value: A) => Promise<void>;
simon1170c322022-10-31 14:51:31 -040025export type SetState<T> = Dispatch<SetStateAction<T>>;
simon1e2bf342022-12-02 12:19:40 -050026export type AsyncSetState<T> = AsyncDispatch<SetStateAction<T>>;
simon571240f2022-11-29 23:59:27 -050027
28/**
29 * HTMLVideoElement with the `sinkId` and `setSinkId` optional properties.
30 *
31 * These properties are defined only on supported browsers
32 * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId#browser_compatibility
33 */
34export interface VideoElementWithSinkId extends HTMLVideoElement {
35 sinkId?: string;
36 setSinkId?: (deviceId: string) => void;
37}
simon5c677962022-12-02 16:51:54 -050038
39export type PartialNotOptional<T> = {
40 [P in keyof T]: T[P] | undefined;
41};
42
43export const isRequired = <T>(obj: Partial<T>): obj is T => {
44 return Object.values(obj).every((v) => v !== undefined);
45};
idillon989d6542023-01-30 15:49:58 -050046
47export type Listener = () => void;
Ziwei Wang45baf532023-02-16 15:41:49 -050048
49export function debounce<T extends any[]>(fn: (...args: T) => void, timeout = 1000) {
50 let timeoutId: ReturnType<typeof setTimeout>;
51 return (...args: T) => {
52 clearTimeout(timeoutId);
53 timeoutId = setTimeout(() => {
54 fn(...args);
55 }, timeout);
56 };
57}