// Copyright 2025 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only import React, { useCallback } from 'react'; import { Modal } from './Modal'; import type { LocalizerType } from '../types/Util'; import { missingCaseError } from '../util/missingCaseError'; import { Button } from './Button'; export type PropsType = { i18n: LocalizerType; mediaType: 'camera' | 'microphone'; requestor: 'call' | 'voiceNote'; openSystemMediaPermissions: (mediaType: 'camera' | 'microphone') => void; onClose: () => void; }; export function MediaPermissionsModal({ i18n, mediaType, requestor, openSystemMediaPermissions, onClose, }: PropsType): JSX.Element { let title: string; if (mediaType === 'camera') { title = i18n('icu:MediaPermissionsModal__title--camera'); } else if (mediaType === 'microphone') { title = i18n('icu:MediaPermissionsModal__title--microphone'); } else { throw missingCaseError(mediaType); } let subtitle: string; if (requestor === 'call') { if (mediaType === 'camera') { subtitle = i18n('icu:MediaPermissionsModal__subtitle--call--camera'); } else if (mediaType === 'microphone') { subtitle = i18n('icu:MediaPermissionsModal__subtitle--call'); } else { throw missingCaseError(mediaType); } } else if (requestor === 'voiceNote') { subtitle = i18n('icu:MediaPermissionsModal__subtitle--voice-note'); } else { throw missingCaseError(requestor); } const onClick = useCallback( () => openSystemMediaPermissions(mediaType), [openSystemMediaPermissions, mediaType] ); return (

{title}

{subtitle}

  1. {i18n('icu:MediaPermissionsModal__step-1', { buttonName: i18n('icu:MediaPermissionsModal__open'), })}
  2. {i18n('icu:MediaPermissionsModal__step-2')}
); }