@remit/web-client 0.0.230 → 0.0.232

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.
Files changed (55) hide show
  1. package/package.json +1 -1
  2. package/src/components/calendar/CalendarComposePane.stories.tsx +115 -0
  3. package/src/components/calendar/CalendarComposePane.tsx +94 -0
  4. package/src/components/calendar/CalendarComposeSeed.tsx +35 -0
  5. package/src/components/calendar/CalendarEventPane.stories.tsx +110 -0
  6. package/src/components/calendar/CalendarEventPane.tsx +90 -0
  7. package/src/components/calendar/CalendarShell.tsx +83 -0
  8. package/src/components/calendar/CalendarViewPlaceholder.tsx +37 -0
  9. package/src/components/calendar/CalendarWorkspace.stories.tsx +219 -0
  10. package/src/components/calendar/CalendarWorkspace.tsx +192 -0
  11. package/src/components/calendar/OpenCalendarEvent.tsx +221 -0
  12. package/src/components/calendar/WriteCalendarEvent.tsx +94 -0
  13. package/src/components/calendar/calendar-workspace.render.test.ts +193 -0
  14. package/src/components/calendar/calendar-write-flow.render.test.ts +356 -0
  15. package/src/components/mail/MailSidebarAdapter.tsx +17 -0
  16. package/src/hooks/calendar/calendar-reads.render.test.ts +265 -0
  17. package/src/hooks/calendar/calendar-writes.render.test.ts +305 -0
  18. package/src/hooks/calendar/draft.test.ts +241 -0
  19. package/src/hooks/calendar/draft.ts +168 -0
  20. package/src/hooks/calendar/index.ts +59 -0
  21. package/src/hooks/calendar/instance.ts +136 -0
  22. package/src/hooks/calendar/recurrence-rule.test.ts +92 -0
  23. package/src/hooks/calendar/recurrence-rule.ts +133 -0
  24. package/src/hooks/calendar/resource.test.ts +98 -0
  25. package/src/hooks/calendar/resource.ts +74 -0
  26. package/src/hooks/calendar/useCalendarEvent.ts +46 -0
  27. package/src/hooks/calendar/useCalendarEvents.ts +124 -0
  28. package/src/hooks/calendar/useCalendarWrites.ts +174 -0
  29. package/src/hooks/calendar/useCalendars.ts +43 -0
  30. package/src/hooks/calendar/window.test.ts +148 -0
  31. package/src/hooks/calendar/window.ts +163 -0
  32. package/src/hooks/useCalendarData.ts +120 -0
  33. package/src/lib/calendar-density.ts +34 -0
  34. package/src/lib/calendar-format.ts +29 -0
  35. package/src/lib/calendar-route.test.ts +210 -0
  36. package/src/lib/calendar-route.ts +187 -0
  37. package/src/lib/search-params.test.ts +77 -0
  38. package/src/lib/search-params.ts +59 -0
  39. package/src/routeTree.gen.ts +199 -0
  40. package/src/router.tsx +5 -0
  41. package/src/routes/calendar/$view.$date/$calendarObjectId/$recurrenceId.tsx +26 -0
  42. package/src/routes/calendar/$view.$date/$calendarObjectId/index.tsx +18 -0
  43. package/src/routes/calendar/$view.$date/$calendarObjectId.tsx +15 -0
  44. package/src/routes/calendar/$view.$date/index.tsx +25 -0
  45. package/src/routes/calendar/$view.$date/new.tsx +20 -0
  46. package/src/routes/calendar/$view.$date.tsx +128 -0
  47. package/src/routes/calendar/-calendar-tree.test.ts +267 -0
  48. package/src/routes/calendar/index.tsx +27 -0
  49. package/src/routes/calendar.tsx +98 -0
  50. package/src/routing/calendar-fragment.test.ts +66 -0
  51. package/src/routing/calendar.ts +150 -0
  52. package/src/routing/fragment.ts +19 -0
  53. package/src/routing/index.ts +10 -0
  54. package/src/routing/nav-selection.ts +2 -0
  55. package/src/test-support/http.ts +8 -0
@@ -10,10 +10,12 @@
10
10
 
11
11
  import { Route as rootRouteImport } from './routes/__root'
12
12
  import { Route as IndexRouteImport } from './routes/index'
13
+ import { Route as CalendarRouteImport } from './routes/calendar'
13
14
  import { Route as ImportRouteImport } from './routes/import'
14
15
  import { Route as MailRouteImport } from './routes/mail'
15
16
  import { Route as OnboardingRouteImport } from './routes/onboarding'
16
17
  import { Route as SettingsRouteImport } from './routes/settings'
18
+ import { Route as CalendarIndexRouteImport } from './routes/calendar/index'
17
19
  import { Route as MailIndexRouteImport } from './routes/mail/index'
