@@ -10,16 +10,18 @@ import { RunStatus } from "./components/RunStatus";
1010import { SessionOverview } from "./components/SessionOverview" ;
1111import { UploadsPanel , type ImportedUploadResult } from "./components/UploadsPanel" ;
1212import { UserGroupSyncPanel } from "./components/UserGroupSyncPanel" ;
13+ import { WriteToolsCatalog , type WriteToolId } from "./components/WriteToolsCatalog" ;
1314import { validateCredentialsForReport } from "./credentials/credentialRules" ;
1415import { DEFAULT_REPORT_RUN_SCOPE } from "./domain/reportScope" ;
1516import { reportRegistry } from "./domain/reportRegistry" ;
1617import { createInitialSessionState , sessionReducer } from "./domain/sessionStore" ;
17- import type { ReportId , RunPeriodRole , RunQueueItem } from "./domain/types" ;
18+ import type { ReportId , RunPeriodRole , RunQueueItem , SessionCredentials } from "./domain/types" ;
1819import type { ReportRunResponseBody } from "./server/reportRunApi" ;
1920
2021export function App ( ) {
2122 const [ state , dispatch ] = useReducer ( sessionReducer , undefined , createInitialSessionState ) ;
2223 const [ activePanel , setActivePanel ] = useState < AppPanel > ( "report" ) ;
24+ const [ selectedWriteToolId , setSelectedWriteToolId ] = useState < WriteToolId > ( "user-group-sync" ) ;
2325 const [ runQueue , setRunQueue ] = useState < RunQueueItem [ ] > ( [ ] ) ;
2426 const [ reportScope , setReportScope ] = useState ( DEFAULT_REPORT_RUN_SCOPE ) ;
2527
@@ -28,6 +30,11 @@ export function App() {
2830 setActivePanel ( "report" ) ;
2931 }
3032
33+ function selectWriteTool ( toolId : WriteToolId ) {
34+ setSelectedWriteToolId ( toolId ) ;
35+ setActivePanel ( "write-tools" ) ;
36+ }
37+
3138 async function queueSelectedReportRun ( periodRole : RunPeriodRole = "current" ) {
3239 const report = reportRegistry . find ( ( candidate ) => candidate . id === state . selectedReportId ) ! ;
3340 if ( ! state . credentials ) {
@@ -158,15 +165,19 @@ export function App() {
158165 const selectedReportRecords = selectedReportOutput ?. records ?? [ ] ;
159166 const datasets = Object . values ( state . datasets ) ;
160167 const datasetCount = datasets . length ;
168+ const sidebar =
169+ activePanel === "write-tools" ? (
170+ < WriteToolsCatalog selectedToolId = { selectedWriteToolId } onSelect = { selectWriteTool } />
171+ ) : (
172+ < ReportCatalog selectedReportId = { state . selectedReportId } onSelect = { selectReport } />
173+ ) ;
161174
162175 return (
163176 < AppShell
164177 activePanel = { activePanel }
165178 onPanelChange = { setActivePanel }
166179 summary = { { credentialsSaved : state . credentials !== null , datasetCount } }
167- sidebar = {
168- < ReportCatalog selectedReportId = { state . selectedReportId } onSelect = { selectReport } />
169- }
180+ sidebar = { sidebar }
170181 >
171182 < SessionOverview state = { state } />
172183 < RunStatus queue = { runQueue } />
@@ -184,9 +195,7 @@ export function App() {
184195 onRemoveDataset = { ( datasetId ) => dispatch ( { type : "dataset/remove" , datasetId } ) }
185196 />
186197 ) }
187- { activePanel === "write-tools" && (
188- < UserGroupSyncPanel credentials = { state . credentials } />
189- ) }
198+ { activePanel === "write-tools" && renderWriteToolPanel ( selectedWriteToolId , state . credentials ) }
190199 { activePanel === "report" && (
191200 < ReportWorkspace
192201 reportId = { state . selectedReportId }
@@ -205,6 +214,16 @@ export function App() {
205214 ) ;
206215}
207216
217+ function renderWriteToolPanel ( toolId : WriteToolId , credentials : SessionCredentials | null ) {
218+ switch ( toolId ) {
219+ case "user-group-sync" :
220+ return < UserGroupSyncPanel credentials = { credentials } /> ;
221+ }
222+
223+ const unhandledToolId : never = toolId ;
224+ return unhandledToolId ;
225+ }
226+
208227function getLiveRunErrorMessage ( error : unknown , _reportTitle : string ) : string {
209228 if ( error instanceof Error ) {
210229 return error . message ;
0 commit comments