import React, { useEffect, useState } from 'react'; import { createPortal } from 'react-dom'; import { ipcChannels } from '../../shared/ipc/contracts'; import type { DisplayInfo, PresentationSettings } from '../../shared/types/presentationSettings'; import { getDndApi } from '../shared/dndApi'; import { Button } from '../shared/ui/controls'; import styles from './EditorApp.module.css'; import { useEditorI18n } from './i18n/EditorI18nContext'; import modalStyles from './PresentationSettingsModal.module.css'; export function PresentationSettingsModal({ open, onClose, }: { open: boolean; onClose: () => void; }) { const { t } = useEditorI18n(); const api = getDndApi(); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [displays, setDisplays] = useState([]); const [draft, setDraft] = useState({ displayId: null, fullScreen: true }); useEffect(() => { if (!open) return; let cancelled = false; setLoading(true); void (async () => { try { const [{ displays: list }, { settings }] = await Promise.all([ api.invoke(ipcChannels.windows.listDisplays, {}), api.invoke(ipcChannels.preferences.getPresentation, {}), ]); if (cancelled) return; setDisplays(list); setDraft(settings); } finally { if (!cancelled) setLoading(false); } })(); return () => { cancelled = true; }; }, [api, open]); if (!open) return null; const save = async () => { setSaving(true); try { const primaryId = displays.find((d) => d.isPrimary)?.id ?? null; const settings: PresentationSettings = { ...draft, displayId: draft.displayId === primaryId ? null : draft.displayId, }; await api.invoke(ipcChannels.preferences.setPresentation, { settings }); onClose(); } finally { setSaving(false); } }; const isDisplaySelected = (d: DisplayInfo) => draft.displayId === d.id || (draft.displayId === null && d.isPrimary); const displayLabel = (d: DisplayInfo) => { const primary = d.isPrimary ? ` (${t('settings.presentation.primary')})` : ''; return `${d.label}${primary} — ${d.width}×${d.height}`; }; return createPortal( <>
{t('settings.presentation.title')}

{t('settings.presentation.hint')}

{t('settings.presentation.display')}
{loading ? (
{t('settings.presentation.loading')}
) : (
{displays.map((d) => ( ))}
)}
, document.body, ); }