@rapidmx/web-client 0.15.1 → 0.17.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.
Files changed (318) hide show
  1. package/README.md +381 -373
  2. package/apps/admin/branding/index.tsx +39 -39
  3. package/apps/admin/data-requests/index.tsx +482 -480
  4. package/apps/admin/distribution-lists/new/index.tsx +3 -1
  5. package/apps/admin/domains/[uid].tsx +166 -164
  6. package/apps/admin/domains/new/index.tsx +3 -1
  7. package/apps/admin/escrow-scopes/[uid].tsx +350 -348
  8. package/apps/admin/escrow-scopes/new/index.tsx +3 -1
  9. package/apps/admin/index.tsx +129 -124
  10. package/apps/admin/mailboxes/[uid].tsx +271 -224
  11. package/apps/admin/mailboxes/new/index.tsx +30 -28
  12. package/apps/admin/plugins/index.tsx +15 -15
  13. package/apps/admin/retention-policy/index.tsx +39 -39
  14. package/apps/admin/signing-certificates/index.tsx +343 -343
  15. package/apps/admin/transport-rules/new/index.tsx +3 -1
  16. package/apps/escrow/audit-log/index.tsx +196 -196
  17. package/apps/escrow/matters/[uid].tsx +621 -621
  18. package/apps/escrow/matters/new/index.tsx +3 -1
  19. package/apps/shared/auth/adminAccess.ts +99 -99
  20. package/apps/shared/components/admin/layout/AdminShell.tsx +381 -378
  21. package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +238 -0
  22. package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -152
  23. package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +194 -0
  24. package/apps/shared/components/admin/settings/BrandingForm.tsx +423 -423
  25. package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +119 -119
  26. package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +50 -3
  27. package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +198 -198
  28. package/apps/shared/components/admin/settings/PluginsManager.tsx +1545 -1545
  29. package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +182 -182
  30. package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +288 -288
  31. package/apps/shared/components/admin/setup/SetupWizard.tsx +446 -444
  32. package/apps/shared/components/admin/usePagedList.tsx +129 -129
  33. package/apps/shared/components/calendar/EventEditor.tsx +5 -10
  34. package/apps/shared/components/calendar/EventFormParts.tsx +16 -47
  35. package/apps/shared/components/calendar/EventModal.tsx +206 -206
  36. package/apps/shared/components/calendar/GuestInput.tsx +100 -0
  37. package/apps/shared/components/calendar/MonthView.tsx +185 -185
  38. package/apps/shared/components/calendar/RecurrenceEditor.tsx +227 -227
  39. package/apps/shared/components/calendar/RequestChangeForm.tsx +23 -54
  40. package/apps/shared/components/calendar/SplitDayView.tsx +144 -144
  41. package/apps/shared/components/calendar/TimeGridView.tsx +246 -246
  42. package/apps/shared/components/calendar/allDay.ts +124 -124
  43. package/apps/shared/components/calendar/eventForm.ts +2 -2
  44. package/apps/shared/components/calendar/eventFormat.ts +49 -22
  45. package/apps/shared/components/calendar/layout/CalendarShell.tsx +201 -200
  46. package/apps/shared/components/contacts/ContactForm.tsx +383 -383
  47. package/apps/shared/components/contacts/ContactsSidebar.tsx +1 -1
  48. package/apps/shared/components/contacts/ContactsToolbar.tsx +103 -98
  49. package/apps/shared/components/contacts/layout/ContactsShell.tsx +218 -216
  50. package/apps/shared/components/escrow/layout/EscrowShell.tsx +155 -155
  51. package/apps/shared/components/layout/AppShell.tsx +461 -480
  52. package/apps/shared/components/layout/FloatingActionButton.tsx +31 -0
  53. package/apps/shared/components/layout/KeyEnrollmentGate.tsx +398 -398
  54. package/apps/shared/components/layout/MailboxProvisioning.tsx +168 -168
  55. package/apps/shared/components/layout/ResponsiveToolbar.tsx +315 -315
  56. package/apps/shared/components/layout/ThemeSwitch.tsx +84 -84
  57. package/apps/shared/components/layout/UserMenu.tsx +439 -424
  58. package/apps/shared/components/mail/ConversationList.tsx +323 -323
  59. package/apps/shared/components/mail/ConversationThreadPane.tsx +613 -491
  60. package/apps/shared/components/mail/EmptyFolderBar.tsx +41 -0
  61. package/apps/shared/components/mail/MailSelectionBar.tsx +240 -227
  62. package/apps/shared/components/mail/MenuButton.tsx +31 -11
  63. package/apps/shared/components/mail/MessageDetailPane.tsx +1757 -1559
  64. package/apps/shared/components/mail/PermanentDeleteDialog.tsx +47 -0
  65. package/apps/shared/components/mail/compose/ComposeContext.tsx +312 -312
  66. package/apps/shared/components/mail/compose/ComposeToolbar.tsx +422 -422
  67. package/apps/shared/components/mail/compose/ComposeWindow.tsx +1681 -1677
  68. package/apps/shared/components/mail/compose/RecipientInput.tsx +54 -11
  69. package/apps/shared/components/mail/compose/RichTextEditor.tsx +147 -147
  70. package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -60
  71. package/apps/shared/components/mail/compose/quotedBody.ts +161 -161
  72. package/apps/shared/components/mail/layout/FolderBadgeChip.tsx +21 -0
  73. package/apps/shared/components/mail/layout/MailShell.tsx +161 -134
  74. package/apps/shared/components/mail/layout/SidebarSection.tsx +66 -0
  75. package/apps/shared/components/mail/reading/MessageMoreMenu.tsx +258 -0
  76. package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +79 -0
  77. package/apps/shared/components/mail/reading/PendingMessageCard.tsx +68 -0
  78. package/apps/shared/components/mail/reading/messageExport.ts +59 -0
  79. package/apps/shared/components/mail/reading/printMessage.ts +99 -0
  80. package/apps/shared/components/mail/reading/useMessageActions.ts +443 -0
  81. package/apps/shared/components/mail/verificationSeals.ts +125 -125
  82. package/apps/shared/components/rules/RuleBuilder.tsx +311 -311
  83. package/apps/shared/components/settings/SigningCertificateCard.tsx +344 -344
  84. package/apps/shared/components/settings/layout/SettingsShell.tsx +257 -254
  85. package/apps/shared/components/tasks/TasksSidebar.tsx +1 -1
  86. package/apps/shared/components/tasks/layout/TasksShell.tsx +219 -217
  87. package/apps/shared/keyboard/GlobalShortcuts.tsx +51 -51
  88. package/apps/shared/keyboard/ShortcutProvider.tsx +62 -62
  89. package/apps/shared/keyboard/ShortcutsDialog.tsx +84 -84
  90. package/apps/shared/keyboard/dispatch.ts +124 -124
  91. package/apps/shared/keyboard/format.ts +89 -89
  92. package/apps/shared/keyboard/keymap.ts +114 -114
  93. package/apps/shared/keyboard/registry.ts +65 -65
  94. package/apps/shared/keyboard/targets.ts +79 -79
  95. package/apps/shared/mail/folderCounts.ts +17 -0
  96. package/apps/shared/mail/folderOfType.ts +49 -0
  97. package/apps/shared/mail/folderTree.ts +143 -143
  98. package/apps/shared/mail/listAllPages.ts +39 -39
  99. package/apps/shared/mail/newMailNotifications.ts +171 -171
  100. package/apps/shared/mail/outbox/outgoingReplies.ts +192 -0
  101. package/apps/shared/mail/outbox/sendJob.ts +19 -1
  102. package/apps/shared/mail/outbox/sendOutcomes.ts +13 -4
  103. package/apps/shared/mail/permanentDelete.ts +160 -0
  104. package/apps/shared/mail/primaryMailbox.ts +71 -0
  105. package/apps/shared/mail/reportNotices.ts +66 -0
  106. package/apps/shared/mail/senderBlocking.ts +141 -0
  107. package/apps/shared/mail/useCollapsedSections.ts +146 -0
  108. package/apps/shared/mail/useMailConnection.ts +205 -203
  109. package/apps/shared/mail/useMailLiveUpdates.ts +277 -277
  110. package/apps/shared/mail/useMailboxUpdateAccess.ts +60 -0
  111. package/apps/shared/mail/useMarkMessageRead.ts +47 -47
  112. package/apps/shared/mail/useNewMailNotifications.ts +178 -178
  113. package/apps/shared/mail/usePermanentDelete.tsx +160 -0
  114. package/apps/shared/navigation/frameContext.tsx +1 -1
  115. package/apps/shared/navigation/index.ts +43 -0
  116. package/apps/shared/navigation/pageTitle.ts +19 -0
  117. package/apps/shared/notifications/store.ts +560 -560
  118. package/apps/shared/search/LocalIndexLifecycle.tsx +114 -114
  119. package/apps/shared/search/crossMailboxSearch.ts +169 -0
  120. package/apps/shared/search/localIndexBuilder.ts +481 -481
  121. package/apps/shared/signing/enrollmentStorage.ts +33 -33
  122. package/apps/shared/signing/enrollmentTracker.ts +385 -385
  123. package/apps/shared/signing/enrollmentView.ts +251 -251
  124. package/apps/shared/signing/useNow.ts +19 -19
  125. package/apps/shared/signing/useSigningEnrollmentWatcher.ts +90 -90
  126. package/apps/shared/styles/app.css +396 -386
  127. package/apps/www/_shell.tsx +82 -0
  128. package/apps/www/calendar/index.tsx +581 -571
  129. package/apps/www/contacts/[uid].tsx +112 -109
  130. package/apps/www/contacts/index.tsx +14 -3
  131. package/apps/www/index.tsx +2962 -2479
  132. package/apps/www/messages/[uid].tsx +139 -135
  133. package/apps/www/settings/appearance/index.tsx +5 -2
  134. package/apps/www/settings/auto-reply/index.tsx +136 -133
  135. package/apps/www/settings/blocked-senders/index.tsx +303 -0
  136. package/apps/www/settings/encryption/index.tsx +1290 -1287
  137. package/apps/www/settings/filters/[uid].tsx +179 -176
  138. package/apps/www/settings/filters/index.tsx +105 -102
  139. package/apps/www/settings/filters/new/index.tsx +165 -140
  140. package/apps/www/settings/labels/index.tsx +207 -204
  141. package/apps/www/settings/privacy/index.tsx +495 -492
  142. package/apps/www/settings/profile/index.tsx +251 -248
  143. package/apps/www/settings/read-receipts/index.tsx +150 -147
  144. package/apps/www/settings/sharing/index.tsx +259 -256
  145. package/apps/www/settings/signatures/[uid].tsx +175 -172
  146. package/apps/www/settings/signatures/index.tsx +91 -88
  147. package/apps/www/settings/signatures/new/index.tsx +138 -135
  148. package/apps/www/tasks/index.tsx +654 -649
  149. package/dist/apps/admin/data-requests/index.js +1 -1
  150. package/dist/apps/admin/distribution-lists/new/index.js +3 -1
  151. package/dist/apps/admin/domains/[uid].js +3 -1
  152. package/dist/apps/admin/domains/new/index.js +3 -1
  153. package/dist/apps/admin/escrow-scopes/[uid].js +3 -1
  154. package/dist/apps/admin/escrow-scopes/new/index.js +3 -1
  155. package/dist/apps/admin/index.js +5 -2
  156. package/dist/apps/admin/mailboxes/[uid].js +15 -3
  157. package/dist/apps/admin/mailboxes/new/index.js +3 -1
  158. package/dist/apps/admin/transport-rules/new/index.js +3 -1
  159. package/dist/apps/escrow/matters/new/index.js +3 -1
  160. package/dist/apps/shared/components/admin/layout/AdminShell.js +6 -3
  161. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +35 -0
  162. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +115 -0
  163. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.d.ts +16 -0
  164. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +92 -0
  165. package/dist/apps/shared/components/admin/settings/BrandingForm.js +3 -3
  166. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +25 -3
  167. package/dist/apps/shared/components/admin/setup/SetupWizard.js +3 -1
  168. package/dist/apps/shared/components/calendar/EventEditor.js +5 -10
  169. package/dist/apps/shared/components/calendar/EventFormParts.d.ts +3 -2
  170. package/dist/apps/shared/components/calendar/EventFormParts.js +5 -16
  171. package/dist/apps/shared/components/calendar/GuestInput.d.ts +45 -0
  172. package/dist/apps/shared/components/calendar/GuestInput.js +30 -0
  173. package/dist/apps/shared/components/calendar/RequestChangeForm.js +11 -22
  174. package/dist/apps/shared/components/calendar/eventForm.d.ts +2 -2
  175. package/dist/apps/shared/components/calendar/eventFormat.d.ts +21 -8
  176. package/dist/apps/shared/components/calendar/eventFormat.js +50 -23
  177. package/dist/apps/shared/components/calendar/layout/CalendarShell.js +5 -4
  178. package/dist/apps/shared/components/contacts/ContactsSidebar.js +1 -1
  179. package/dist/apps/shared/components/contacts/ContactsToolbar.d.ts +3 -1
  180. package/dist/apps/shared/components/contacts/ContactsToolbar.js +4 -2
  181. package/dist/apps/shared/components/contacts/layout/ContactsShell.js +7 -5
  182. package/dist/apps/shared/components/layout/AppShell.d.ts +8 -11
  183. package/dist/apps/shared/components/layout/AppShell.js +24 -33
  184. package/dist/apps/shared/components/layout/FloatingActionButton.d.ts +13 -0
  185. package/dist/apps/shared/components/layout/FloatingActionButton.js +9 -0
  186. package/dist/apps/shared/components/layout/UserMenu.d.ts +4 -1
  187. package/dist/apps/shared/components/layout/UserMenu.js +6 -5
  188. package/dist/apps/shared/components/mail/ConversationThreadPane.js +127 -22
  189. package/dist/apps/shared/components/mail/EmptyFolderBar.d.ts +18 -0
  190. package/dist/apps/shared/components/mail/EmptyFolderBar.js +10 -0
  191. package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +14 -4
  192. package/dist/apps/shared/components/mail/MailSelectionBar.js +11 -13
  193. package/dist/apps/shared/components/mail/MenuButton.d.ts +9 -2
  194. package/dist/apps/shared/components/mail/MenuButton.js +15 -11
  195. package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +5 -0
  196. package/dist/apps/shared/components/mail/MessageDetailPane.js +147 -7
  197. package/dist/apps/shared/components/mail/PermanentDeleteDialog.d.ts +19 -0
  198. package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +11 -0
  199. package/dist/apps/shared/components/mail/compose/ComposeWindow.js +8 -4
  200. package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +21 -1
  201. package/dist/apps/shared/components/mail/compose/RecipientInput.js +18 -10
  202. package/dist/apps/shared/components/mail/layout/FolderBadgeChip.d.ts +6 -0
  203. package/dist/apps/shared/components/mail/layout/FolderBadgeChip.js +9 -0
  204. package/dist/apps/shared/components/mail/layout/MailShell.d.ts +16 -7
  205. package/dist/apps/shared/components/mail/layout/MailShell.js +78 -65
  206. package/dist/apps/shared/components/mail/layout/SidebarSection.d.ts +23 -0
  207. package/dist/apps/shared/components/mail/layout/SidebarSection.js +16 -0
  208. package/dist/apps/shared/components/mail/reading/MessageMoreMenu.d.ts +56 -0
  209. package/dist/apps/shared/components/mail/reading/MessageMoreMenu.js +153 -0
  210. package/dist/apps/shared/components/mail/reading/MessageSourceDialog.d.ts +27 -0
  211. package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +27 -0
  212. package/dist/apps/shared/components/mail/reading/PendingMessageCard.d.ts +14 -0
  213. package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +16 -0
  214. package/dist/apps/shared/components/mail/reading/messageExport.d.ts +19 -0
  215. package/dist/apps/shared/components/mail/reading/messageExport.js +51 -0
  216. package/dist/apps/shared/components/mail/reading/printMessage.d.ts +30 -0
  217. package/dist/apps/shared/components/mail/reading/printMessage.js +70 -0
  218. package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +57 -0
  219. package/dist/apps/shared/components/mail/reading/useMessageActions.js +366 -0
  220. package/dist/apps/shared/components/settings/layout/SettingsShell.js +10 -7
  221. package/dist/apps/shared/components/tasks/TasksSidebar.js +1 -1
  222. package/dist/apps/shared/components/tasks/layout/TasksShell.js +7 -5
  223. package/dist/apps/shared/keyboard/GlobalShortcuts.js +1 -1
  224. package/dist/apps/shared/mail/folderCounts.d.ts +10 -0
  225. package/dist/apps/shared/mail/folderCounts.js +12 -0
  226. package/dist/apps/shared/mail/folderOfType.d.ts +13 -0
  227. package/dist/apps/shared/mail/folderOfType.js +40 -0
  228. package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +80 -0
  229. package/dist/apps/shared/mail/outbox/outgoingReplies.js +131 -0
  230. package/dist/apps/shared/mail/outbox/sendJob.d.ts +5 -1
  231. package/dist/apps/shared/mail/outbox/sendJob.js +14 -1
  232. package/dist/apps/shared/mail/outbox/sendOutcomes.js +13 -4
  233. package/dist/apps/shared/mail/permanentDelete.d.ts +62 -0
  234. package/dist/apps/shared/mail/permanentDelete.js +127 -0
  235. package/dist/apps/shared/mail/primaryMailbox.d.ts +29 -0
  236. package/dist/apps/shared/mail/primaryMailbox.js +61 -0
  237. package/dist/apps/shared/mail/reportNotices.d.ts +21 -0
  238. package/dist/apps/shared/mail/reportNotices.js +47 -0
  239. package/dist/apps/shared/mail/senderBlocking.d.ts +26 -0
  240. package/dist/apps/shared/mail/senderBlocking.js +92 -0
  241. package/dist/apps/shared/mail/useCollapsedSections.d.ts +32 -0
  242. package/dist/apps/shared/mail/useCollapsedSections.js +110 -0
  243. package/dist/apps/shared/mail/useMailConnection.js +3 -1
  244. package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +11 -0
  245. package/dist/apps/shared/mail/useMailboxUpdateAccess.js +52 -0
  246. package/dist/apps/shared/mail/usePermanentDelete.d.ts +35 -0
  247. package/dist/apps/shared/mail/usePermanentDelete.js +96 -0
  248. package/dist/apps/shared/navigation/frameContext.d.ts +1 -1
  249. package/dist/apps/shared/navigation/index.d.ts +16 -0
  250. package/dist/apps/shared/navigation/index.js +34 -0
  251. package/dist/apps/shared/navigation/pageTitle.d.ts +11 -0
  252. package/dist/apps/shared/navigation/pageTitle.js +12 -0
  253. package/dist/apps/shared/search/crossMailboxSearch.d.ts +72 -0
  254. package/dist/apps/shared/search/crossMailboxSearch.js +136 -0
  255. package/dist/apps/shared/styles/app.css +396 -386
  256. package/dist/apps/www/_shell.d.ts +26 -0
  257. package/dist/apps/www/_shell.js +31 -0
  258. package/dist/apps/www/calendar/index.d.ts +7 -2
  259. package/dist/apps/www/calendar/index.js +7 -4
  260. package/dist/apps/www/contacts/[uid].d.ts +14 -3
  261. package/dist/apps/www/contacts/[uid].js +5 -3
  262. package/dist/apps/www/contacts/index.d.ts +7 -2
  263. package/dist/apps/www/contacts/index.js +8 -4
  264. package/dist/apps/www/index.d.ts +7 -2
  265. package/dist/apps/www/index.js +542 -207
  266. package/dist/apps/www/messages/[uid].d.ts +14 -3
  267. package/dist/apps/www/messages/[uid].js +7 -5
  268. package/dist/apps/www/settings/appearance/index.d.ts +8 -2
  269. package/dist/apps/www/settings/appearance/index.js +4 -2
  270. package/dist/apps/www/settings/auto-reply/index.d.ts +7 -2
  271. package/dist/apps/www/settings/auto-reply/index.js +4 -2
  272. package/dist/apps/www/settings/blocked-senders/index.d.ts +9 -0
  273. package/dist/apps/www/settings/blocked-senders/index.js +134 -0
  274. package/dist/apps/www/settings/encryption/index.d.ts +7 -2
  275. package/dist/apps/www/settings/encryption/index.js +4 -2
  276. package/dist/apps/www/settings/filters/[uid].d.ts +7 -2
  277. package/dist/apps/www/settings/filters/[uid].js +4 -2
  278. package/dist/apps/www/settings/filters/index.d.ts +7 -2
  279. package/dist/apps/www/settings/filters/index.js +4 -2
  280. package/dist/apps/www/settings/filters/new/index.d.ts +7 -2
  281. package/dist/apps/www/settings/filters/new/index.js +28 -5
  282. package/dist/apps/www/settings/labels/index.d.ts +7 -2
  283. package/dist/apps/www/settings/labels/index.js +4 -2
  284. package/dist/apps/www/settings/privacy/index.d.ts +7 -2
  285. package/dist/apps/www/settings/privacy/index.js +4 -2
  286. package/dist/apps/www/settings/profile/index.d.ts +7 -2
  287. package/dist/apps/www/settings/profile/index.js +4 -2
  288. package/dist/apps/www/settings/read-receipts/index.d.ts +7 -2
  289. package/dist/apps/www/settings/read-receipts/index.js +4 -2
  290. package/dist/apps/www/settings/sharing/index.d.ts +7 -2
  291. package/dist/apps/www/settings/sharing/index.js +4 -2
  292. package/dist/apps/www/settings/signatures/[uid].d.ts +7 -2
  293. package/dist/apps/www/settings/signatures/[uid].js +4 -2
  294. package/dist/apps/www/settings/signatures/index.d.ts +7 -2
  295. package/dist/apps/www/settings/signatures/index.js +4 -2
  296. package/dist/apps/www/settings/signatures/new/index.d.ts +7 -2
  297. package/dist/apps/www/settings/signatures/new/index.js +5 -3
  298. package/dist/apps/www/tasks/index.d.ts +7 -2
  299. package/dist/apps/www/tasks/index.js +5 -3
  300. package/package.json +4 -2
  301. package/apps/shared/navigation/AppRouter.tsx +0 -300
  302. package/apps/shared/navigation/idle.ts +0 -45
  303. package/apps/shared/navigation/routerContext.tsx +0 -83
  304. package/apps/shared/navigation/routes.ts +0 -72
  305. package/apps/www/_routedPage.tsx +0 -24
  306. package/apps/www/_routes.ts +0 -37
  307. package/dist/apps/shared/navigation/AppRouter.d.ts +0 -52
  308. package/dist/apps/shared/navigation/AppRouter.js +0 -242
  309. package/dist/apps/shared/navigation/idle.d.ts +0 -14
  310. package/dist/apps/shared/navigation/idle.js +0 -43
  311. package/dist/apps/shared/navigation/routerContext.d.ts +0 -37
  312. package/dist/apps/shared/navigation/routerContext.js +0 -56
  313. package/dist/apps/shared/navigation/routes.d.ts +0 -32
  314. package/dist/apps/shared/navigation/routes.js +0 -37
  315. package/dist/apps/www/_routedPage.d.ts +0 -12
  316. package/dist/apps/www/_routedPage.js +0 -19
  317. package/dist/apps/www/_routes.d.ts +0 -11
  318. package/dist/apps/www/_routes.js +0 -31
