@sentry/junior-dashboard 0.272.0 → 0.273.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,7 @@ import {
21
21
  DashboardChromeProvider,
22
22
  } from "./components/layout/DashboardChrome";
23
23
  import { DashboardHeader } from "./components/layout/DashboardHeader";
24
+ import { NavRail, NavRailProvider } from "./components/layout/NavRail";
24
25
  import { VisualViewportShell } from "./components/layout/VisualViewportShell";
25
26
  import {
26
27
  automationPath,
@@ -201,463 +202,472 @@ export function DashboardShell() {
201
202
 
202
203
  return (
203
204
  <DashboardChromeProvider>
204
- <VisualViewportShell
205
- className="bg-dashboard-bg"
206
- enabled={
207
- workspace ||
208
- location.pathname === "/review" ||
209
- hasAutomationDetailsFrame(location.pathname) ||
210
- isMemoryLibraryPath(location.pathname)
211
- }
212
- >
213
- <DashboardChrome
214
- banner={
215
- <>
216
- <VersionDriftBanner serverVersion={serverVersion} />
217
- <ConnectionBanner />
218
- </>
205
+ <NavRailProvider>
206
+ <NavRail
207
+ navItems={primaryNavItems}
208
+ profile={
209
+ loggedIn ? (
210
+ <ProfileMenu
211
+ identity={data!.me}
212
+ onSignOut={signOut}
213
+ spend={personalSpendQuery.data}
214
+ userPages={userPages}
215
+ />
216
+ ) : undefined
219
217
  }
220
- header={
221
- <DashboardHeader
222
- mobileBackTo={conversationId ? "/" : undefined}
223
- mobileTitle={mobileConversationTitle}
224
- mobileNavigationOpen={mobileNavigationOpen}
225
- navItems={primaryNavItems}
226
- onMobileNavigationOpenChange={setMobileNavigationOpen}
227
- mobileIdentity={
228
- loggedIn ? (
229
- <ProfileMenu
230
- identity={data!.me}
231
- onSignOut={signOut}
232
- spend={personalSpendQuery.data}
233
- userPages={userPages}
234
- variant="sheet-identity"
218
+ workspaceActive={workspace}
219
+ />
220
+ <VisualViewportShell
221
+ className="min-w-0 flex-1 bg-dashboard-bg"
222
+ enabled={
223
+ workspace ||
224
+ location.pathname === "/review" ||
225
+ hasAutomationDetailsFrame(location.pathname) ||
226
+ isMemoryLibraryPath(location.pathname)
227
+ }
228
+ >
229
+ <DashboardChrome
230
+ banner={
231
+ <>
232
+ <VersionDriftBanner serverVersion={serverVersion} />
233
+ <ConnectionBanner />
234
+ </>
235
+ }
236
+ header={
237
+ <DashboardHeader
238
+ mobileBackTo={conversationId ? "/" : undefined}
239
+ mobileTitle={mobileConversationTitle}
240
+ mobileNavigationOpen={mobileNavigationOpen}
241
+ navItems={primaryNavItems}
242
+ onMobileNavigationOpenChange={setMobileNavigationOpen}
243
+ mobileIdentity={
244
+ loggedIn ? (
245
+ <ProfileMenu
246
+ identity={data!.me}
247
+ onSignOut={signOut}
248
+ spend={personalSpendQuery.data}
249
+ userPages={userPages}
250
+ variant="sheet-identity"
251
+ />
252
+ ) : undefined
253
+ }
254
+ mobileProfile={
255
+ loggedIn ? (
256
+ <ProfileMenu
257
+ identity={data!.me}
258
+ onSignOut={signOut}
259
+ spend={personalSpendQuery.data}
260
+ userPages={userPages}
261
+ variant="sheet-links"
262
+ />
263
+ ) : undefined
264
+ }
265
+ mobileSpend={
266
+ loggedIn ? (
267
+ <ProfileMenu
268
+ identity={data!.me}
269
+ onSignOut={signOut}
270
+ spend={personalSpendQuery.data}
271
+ userPages={userPages}
272
+ variant="sheet-spend"
273
+ />
274
+ ) : undefined
275
+ }
276
+ version={data?.config.version}
277
+ workspaceActive={workspace}
278
+ />
279
+ }
280
+ />
281
+ <Routes>
282
+ <Route element={<LegacyAutomationsRedirect />} path="/tasks" />
283
+ <Route element={<LegacyAutomationsRedirect />} path="/tasks/*" />
284
+ <Route
285
+ element={<LegacyAutomationExecutionsRedirect />}
286
+ path="/automations/:automationId/executions"
287
+ />
288
+ <Route
289
+ element={
290
+ loading || loggedIn ? (
291
+ <AutomationPage enabled={loggedIn} tab="runs" />
292
+ ) : (
293
+ <Navigate replace to="/" />
294
+ )
295
+ }
296
+ path="/automations/:automationId/runs"
297
+ />
298
+ <Route
299
+ element={
300
+ loading || loggedIn ? (
301
+ <AutomationPage enabled={loggedIn} tab="versions" />
302
+ ) : (
303
+ <Navigate replace to="/" />
304
+ )
305
+ }
306
+ path="/automations/:automationId/versions"
307
+ />
308
+ <Route
309
+ element={
310
+ loading || loggedIn ? (
311
+ <AutomationPage enabled={loggedIn} tab="edit" />
312
+ ) : (
313
+ <Navigate replace to="/" />
314
+ )
315
+ }
316
+ path="/automations/:automationId/edit"
317
+ />
318
+ <Route
319
+ element={
320
+ loading ? (
321
+ <AutomationsPageLayout>
322
+ <AutomationsRouteLoading
323
+ description="Newest runs across your automations and automations in public destinations."
324
+ label="Loading automation runs"
325
+ title="Runs"
326
+ variant="list"
327
+ />
328
+ </AutomationsPageLayout>
329
+ ) : loggedIn ? (
330
+ <AutomationsPageLayout>
331
+ <AutomationRunsPage enabled={loggedIn} />
332
+ </AutomationsPageLayout>
333
+ ) : (
334
+ <Navigate replace to="/" />
335
+ )
336
+ }
337
+ path="/automations/runs"
338
+ />
339
+ <Route
340
+ element={
341
+ loading ? (
342
+ <AutomationsPageLayout>
343
+ <AutomationsRouteLoading
344
+ description="Find and manage automations across your linked workspaces."
345
+ label="Loading automations"
346
+ title="All automations"
347
+ variant="list"
348
+ />
349
+ </AutomationsPageLayout>
350
+ ) : loggedIn ? (
351
+ <AutomationsPageLayout>
352
+ <AutomationsPage enabled={loggedIn} view="list" />
353
+ </AutomationsPageLayout>
354
+ ) : (
355
+ <Navigate replace to="/" />
356
+ )
357
+ }
358
+ path="/automations/list"
359
+ />
360
+ <Route
361
+ element={
362
+ loading || loggedIn ? (
363
+ <AutomationPage enabled={loggedIn} tab="overview" />
364
+ ) : (
365
+ <Navigate replace to="/" />
366
+ )
367
+ }
368
+ path="/automations/:automationId"
369
+ />
370
+ <Route
371
+ element={
372
+ loading ? (
373
+ <AutomationsPageLayout>
374
+ <AutomationsRouteLoading
375
+ description="Scheduled and event-driven work created by users."
376
+ label="Loading automations"
377
+ title="Automations"
378
+ variant="stats"
379
+ />
380
+ </AutomationsPageLayout>
381
+ ) : loggedIn ? (
382
+ <AutomationsPageLayout>
383
+ <AutomationsPage enabled={loggedIn} view="overview" />
384
+ </AutomationsPageLayout>
385
+ ) : (
386
+ <Navigate replace to="/" />
387
+ )
388
+ }
389
+ path="/automations"
390
+ />
391
+ <Route
392
+ element={<LegacySystemRedirect section="locations" />}
393
+ path="/locations"
394
+ />
395
+ <Route
396
+ element={<LegacySystemRedirect section="locations" />}
397
+ path="/locations/:locationId"
398
+ />
399
+ <Route
400
+ element={
401
+ loading ? (
402
+ <SystemRouteLoading
403
+ description="Public destinations and their conversation activity."
404
+ label="Loading locations"
405
+ title="Locations"
406
+ variant="stats"
235
407
  />
236
- ) : undefined
408
+ ) : (
409
+ <LocationsPage />
410
+ )
237
411
  }
238
- mobileProfile={
239
- loggedIn ? (
240
- <ProfileMenu
241
- identity={data!.me}
242
- onSignOut={signOut}
243
- spend={personalSpendQuery.data}
244
- userPages={userPages}
245
- variant="sheet-links"
412
+ path="/system/locations"
413
+ />
414
+ <Route
415
+ element={
416
+ loading ? (
417
+ <SystemPageLayout>
418
+ <LoadingView label="Loading location" />
419
+ </SystemPageLayout>
420
+ ) : (
421
+ <LocationDetailPage />
422
+ )
423
+ }
424
+ path="/system/locations/:locationId"
425
+ />
426
+ <Route
427
+ element={
428
+ loading ? (
429
+ <ConversationWorkspaceLoading detail={false} />
430
+ ) : data ? (
431
+ <ConversationWorkspace />
432
+ ) : (
433
+ <LoadingView
434
+ label={query.error?.message ?? "Dashboard unavailable"}
246
435
  />
247
- ) : undefined
436
+ )
248
437
  }
249
- mobileSpend={
250
- loggedIn ? (
251
- <ProfileMenu
252
- identity={data!.me}
253
- onSignOut={signOut}
254
- spend={personalSpendQuery.data}
255
- userPages={userPages}
256
- variant="sheet-spend"
438
+ path="/"
439
+ />
440
+ <Route
441
+ element={
442
+ loading ? (
443
+ <ReviewDeskLoading />
444
+ ) : loggedIn ? (
445
+ <ReviewDeskPage />
446
+ ) : (
447
+ <Navigate replace to="/" />
448
+ )
449
+ }
450
+ path="/review"
451
+ />
452
+ <Route element={<CodePage />} path="/code" />
453
+ {codeRepositoryTabs.map((tab) => (
454
+ <Route
455
+ element={<RepositoryPage tab={tab} />}
456
+ key={tab}
457
+ path={
458
+ tab === "overview"
459
+ ? "/code/:repositoryId"
460
+ : `/code/:repositoryId/${tab}`
461
+ }
462
+ />
463
+ ))}
464
+ <Route
465
+ element={<Navigate replace to="/" />}
466
+ path="/conversations/new"
467
+ />
468
+ <Route
469
+ element={
470
+ loading ? (
471
+ <ConversationWorkspaceLoading detail />
472
+ ) : data ? (
473
+ <ConversationWorkspace />
474
+ ) : (
475
+ <LoadingView
476
+ label={query.error?.message ?? "Dashboard unavailable"}
257
477
  />
258
- ) : undefined
478
+ )
479
+ }
480
+ path="/conversations/:conversationId"
481
+ />
482
+ <Route
483
+ element={<Navigate replace to="/" />}
484
+ path="/conversations"
485
+ />
486
+ <Route
487
+ element={<LegacySystemRedirect section="people" />}
488
+ path="/people"
489
+ />
490
+ <Route
491
+ element={
492
+ loading ? (
493
+ <LoadingView label="Loading profile" />
494
+ ) : (
495
+ <PersonProfilePage />
496
+ )
259
497
  }
260
- profile={
261
- loggedIn ? (
262
- <ProfileMenu
263
- identity={data!.me}
264
- onSignOut={signOut}
265
- spend={personalSpendQuery.data}
266
- userPages={userPages}
498
+ path="/people/:email"
499
+ />
500
+ <Route
501
+ element={
502
+ loading ? (
503
+ <SystemRouteLoading
504
+ description="People, activity, and model spend."
505
+ label="Loading people"
506
+ title="People"
507
+ variant="stats"
267
508
  />
268
- ) : undefined
509
+ ) : (
510
+ <PeoplePage />
511
+ )
269
512
  }
270
- version={data?.config.version}
271
- workspaceActive={workspace}
513
+ path="/system/people"
272
514
  />
273
- }
274
- />
275
- <Routes>
276
- <Route element={<LegacyAutomationsRedirect />} path="/tasks" />
277
- <Route element={<LegacyAutomationsRedirect />} path="/tasks/*" />
278
- <Route
279
- element={<LegacyAutomationExecutionsRedirect />}
280
- path="/automations/:automationId/executions"
281
- />
282
- <Route
283
- element={
284
- loading || loggedIn ? (
285
- <AutomationPage enabled={loggedIn} tab="runs" />
286
- ) : (
287
- <Navigate replace to="/" />
288
- )
289
- }
290
- path="/automations/:automationId/runs"
291
- />
292
- <Route
293
- element={
294
- loading || loggedIn ? (
295
- <AutomationPage enabled={loggedIn} tab="versions" />
296
- ) : (
297
- <Navigate replace to="/" />
298
- )
299
- }
300
- path="/automations/:automationId/versions"
301
- />
302
- <Route
303
- element={
304
- loading || loggedIn ? (
305
- <AutomationPage enabled={loggedIn} tab="edit" />
306
- ) : (
307
- <Navigate replace to="/" />
308
- )
309
- }
310
- path="/automations/:automationId/edit"
311
- />
312
- <Route
313
- element={
314
- loading ? (
315
- <AutomationsPageLayout>
316
- <AutomationsRouteLoading
317
- description="Newest runs across your automations and automations in public destinations."
318
- label="Loading automation runs"
319
- title="Runs"
515
+ <Route
516
+ element={
517
+ loading ? (
518
+ <SystemRouteLoading
519
+ description="Repository recipes Junior can switch into."
520
+ label="Loading Workspaces"
521
+ title="Workspaces"
320
522
  variant="list"
321
523
  />
322
- </AutomationsPageLayout>
323
- ) : loggedIn ? (
324
- <AutomationsPageLayout>
325
- <AutomationRunsPage enabled={loggedIn} />
326
- </AutomationsPageLayout>
327
- ) : (
328
- <Navigate replace to="/" />
329
- )
330
- }
331
- path="/automations/runs"
332
- />
333
- <Route
334
- element={
335
- loading ? (
336
- <AutomationsPageLayout>
337
- <AutomationsRouteLoading
338
- description="Find and manage automations across your linked workspaces."
339
- label="Loading automations"
340
- title="All automations"
524
+ ) : (
525
+ <WorkspacesPage />
526
+ )
527
+ }
528
+ path="/system/workspaces"
529
+ />
530
+ <Route
531
+ element={
532
+ loading ? (
533
+ <SystemPageLayout>
534
+ <LoadingView label="Loading Workspace" />
535
+ </SystemPageLayout>
536
+ ) : (
537
+ <WorkspaceFormPage />
538
+ )
539
+ }
540
+ path="/system/workspaces/new"
541
+ />
542
+ <Route
543
+ element={
544
+ loading ? (
545
+ <SystemRouteLoading
546
+ description="Repository recipes Junior can switch into."
547
+ label="Loading Workspaces"
548
+ title="Workspaces"
341
549
  variant="list"
342
550
  />
343
- </AutomationsPageLayout>
344
- ) : loggedIn ? (
345
- <AutomationsPageLayout>
346
- <AutomationsPage enabled={loggedIn} view="list" />
347
- </AutomationsPageLayout>
348
- ) : (
349
- <Navigate replace to="/" />
350
- )
351
- }
352
- path="/automations/list"
353
- />
354
- <Route
355
- element={
356
- loading || loggedIn ? (
357
- <AutomationPage enabled={loggedIn} tab="overview" />
358
- ) : (
359
- <Navigate replace to="/" />
360
- )
361
- }
362
- path="/automations/:automationId"
363
- />
364
- <Route
365
- element={
366
- loading ? (
367
- <AutomationsPageLayout>
368
- <AutomationsRouteLoading
369
- description="Scheduled and event-driven work created by users."
370
- label="Loading automations"
371
- title="Automations"
372
- variant="stats"
373
- />
374
- </AutomationsPageLayout>
375
- ) : loggedIn ? (
376
- <AutomationsPageLayout>
377
- <AutomationsPage enabled={loggedIn} view="overview" />
378
- </AutomationsPageLayout>
379
- ) : (
380
- <Navigate replace to="/" />
381
- )
382
- }
383
- path="/automations"
384
- />
385
- <Route
386
- element={<LegacySystemRedirect section="locations" />}
387
- path="/locations"
388
- />
389
- <Route
390
- element={<LegacySystemRedirect section="locations" />}
391
- path="/locations/:locationId"
392
- />
393
- <Route
394
- element={
395
- loading ? (
396
- <SystemRouteLoading
397
- description="Public destinations and their conversation activity."
398
- label="Loading locations"
399
- title="Locations"
400
- variant="stats"
401
- />
402
- ) : (
403
- <LocationsPage />
404
- )
405
- }
406
- path="/system/locations"
407
- />
408
- <Route
409
- element={
410
- loading ? (
411
- <SystemPageLayout>
412
- <LoadingView label="Loading location" />
413
- </SystemPageLayout>
414
- ) : (
415
- <LocationDetailPage />
416
- )
417
- }
418
- path="/system/locations/:locationId"
419
- />
420
- <Route
421
- element={
422
- loading ? (
423
- <ConversationWorkspaceLoading detail={false} />
424
- ) : data ? (
425
- <ConversationWorkspace />
426
- ) : (
427
- <LoadingView
428
- label={query.error?.message ?? "Dashboard unavailable"}
429
- />
430
- )
431
- }
432
- path="/"
433
- />
434
- <Route
435
- element={
436
- loading ? (
437
- <ReviewDeskLoading />
438
- ) : loggedIn ? (
439
- <ReviewDeskPage />
440
- ) : (
441
- <Navigate replace to="/" />
442
- )
443
- }
444
- path="/review"
445
- />
446
- <Route element={<CodePage />} path="/code" />
447
- {codeRepositoryTabs.map((tab) => (
551
+ ) : (
552
+ <WorkspacesPage />
553
+ )
554
+ }
555
+ path="/system/workspaces/:workspaceId"
556
+ />
448
557
  <Route
449
- element={<RepositoryPage tab={tab} />}
450
- key={tab}
451
- path={
452
- tab === "overview"
453
- ? "/code/:repositoryId"
454
- : `/code/:repositoryId/${tab}`
558
+ element={
559
+ loading ? (
560
+ <SystemPageLayout>
561
+ <LoadingView label="Loading Workspace" />
562
+ </SystemPageLayout>
563
+ ) : (
564
+ <WorkspaceFormPage />
565
+ )
455
566
  }
567
+ path="/system/workspaces/:workspaceId/edit"
456
568
  />
457
- ))}
458
- <Route
459
- element={<Navigate replace to="/" />}
460
- path="/conversations/new"
461
- />
462
- <Route
463
- element={
464
- loading ? (
465
- <ConversationWorkspaceLoading detail />
466
- ) : data ? (
467
- <ConversationWorkspace />
468
- ) : (
469
- <LoadingView
470
- label={query.error?.message ?? "Dashboard unavailable"}
471
- />
472
- )
473
- }
474
- path="/conversations/:conversationId"
475
- />
476
- <Route element={<Navigate replace to="/" />} path="/conversations" />
477
- <Route
478
- element={<LegacySystemRedirect section="people" />}
479
- path="/people"
480
- />
481
- <Route
482
- element={
483
- loading ? (
484
- <LoadingView label="Loading profile" />
485
- ) : (
486
- <PersonProfilePage />
487
- )
488
- }
489
- path="/people/:email"
490
- />
491
- <Route
492
- element={
493
- loading ? (
494
- <SystemRouteLoading
495
- description="People, activity, and model spend."
496
- label="Loading people"
497
- title="People"
498
- variant="stats"
499
- />
500
- ) : (
501
- <PeoplePage />
502
- )
503
- }
504
- path="/system/people"
505
- />
506
- <Route
507
- element={
508
- loading ? (
509
- <SystemRouteLoading
510
- description="Repository recipes Junior can switch into."
511
- label="Loading Workspaces"
512
- title="Workspaces"
513
- variant="list"
514
- />
515
- ) : (
516
- <WorkspacesPage />
517
- )
518
- }
519
- path="/system/workspaces"
520
- />
521
- <Route
522
- element={
523
- loading ? (
524
- <SystemPageLayout>
525
- <LoadingView label="Loading Workspace" />
526
- </SystemPageLayout>
527
- ) : (
528
- <WorkspaceFormPage />
529
- )
530
- }
531
- path="/system/workspaces/new"
532
- />
533
- <Route
534
- element={
535
- loading ? (
536
- <SystemRouteLoading
537
- description="Repository recipes Junior can switch into."
538
- label="Loading Workspaces"
539
- title="Workspaces"
540
- variant="list"
541
- />
542
- ) : (
543
- <WorkspacesPage />
544
- )
545
- }
546
- path="/system/workspaces/:workspaceId"
547
- />
548
- <Route
549
- element={
550
- loading ? (
551
- <SystemPageLayout>
552
- <LoadingView label="Loading Workspace" />
553
- </SystemPageLayout>
554
- ) : (
555
- <WorkspaceFormPage />
556
- )
557
- }
558
- path="/system/workspaces/:workspaceId/edit"
559
- />
560
- <Route
561
- element={
562
- loading ? (
563
- <SystemRouteLoading
564
- description="Runtime health, model usage, and loaded capabilities."
565
- label="Loading system"
566
- title="System"
567
- variant="overview"
568
- />
569
- ) : data ? (
570
- <SystemRoute coreData={data} />
571
- ) : (
572
- <SystemPageLayout>
573
- <LoadingView
574
- label={query.error?.message ?? "Dashboard unavailable"}
575
- />
576
- </SystemPageLayout>
577
- )
578
- }
579
- path="/system/*"
580
- />
581
- {settingsRoutes.map((route) => (
582
569
  <Route
583
570
  element={
584
571
  loading ? (
585
- <SettingsPageLayout
586
- description={route.loading.description}
587
- title={route.loading.title}
588
- >
589
- <PageContentSkeleton
590
- label={route.loading.label}
591
- variant={route.loading.variant}
572
+ <SystemRouteLoading
573
+ description="Runtime health, model usage, and loaded capabilities."
574
+ label="Loading system"
575
+ title="System"
576
+ variant="overview"
577
+ />
578
+ ) : data ? (
579
+ <SystemRoute coreData={data} />
580
+ ) : (
581
+ <SystemPageLayout>
582
+ <LoadingView
583
+ label={query.error?.message ?? "Dashboard unavailable"}
592
584
  />
593
- </SettingsPageLayout>
594
- ) : loggedIn ? (
595
- route.render(data!)
585
+ </SystemPageLayout>
586
+ )
587
+ }
588
+ path="/system/*"
589
+ />
590
+ {settingsRoutes.map((route) => (
591
+ <Route
592
+ element={
593
+ loading ? (
594
+ <SettingsPageLayout
595
+ description={route.loading.description}
596
+ title={route.loading.title}
597
+ >
598
+ <PageContentSkeleton
599
+ label={route.loading.label}
600
+ variant={route.loading.variant}
601
+ />
602
+ </SettingsPageLayout>
603
+ ) : loggedIn ? (
604
+ route.render(data!)
605
+ ) : (
606
+ <Navigate replace to="/" />
607
+ )
608
+ }
609
+ key={route.path}
610
+ path={route.path}
611
+ />
612
+ ))}
613
+ <Route
614
+ element={
615
+ loading || userPagesQuery.isPending ? (
616
+ <MemoryRouteLoading label="Loading memories" />
617
+ ) : loggedIn && userPagesQuery.data ? (
618
+ <MemoryPermalinkRoute pages={userPagesQuery.data} />
596
619
  ) : (
597
620
  <Navigate replace to="/" />
598
621
  )
599
622
  }
600
- key={route.path}
601
- path={route.path}
623
+ path="/memories/library"
602
624
  />
603
- ))}
604
- <Route
605
- element={
606
- loading || userPagesQuery.isPending ? (
607
- <MemoryRouteLoading label="Loading memories" />
608
- ) : loggedIn && userPagesQuery.data ? (
609
- <MemoryPermalinkRoute pages={userPagesQuery.data} />
610
- ) : (
611
- <Navigate replace to="/" />
612
- )
613
- }
614
- path="/memories/library"
615
- />
616
- <Route
617
- element={
618
- loading || userPagesQuery.isPending ? (
619
- <MemoryRouteLoading label="Loading memory" />
620
- ) : loggedIn && userPagesQuery.data ? (
621
- <MemoryPermalinkRoute pages={userPagesQuery.data} />
622
- ) : (
623
- <Navigate replace to="/" />
624
- )
625
- }
626
- path="/memories/:memoryId?"
627
- />
628
- <Route
629
- element={
630
- loading || userPagesQuery.isPending ? (
631
- <LoadingView label="Loading page" />
632
- ) : loggedIn && userPagesQuery.data ? (
633
- <PluginUserPageRoute pages={userPagesQuery.data} />
634
- ) : (
635
- <Navigate replace to="/" />
636
- )
637
- }
638
- path="/plugins/:pluginName/:pageId/*"
639
- />
640
- <Route
641
- element={
642
- loading || userPagesQuery.isPending ? (
643
- <LoadingView label="Loading admin" />
644
- ) : loggedIn && data!.me.user.isAdmin && userPagesQuery.data ? (
645
- <AdminPage pages={userPagesQuery.data} />
646
- ) : (
647
- <Navigate replace to="/" />
648
- )
649
- }
650
- path="/admin"
625
+ <Route
626
+ element={
627
+ loading || userPagesQuery.isPending ? (
628
+ <MemoryRouteLoading label="Loading memory" />
629
+ ) : loggedIn && userPagesQuery.data ? (
630
+ <MemoryPermalinkRoute pages={userPagesQuery.data} />
631
+ ) : (
632
+ <Navigate replace to="/" />
633
+ )
634
+ }
635
+ path="/memories/:memoryId?"
636
+ />
637
+ <Route
638
+ element={
639
+ loading || userPagesQuery.isPending ? (
640
+ <LoadingView label="Loading page" />
641
+ ) : loggedIn && userPagesQuery.data ? (
642
+ <PluginUserPageRoute pages={userPagesQuery.data} />
643
+ ) : (
644
+ <Navigate replace to="/" />
645
+ )
646
+ }
647
+ path="/plugins/:pluginName/:pageId/*"
648
+ />
649
+ <Route
650
+ element={
651
+ loading || userPagesQuery.isPending ? (
652
+ <LoadingView label="Loading admin" />
653
+ ) : loggedIn && data!.me.user.isAdmin && userPagesQuery.data ? (
654
+ <AdminPage pages={userPagesQuery.data} />
655
+ ) : (
656
+ <Navigate replace to="/" />
657
+ )
658
+ }
659
+ path="/admin"
660
+ />
661
+ <Route element={<Navigate replace to="/" />} path="*" />
662
+ </Routes>
663
+ <span
664
+ aria-hidden="true"
665
+ className="pointer-events-none fixed inset-0 z-50 block opacity-[0.018]"
666
+ data-dashboard-noise=""
667
+ style={dashboardNoise}
651
668
  />
652
- <Route element={<Navigate replace to="/" />} path="*" />
653
- </Routes>
654
- <span
655
- aria-hidden="true"
656
- className="pointer-events-none fixed inset-0 z-50 block opacity-[0.018]"
657
- data-dashboard-noise=""
658
- style={dashboardNoise}
659
- />
660
- </VisualViewportShell>
669
+ </VisualViewportShell>
670
+ </NavRailProvider>
661
671
  </DashboardChromeProvider>
662
672
  );
663
673
  }