import React from 'react'; import { StyleProp, ViewStyle } from 'react-native'; import { ModifyDisplaySettingsOptions, ModifyDisplaySettingsParameters } from '../../methods/displaySettingsMethods/modifyDisplaySettings'; /** * Configuration parameters for `DisplaySettingsModal`. * * @interface DisplaySettingsModalParameters * @extends ModifyDisplaySettingsParameters * * **Display Configuration:** * @property {string} meetingDisplayType Current display mode (`'video'`, `'media'`, `'all'`). * @property {boolean} autoWave Whether participant auto-wave animations are enabled. * @property {boolean} forceFullDisplay Forces full-screen display mode when true. * @property {boolean} meetingVideoOptimized Indicates if video rendering is optimized for performance. */ export interface DisplaySettingsModalParameters extends ModifyDisplaySettingsParameters { meetingDisplayType: string; autoWave: boolean; forceFullDisplay: boolean; meetingVideoOptimized: boolean; } /** * Configuration options for the `DisplaySettingsModal` component. * * @interface DisplaySettingsModalOptions * * **Modal Control:** * @property {boolean} isDisplaySettingsModalVisible Toggles modal visibility. * @property {() => void} onDisplaySettingsClose Invoked when the settings modal should close. * * **Settings Handler:** * @property {(options: ModifyDisplaySettingsOptions) => Promise} [onModifyDisplaySettings=modifyDisplaySettings] * Custom handler for persisting updated display settings. * * **State Parameters:** * @property {DisplaySettingsModalParameters} parameters Current display configuration state. * * **Customization:** * @property {'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'} [position='topRight'] Preferred modal anchor location. * @property {string} [backgroundColor='#83c0e9'] Modal background color. * @property {StyleProp} [style] Additional styling applied to the modal container. * * **Advanced Render Overrides:** * @property {(options: { defaultContent: JSX.Element; dimensions: { width: number; height: number } }) => JSX.Element} [renderContent] * Override for the default content layout. * @property {(options: { defaultContainer: JSX.Element; dimensions: { width: number; height: number } }) => JSX.Element} [renderContainer] * Override for the outer modal container. */ export interface DisplaySettingsModalOptions { isDisplaySettingsModalVisible: boolean; onDisplaySettingsClose: () => void; onModifyDisplaySettings?: (options: ModifyDisplaySettingsOptions) => Promise; parameters: DisplaySettingsModalParameters; position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'; backgroundColor?: string; style?: StyleProp; renderContent?: (options: { defaultContent: JSX.Element; dimensions: { width: number; height: number; }; }) => JSX.Element; renderContainer?: (options: { defaultContainer: JSX.Element; dimensions: { width: number; height: number; }; }) => JSX.Element; } export type DisplaySettingsModalType = (options: DisplaySettingsModalOptions) => JSX.Element; /** * DisplaySettingsModal centralizes MediaSFU meeting display preferences in a compact, accessible modal. * It supports rapid toggling of audiographs, full-screen overrides, and video optimization, and exposes * convenient render overrides for advanced UI customization. * * ### Key Features * - Connects directly to `modifyDisplaySettings` to persist layout changes. * - Provides toggles for auto-wave animations, force display, and video prioritization. * - Supports anchored positioning (`topRight`, `topLeft`, `bottomRight`, `bottomLeft`). * - Allows render overrides for both the modal container and internal content. * * ### Accessibility * - Switch interactions are wrapped in `Pressable` components with accessibility roles and labels. * - Close button exposes assistive text and supports keyboard/screen-reader activation. * * @param {DisplaySettingsModalOptions} props Configuration options controlling modal visibility, styling, and handlers. * * @example Basic usage toggling display options within a meeting controller. * ```tsx * import React, { useState } from 'react'; * import { View, Button } from 'react-native'; * import { DisplaySettingsModal } from 'mediasfu-reactnative'; * * export function MeetingControls() { * const [visible, setVisible] = useState(false); * * return ( * *