import { useEffect, useRef } from 'react'; import { createPortal } from 'react-dom'; import type { TFunction } from 'i18next'; import type { ContextMenuState } from './ModelMappingDiagramTypes'; import styles from './ModelMappingDiagram.module.scss'; interface DiagramContextMenuProps { contextMenu: ContextMenuState | null; t: TFunction; onRequestClose: () => void; onAddAlias: () => void; onRenameAlias: (alias: string) => void; onOpenAliasSettings: (alias: string) => void; onDeleteAlias: (alias: string) => void; onEditProvider: (provider: string) => void; onDeleteProvider: (provider: string) => void; onOpenSourceSettings: (sourceId: string) => void; } export function DiagramContextMenu({ contextMenu, t, onRequestClose, onAddAlias, onRenameAlias, onOpenAliasSettings, onDeleteAlias, onEditProvider, onDeleteProvider, onOpenSourceSettings }: DiagramContextMenuProps) { const menuRef = useRef(null); useEffect(() => { if (!contextMenu) return; const handleClick = (event: globalThis.MouseEvent) => { if (!menuRef.current?.contains(event.target as Node)) { onRequestClose(); } }; document.addEventListener('mousedown', handleClick); return () => document.removeEventListener('mousedown', handleClick); }, [contextMenu, onRequestClose]); if (!contextMenu) return null; const { type, data } = contextMenu; const renderBackground = () => (
{t('oauth_model_alias.diagram_add_alias')}
); const renderAlias = () => { if (!data) return null; return ( <>
onRenameAlias(data)}> {t('oauth_model_alias.diagram_rename')}
onOpenAliasSettings(data)}> {t('oauth_model_alias.diagram_settings')}
onDeleteAlias(data)}> {t('oauth_model_alias.diagram_delete_alias')}
); }; const renderProvider = () => { if (!data) return null; return ( <>
onEditProvider(data)}> {t('common.edit')}
onDeleteProvider(data)}> {t('oauth_model_alias.delete')}
); }; const renderSource = () => { if (!data) return null; return (
onOpenSourceSettings(data)}> {t('oauth_model_alias.diagram_settings')}
); }; return createPortal(
e.stopPropagation()} > {type === 'background' && renderBackground()} {type === 'alias' && renderAlias()} {type === 'provider' && renderProvider()} {type === 'source' && renderSource()}
, document.body ); }