@@ -1,254 +1,257 @@
1
- ///////////////////////////////////////////////////////////////////////////////
2
- // Copyright (C) 2026 Jean-Philippe Steinmetz
3
- // SPDX-License-Identifier: MPL-2.0
4
- ///////////////////////////////////////////////////////////////////////////////
5
- import React, { createContext, PropsWithChildren, ReactNode, useContext, useEffect, useMemo, useState } from "react";
6
- import { HiOutlineBars3 } from "react-icons/hi2";
7
- import { ApiRequestError } from "@rapidmx/react-shared/util/api.js";
8
- import Drawer from "@rapidmx/react-shared/components/overlays/Drawer.js";
9
- import { Mailbox, listMailboxes } from "@rapidmx/react-shared/mail/mailApi.js";
10
- import Alert from "@rapidmx/react-shared/components/feedback/Alert.js";
11
- import Skeleton, { SkeletonList } from "@rapidmx/react-shared/components/feedback/Skeleton.js";
12
- import AppShell, { AppShellProps } from "../../layout/AppShell.js";
13
- import { useLocationSearch, useNavigate } from "../../../navigation/AppRouter.js";
14
- import MailboxProvisioning from "../../layout/MailboxProvisioning.js";
15
- import { mergePluginNavItems, PluginNav } from "../../../plugins/pluginNav.js";
16
-
17
- export interface SettingsSectionDef {
18
- id: string;
19
- href: string;
20
- label: string;
21
- }
22
-
23
- /** Every settings section with its own sidebar entry. */
24
- export const SETTINGS_SECTIONS: SettingsSectionDef[] = [
25
- { id: "profile", href: "/settings/profile", label: "Profile" },
26
- { id: "appearance", href: "/settings/appearance", label: "Appearance" },
27
- { id: "auto-reply", href: "/settings/auto-reply", label: "Automatic Replies" },
28
- { id: "filters", href: "/settings/filters", label: "Mail Filters" },
29
- { id: "signatures", href: "/settings/signatures", label: "Signatures" },
30
- { id: "labels", href: "/settings/labels", label: "Labels" },
31
- { id: "read-receipts", href: "/settings/read-receipts", label: "Read Receipts" },
32
- { id: "encryption", href: "/settings/encryption", label: "Encryption" },
33
- { id: "sharing", href: "/settings/sharing", label: "Sharing" },
34
- { id: "privacy", href: "/settings/privacy", label: "Privacy & Data" },
35
- ];
36
-
37
- /** A `SETTINGS_SECTIONS` id, or a plugin's `settingsSections` item id (see `PluginNav`). */
38
- export type SettingsSectionId = string;
39
-
40
- /** `SETTINGS_SECTIONS` followed by the plugins' `settingsSections` items, core ids winning - see
41
- * `mergePluginNavItems`. */
42
- export function settingsSections(pluginNav?: PluginNav): SettingsSectionDef[] {
43
- return mergePluginNavItems<SettingsSectionDef>(SETTINGS_SECTIONS, pluginNav?.settingsSections, ({ id, href, label }) => ({
44
- id,
45
- href,
46
- label,
47
- }));
48
- }
49
-
50
- export interface SettingsShellProps extends Omit<AppShellProps, "active"> {
51
- /** Which entry in `SETTINGS_SECTIONS` (or plugin `settingsSections` item) is highlighted in this shell's own sidebar — distinct from
52
- * `AppShell`'s own `active` (always hardcoded to `"settings"` below), since Settings isn't a rail
53
- * icon (see `AppShell.tsx`'s `AppShellApp` doc comment) but still needs its own section
54
- * highlighting. Each settings page passes its own section id explicitly, the same "gotcha" this
55
- * plan already calls out for every shell's `active` prop. */
56
- active: SettingsSectionId;
57
- }
58
-
59
- export interface SettingsShellContextValue {
60
- /** The mailbox currently selected (`?mailboxUid=`, or the caller's first accessible mailbox) —
61
- * every settings section so far (Automatic Replies) edits mailbox-scoped fields. */
62
- mailboxUid?: string;
63
- mailboxes: Mailbox[];
64
- }
65
-
66
- const SettingsShellContext = createContext<SettingsShellContextValue>({ mailboxes: [] });
67
-
68
- /** Reads the mailbox Settings is currently scoped to, as resolved by the enclosing `SettingsShell`. */
69
- export function useSettingsShell(): SettingsShellContextValue {
70
- return useContext(SettingsShellContext);
71
- }
72
-
73
- type Status = "checking" | "error" | "ready";
74
-
75
- /**
76
- * The Settings area's shell — reached via a `UserMenu` entry rather than a 5th `AppShell` icon (per
77
- * this plan's own confirmed decision), so it always passes `active="settings"` to `AppShell` regardless
78
- * of which section is showing. Unlike `ContactsShell`/`TasksShell` (whose sidebar is just a mailbox
79
- * switcher, since each has exactly one well-known folder), this shell's sidebar is a real list of
80
- * settings sections (`SETTINGS_SECTIONS`) — full-page navigation between them, same as the top-level
81
- * app rail, since this framework has no client-side router.
82
- */
83
- export default function SettingsShell({
84
- active,
85
- userUid,
86
- authServerUrl,
87
- impersonating,
88
- impersonationBaseUrl,
89
- trusted,
90
- trustedRoles,
91
- pluginNav,
92
- children,
93
- }: PropsWithChildren<SettingsShellProps>) {
94
- const [status, setStatus] = useState<Status>("checking");
95
- const [error, setError] = useState<string | null>(null);
96
- const [mailboxes, setMailboxes] = useState<Mailbox[]>([]);
97
- const [requestedMailboxUid, setRequestedMailboxUid] = useState<string | null>(null);
98
- const [drawerOpen, setDrawerOpen] = useState(false);
99
-
100
- // Read from the router's location, so a mailbox change (a link, or `navigate()`) takes effect without a page load - and in an
101
- // effect, not during render, so the server render and the hydrating render agree.
102
- const search = useLocationSearch();
103
- const navigate = useNavigate();
104
- useEffect(() => {
105
- setRequestedMailboxUid(new URLSearchParams(search).get("mailboxUid"));
106
- }, [search]);
107
- // Choosing a folder (or mailbox) changes the URL without a page load now, so the drawer that held the choice - which used to go
108
- // with the page - is closed here.
109
- useEffect(() => {
110
- setDrawerOpen(false);
111
- }, [search]);
112
-
113
- useEffect(() => {
114
- if (!userUid) {
115
- return;
116
- }
117
- listMailboxes({ limit: 100 })
118
- .then((result) => {
119
- setMailboxes(result);
120
- setStatus("ready");
121
- })
122
- .catch((err) => {
123
- setError(err instanceof ApiRequestError ? err.message : "Could not load your mailboxes.");
124
- setStatus("error");
125
- });
126
- }, [userUid]);
127
-
128
- const mailboxUid: string | undefined =
129
- (requestedMailboxUid && mailboxes.some((mb) => mb.uid === requestedMailboxUid) ? requestedMailboxUid : undefined) ??
130
- mailboxes[0]?.uid;
131
-
132
- const contextValue = useMemo<SettingsShellContextValue>(() => ({ mailboxUid, mailboxes }), [mailboxUid, mailboxes]);
133
-
134
- // A full-screen takeover, not nested inside the rest of the app's chrome — same as ContactsShell/
135
- // TasksShell, there's nothing else for a mailbox-less caller to configure here yet.
136
- if (userUid && status === "ready" && !mailboxUid) {
137
- return <MailboxProvisioning />;
138
- }
139
-
140
- let inner: ReactNode = null;
141
- if (userUid && status === "checking") {
142
- inner = (
143
- <div className="w-56 shrink-0 border-r border-border flex flex-col gap-4 p-3">
144
- <Skeleton height="h-9" />
145
- <SkeletonList count={3} />
146
- </div>
147
- );
148
- } else if (userUid && status === "error") {
149
- inner = (
150
- <div className="flex-1 flex items-center justify-center p-8">
151
- <div className="w-full max-w-md">
152
- <Alert>{error}</Alert>
153
- </div>
154
- </div>
155
- );
156
- } else if (userUid && status === "ready") {
157
- const sections = settingsSections(pluginNav);
158
- // A function, not a plain JSX constant — same reasoning as ContactsShell's identical comment:
159
- // rendered twice (desktop `<aside>` + mobile `Drawer`), possibly simultaneously mounted, so the
160
- // `<select>`'s `id`/its `<label>`'s `htmlFor` need a distinct value per instance.
161
- const sidebarContent = (idPrefix: string) => (
162
- <>
163
- {mailboxes.length > 1 && (
164
- <div>
165
- <label
166
- className="block text-xs font-bold uppercase tracking-wide text-text-muted mb-1"
167
- htmlFor={`${idPrefix}-settings-mailbox-switcher`}
168
- >
169
- Mailbox
170
- </label>
171
- <select
172
- id={`${idPrefix}-settings-mailbox-switcher`}
173
- className="w-full text-sm border border-border rounded-sm py-1.5 px-2 bg-surface"
174
- value={mailboxUid}
175
- onChange={(e) => {
176
- // Every core settings page passes its own section id (see
177
- // `SettingsShellProps.active`), but a plugin page's section is missing when the
178
- // server didn't send its nav item, so that falls back to the current path.
179
- const href = sections.find((s) => s.id === active)?.href ?? window.location.pathname;
180
- navigate(`${href}?mailboxUid=${encodeURIComponent(e.target.value)}`);
181
- }}
182
- >
183
- {mailboxes.map((mb) => (
184
- <option key={mb.uid} value={mb.uid}>
185
- {mb.displayName}
186
- {mb.ownerUserUid ? "" : " (shared)"}
187
- </option>
188
- ))}
189
- </select>
190
- </div>
191
- )}
192
- <nav aria-label="Settings sections" className="flex flex-col gap-0.5">
193
- {sections.map((section) => (
194
- <a
195
- key={section.id}
196
- // `inner` (this whole branch) is only ever computed once `status === "ready"`
197
- // and `mailboxUid` has already resolved truthy — a falsy `mailboxUid` returns
198
- // `<MailboxProvisioning />` above instead (and TypeScript's own narrowing of
199
- // this `const` already reflects that, no `!` needed) — so no fallback is
200
- // needed here, matching this plan's established "dead guard the UI
201
- // structurally can't trigger" removal precedent (e.g.
202
- // `DomainDetailContent.handleVerify`).
203
- href={`${section.href}?mailboxUid=${encodeURIComponent(mailboxUid)}`}
204
- aria-current={section.id === active ? "page" : undefined}
205
- className={[
206
- "block px-2.5 py-1.5 rounded-sm text-sm",
207
- section.id === active ? "bg-primary/10 text-primary-dark font-medium" : "text-text hover:bg-surface-alt",
208
- ].join(" ")}
209
- >
210
- {section.label}
211
- </a>
212
- ))}
213
- </nav>
214
- </>
215
- );
216
-
217
- inner = (
218
- <>
219
- <aside className="hidden md:flex w-56 shrink-0 bg-surface border-r border-border flex-col p-3 gap-3">
220
- {sidebarContent("desktop")}
221
- </aside>
222
- <Drawer open={drawerOpen} onClose={() => setDrawerOpen(false)} title="Settings">
223
- <div className="flex flex-col gap-3">{sidebarContent("mobile")}</div>
224
- </Drawer>
225
- <main className="flex-1 min-w-0 flex flex-col">
226
- <button
227
- type="button"
228
- className="md:hidden m-3 self-start w-9 h-9 flex items-center justify-center rounded-sm text-text-muted hover:bg-surface-alt hover:text-text"
229
- aria-label="Open settings menu"
230
- onClick={() => setDrawerOpen(true)}
231
- >
232
- <HiOutlineBars3 size={20} aria-hidden="true" />
233
- </button>
234
- <SettingsShellContext.Provider value={contextValue}>{children}</SettingsShellContext.Provider>
235
- </main>
236
- </>
237
- );
238
- }
239
-
240
- return (
241
- <AppShell
242
- active="settings"
243
- userUid={userUid}
244
- authServerUrl={authServerUrl}
245
- impersonating={impersonating}
246
- impersonationBaseUrl={impersonationBaseUrl}
247
- trusted={trusted}
248
- trustedRoles={trustedRoles}
249
- pluginNav={pluginNav}
250
- >
251
- {inner}
252
- </AppShell>
253
- );
254
- }
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import React, { createContext, PropsWithChildren, ReactNode, useContext, useEffect, useMemo, useState } from "react";
6
+ import { HiOutlineBars3 } from "react-icons/hi2";
7
+ import { ApiRequestError } from "@rapidmx/react-shared/util/api.js";
8
+ import Drawer from "@rapidmx/react-shared/components/overlays/Drawer.js";
9
+ import { Mailbox, listMailboxes } from "@rapidmx/react-shared/mail/mailApi.js";
10
+ import Alert from "@rapidmx/react-shared/components/feedback/Alert.js";
11
+ import Skeleton, { SkeletonList } from "@rapidmx/react-shared/components/feedback/Skeleton.js";
12
+ import AppShell, { AppShellProps } from "../../layout/AppShell.js";
13
+ import { useLocation } from "@rapidrest/react/client";
14
+ import { useNavigate } from "../../../navigation/index.js";
15
+ import MailboxProvisioning from "../../layout/MailboxProvisioning.js";
16
+ import { orderMailboxes, primaryMailboxUid } from "../../../mail/primaryMailbox.js";
17
+ import { mergePluginNavItems, PluginNav } from "../../../plugins/pluginNav.js";
18
+
19
+ export interface SettingsSectionDef {
20
+ id: string;
21
+ href: string;
22
+ label: string;
23
+ }
24
+
25
+ /** Every settings section with its own sidebar entry. */
26
+ export const SETTINGS_SECTIONS: SettingsSectionDef[] = [
27
+ { id: "profile", href: "/settings/profile", label: "Profile" },
28
+ { id: "appearance", href: "/settings/appearance", label: "Appearance" },
29
+ { id: "auto-reply", href: "/settings/auto-reply", label: "Automatic Replies" },
30
+ { id: "filters", href: "/settings/filters", label: "Mail Filters" },
31
+ { id: "blocked-senders", href: "/settings/blocked-senders", label: "Blocked & Safe Senders" },
32
+ { id: "signatures", href: "/settings/signatures", label: "Signatures" },
33
+ { id: "labels", href: "/settings/labels", label: "Labels" },
34
+ { id: "read-receipts", href: "/settings/read-receipts", label: "Read Receipts" },
35
+ { id: "encryption", href: "/settings/encryption", label: "Encryption" },
36
+ { id: "sharing", href: "/settings/sharing", label: "Sharing" },
37
+ { id: "privacy", href: "/settings/privacy", label: "Privacy & Data" },
38
+ ];
39
+
40
+ /** A `SETTINGS_SECTIONS` id, or a plugin's `settingsSections` item id (see `PluginNav`). */
41
+ export type SettingsSectionId = string;
42
+
43
+ /** `SETTINGS_SECTIONS` followed by the plugins' `settingsSections` items, core ids winning - see
44
+ * `mergePluginNavItems`. */
45
+ export function settingsSections(pluginNav?: PluginNav): SettingsSectionDef[] {
46
+ return mergePluginNavItems<SettingsSectionDef>(SETTINGS_SECTIONS, pluginNav?.settingsSections, ({ id, href, label }) => ({
47
+ id,
48
+ href,
49
+ label,
50
+ }));
51
+ }
52
+
53
+ export interface SettingsShellProps extends Omit<AppShellProps, "active"> {
54
+ /** Which entry in `SETTINGS_SECTIONS` (or plugin `settingsSections` item) is highlighted in this shell's own sidebar — distinct from
55
+ * `AppShell`'s own `active` (always hardcoded to `"settings"` below), since Settings isn't a rail
56
+ * icon (see `AppShell.tsx`'s `AppShellApp` doc comment) but still needs its own section
57
+ * highlighting. Each settings page passes its own section id explicitly, the same "gotcha" this
58
+ * plan already calls out for every shell's `active` prop. */
59
+ active: SettingsSectionId;
60
+ }
61
+
62
+ export interface SettingsShellContextValue {
63
+ /** The mailbox currently selected (`?mailboxUid=`, or the caller's first accessible mailbox) —
64
+ * every settings section so far (Automatic Replies) edits mailbox-scoped fields. */
65
+ mailboxUid?: string;
66
+ mailboxes: Mailbox[];
67
+ }
68
+
69
+ const SettingsShellContext = createContext<SettingsShellContextValue>({ mailboxes: [] });
70
+
71
+ /** Reads the mailbox Settings is currently scoped to, as resolved by the enclosing `SettingsShell`. */
72
+ export function useSettingsShell(): SettingsShellContextValue {
73
+ return useContext(SettingsShellContext);
74
+ }
75
+
76
+ type Status = "checking" | "error" | "ready";
77
+
78
+ /**
79
+ * The Settings area's shell — reached via a `UserMenu` entry rather than a 5th `AppShell` icon (per
80
+ * this plan's own confirmed decision), so it always passes `active="settings"` to `AppShell` regardless
81
+ * of which section is showing. Unlike `ContactsShell`/`TasksShell` (whose sidebar is just a mailbox
82
+ * switcher, since each has exactly one well-known folder), this shell's sidebar is a real list of
83
+ * settings sections (`SETTINGS_SECTIONS`) — full-page navigation between them, same as the top-level
84
+ * app rail, since this framework has no client-side router.
85
+ */
86
+ export default function SettingsShell({
87
+ active,
88
+ userUid,
89
+ authServerUrl,
90
+ impersonating,
91
+ impersonationBaseUrl,
92
+ trusted,
93
+ trustedRoles,
94
+ pluginNav,
95
+ children,
96
+ }: PropsWithChildren<SettingsShellProps>) {
97
+ const [status, setStatus] = useState<Status>("checking");
98
+ const [error, setError] = useState<string | null>(null);
99
+ const [mailboxes, setMailboxes] = useState<Mailbox[]>([]);
100
+ const [requestedMailboxUid, setRequestedMailboxUid] = useState<string | null>(null);
101
+ const [drawerOpen, setDrawerOpen] = useState(false);
102
+
103
+ // Read from the router's location, so a mailbox change (a link, or `navigate()`) takes effect without a page load - and in an
104
+ // effect, not during render, so the server render and the hydrating render agree.
105
+ const { search } = useLocation();
106
+ const navigate = useNavigate();
107
+ useEffect(() => {
108
+ setRequestedMailboxUid(new URLSearchParams(search).get("mailboxUid"));
109
+ }, [search]);
110
+ // Choosing a folder (or mailbox) changes the URL without a page load now, so the drawer that held the choice - which used to go
111
+ // with the page - is closed here.
112
+ useEffect(() => {
113
+ setDrawerOpen(false);
114
+ }, [search]);
115
+
116
+ useEffect(() => {
117
+ if (!userUid) {
118
+ return;
119
+ }
120
+ listMailboxes({ limit: 100 })
121
+ .then((result) => {
122
+ setMailboxes(orderMailboxes(result, userUid));
123
+ setStatus("ready");
124
+ })
125
+ .catch((err) => {
126
+ setError(err instanceof ApiRequestError ? err.message : "Could not load your mailboxes.");
127
+ setStatus("error");
128
+ });
129
+ }, [userUid]);
130
+
131
+ const mailboxUid: string | undefined =
132
+ (requestedMailboxUid && mailboxes.some((mb) => mb.uid === requestedMailboxUid) ? requestedMailboxUid : undefined) ??
133
+ primaryMailboxUid(mailboxes, userUid);
134
+
135
+ const contextValue = useMemo<SettingsShellContextValue>(() => ({ mailboxUid, mailboxes }), [mailboxUid, mailboxes]);
136
+
137
+ // A full-screen takeover, not nested inside the rest of the app's chrome — same as ContactsShell/
138
+ // TasksShell, there's nothing else for a mailbox-less caller to configure here yet.
139
+ if (userUid && status === "ready" && !mailboxUid) {
140
+ return <MailboxProvisioning />;
141
+ }
142
+
143
+ let inner: ReactNode = null;
144
+ if (userUid && status === "checking") {
145
+ inner = (
146
+ <div className="w-56 shrink-0 border-r border-border flex flex-col gap-4 p-3">
147
+ <Skeleton height="h-9" />
148
+ <SkeletonList count={3} />
149
+ </div>
150
+ );
151
+ } else if (userUid && status === "error") {
152
+ inner = (
153
+ <div className="flex-1 flex items-center justify-center p-8">
154
+ <div className="w-full max-w-md">
155
+ <Alert>{error}</Alert>
156
+ </div>
157
+ </div>
158
+ );
159
+ } else if (userUid && status === "ready") {
160
+ const sections = settingsSections(pluginNav);
161
+ // A function, not a plain JSX constant — same reasoning as ContactsShell's identical comment:
162
+ // rendered twice (desktop `<aside>` + mobile `Drawer`), possibly simultaneously mounted, so the
163
+ // `<select>`'s `id`/its `<label>`'s `htmlFor` need a distinct value per instance.
164
+ const sidebarContent = (idPrefix: string) => (
165
+ <>
166
+ {mailboxes.length > 1 && (
167
+ <div>
168
+ <label
169
+ className="block text-xs font-bold uppercase tracking-wide text-text-muted mb-1"
170
+ htmlFor={`${idPrefix}-settings-mailbox-switcher`}
171
+ >
172
+ Mailbox
173
+ </label>
174
+ <select
175
+ id={`${idPrefix}-settings-mailbox-switcher`}
176
+ className="w-full text-sm border border-border rounded-sm py-1.5 px-2 bg-surface"
177
+ value={mailboxUid}
178
+ onChange={(e) => {
179
+ // Every core settings page passes its own section id (see
180
+ // `SettingsShellProps.active`), but a plugin page's section is missing when the
181
+ // server didn't send its nav item, so that falls back to the current path.
182
+ const href = sections.find((s) => s.id === active)?.href ?? window.location.pathname;
183
+ navigate(`${href}?mailboxUid=${encodeURIComponent(e.target.value)}`);
184
+ }}
185
+ >
186
+ {mailboxes.map((mb) => (
187
+ <option key={mb.uid} value={mb.uid}>
188
+ {mb.displayName}
189
+ {mb.ownerUserUid ? "" : " (shared)"}
190
+ </option>
191
+ ))}
192
+ </select>
193
+ </div>
194
+ )}
195
+ <nav aria-label="Settings sections" className="flex flex-col gap-0.5">
196
+ {sections.map((section) => (
197
+ <a
198
+ key={section.id}
199
+ // `inner` (this whole branch) is only ever computed once `status === "ready"`
200
+ // and `mailboxUid` has already resolved truthy — a falsy `mailboxUid` returns
201
+ // `<MailboxProvisioning />` above instead (which is what the `!` below records,
202
+ // `primaryMailboxUid()` being honest that it may find none) — so no fallback is
203
+ // needed here, matching this plan's established "dead guard the UI
204
+ // structurally can't trigger" removal precedent (e.g.
205
+ // `DomainDetailContent.handleVerify`).
206
+ href={`${section.href}?mailboxUid=${encodeURIComponent(mailboxUid!)}`}
207
+ aria-current={section.id === active ? "page" : undefined}
208
+ className={[
209
+ "block px-2.5 py-1.5 rounded-sm text-sm",
210
+ section.id === active ? "bg-primary/10 text-primary-dark font-medium" : "text-text hover:bg-surface-alt",
211
+ ].join(" ")}
212
+ >
213
+ {section.label}
214
+ </a>
215
+ ))}
216
+ </nav>
217
+ </>
218
+ );
219
+
220
+ inner = (
221
+ <>
222
+ <aside className="hidden md:flex w-56 shrink-0 bg-surface border-r border-border flex-col p-3 gap-3">
223
+ {sidebarContent("desktop")}
224
+ </aside>
225
+ <Drawer open={drawerOpen} onClose={() => setDrawerOpen(false)} title="Settings" fullScreen>
226
+ <div className="flex flex-col gap-3">{sidebarContent("mobile")}</div>
227
+ </Drawer>
228
+ <main className="flex-1 min-w-0 flex flex-col">
229
+ <button
230
+ type="button"
231
+ className="md:hidden m-3 self-start w-9 h-9 flex items-center justify-center rounded-sm text-text-muted hover:bg-surface-alt hover:text-text"
232
+ aria-label="Open settings menu"
233
+ onClick={() => setDrawerOpen(true)}
234
+ >
235
+ <HiOutlineBars3 size={20} aria-hidden="true" />
236
+ </button>
237
+ <SettingsShellContext.Provider value={contextValue}>{children}</SettingsShellContext.Provider>
238
+ </main>
239
+ </>
240
+ );
241
+ }
242
+
243
+ return (
244
+ <AppShell
245
+ active="settings"
246
+ userUid={userUid}
247
+ authServerUrl={authServerUrl}
248
+ impersonating={impersonating}
249
+ impersonationBaseUrl={impersonationBaseUrl}
250
+ trusted={trusted}
251
+ trustedRoles={trustedRoles}
252
+ pluginNav={pluginNav}
253
+ >
254
+ {inner}
255
+ </AppShell>
256
+ );
257
+ }
@@ -195,7 +195,7 @@ export default function TasksSidebar({ mailboxUid, tasks, userUid, active, onSel
195
195
  <nav aria-label="Tasks" className="hidden lg:flex w-56 shrink-0 border-r border-border flex-col gap-4 p-3 overflow-y-auto">
196
196
  {navContent("desktop")}
197
197
  </nav>
198
- <Drawer open={drawerOpen} onClose={() => setDrawerOpen(false)} title="Tasks">
198
+ <Drawer open={drawerOpen} onClose={() => setDrawerOpen(false)} title="Tasks" fullScreen>
199
199
  <div className="flex flex-col gap-4">{navContent("mobile")}</div>
200
200
  </Drawer>
201
201
  </>