@@ -12,8 +12,9 @@ import {
1212export type ModalState = 'none' | 'select' | 'create' | 'metadata' ;
1313
1414/**
15- * Component for managing project modals in the Interlinearizer. Handles state for project creation,
16- * selection, and metadata modals.
15+ * Single mount point for all project-related dialogs. Renders at most one of
16+ * {@link SelectInterlinearProjectModal}, {@link CreateProjectModal}, or {@link ProjectMetadataModal}
17+ * based on the `modal` prop, and manages the shared WebView state for the active project.
1718 *
1819 * @param props - Component props
1920 * @param props.activeProject - The currently active interlinear project, read from WebView state by
@@ -52,9 +53,10 @@ export default function ProjectModals({
5253 ) ;
5354
5455 /**
55- * Tracks where the metadata modal was opened from so the correct modal is restored on close.
56- * `'select'` means it was opened via the info icon in the select modal; `'menu'` means it was
57- * opened via the "View Project Info" menu item.
56+ * Tracks whether the metadata modal was opened from the select modal (info icon) or from the
57+ * top-menu "View Project Info" item. `true` means opened via the select modal, so closing the
58+ * metadata modal restores the select modal; `false` means opened from the menu, so closing
59+ * dismisses to `'none'`.
5860 */
5961 const [ metadataSourceIsSelect , setMetadataSourceIsSelect ] = useState ( false ) ;
6062
@@ -102,29 +104,51 @@ export default function ProjectModals({
102104 [ activeProject , resetActiveProject ] ,
103105 ) ;
104106
107+ const handleSelectProject = useCallback (
108+ ( project : InterlinearProjectSummary ) => {
109+ setActiveProject ( project ) ;
110+ setModal ( 'none' ) ;
111+ } ,
112+ [ setActiveProject , setModal ] ,
113+ ) ;
114+
115+ const handleSelectCreateNew = useCallback ( ( ) => setModal ( 'create' ) , [ setModal ] ) ;
116+
117+ const handleSelectClose = useCallback ( ( ) => setModal ( 'none' ) , [ setModal ] ) ;
118+
119+ const handleCreateClose = useCallback ( ( ) => setModal ( 'none' ) , [ setModal ] ) ;
120+
121+ const handleProjectCreated = useCallback (
122+ ( project : InterlinearProjectSummary ) => {
123+ setActiveProject ( project ) ;
124+ setModal ( 'none' ) ;
125+ } ,
126+ [ setActiveProject , setModal ] ,
127+ ) ;
128+
129+ const handleMetadataClose = useCallback ( ( ) => {
130+ setModal ( metadataSourceIsSelect ? 'select' : 'none' ) ;
131+ setMetadataSourceIsSelect ( false ) ;
132+ setMetadataProject ( undefined ) ;
133+ } , [ metadataSourceIsSelect , setModal ] ) ;
134+
105135 return (
106136 < div >
107137 { modal === 'select' && (
108138 < SelectInterlinearProjectModal
109139 sourceProjectId = { projectId }
110- onSelect = { ( project ) => {
111- setActiveProject ( project ) ;
112- setModal ( 'none' ) ;
113- } }
114- onCreateNew = { ( ) => setModal ( 'create' ) }
115- onClose = { ( ) => setModal ( 'none' ) }
140+ onSelect = { handleSelectProject }
141+ onCreateNew = { handleSelectCreateNew }
142+ onClose = { handleSelectClose }
116143 onViewInfo = { handleViewInfo }
117144 />
118145 ) }
119146
120147 { modal === 'create' && (
121148 < CreateProjectModal
122149 projectId = { projectId }
123- onClose = { ( ) => setModal ( 'none' ) }
124- onProjectCreated = { ( project ) => {
125- setActiveProject ( project ) ;
126- setModal ( 'none' ) ;
127- } }
150+ onClose = { handleCreateClose }
151+ onProjectCreated = { handleProjectCreated }
128152 />
129153 ) }
130154
@@ -134,13 +158,10 @@ export default function ProjectModals({
134158 name = { resolvedMetadataProject . name }
135159 description = { resolvedMetadataProject . description }
136160 sourceProjectId = { resolvedMetadataProject . sourceProjectId }
161+ targetProjectId = { resolvedMetadataProject . targetProjectId }
137162 analysisLanguages = { resolvedMetadataProject . analysisLanguages }
138163 createdAt = { resolvedMetadataProject . createdAt }
139- onClose = { ( ) => {
140- setModal ( metadataSourceIsSelect ? 'select' : 'none' ) ;
141- setMetadataSourceIsSelect ( false ) ;
142- setMetadataProject ( undefined ) ;
143- } }
164+ onClose = { handleMetadataClose }
144165 onProjectSaved = { handleMetadataProjectSaved }
145166 onProjectDeleted = { handleMetadataProjectDeleted }
146167 />
0 commit comments