UNPKG

@daily-co/daily-react

Version:

Daily React makes it easier to integrate [@daily-co/daily-js](https://www.npmjs.com/package/@daily-co/daily-js) in React applications.

78 lines (67 loc) 2.35 kB
import { DailyCpuLoadStats, DailyEventObject } from '@daily-co/daily-js'; import deepEqual from 'fast-deep-equal'; import { atom, useAtomValue } from 'jotai'; import { useAtomCallback } from 'jotai/utils'; import { useCallback, useDebugValue, useEffect } from 'react'; import { jotaiDebugLabel } from '../lib/jotai-custom'; import { useDaily } from './useDaily'; import { useDailyEvent } from './useDailyEvent'; import { useMeetingState } from './useMeetingState'; interface CPULoad { state: DailyCpuLoadStats['cpuLoadState']; reason: DailyCpuLoadStats['cpuLoadStateReason']; } const CPULoadState = atom<CPULoad>({ state: 'low', reason: 'none', }); CPULoadState.debugLabel = jotaiDebugLabel('cpu-load'); interface Props { onCPULoadChange?(ev: DailyEventObject<'cpu-load-change'>): void; } /** * Returns the current CPU load as reported by daily-js [cpu-load-change](https://docs.daily.co/reference/daily-js/events/quality-events#cpu-load-change) events * and [getCpuLoadStats](https://docs.daily.co/reference/daily-js/instance-methods/get-cpu-load-stats). */ export const useCPULoad = ({ onCPULoadChange }: Props = {}) => { const cpu = useAtomValue(CPULoadState); const daily = useDaily(); const meetingState = useMeetingState(); const updateCPULoadState = useAtomCallback( useCallback((get, set, cpu: CPULoad) => { const prev = get(CPULoadState); // Get the current CPU load state if (deepEqual(prev, cpu)) return; // Check if the previous state is equal to the current one set(CPULoadState, cpu); // Update the state if different }, []) ); useEffect(() => { let mounted = true; if (!daily || daily.isDestroyed() || meetingState !== 'joined-meeting') return; daily.getCpuLoadStats().then((stats) => { if (!mounted) return; updateCPULoadState({ state: stats.cpuLoadState, reason: stats.cpuLoadStateReason, }); }); return () => { mounted = false; }; }, [daily, meetingState, updateCPULoadState]); useDailyEvent( 'cpu-load-change', useCallback( (ev) => { updateCPULoadState({ state: ev.cpuLoadState, reason: ev.cpuLoadStateReason, }); onCPULoadChange?.(ev); }, [onCPULoadChange, updateCPULoadState] ) ); useDebugValue(cpu); return cpu; };