18
20
  import { Route as MailMailboxIdRouteImport } from './routes/mail/$mailboxId'
19
21
  import { Route as MailBriefRouteImport } from './routes/mail/brief'
@@ -28,6 +30,7 @@ import { Route as SettingsFoldersRouteImport } from './routes/settings/folders'
28
30
  import { Route as SettingsLabelsRouteImport } from './routes/settings/labels'
29
31
  import { Route as SettingsSendersRouteImport } from './routes/settings/senders'
30
32
  import { Route as SettingsSuggestedVipsRouteImport } from './routes/settings/suggested-vips'
33
+ import { Route as CalendarViewDateRouteImport } from './routes/calendar/$view.$date'
31
34
  import { Route as MailMailboxIdIndexRouteImport } from './routes/mail/$mailboxId/index'
32
35
  import { Route as MailMailboxIdThreadIdRouteImport } from './routes/mail/$mailboxId/$threadId'
33
36
  import { Route as MailBriefIndexRouteImport } from './routes/mail/brief/index'
@@ -35,6 +38,9 @@ import { Route as MailBriefThreadIdRouteImport } from './routes/mail/brief/$thre
35
38
  import { Route as MailFlaggedIndexRouteImport } from './routes/mail/flagged/index'
36
39
  import { Route as MailFlaggedThreadIdRouteImport } from './routes/mail/flagged/$threadId'
37
40
  import { Route as MailOutboxIndexRouteImport } from './routes/mail/outbox/index'
41
+ import { Route as CalendarViewDateIndexRouteImport } from './routes/calendar/$view.$date/index'
42
+ import { Route as CalendarViewDateCalendarObjectIdRouteImport } from './routes/calendar/$view.$date/$calendarObjectId'
43
+ import { Route as CalendarViewDateNewRouteImport } from './routes/calendar/$view.$date/new'
38
44
  import { Route as MailMailboxIdThreadIdIndexRouteImport } from './routes/mail/$mailboxId/$threadId/index'
39
45
  import { Route as MailMailboxIdThreadIdMessageIdRouteImport } from './routes/mail/$mailboxId/$threadId/$messageId'
