import React, { useMemo } from 'react'; import { isNpcBindingNone, listStorylineOptionsForBinding, noneBinding } from '../../shared/npcs/npcBinding'; import type { GraphNodeId, NpcBinding, Project, SceneId } from '../../shared/types'; import editorStyles from '../editor/EditorApp.module.css'; import { useEditorI18n } from '../editor/i18n/EditorI18nContext'; import controlStyles from '../shared/ui/Controls.module.css'; type NpcBindingFieldsProps = { project: Project; binding: NpcBinding; onChange: (binding: NpcBinding) => void; }; function defaultBinding(project: Project): NpcBinding { const opts = listStorylineOptionsForBinding(project); if (opts.main) return { kind: 'storyline', storyline: { kind: 'main' } }; if (opts.sides[0]) { return { kind: 'storyline', storyline: { kind: 'side', startGraphNodeId: opts.sides[0].startGraphNodeId }, }; } const firstScene = Object.keys(project.scenes)[0] as SceneId | undefined; if (firstScene) return { kind: 'scene', sceneId: firstScene }; return noneBinding(); } export function NpcBindingFields({ project, binding, onChange }: NpcBindingFieldsProps) { const { t } = useEditorI18n(); const enabled = !isNpcBindingNone(binding); const storylineOpts = useMemo(() => listStorylineOptionsForBinding(project), [project]); const sceneOptions = useMemo( () => Object.entries(project.scenes) .map(([id, scene]) => ({ id: id as SceneId, title: scene.title.trim() || id })) .sort((a, b) => a.title.localeCompare(b.title, undefined, { sensitivity: 'base' })), [project.scenes], ); const kind = binding.kind === 'none' ? 'storyline' : binding.kind; const bindingTargetValue = useMemo(() => { if (binding.kind === 'scene') return binding.sceneId; if (binding.kind === 'storyline') { if (binding.storyline.kind === 'main') return 'main'; return `side:${binding.storyline.startGraphNodeId}`; } return ''; }, [binding]); return (
{enabled ? ( <>
{t('npcs.bindingKind')}
{t('npcs.bindingSelect')}
) : null}
); }