import type { KeyboardEvent } from 'react'; import type { TFunction } from 'i18next'; import { Modal } from '@/components/ui/Modal'; import { Input } from '@/components/ui/Input'; import { Button } from '@/components/ui/Button'; import { ToggleSwitch } from '@/components/ui/ToggleSwitch'; import { IconTrash2 } from '@/components/ui/icons'; import type { AliasNode, SourceNode } from './ModelMappingDiagramTypes'; import styles from './ModelMappingDiagram.module.scss'; interface RenameAliasModalProps { open: boolean; t: TFunction; value: string; error: string; onChange: (value: string) => void; onClose: () => void; onSubmit: () => void; } export function RenameAliasModal({ open, t, value, error, onChange, onClose, onSubmit }: RenameAliasModalProps) { return ( {t('common.cancel')} {t('oauth_model_alias.diagram_rename_btn')} > } > onChange(e.target.value)} onKeyDown={(e: KeyboardEvent) => { if (e.key === 'Enter') onSubmit(); }} error={error} placeholder={t('oauth_model_alias.diagram_rename_placeholder')} autoFocus /> ); } interface AddAliasModalProps { open: boolean; t: TFunction; value: string; error: string; onChange: (value: string) => void; onClose: () => void; onSubmit: () => void; } export function AddAliasModal({ open, t, value, error, onChange, onClose, onSubmit }: AddAliasModalProps) { return ( {t('common.cancel')} {t('oauth_model_alias.diagram_add_btn')} > } > onChange(e.target.value)} onKeyDown={(e: KeyboardEvent) => { if (e.key === 'Enter') onSubmit(); }} error={error} placeholder={t('oauth_model_alias.diagram_add_placeholder')} autoFocus /> ); } interface SettingsAliasModalProps { open: boolean; t: TFunction; alias: string | null; aliasNodes: AliasNode[]; onClose: () => void; onToggleFork: (provider: string, sourceModel: string, alias: string, fork: boolean) => void; onUnlink: (provider: string, sourceModel: string, alias: string) => void; } export function SettingsAliasModal({ open, t, alias, aliasNodes, onClose, onToggleFork, onUnlink }: SettingsAliasModalProps) { return ( {t('common.close')} } > {alias ? ( (() => { const node = aliasNodes.find((n) => n.alias === alias); if (!node || node.sources.length === 0) { return {t('oauth_model_alias.diagram_settings_empty')}; } return ( {node.sources.map((source) => { const entry = source.aliases.find((item) => item.alias === alias); const forkEnabled = entry?.fork === true; return ( {source.name} → {alias} {t('oauth_model_alias.alias_fork_label')} onToggleFork(source.provider, source.name, alias, value)} ariaLabel={t('oauth_model_alias.alias_fork_label')} /> onUnlink(source.provider, source.name, alias)} aria-label={t('oauth_model_alias.diagram_delete_link', { provider: source.provider, name: source.name })} title={t('oauth_model_alias.diagram_delete_link', { provider: source.provider, name: source.name })} > ); })} ); })() ) : null} ); } interface SettingsSourceModalProps { open: boolean; t: TFunction; source: SourceNode | null; onClose: () => void; onToggleFork: (provider: string, sourceModel: string, alias: string, fork: boolean) => void; onUnlink: (provider: string, sourceModel: string, alias: string) => void; } export function SettingsSourceModal({ open, t, source, onClose, onToggleFork, onUnlink }: SettingsSourceModalProps) { return ( {t('common.close')} } > {source ? ( source.aliases.length === 0 ? ( {t('oauth_model_alias.diagram_settings_empty')} ) : ( {source.aliases.map((entry) => ( {source.name} → {entry.alias} {t('oauth_model_alias.alias_fork_label')} onToggleFork(source.provider, source.name, entry.alias, value)} ariaLabel={t('oauth_model_alias.alias_fork_label')} /> onUnlink(source.provider, source.name, entry.alias)} aria-label={t('oauth_model_alias.diagram_delete_link', { provider: source.provider, name: source.name })} title={t('oauth_model_alias.diagram_delete_link', { provider: source.provider, name: source.name })} > ))} ) ) : null} ); }