40
46
  import { Route as MailMailboxIdComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/$mailboxId/compose.{-$outboxMessageId}'
@@ -46,6 +52,8 @@ import { Route as MailFlaggedThreadIdMessageIdRouteImport } from './routes/mail/
46
52
  import { Route as MailFlaggedComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/flagged/compose.{-$outboxMessageId}'
47
53
  import { Route as MailOutboxComposeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/outbox/compose.{-$outboxMessageId}'
48
54
  import { Route as MailOutboxDraftOutboxMessageIdRouteImport } from './routes/mail/outbox/draft/$outboxMessageId'
55
+ import { Route as CalendarViewDateCalendarObjectIdIndexRouteImport } from './routes/calendar/$view.$date/$calendarObjectId/index'
56
+ import { Route as CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport } from './routes/calendar/$view.$date/$calendarObjectId/$recurrenceId'
49
57
  import { Route as MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/$mailboxId/$threadId/$messageId/$mode.{-$outboxMessageId}'
50
58
  import { Route as MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/brief/$threadId/$messageId/$mode.{-$outboxMessageId}'
51
59
  import { Route as MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport } from './routes/mail/flagged/$threadId/$messageId/$mode.{-$outboxMessageId}'
@@ -55,6 +63,11 @@ const IndexRoute = IndexRouteImport.update({
55
63
  path: '/',
56
64
  getParentRoute: () => rootRouteImport,
57
65
  } as any)
66
+ const CalendarRoute = CalendarRouteImport.update({
67
+ id: '/calendar',
68
+ path: '/calendar',
69
+ getParentRoute: () => rootRouteImport,
70
+ } as any)
58
71
  const ImportRoute = ImportRouteImport.update({
59
72
  id: '/import',
60
73
  path: '/import',
@@ -75,6 +88,11 @@ const SettingsRoute = SettingsRouteImport.update({
75
88
  path: '/settings',
76
89
  getParentRoute: () => rootRouteImport,
77
90
  } as any)
91
+ const CalendarIndexRoute = CalendarIndexRouteImport.update({
92
+ id: '/',
93
+ path: '/',
94
+ getParentRoute: () => CalendarRoute,
95
+ } as any)
78
96
  const MailIndexRoute = MailIndexRouteImport.update({
79
97
  id: '/',
80
98
  path: '/',
@@ -145,6 +163,11 @@ const SettingsSuggestedVipsRoute = SettingsSuggestedVipsRouteImport.update({
145
163
  path: '/suggested-vips',
146
164
  getParentRoute: () => SettingsRoute,
147
165
  } as any)
166
+ const CalendarViewDateRoute = CalendarViewDateRouteImport.update({
167
+ id: '/$view/$date',
168
+ path: '/$view/$date',
169
+ getParentRoute: () => CalendarRoute,
170
+ } as any)
148
171
  const MailMailboxIdIndexRoute = MailMailboxIdIndexRouteImport.update({
149
172
  id: '/',
150
173
  path: '/',
@@ -180,6 +203,22 @@ const MailOutboxIndexRoute = MailOutboxIndexRouteImport.update({
180
203
  path: '/',
181
204
  getParentRoute: () => MailOutboxRoute,
182
205
  } as any)
206
+ const CalendarViewDateIndexRoute = CalendarViewDateIndexRouteImport.update({
207
+ id: '/',
208
+ path: '/',
209
+ getParentRoute: () => CalendarViewDateRoute,
210
+ } as any)
211
+ const CalendarViewDateCalendarObjectIdRoute =
212
+ CalendarViewDateCalendarObjectIdRouteImport.update({
213
+ id: '/$calendarObjectId',
214
+ path: '/$calendarObjectId',
215
+ getParentRoute: () => CalendarViewDateRoute,
216
+ } as any)
217
+ const CalendarViewDateNewRoute = CalendarViewDateNewRouteImport.update({
218
+ id: '/new',
219
+ path: '/new',
220
+ getParentRoute: () => CalendarViewDateRoute,
221
+ } as any)
183
222
  const MailMailboxIdThreadIdIndexRoute =
184
223
  MailMailboxIdThreadIdIndexRouteImport.update({
185
224
  id: '/',
@@ -245,6 +284,18 @@ const MailOutboxDraftOutboxMessageIdRoute =
245
284
  path: '/draft/$outboxMessageId',
246
285
  getParentRoute: () => MailOutboxRoute,
247
286
  } as any)
287
+ const CalendarViewDateCalendarObjectIdIndexRoute =
288
+ CalendarViewDateCalendarObjectIdIndexRouteImport.update({
289
+ id: '/',
290
+ path: '/',
291
+ getParentRoute: () => CalendarViewDateCalendarObjectIdRoute,
292
+ } as any)
293
+ const CalendarViewDateCalendarObjectIdRecurrenceIdRoute =
294
+ CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport.update({
295
+ id: '/$recurrenceId',
296
+ path: '/$recurrenceId',
297
+ getParentRoute: () => CalendarViewDateCalendarObjectIdRoute,
298
+ } as any)
248
299
  const MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route =
249
300
  MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125RouteImport.update(
250
301
  {
@@ -272,6 +323,7 @@ const MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route =
272
323
 
273
324
  export interface FileRoutesByFullPath {
274
325
  '/': typeof IndexRoute
326
+ '/calendar': typeof CalendarRouteWithChildren
275
327
  '/import': typeof ImportRoute
276
328
  '/mail': typeof MailRouteWithChildren
277
329
  '/onboarding': typeof OnboardingRoute
@@ -288,8 +340,10 @@ export interface FileRoutesByFullPath {
288
340
  '/settings/labels': typeof SettingsLabelsRoute
289
341
  '/settings/senders': typeof SettingsSendersRoute
290
342
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
343
+ '/calendar/': typeof CalendarIndexRoute
291
344
  '/mail/': typeof MailIndexRoute
292
345
  '/settings/': typeof SettingsIndexRoute
346
+ '/calendar/$view/$date': typeof CalendarViewDateRouteWithChildren
293
347
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdRouteWithChildren
294
348
  '/mail/brief/$threadId': typeof MailBriefThreadIdRouteWithChildren
295
349
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdRouteWithChildren
@@ -297,6 +351,8 @@ export interface FileRoutesByFullPath {
297
351
  '/mail/brief/': typeof MailBriefIndexRoute
298
352
  '/mail/flagged/': typeof MailFlaggedIndexRoute
299
353
  '/mail/outbox/': typeof MailOutboxIndexRoute
354
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdRouteWithChildren
355
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
300
356
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
301
357
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
302
358
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -305,9 +361,12 @@ export interface FileRoutesByFullPath {
305
361
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
306
362
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
307
363
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
364
+ '/calendar/$view/$date/': typeof CalendarViewDateIndexRoute
308
365
  '/mail/$mailboxId/$threadId/': typeof MailMailboxIdThreadIdIndexRoute
309
366
  '/mail/brief/$threadId/': typeof MailBriefThreadIdIndexRoute
310
367
  '/mail/flagged/$threadId/': typeof MailFlaggedThreadIdIndexRoute
368
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
369
+ '/calendar/$view/$date/$calendarObjectId/': typeof CalendarViewDateCalendarObjectIdIndexRoute
311
370
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
312
371
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
313
372
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
@@ -324,12 +383,14 @@ export interface FileRoutesByTo {
324
383
  '/settings/labels': typeof SettingsLabelsRoute
325
384
  '/settings/senders': typeof SettingsSendersRoute
326
385
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
386
+ '/calendar': typeof CalendarIndexRoute
327
387
  '/mail': typeof MailIndexRoute
328
388
  '/settings': typeof SettingsIndexRoute
329
389
  '/mail/$mailboxId': typeof MailMailboxIdIndexRoute
330
390
  '/mail/brief': typeof MailBriefIndexRoute
331
391
  '/mail/flagged': typeof MailFlaggedIndexRoute
332
392
  '/mail/outbox': typeof MailOutboxIndexRoute
393
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
333
394
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
334
395
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
335
396
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -338,9 +399,12 @@ export interface FileRoutesByTo {
338
399
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
339
400
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
340
401
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
402
+ '/calendar/$view/$date': typeof CalendarViewDateIndexRoute
341
403
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdIndexRoute
342
404
  '/mail/brief/$threadId': typeof MailBriefThreadIdIndexRoute
343
405
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdIndexRoute
406
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
407
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdIndexRoute
344
408
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
345
409
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
346
410
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
@@ -348,6 +412,7 @@ export interface FileRoutesByTo {
348
412
  export interface FileRoutesById {
349
413
  __root__: typeof rootRouteImport
350
414
  '/': typeof IndexRoute
415
+ '/calendar': typeof CalendarRouteWithChildren
351
416
  '/import': typeof ImportRoute
352
417
  '/mail': typeof MailRouteWithChildren
353
418
  '/onboarding': typeof OnboardingRoute
@@ -364,8 +429,10 @@ export interface FileRoutesById {
364
429
  '/settings/labels': typeof SettingsLabelsRoute
365
430
  '/settings/senders': typeof SettingsSendersRoute
366
431
  '/settings/suggested-vips': typeof SettingsSuggestedVipsRoute
432
+ '/calendar/': typeof CalendarIndexRoute
367
433
  '/mail/': typeof MailIndexRoute
368
434
  '/settings/': typeof SettingsIndexRoute
435
+ '/calendar/$view/$date': typeof CalendarViewDateRouteWithChildren
369
436
  '/mail/$mailboxId/$threadId': typeof MailMailboxIdThreadIdRouteWithChildren
370
437
  '/mail/brief/$threadId': typeof MailBriefThreadIdRouteWithChildren
371
438
  '/mail/flagged/$threadId': typeof MailFlaggedThreadIdRouteWithChildren
@@ -373,6 +440,8 @@ export interface FileRoutesById {
373
440
  '/mail/brief/': typeof MailBriefIndexRoute
374
441
  '/mail/flagged/': typeof MailFlaggedIndexRoute
375
442
  '/mail/outbox/': typeof MailOutboxIndexRoute
443
+ '/calendar/$view/$date/$calendarObjectId': typeof CalendarViewDateCalendarObjectIdRouteWithChildren
444
+ '/calendar/$view/$date/new': typeof CalendarViewDateNewRoute
376
445
  '/mail/$mailboxId/$threadId/$messageId': typeof MailMailboxIdThreadIdMessageIdRouteWithChildren
377
446
  '/mail/$mailboxId/compose/{-$outboxMessageId}': typeof MailMailboxIdComposeChar123OutboxMessageIdChar125Route
378
447
  '/mail/brief/$threadId/$messageId': typeof MailBriefThreadIdMessageIdRouteWithChildren
@@ -381,9 +450,12 @@ export interface FileRoutesById {
381
450
  '/mail/flagged/compose/{-$outboxMessageId}': typeof MailFlaggedComposeChar123OutboxMessageIdChar125Route
382
451
  '/mail/outbox/compose/{-$outboxMessageId}': typeof MailOutboxComposeChar123OutboxMessageIdChar125Route
383
452
  '/mail/outbox/draft/$outboxMessageId': typeof MailOutboxDraftOutboxMessageIdRoute
453
+ '/calendar/$view/$date/': typeof CalendarViewDateIndexRoute
384
454
  '/mail/$mailboxId/$threadId/': typeof MailMailboxIdThreadIdIndexRoute
385
455
  '/mail/brief/$threadId/': typeof MailBriefThreadIdIndexRoute
386
456
  '/mail/flagged/$threadId/': typeof MailFlaggedThreadIdIndexRoute
457
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
458
+ '/calendar/$view/$date/$calendarObjectId/': typeof CalendarViewDateCalendarObjectIdIndexRoute
387
459
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
388
460
  '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailBriefThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
389
461
  '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}': typeof MailFlaggedThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
@@ -392,6 +464,7 @@ export interface FileRouteTypes {
392
464
  fileRoutesByFullPath: FileRoutesByFullPath
393
465
  fullPaths:
394
466
  | '/'
467
+ | '/calendar'
395
468
  | '/import'
396
469
  | '/mail'
397
470
  | '/onboarding'
@@ -408,8 +481,10 @@ export interface FileRouteTypes {
408
481
  | '/settings/labels'
409
482
  | '/settings/senders'
410
483
  | '/settings/suggested-vips'
484
+ | '/calendar/'
411
485
  | '/mail/'
412
486
  | '/settings/'
487
+ | '/calendar/$view/$date'
413
488
  | '/mail/$mailboxId/$threadId'
414
489
  | '/mail/brief/$threadId'
415
490
  | '/mail/flagged/$threadId'
@@ -417,6 +492,8 @@ export interface FileRouteTypes {
417
492
  | '/mail/brief/'
418
493
  | '/mail/flagged/'
419
494
  | '/mail/outbox/'
495
+ | '/calendar/$view/$date/$calendarObjectId'
496
+ | '/calendar/$view/$date/new'
420
497
  | '/mail/$mailboxId/$threadId/$messageId'
421
498
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
422
499
  | '/mail/brief/$threadId/$messageId'
@@ -425,9 +502,12 @@ export interface FileRouteTypes {
425
502
  | '/mail/flagged/compose/{-$outboxMessageId}'
426
503
  | '/mail/outbox/compose/{-$outboxMessageId}'
427
504
  | '/mail/outbox/draft/$outboxMessageId'
505
+ | '/calendar/$view/$date/'
428
506
  | '/mail/$mailboxId/$threadId/'
429
507
  | '/mail/brief/$threadId/'
430
508
  | '/mail/flagged/$threadId/'
509
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
510
+ | '/calendar/$view/$date/$calendarObjectId/'
431
511
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
432
512
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
433
513
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
@@ -444,12 +524,14 @@ export interface FileRouteTypes {
444
524
  | '/settings/labels'
445
525
  | '/settings/senders'
446
526
  | '/settings/suggested-vips'
527
+ | '/calendar'
447
528
  | '/mail'
448
529
  | '/settings'
449
530
  | '/mail/$mailboxId'
450
531
  | '/mail/brief'
451
532
  | '/mail/flagged'
452
533
  | '/mail/outbox'
534
+ | '/calendar/$view/$date/new'
453
535
  | '/mail/$mailboxId/$threadId/$messageId'
454
536
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
455
537
  | '/mail/brief/$threadId/$messageId'
@@ -458,15 +540,19 @@ export interface FileRouteTypes {
458
540
  | '/mail/flagged/compose/{-$outboxMessageId}'
459
541
  | '/mail/outbox/compose/{-$outboxMessageId}'
460
542
  | '/mail/outbox/draft/$outboxMessageId'
543
+ | '/calendar/$view/$date'
461
544
  | '/mail/$mailboxId/$threadId'
462
545
  | '/mail/brief/$threadId'
463
546
  | '/mail/flagged/$threadId'
547
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
548
+ | '/calendar/$view/$date/$calendarObjectId'
464
549
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
465
550
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
466
551
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
467
552
  id:
468
553
  | '__root__'
469
554
  | '/'
555
+ | '/calendar'
470
556
  | '/import'
471
557
  | '/mail'
472
558
  | '/onboarding'
@@ -483,8 +569,10 @@ export interface FileRouteTypes {
483
569
  | '/settings/labels'
484
570
  | '/settings/senders'
485
571
  | '/settings/suggested-vips'
572
+ | '/calendar/'
486
573
  | '/mail/'
487
574
  | '/settings/'
575
+ | '/calendar/$view/$date'
488
576
  | '/mail/$mailboxId/$threadId'
489
577
  | '/mail/brief/$threadId'
490
578
  | '/mail/flagged/$threadId'
@@ -492,6 +580,8 @@ export interface FileRouteTypes {
492
580
  | '/mail/brief/'
493
581
  | '/mail/flagged/'
494
582
  | '/mail/outbox/'
583
+ | '/calendar/$view/$date/$calendarObjectId'
584
+ | '/calendar/$view/$date/new'
495
585
  | '/mail/$mailboxId/$threadId/$messageId'
496
586
  | '/mail/$mailboxId/compose/{-$outboxMessageId}'
497
587
  | '/mail/brief/$threadId/$messageId'
@@ -500,9 +590,12 @@ export interface FileRouteTypes {
500
590
  | '/mail/flagged/compose/{-$outboxMessageId}'
501
591
  | '/mail/outbox/compose/{-$outboxMessageId}'
502
592
  | '/mail/outbox/draft/$outboxMessageId'
593
+ | '/calendar/$view/$date/'
503
594
  | '/mail/$mailboxId/$threadId/'
504
595
  | '/mail/brief/$threadId/'
505
596
  | '/mail/flagged/$threadId/'
597
+ | '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
598
+ | '/calendar/$view/$date/$calendarObjectId/'
506
599
  | '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
507
600
  | '/mail/brief/$threadId/$messageId/$mode/{-$outboxMessageId}'
508
601
  | '/mail/flagged/$threadId/$messageId/$mode/{-$outboxMessageId}'
@@ -510,6 +603,7 @@ export interface FileRouteTypes {
510
603
  }
511
604
  export interface RootRouteChildren {
512
605
  IndexRoute: typeof IndexRoute
606
+ CalendarRoute: typeof CalendarRouteWithChildren
513
607
  ImportRoute: typeof ImportRoute
514
608
  MailRoute: typeof MailRouteWithChildren
515
609
  OnboardingRoute: typeof OnboardingRoute
@@ -525,6 +619,13 @@ declare module '@tanstack/react-router' {
525
619
  preLoaderRoute: typeof IndexRouteImport
526
620
  parentRoute: typeof rootRouteImport
527
621
  }
622
+ '/calendar': {
623
+ id: '/calendar'
624
+ path: '/calendar'
625
+ fullPath: '/calendar'
626
+ preLoaderRoute: typeof CalendarRouteImport
627
+ parentRoute: typeof rootRouteImport
628
+ }
528
629
  '/import': {
529
630
  id: '/import'
530
631
  path: '/import'
@@ -553,6 +654,13 @@ declare module '@tanstack/react-router' {
553
654
  preLoaderRoute: typeof SettingsRouteImport
554
655
  parentRoute: typeof rootRouteImport
555
656
  }
657
+ '/calendar/': {
658
+ id: '/calendar/'
659
+ path: '/'
660
+ fullPath: '/calendar/'
661
+ preLoaderRoute: typeof CalendarIndexRouteImport
662
+ parentRoute: typeof CalendarRoute
663
+ }
556
664
  '/mail/': {
557
665
  id: '/mail/'
558
666
  path: '/'
@@ -651,6 +759,13 @@ declare module '@tanstack/react-router' {
651
759
  preLoaderRoute: typeof SettingsSuggestedVipsRouteImport
652
760
  parentRoute: typeof SettingsRoute
653
761
  }
762
+ '/calendar/$view/$date': {
763
+ id: '/calendar/$view/$date'
764
+ path: '/$view/$date'
765
+ fullPath: '/calendar/$view/$date'
766
+ preLoaderRoute: typeof CalendarViewDateRouteImport
767
+ parentRoute: typeof CalendarRoute
768
+ }
654
769
  '/mail/$mailboxId/': {
655
770
  id: '/mail/$mailboxId/'
656
771
  path: '/'
@@ -700,6 +815,27 @@ declare module '@tanstack/react-router' {
700
815
  preLoaderRoute: typeof MailOutboxIndexRouteImport
701
816
  parentRoute: typeof MailOutboxRoute
702
817
  }
818
+ '/calendar/$view/$date/': {
819
+ id: '/calendar/$view/$date/'
820
+ path: '/'
821
+ fullPath: '/calendar/$view/$date/'
822
+ preLoaderRoute: typeof CalendarViewDateIndexRouteImport
823
+ parentRoute: typeof CalendarViewDateRoute
824
+ }
825
+ '/calendar/$view/$date/$calendarObjectId': {
826
+ id: '/calendar/$view/$date/$calendarObjectId'
827
+ path: '/$calendarObjectId'
828
+ fullPath: '/calendar/$view/$date/$calendarObjectId'
829
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdRouteImport
830
+ parentRoute: typeof CalendarViewDateRoute
831
+ }
832
+ '/calendar/$view/$date/new': {
833
+ id: '/calendar/$view/$date/new'
834
+ path: '/new'
835
+ fullPath: '/calendar/$view/$date/new'
836
+ preLoaderRoute: typeof CalendarViewDateNewRouteImport
837
+ parentRoute: typeof CalendarViewDateRoute
838
+ }
703
839
  '/mail/$mailboxId/$threadId/': {
704
840
  id: '/mail/$mailboxId/$threadId/'
705
841
  path: '/'
@@ -777,6 +913,20 @@ declare module '@tanstack/react-router' {
777
913
  preLoaderRoute: typeof MailOutboxDraftOutboxMessageIdRouteImport
778
914
  parentRoute: typeof MailOutboxRoute
779
915
  }
916
+ '/calendar/$view/$date/$calendarObjectId/': {
917
+ id: '/calendar/$view/$date/$calendarObjectId/'
918
+ path: '/'
919
+ fullPath: '/calendar/$view/$date/$calendarObjectId/'
920
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdIndexRouteImport
921
+ parentRoute: typeof CalendarViewDateCalendarObjectIdRoute
922
+ }
923
+ '/calendar/$view/$date/$calendarObjectId/$recurrenceId': {
924
+ id: '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
925
+ path: '/$recurrenceId'
926
+ fullPath: '/calendar/$view/$date/$calendarObjectId/$recurrenceId'
927
+ preLoaderRoute: typeof CalendarViewDateCalendarObjectIdRecurrenceIdRouteImport
928
+ parentRoute: typeof CalendarViewDateCalendarObjectIdRoute
929
+ }
780
930
  '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}': {
781
931
  id: '/mail/$mailboxId/$threadId/$messageId/$mode/{-$outboxMessageId}'
782
932
  path: '/$mode/{-$outboxMessageId}'
@@ -801,6 +951,54 @@ declare module '@tanstack/react-router' {
801
951
  }
802
952
  }
803
953
 
954
+ interface CalendarViewDateCalendarObjectIdRouteChildren {
955
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute: typeof CalendarViewDateCalendarObjectIdRecurrenceIdRoute
956
+ CalendarViewDateCalendarObjectIdIndexRoute: typeof CalendarViewDateCalendarObjectIdIndexRoute
957
+ }
958
+
959
+ const CalendarViewDateCalendarObjectIdRouteChildren: CalendarViewDateCalendarObjectIdRouteChildren =
960
+ {
961
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute:
962
+ CalendarViewDateCalendarObjectIdRecurrenceIdRoute,
963
+ CalendarViewDateCalendarObjectIdIndexRoute:
964
+ CalendarViewDateCalendarObjectIdIndexRoute,
965
+ }
966
+
967
+ const CalendarViewDateCalendarObjectIdRouteWithChildren =
968
+ CalendarViewDateCalendarObjectIdRoute._addFileChildren(
969
+ CalendarViewDateCalendarObjectIdRouteChildren,
970
+ )
971
+
972
+ interface CalendarViewDateRouteChildren {
973
+ CalendarViewDateCalendarObjectIdRoute: typeof CalendarViewDateCalendarObjectIdRouteWithChildren
974
+ CalendarViewDateNewRoute: typeof CalendarViewDateNewRoute
975
+ CalendarViewDateIndexRoute: typeof CalendarViewDateIndexRoute
976
+ }
977
+
978
+ const CalendarViewDateRouteChildren: CalendarViewDateRouteChildren = {
979
+ CalendarViewDateCalendarObjectIdRoute:
980
+ CalendarViewDateCalendarObjectIdRouteWithChildren,
981
+ CalendarViewDateNewRoute: CalendarViewDateNewRoute,
982
+ CalendarViewDateIndexRoute: CalendarViewDateIndexRoute,
983
+ }
984
+
985
+ const CalendarViewDateRouteWithChildren =
986
+ CalendarViewDateRoute._addFileChildren(CalendarViewDateRouteChildren)
987
+
988
+ interface CalendarRouteChildren {
989
+ CalendarIndexRoute: typeof CalendarIndexRoute
990
+ CalendarViewDateRoute: typeof CalendarViewDateRouteWithChildren
991
+ }
992
+
993
+ const CalendarRouteChildren: CalendarRouteChildren = {
994
+ CalendarIndexRoute: CalendarIndexRoute,
995
+ CalendarViewDateRoute: CalendarViewDateRouteWithChildren,
996
+ }
997
+
998
+ const CalendarRouteWithChildren = CalendarRoute._addFileChildren(
999
+ CalendarRouteChildren,
1000
+ )
1001
+
804
1002
  interface MailMailboxIdThreadIdMessageIdRouteChildren {
805
1003
  MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route: typeof MailMailboxIdThreadIdMessageIdModeChar123OutboxMessageIdChar125Route
806
1004
  }
@@ -1005,6 +1203,7 @@ const SettingsRouteWithChildren = SettingsRoute._addFileChildren(
1005
1203
 
1006
1204
  const rootRouteChildren: RootRouteChildren = {
1007
1205
  IndexRoute: IndexRoute,
1206
+ CalendarRoute: CalendarRouteWithChildren,
1008
1207
  ImportRoute: ImportRoute,
1009
1208
  MailRoute: MailRouteWithChildren,
1010
1209
  OnboardingRoute: OnboardingRoute,
package/src/router.tsx CHANGED
@@ -2,6 +2,7 @@ import type { QueryClient } from "@tanstack/react-query";
2
2
  import { createRouter } from "@tanstack/react-router";
3
3
  import { AppShellSkeleton } from "./components/layout/AppShellSkeleton";
4
4
  import { recordRoute } from "./lib/route-breadcrumbs";
5
+ import { stringifySearch } from "./lib/search-params";
5
6
  import type { Telemetry } from "./lib/telemetry";
6
7
  import { routeTree } from "./routeTree.gen";
7
8
 
@@ -16,6 +17,10 @@ export const createAppRouter = (
16
17
  const router = createRouter({
17
18
  routeTree,
18
19
  context: { queryClient },
20
+ // A query param that carries a list writes one param per value
21
+ // (`lib/search-params.ts`), which is what the router's own reader already
22
+ // expects and what a hand-written link says.
23
+ stringifySearch,
19
24
  defaultPreload: "intent",
20
25
  // A route arrives with its own code, and each mail list carries a whole pane
21
26
  // in it. Without a pending state the router keeps the previous route on
@@ -0,0 +1,26 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * One occurrence of a repeating event, under the series it belongs to.
4
+ *
5
+ * A segment rather than a param on the event, because an edit asks which
6
+ * instances it applies to and the answer starts from the one on screen: the
7
+ * series stays matched behind the occurrence, so the address names both.
8
+ */
9
+ import { createFileRoute } from "@tanstack/react-router";
10
+ import { OpenCalendarEvent } from "@/components/calendar/OpenCalendarEvent";
11
+
12
+ function CalendarOccurrenceRoute() {
13
+ const { calendarObjectId, recurrenceId } = Route.useParams();
14
+ return (
15
+ <OpenCalendarEvent
16
+ calendarObjectId={calendarObjectId}
17
+ recurrenceId={recurrenceId}
18
+ />
19
+ );
20
+ }
21
+
22
+ export const Route = createFileRoute(
23
+ "/calendar/$view/$date/$calendarObjectId/$recurrenceId",
24
+ )({
25
+ component: CalendarOccurrenceRoute,
26
+ });
@@ -0,0 +1,18 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * The event itself — the series, where it repeats. An occurrence of it is the
4
+ * `$recurrenceId` segment beside this one.
5
+ */
6
+ import { createFileRoute } from "@tanstack/react-router";
7
+ import { OpenCalendarEvent } from "@/components/calendar/OpenCalendarEvent";
8
+
9
+ function CalendarEventRoute() {
10
+ const { calendarObjectId } = Route.useParams();
11
+ return <OpenCalendarEvent calendarObjectId={calendarObjectId} />;
12
+ }
13
+
14
+ export const Route = createFileRoute(
15
+ "/calendar/$view/$date/$calendarObjectId/",
16
+ )({
17
+ component: CalendarEventRoute,
18
+ });
@@ -0,0 +1,15 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * /calendar/{view}/{date}/{calendarObjectId} — an event open in the reading
4
+ * pane, mirroring `$threadId` under a mail list.
5
+ *
6
+ * A layout, because one instance of a series nests under it: the series is what
7
+ * the address names, and the occurrence is the segment below.
8
+ */
9
+ import { createFileRoute, Outlet } from "@tanstack/react-router";
10
+
11
+ export const Route = createFileRoute("/calendar/$view/$date/$calendarObjectId")(
12
+ {
13
+ component: Outlet,
14
+ },
15
+ );
@@ -0,0 +1,25 @@
1
+ // biome-ignore lint/style/useFilenamingConvention: TanStack Router convention
2
+ /**
3
+ * The calendar's reading pane with nothing open. It is a route because the pane
4
+ * belongs to the view it was opened from, and the event and the composer arrive
5
+ * as segments beside it.
6
+ */
7
+
8
+ import { createFileRoute } from "@tanstack/react-router";
9
+ import { CalendarDays } from "lucide-react";
10
+ import { EmptyState } from "@/components/ui/EmptyState";
11
+
12
+ function CalendarReadingPane() {
13
+ return (
14
+ <div className="flex h-full items-center justify-center bg-surface">
15
+ <EmptyState
16
+ message="Pick an event to read it here."
17
+ icon={<CalendarDays className="size-8" />}
18
+ />
19
+ </div>
20
+ );
21
+ }
22
+
23
+ export const Route = createFileRoute("/calendar/$view/$date/")({
24
+ component: CalendarReadingPane,
25
+ });
@@ -0,0 +1,20 @@
1
+ /**
2
+ * /calendar/{view}/{date}/new — writing an event.
3
+ *
4
+ * A sibling of the event route, so navigating here unmatches whatever the
5
+ * calendar had open in the same transition: nothing has to be closed first, and
6
+ * a composer over an open event is unrepresentable. The address is exactly the
7
+ * move `compose` makes over a mail list.
8
+ */
9
+ import { createFileRoute } from "@tanstack/react-router";
10
+ import { WriteCalendarEvent } from "@/components/calendar/WriteCalendarEvent";
11
+ import { useCalendarNavigation } from "@/routing";
12
+
13
+ function CalendarComposeRoute() {
14
+ const { closeEvent } = useCalendarNavigation();
15
+ return <WriteCalendarEvent onClose={closeEvent} />;
16
+ }
17
+
18
+ export const Route = createFileRoute("/calendar/$view/$date/new")({
19
+ component: CalendarComposeRoute,
20
+ });