projects/deliberation_at_scale/packages/frontend/hooks/useLocalMedia.tsx (45 lines of code) (raw):

'use client'; import { LocalMediaContext } from '@/components/LocalMedia/context'; import { PermissionState, setPermissionState } from '@/state/slices/room'; import { useAppDispatch, useAppSelector } from '@/state/store'; import { usePathname } from 'next/navigation'; import { useContext, useEffect, useMemo } from 'react'; import useLocalizedPush from './useLocalizedPush'; import { useLanguage } from './useLanguage'; export interface UseLocalMediaOptions { request: boolean; redirect: boolean; } const defaultUseLocalMediaOptions: UseLocalMediaOptions = { /** When permissions are missing, request them from the user. This will * cause a permission pop up to appear in the user's browser. */ request: true, /** When permissions are missing, */ redirect: true, }; export type UseLocalMedia = LocalMediaContext | { state: null, actions: null, _ref: null }; /** * Retrieve the state for the current local media. */ export function useLocalMedia(): LocalMediaContext; export function useLocalMedia(options: Partial<UseLocalMediaOptions>): UseLocalMedia; export function useLocalMedia(options: Partial<UseLocalMediaOptions> = {}) { const { request, redirect, } = useMemo(() => Object.assign({}, defaultUseLocalMediaOptions, options), [options]); const ctx = useContext(LocalMediaContext); const permission = useAppSelector((state) => state.room.permission); const dispatch = useAppDispatch(); const { push } = useLocalizedPush(); const pathname = usePathname(); const language = useLanguage(); const pathnameWithoutLocale = pathname?.replace(`/${language}/`, '/'); useEffect(() => { if (permission === PermissionState.NONE) { if (redirect) { push(`/lobby/permission?redirect=${pathnameWithoutLocale}`); } if (request) { dispatch(setPermissionState(PermissionState.REQUESTED)); } } }, [permission, redirect, request, dispatch, pathnameWithoutLocale, push]); // GUARD: Check that the context provider is somewhere in the tree if (!ctx) { return { state: null, actions: null, _ref: null }; } return ctx; }