import React, { useCallback, useEffect, useState } from 'react'; import { ipcChannels, type SessionState } from '../../shared/ipc/contracts'; import type { MaterialId } from '../../shared/types'; import { MaterialsBrowser } from '../editor/MaterialsBrowser'; import matStyles from '../editor/MaterialsModals.module.css'; import { useEditorI18n } from '../editor/i18n/EditorI18nContext'; import { getDndApi } from '../shared/dndApi'; import { useMaterialsOverlayState } from '../shared/materials/useMaterialsOverlayState'; import { Button } from '../shared/ui/controls'; import styles from './MaterialsApp.module.css'; function ZoomInIcon() { return ( ); } function ZoomOutIcon() { return ( ); } export function MaterialsApp() { const { t } = useEditorI18n(); const api = getDndApi(); const [session, setSession] = useState(null); const [overlay, overlayApi] = useMaterialsOverlayState(); const [selectedId, setSelectedId] = useState(null); const onSelect = useCallback((id: MaterialId | null) => setSelectedId(id), []); useEffect(() => { void api.invoke(ipcChannels.project.get, {}).then(({ project }) => { setSession({ project, currentSceneId: project?.currentSceneId ?? null }); const mats = project?.materials ?? []; setSelectedId(mats[0]?.id ?? null); }); return api.on(ipcChannels.session.stateChanged, ({ state }) => { setSession(state); }); }, [api]); useEffect(() => { const onKey = (e: KeyboardEvent) => { if (e.key === 'Escape') { if ((overlay?.activeMaterialIds?.length ?? 0) > 0) { void overlayApi.dispatch({ kind: 'hide' }); return; } if (overlay?.zoomTool) { void overlayApi.dispatch({ kind: 'zoomTool.set', tool: null }); return; } window.close(); } }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [overlay?.activeMaterialIds, overlay?.zoomTool, overlayApi]); const materials = session?.project?.materials ?? []; const activeIds = overlay?.activeMaterialIds ?? []; const zoomTool = overlay?.zoomTool ?? null; return (
{ const mat = materials.find((m) => m.id === id); void overlayApi.dispatch({ kind: 'toggle', materialId: id, rotationDeg: mat?.rotationDeg ?? 0, }); }} toolbar={ <>
{activeIds.length > 0 ? (
) : null}
{zoomTool === 'zoomIn' ? t('materials.zoomInHint') : zoomTool === 'zoomOut' ? t('materials.zoomOutHint') : t('materials.zoomIdleHint')}
} />
); }