import { useMemo } from 'react'; import ReactDOM from 'react-dom'; import { AlertTriangle, EyeOff, Trash2 } from 'lucide-react'; import type { TFunction } from 'i18next'; import { Button } from '../../../../shared/view/ui'; import Settings from '../../../settings/view/Settings'; import VersionUpgradeModal from '../../../version-upgrade/view'; import type { Project } from '../../../../types/app'; import type { ReleaseInfo } from '../../../../types/sharedTypes'; import type { InstallMode } from '../../../../hooks/useVersionCheck'; import { normalizeProjectForSettings } from '../../utils/utils'; import type { DeleteProjectConfirmation, SessionDeleteConfirmation, SettingsProject } from '../../types/types'; import ProjectCreationWizard from '../../../project-creation-wizard'; type SidebarModalsProps = { projects: Project[]; showSettings: boolean; settingsInitialTab: string; onCloseSettings: () => void; showNewProject: boolean; onCloseNewProject: () => void; onProjectCreated: () => void; deleteConfirmation: DeleteProjectConfirmation | null; onCancelDeleteProject: () => void; onConfirmDeleteProject: (deleteData?: boolean) => void; sessionDeleteConfirmation: SessionDeleteConfirmation | null; onCancelDeleteSession: () => void; onConfirmDeleteSession: (hardDelete?: boolean) => void; showVersionModal: boolean; onCloseVersionModal: () => void; releaseInfo: ReleaseInfo | null; currentVersion: string; latestVersion: string | null; installMode: InstallMode; t: TFunction; }; type TypedSettingsProps = { isOpen: boolean; onClose: () => void; projects: SettingsProject[]; initialTab: string; }; const SettingsComponent = Settings as (props: TypedSettingsProps) => JSX.Element; function TypedSettings(props: TypedSettingsProps) { return ; } export default function SidebarModals({ projects, showSettings, settingsInitialTab, onCloseSettings, showNewProject, onCloseNewProject, onProjectCreated, deleteConfirmation, onCancelDeleteProject, onConfirmDeleteProject, sessionDeleteConfirmation, onCancelDeleteSession, onConfirmDeleteSession, showVersionModal, onCloseVersionModal, releaseInfo, currentVersion, latestVersion, installMode, t, }: SidebarModalsProps) { // Settings expects project identity/path fields to be present for dropdown labels and local-scope MCP config. const settingsProjects = useMemo( () => projects.map(normalizeProjectForSettings), [projects], ); return ( <> {showNewProject && ReactDOM.createPortal( , document.body, )} {showSettings && ReactDOM.createPortal( , document.body, )} {deleteConfirmation && ReactDOM.createPortal(

{t('deleteConfirmation.deleteProject')}

{t('deleteConfirmation.confirmDelete')}{' '} {deleteConfirmation.project.displayName || deleteConfirmation.project.projectId} ?

{deleteConfirmation.sessionCount > 0 && (

{t('deleteConfirmation.sessionCount', { count: deleteConfirmation.sessionCount })}

)}
, document.body, )} {sessionDeleteConfirmation && ReactDOM.createPortal(

{t('deleteConfirmation.deleteSession')}

{t('deleteConfirmation.confirmDelete')}{' '} {sessionDeleteConfirmation.sessionTitle || t('sessions.unnamed')} ?

{sessionDeleteConfirmation.isArchived ? t('deleteConfirmation.archivedSessionNotice', 'This session is already archived. You can keep it hidden or delete it permanently.') : t('deleteConfirmation.archiveSessionNotice', 'Archive keeps the session out of the active list while preserving its history.')}

{!sessionDeleteConfirmation.isArchived && ( )}
, document.body, )} ); }