@rapidmx/web-client 0.21.0 → 0.22.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 (885) hide show
  1. package/README.md +48 -14
  2. package/apps/admin/_layout.tsx +2 -2
  3. package/apps/admin/audit-log/index.tsx +4 -4
  4. package/apps/admin/branding/index.tsx +3 -3
  5. package/apps/admin/data-requests/index.tsx +8 -8
  6. package/apps/admin/distribution-lists/[uid].tsx +3 -3
  7. package/apps/admin/distribution-lists/index.tsx +4 -4
  8. package/apps/admin/distribution-lists/new/index.tsx +5 -5
  9. package/apps/admin/domains/[uid].tsx +6 -6
  10. package/apps/admin/domains/index.tsx +4 -4
  11. package/apps/admin/domains/new/index.tsx +5 -5
  12. package/apps/admin/encryption-policy/index.tsx +1 -1
  13. package/apps/admin/escrow-scopes/[uid].tsx +7 -7
  14. package/apps/admin/escrow-scopes/index.tsx +4 -4
  15. package/apps/admin/escrow-scopes/new/index.tsx +5 -5
  16. package/apps/admin/index.tsx +6 -6
  17. package/apps/admin/ingest-queue/index.tsx +4 -4
  18. package/apps/admin/mailbox-policy/index.tsx +1 -1
  19. package/apps/admin/mailboxes/[uid].tsx +5 -5
  20. package/apps/admin/quarantine/index.tsx +5 -5
  21. package/apps/admin/retention-policy/index.tsx +3 -3
  22. package/apps/admin/signing-certificates/index.tsx +5 -5
  23. package/apps/admin/transport-rules/[uid].tsx +5 -5
  24. package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
  25. package/apps/admin/transport-rules/index.tsx +4 -4
  26. package/apps/admin/transport-rules/new/index.tsx +5 -5
  27. package/apps/escrow/_layout.tsx +1 -1
  28. package/apps/escrow/audit-log/index.tsx +4 -4
  29. package/apps/escrow/index.tsx +4 -4
  30. package/apps/escrow/matters/[uid].tsx +10 -10
  31. package/apps/escrow/matters/new/index.tsx +6 -6
  32. package/apps/shared/appearance/AppearanceForm.tsx +3 -3
  33. package/apps/shared/appearance/AppearanceHead.tsx +1 -1
  34. package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
  35. package/apps/shared/appearance/appearanceCache.ts +1 -1
  36. package/apps/shared/appearance/appearanceContext.ts +1 -1
  37. package/apps/shared/appearance/theme.ts +1 -1
  38. package/apps/shared/auth/adminAccess.ts +1 -1
  39. package/apps/shared/calendar/bookingPlugin.ts +1 -1
  40. package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
  41. package/apps/shared/calendar/calendarReminders.ts +1 -1
  42. package/apps/shared/calendar/useCalendarReminders.ts +1 -1
  43. package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
  44. package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
  45. package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
  46. package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
  47. package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
  48. package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
  49. package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
  50. package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
  51. package/apps/shared/components/admin/diagnostics/format.ts +1 -1
  52. package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
  53. package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
  54. package/apps/shared/components/admin/elevation.ts +1 -1
  55. package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
  56. package/apps/shared/components/admin/layout/AdminShell.tsx +8 -8
  57. package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +6 -6
  58. package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +10 -8
  59. package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +4 -4
  60. package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
  61. package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
  62. package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
  63. package/apps/shared/components/admin/settings/BrandingForm.tsx +5 -5
  64. package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
  65. package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +4 -4
  66. package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
  67. package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
  68. package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +4 -4
  69. package/apps/shared/components/admin/settings/PluginsManager.tsx +5 -5
  70. package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +5 -5
  71. package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +7 -7
  72. package/apps/shared/components/admin/setup/SetupWizard.tsx +27 -23
  73. package/apps/shared/components/admin/signOut.ts +1 -1
  74. package/apps/shared/components/admin/usePagedList.tsx +2 -2
  75. package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
  76. package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
  77. package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
  78. package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
  79. package/apps/shared/components/calendar/EventDetails.tsx +16 -14
  80. package/apps/shared/components/calendar/EventEditor.tsx +54 -39
  81. package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
  82. package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
  83. package/apps/shared/components/calendar/EventModal.tsx +5 -5
  84. package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
  85. package/apps/shared/components/calendar/EventShell.tsx +1 -1
  86. package/apps/shared/components/calendar/FindATime.tsx +6 -4
  87. package/apps/shared/components/calendar/GuestInput.tsx +2 -2
  88. package/apps/shared/components/calendar/MonthView.tsx +2 -2
  89. package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
  90. package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
  91. package/apps/shared/components/calendar/RecurrenceEditor.tsx +2 -2
  92. package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
  93. package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
  94. package/apps/shared/components/calendar/SplitDayView.tsx +1 -1
  95. package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
  96. package/apps/shared/components/calendar/TimeGridView.tsx +2 -2
  97. package/apps/shared/components/calendar/allDay.ts +2 -2
  98. package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
  99. package/apps/shared/components/calendar/eventForm.ts +3 -3
  100. package/apps/shared/components/calendar/eventFormat.ts +3 -3
  101. package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
  102. package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
  103. package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
  104. package/apps/shared/components/contacts/ContactForm.tsx +27 -17
  105. package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
  106. package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
  107. package/apps/shared/components/contacts/contactKeys.ts +3 -3
  108. package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
  109. package/apps/shared/components/escrow/layout/EscrowShell.tsx +6 -6
  110. package/apps/shared/components/forms/StringListField.tsx +1 -1
  111. package/apps/shared/components/layout/AppShell.tsx +12 -10
  112. package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
  113. package/apps/shared/components/layout/KeyEnrollmentGate.tsx +9 -9
  114. package/apps/shared/components/layout/MailboxProvisioning.tsx +8 -6
  115. package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
  116. package/apps/shared/components/layout/ThemeSwitch.tsx +1 -1
  117. package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
  118. package/apps/shared/components/layout/UserMenu.tsx +6 -4
  119. package/apps/shared/components/mail/ConversationList.tsx +7 -5
  120. package/apps/shared/components/mail/ConversationThreadPane.tsx +26 -15
  121. package/apps/shared/components/mail/InviteCard.tsx +11 -9
  122. package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
  123. package/apps/shared/components/mail/MailAddress.tsx +1 -1
  124. package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
  125. package/apps/shared/components/mail/MailSelectionBar.tsx +2 -2
  126. package/apps/shared/components/mail/MenuButton.tsx +1 -1
  127. package/apps/shared/components/mail/MessageDetailPane.tsx +32 -30
  128. package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
  129. package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
  130. package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
  131. package/apps/shared/components/mail/compose/ComposeContext.tsx +14 -3
  132. package/apps/shared/components/mail/compose/ComposeWindow.tsx +34 -30
  133. package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
  134. package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
  135. package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
  136. package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
  137. package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
  138. package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
  139. package/apps/shared/components/mail/compose/quotedBody.ts +5 -5
  140. package/apps/shared/components/mail/compose/recipients.ts +1 -1
  141. package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
  142. package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
  143. package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
  144. package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
  145. package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
  146. package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
  147. package/apps/shared/components/mail/labelMenu.tsx +9 -7
  148. package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
  149. package/apps/shared/components/mail/listPreferences.ts +2 -2
  150. package/apps/shared/components/mail/pinnedSigners.ts +45 -19
  151. package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
  152. package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
  153. package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
  154. package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +3 -3
  155. package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
  156. package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
  157. package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
  158. package/apps/shared/components/mail/reading/messageExport.ts +1 -1
  159. package/apps/shared/components/mail/reading/printMessage.ts +2 -2
  160. package/apps/shared/components/mail/reading/useMessageActions.ts +28 -21
  161. package/apps/shared/components/mail/unreadStyle.tsx +1 -1
  162. package/apps/shared/components/mail/verificationSeals.ts +16 -12
  163. package/apps/shared/components/mail/writableMailboxes.ts +14 -7
  164. package/apps/shared/components/rules/RuleBuilder.tsx +1 -1
  165. package/apps/shared/components/settings/SigningCertificateCard.tsx +4 -4
  166. package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
  167. package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
  168. package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
  169. package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
  170. package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
  171. package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
  172. package/apps/shared/keyboard/ShortcutsDialog.tsx +1 -1
  173. package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
  174. package/apps/shared/mail/folderCounts.ts +8 -4
  175. package/apps/shared/mail/folderOfType.ts +5 -3
  176. package/apps/shared/mail/folderTree.ts +1 -1
  177. package/apps/shared/mail/listSnapshots.ts +2 -2
  178. package/apps/shared/mail/messageReadState.ts +6 -5
  179. package/apps/shared/mail/newMailNotifications.ts +2 -2
  180. package/apps/shared/mail/outbox/composeBridge.ts +2 -2
  181. package/apps/shared/mail/outbox/outboxState.ts +1 -1
  182. package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
  183. package/apps/shared/mail/outbox/sendDecision.ts +2 -2
  184. package/apps/shared/mail/outbox/sendJob.ts +40 -35
  185. package/apps/shared/mail/outbox/sendOutcomes.ts +20 -15
  186. package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
  187. package/apps/shared/mail/permanentDelete.ts +8 -7
  188. package/apps/shared/mail/primaryMailbox.ts +1 -1
  189. package/apps/shared/mail/reportNotices.ts +1 -1
  190. package/apps/shared/mail/senderBlocking.ts +36 -20
  191. package/apps/shared/mail/useMailConnection.ts +12 -10
  192. package/apps/shared/mail/useMailLiveUpdates.ts +3 -3
  193. package/apps/shared/mail/useMailboxUpdateAccess.ts +35 -11
  194. package/apps/shared/mail/useMarkMessageRead.ts +14 -7
  195. package/apps/shared/mail/useNewMailNotifications.ts +1 -1
  196. package/apps/shared/mail/usePermanentDelete.tsx +5 -3
  197. package/apps/shared/navigation/pageTitle.ts +1 -1
  198. package/apps/shared/notifications/NotificationCenter.tsx +1 -1
  199. package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
  200. package/apps/shared/notifications/apiErrors.ts +2 -2
  201. package/apps/shared/notifications/pushStatus.ts +1 -1
  202. package/apps/shared/notifications/systemErrors.ts +1 -1
  203. package/apps/shared/search/LocalIndexLifecycle.tsx +18 -12
  204. package/apps/shared/search/crossMailboxSearch.ts +3 -3
  205. package/apps/shared/search/localIndexBuilder.ts +24 -12
  206. package/apps/shared/search/localIndexKey.ts +1 -1
  207. package/apps/shared/search/localIndexRpcClient.ts +150 -30
  208. package/apps/shared/search/localIndexTransport.ts +84 -0
  209. package/apps/shared/search/localIndexWorker.ts +1 -1
  210. package/apps/shared/search/searchTier2.ts +3 -3
  211. package/apps/shared/signing/enrollmentTracker.ts +3 -3
  212. package/apps/shared/signing/enrollmentView.ts +1 -1
  213. package/apps/shared/signing/signingInfo.ts +1 -1
  214. package/apps/shared/signing/useSigningEnrollmentWatcher.ts +6 -4
  215. package/apps/shared/styles/app.css +14 -23
  216. package/apps/www/_layout.tsx +2 -2
  217. package/apps/www/calendar/index.tsx +20 -18
  218. package/apps/www/contacts/[uid].tsx +8 -6
  219. package/apps/www/contacts/index.tsx +19 -17
  220. package/apps/www/index.tsx +57 -48
  221. package/apps/www/messages/[uid].tsx +11 -9
  222. package/apps/www/settings/auto-reply/index.tsx +6 -4
  223. package/apps/www/settings/blocked-senders/index.tsx +9 -7
  224. package/apps/www/settings/encryption/index.tsx +38 -32
  225. package/apps/www/settings/filters/[uid].tsx +19 -14
  226. package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
  227. package/apps/www/settings/filters/index.tsx +4 -4
  228. package/apps/www/settings/filters/new/index.tsx +10 -8
  229. package/apps/www/settings/labels/index.tsx +12 -10
  230. package/apps/www/settings/privacy/index.tsx +18 -14
  231. package/apps/www/settings/profile/index.tsx +16 -11
  232. package/apps/www/settings/read-receipts/index.tsx +17 -12
  233. package/apps/www/settings/sharing/index.tsx +6 -6
  234. package/apps/www/settings/signatures/[uid].tsx +5 -5
  235. package/apps/www/settings/signatures/index.tsx +4 -4
  236. package/apps/www/settings/signatures/new/index.tsx +4 -4
  237. package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
  238. package/apps/www/tasks/index.tsx +28 -23
  239. package/dist/apps/admin/_layout.d.ts +1 -1
  240. package/dist/apps/admin/_layout.js +1 -1
  241. package/dist/apps/admin/audit-log/index.d.ts +1 -1
  242. package/dist/apps/admin/audit-log/index.js +4 -4
  243. package/dist/apps/admin/branding/index.js +3 -3
  244. package/dist/apps/admin/data-requests/index.js +8 -8
  245. package/dist/apps/admin/distribution-lists/[uid].js +3 -3
  246. package/dist/apps/admin/distribution-lists/index.js +4 -4
  247. package/dist/apps/admin/distribution-lists/new/index.js +5 -5
  248. package/dist/apps/admin/domains/[uid].js +6 -6
  249. package/dist/apps/admin/domains/index.js +4 -4
  250. package/dist/apps/admin/domains/new/index.js +5 -5
  251. package/dist/apps/admin/encryption-policy/index.js +1 -1
  252. package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
  253. package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
  254. package/dist/apps/admin/escrow-scopes/index.js +4 -4
  255. package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
  256. package/dist/apps/admin/index.js +6 -6
  257. package/dist/apps/admin/ingest-queue/index.js +4 -4
  258. package/dist/apps/admin/mailbox-policy/index.js +1 -1
  259. package/dist/apps/admin/mailboxes/[uid].js +5 -5
  260. package/dist/apps/admin/quarantine/index.js +5 -5
  261. package/dist/apps/admin/retention-policy/index.js +3 -3
  262. package/dist/apps/admin/signing-certificates/index.js +5 -5
  263. package/dist/apps/admin/transport-rules/[uid].js +5 -5
  264. package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
  265. package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
  266. package/dist/apps/admin/transport-rules/index.js +4 -4
  267. package/dist/apps/admin/transport-rules/new/index.js +5 -5
  268. package/dist/apps/escrow/_layout.d.ts +1 -1
  269. package/dist/apps/escrow/audit-log/index.d.ts +1 -1
  270. package/dist/apps/escrow/audit-log/index.js +4 -4
  271. package/dist/apps/escrow/index.js +4 -4
  272. package/dist/apps/escrow/matters/[uid].js +10 -10
  273. package/dist/apps/escrow/matters/new/index.js +6 -6
  274. package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
  275. package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
  276. package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
  277. package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
  278. package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
  279. package/dist/apps/shared/appearance/appearanceCache.js +1 -1
  280. package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
  281. package/dist/apps/shared/appearance/theme.d.ts +1 -1
  282. package/dist/apps/shared/auth/adminAccess.js +1 -1
  283. package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
  284. package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
  285. package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
  286. package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
  287. package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
  288. package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
  289. package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
  290. package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
  291. package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
  292. package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
  293. package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
  294. package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
  295. package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
  296. package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
  297. package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
  298. package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
  299. package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
  300. package/dist/apps/shared/components/admin/elevation.js +1 -1
  301. package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
  302. package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
  303. package/dist/apps/shared/components/admin/layout/AdminShell.js +7 -7
  304. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
  305. package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
  306. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
  307. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
  308. package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
  309. package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
  310. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
  311. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
  312. package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
  313. package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
  314. package/dist/apps/shared/components/admin/settings/BrandingForm.js +5 -5
  315. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
  316. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
  317. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
  318. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
  319. package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
  320. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
  321. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
  322. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
  323. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
  324. package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
  325. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
  326. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
  327. package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
  328. package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
  329. package/dist/apps/shared/components/admin/signOut.js +1 -1
  330. package/dist/apps/shared/components/admin/usePagedList.js +2 -2
  331. package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
  332. package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
  333. package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
  334. package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
  335. package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
  336. package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
  337. package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
  338. package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
  339. package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
  340. package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
  341. package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
  342. package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
  343. package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
  344. package/dist/apps/shared/components/calendar/EventModal.js +3 -3
  345. package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
  346. package/dist/apps/shared/components/calendar/EventShell.js +1 -1
  347. package/dist/apps/shared/components/calendar/FindATime.js +6 -4
  348. package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
  349. package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
  350. package/dist/apps/shared/components/calendar/MonthView.js +1 -1
  351. package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
  352. package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
  353. package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
  354. package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
  355. package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
  356. package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
  357. package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
  358. package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
  359. package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
  360. package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
  361. package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
  362. package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
  363. package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
  364. package/dist/apps/shared/components/calendar/allDay.js +1 -1
  365. package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
  366. package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
  367. package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
  368. package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
  369. package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
  370. package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
  371. package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
  372. package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
  373. package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
  374. package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
  375. package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
  376. package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
  377. package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
  378. package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
  379. package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
  380. package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
  381. package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
  382. package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
  383. package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
  384. package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
  385. package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
  386. package/dist/apps/shared/components/escrow/layout/EscrowShell.js +6 -6
  387. package/dist/apps/shared/components/forms/StringListField.js +1 -1
  388. package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
  389. package/dist/apps/shared/components/layout/AppShell.js +11 -9
  390. package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
  391. package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
  392. package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
  393. package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
  394. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
  395. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
  396. package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
  397. package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
  398. package/dist/apps/shared/components/layout/UserMenu.js +6 -4
  399. package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
  400. package/dist/apps/shared/components/mail/ConversationList.js +6 -4
  401. package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
  402. package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
  403. package/dist/apps/shared/components/mail/InviteCard.js +10 -8
  404. package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
  405. package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
  406. package/dist/apps/shared/components/mail/MailAddress.js +1 -1
  407. package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
  408. package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
  409. package/dist/apps/shared/components/mail/MenuButton.js +1 -1
  410. package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
  411. package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
  412. package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
  413. package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
  414. package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
  415. package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
  416. package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
  417. package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
  418. package/dist/apps/shared/components/mail/compose/ComposeWindow.js +34 -30
  419. package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
  420. package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
  421. package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
  422. package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
  423. package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
  424. package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
  425. package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
  426. package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
  427. package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
  428. package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
  429. package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
  430. package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
  431. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
  432. package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
  433. package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
  434. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
  435. package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
  436. package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
  437. package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
  438. package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
  439. package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
  440. package/dist/apps/shared/components/mail/labelMenu.js +9 -7
  441. package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
  442. package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
  443. package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
  444. package/dist/apps/shared/components/mail/listPreferences.js +1 -1
  445. package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
  446. package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
  447. package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
  448. package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
  449. package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
  450. package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
  451. package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
  452. package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
  453. package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
  454. package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
  455. package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
  456. package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
  457. package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
  458. package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
  459. package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
  460. package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
  461. package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
  462. package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
  463. package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
  464. package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
  465. package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
  466. package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
  467. package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
  468. package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
  469. package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
  470. package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
  471. package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
  472. package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
  473. package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
  474. package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
  475. package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
  476. package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
  477. package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
  478. package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
  479. package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
  480. package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
  481. package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
  482. package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
  483. package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
  484. package/dist/apps/shared/mail/folderCounts.js +6 -4
  485. package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
  486. package/dist/apps/shared/mail/folderOfType.js +4 -4
  487. package/dist/apps/shared/mail/folderTree.d.ts +1 -1
  488. package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
  489. package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
  490. package/dist/apps/shared/mail/messageReadState.js +5 -5
  491. package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
  492. package/dist/apps/shared/mail/newMailNotifications.js +1 -1
  493. package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
  494. package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
  495. package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
  496. package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
  497. package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
  498. package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
  499. package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
  500. package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
  501. package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
  502. package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
  503. package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
  504. package/dist/apps/shared/mail/permanentDelete.js +8 -8
  505. package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
  506. package/dist/apps/shared/mail/primaryMailbox.js +1 -1
  507. package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
  508. package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
  509. package/dist/apps/shared/mail/senderBlocking.js +19 -16
  510. package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
  511. package/dist/apps/shared/mail/useMailConnection.js +12 -10
  512. package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
  513. package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
  514. package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
  515. package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
  516. package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
  517. package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
  518. package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
  519. package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
  520. package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
  521. package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
  522. package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
  523. package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
  524. package/dist/apps/shared/notifications/apiErrors.js +2 -2
  525. package/dist/apps/shared/notifications/pushStatus.js +1 -1
  526. package/dist/apps/shared/notifications/systemErrors.js +1 -1
  527. package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
  528. package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
  529. package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
  530. package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
  531. package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
  532. package/dist/apps/shared/search/localIndexBuilder.js +15 -12
  533. package/dist/apps/shared/search/localIndexKey.js +1 -1
  534. package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
  535. package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
  536. package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
  537. package/dist/apps/shared/search/localIndexTransport.js +1 -0
  538. package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
  539. package/dist/apps/shared/search/searchTier2.d.ts +3 -3
  540. package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
  541. package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
  542. package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
  543. package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
  544. package/dist/apps/shared/signing/signingInfo.js +1 -1
  545. package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
  546. package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
  547. package/dist/apps/shared/styles/app.css +14 -23
  548. package/dist/apps/www/_layout.d.ts +1 -1
  549. package/dist/apps/www/_layout.js +1 -1
  550. package/dist/apps/www/calendar/index.d.ts +1 -1
  551. package/dist/apps/www/calendar/index.js +20 -18
  552. package/dist/apps/www/contacts/[uid].d.ts +1 -1
  553. package/dist/apps/www/contacts/[uid].js +8 -6
  554. package/dist/apps/www/contacts/index.d.ts +1 -1
  555. package/dist/apps/www/contacts/index.js +19 -17
  556. package/dist/apps/www/index.d.ts +1 -1
  557. package/dist/apps/www/index.js +54 -50
  558. package/dist/apps/www/messages/[uid].d.ts +1 -1
  559. package/dist/apps/www/messages/[uid].js +11 -9
  560. package/dist/apps/www/settings/appearance/index.d.ts +1 -1
  561. package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
  562. package/dist/apps/www/settings/auto-reply/index.js +6 -4
  563. package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
  564. package/dist/apps/www/settings/blocked-senders/index.js +6 -4
  565. package/dist/apps/www/settings/encryption/index.d.ts +1 -1
  566. package/dist/apps/www/settings/encryption/index.js +31 -29
  567. package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
  568. package/dist/apps/www/settings/filters/[uid].js +11 -9
  569. package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
  570. package/dist/apps/www/settings/filters/index.d.ts +1 -1
  571. package/dist/apps/www/settings/filters/index.js +4 -4
  572. package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
  573. package/dist/apps/www/settings/filters/new/index.js +10 -8
  574. package/dist/apps/www/settings/labels/index.d.ts +1 -1
  575. package/dist/apps/www/settings/labels/index.js +12 -10
  576. package/dist/apps/www/settings/privacy/index.d.ts +1 -1
  577. package/dist/apps/www/settings/privacy/index.js +18 -14
  578. package/dist/apps/www/settings/profile/index.d.ts +1 -1
  579. package/dist/apps/www/settings/profile/index.js +7 -5
  580. package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
  581. package/dist/apps/www/settings/read-receipts/index.js +5 -3
  582. package/dist/apps/www/settings/sharing/index.d.ts +1 -1
  583. package/dist/apps/www/settings/sharing/index.js +6 -6
  584. package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
  585. package/dist/apps/www/settings/signatures/[uid].js +5 -5
  586. package/dist/apps/www/settings/signatures/index.d.ts +1 -1
  587. package/dist/apps/www/settings/signatures/index.js +4 -4
  588. package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
  589. package/dist/apps/www/settings/signatures/new/index.js +4 -4
  590. package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
  591. package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
  592. package/dist/apps/www/tasks/index.d.ts +1 -1
  593. package/dist/apps/www/tasks/index.js +17 -15
  594. package/dist/lib/admin/auditLogApi.d.ts +32 -0
  595. package/dist/lib/admin/auditLogApi.js +27 -0
  596. package/dist/lib/admin/distributionListsApi.d.ts +47 -0
  597. package/dist/lib/admin/distributionListsApi.js +34 -0
  598. package/dist/lib/admin/domainsApi.d.ts +75 -0
  599. package/dist/lib/admin/domainsApi.js +44 -0
  600. package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
  601. package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
  602. package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
  603. package/dist/lib/admin/escrowAuditLogApi.js +31 -0
  604. package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
  605. package/dist/lib/admin/escrowScopesApi.js +50 -0
  606. package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
  607. package/dist/lib/admin/leftoverMailboxApi.js +67 -0
  608. package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
  609. package/dist/lib/admin/mailboxPolicyApi.js +21 -0
  610. package/dist/lib/admin/matterExportApi.d.ts +40 -0
  611. package/dist/lib/admin/matterExportApi.js +39 -0
  612. package/dist/lib/admin/matterSearchApi.d.ts +20 -0
  613. package/dist/lib/admin/matterSearchApi.js +27 -0
  614. package/dist/lib/admin/mattersApi.d.ts +56 -0
  615. package/dist/lib/admin/mattersApi.js +40 -0
  616. package/dist/lib/admin/pluginsApi.d.ts +265 -0
  617. package/dist/lib/admin/pluginsApi.js +102 -0
  618. package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
  619. package/dist/lib/admin/retentionPolicyApi.js +29 -0
  620. package/dist/lib/admin/setupApi.d.ts +23 -0
  621. package/dist/lib/admin/setupApi.js +26 -0
  622. package/dist/lib/admin/transportRulesApi.d.ts +66 -0
  623. package/dist/lib/admin/transportRulesApi.js +43 -0
  624. package/dist/lib/appearance/preferencesApi.d.ts +128 -0
  625. package/dist/lib/appearance/preferencesApi.js +257 -0
  626. package/dist/lib/auth/profileApi.d.ts +33 -0
  627. package/dist/lib/auth/profileApi.js +52 -0
  628. package/dist/lib/auth/session.d.ts +70 -0
  629. package/dist/lib/auth/session.js +210 -0
  630. package/dist/lib/branding/brandingApi.d.ts +47 -0
  631. package/dist/lib/branding/brandingApi.js +61 -0
  632. package/dist/lib/branding/useBranding.d.ts +23 -0
  633. package/dist/lib/branding/useBranding.js +65 -0
  634. package/dist/lib/calendar/calendarApi.d.ts +230 -0
  635. package/dist/lib/calendar/calendarApi.js +106 -0
  636. package/dist/lib/calendar/calendarColors.d.ts +18 -0
  637. package/dist/lib/calendar/calendarColors.js +39 -0
  638. package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
  639. package/dist/lib/calendar/calendarDragIds.js +92 -0
  640. package/dist/lib/calendar/calendarMutations.d.ts +68 -0
  641. package/dist/lib/calendar/calendarMutations.js +190 -0
  642. package/dist/lib/calendar/eventDescription.d.ts +43 -0
  643. package/dist/lib/calendar/eventDescription.js +195 -0
  644. package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
  645. package/dist/lib/calendar/freeBusyApi.js +119 -0
  646. package/dist/lib/calendar/inviteApi.d.ts +121 -0
  647. package/dist/lib/calendar/inviteApi.js +54 -0
  648. package/dist/lib/calendar/recurrence.d.ts +60 -0
  649. package/dist/lib/calendar/recurrence.js +225 -0
  650. package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
  651. package/dist/lib/components/avatar/ContactAvatar.js +26 -0
  652. package/dist/lib/components/buttons/Button.d.ts +9 -0
  653. package/dist/lib/components/buttons/Button.js +14 -0
  654. package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
  655. package/dist/lib/components/buttons/CopyButton.js +14 -0
  656. package/dist/lib/components/feedback/Alert.d.ts +4 -0
  657. package/dist/lib/components/feedback/Alert.js +4 -0
  658. package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
  659. package/dist/lib/components/feedback/Skeleton.js +14 -0
  660. package/dist/lib/components/forms/FormField.d.ts +8 -0
  661. package/dist/lib/components/forms/FormField.js +5 -0
  662. package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
  663. package/dist/lib/components/navigation/BottomTabBar.js +32 -0
  664. package/dist/lib/components/overlays/Drawer.d.ts +20 -0
  665. package/dist/lib/components/overlays/Drawer.js +27 -0
  666. package/dist/lib/components/overlays/Modal.d.ts +17 -0
  667. package/dist/lib/components/overlays/Modal.js +25 -0
  668. package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
  669. package/dist/lib/components/overlays/PopoverPortal.js +53 -0
  670. package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
  671. package/dist/lib/components/overlays/overlayStack.js +143 -0
  672. package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
  673. package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
  674. package/dist/lib/contacts/contactsApi.d.ts +174 -0
  675. package/dist/lib/contacts/contactsApi.js +139 -0
  676. package/dist/lib/contacts/vcard.d.ts +23 -0
  677. package/dist/lib/contacts/vcard.js +179 -0
  678. package/dist/lib/crypto/composeSecurity.d.ts +67 -0
  679. package/dist/lib/crypto/composeSecurity.js +93 -0
  680. package/dist/lib/crypto/encoding.d.ts +9 -0
  681. package/dist/lib/crypto/encoding.js +32 -0
  682. package/dist/lib/crypto/escrowKeys.d.ts +25 -0
  683. package/dist/lib/crypto/escrowKeys.js +59 -0
  684. package/dist/lib/crypto/idleTimeout.d.ts +16 -0
  685. package/dist/lib/crypto/idleTimeout.js +47 -0
  686. package/dist/lib/crypto/keySession.d.ts +159 -0
  687. package/dist/lib/crypto/keySession.js +367 -0
  688. package/dist/lib/crypto/keys.d.ts +50 -0
  689. package/dist/lib/crypto/keys.js +89 -0
  690. package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
  691. package/dist/lib/crypto/keyvaultApi.js +350 -0
  692. package/dist/lib/crypto/masterKey.d.ts +59 -0
  693. package/dist/lib/crypto/masterKey.js +104 -0
  694. package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
  695. package/dist/lib/crypto/masterKeyWraps.js +228 -0
  696. package/dist/lib/crypto/messageSecurity.d.ts +248 -0
  697. package/dist/lib/crypto/messageSecurity.js +367 -0
  698. package/dist/lib/crypto/mime.d.ts +143 -0
  699. package/dist/lib/crypto/mime.js +504 -0
  700. package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
  701. package/dist/lib/crypto/passkeyUnlock.js +79 -0
  702. package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
  703. package/dist/lib/crypto/passwordUnlock.js +73 -0
  704. package/dist/lib/crypto/recoveryCode.d.ts +28 -0
  705. package/dist/lib/crypto/recoveryCode.js +86 -0
  706. package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
  707. package/dist/lib/crypto/signingProviderApi.js +60 -0
  708. package/dist/lib/crypto/smime.d.ts +128 -0
  709. package/dist/lib/crypto/smime.js +402 -0
  710. package/dist/lib/crypto/smimeMessage.d.ts +132 -0
  711. package/dist/lib/crypto/smimeMessage.js +341 -0
  712. package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
  713. package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
  714. package/dist/lib/crypto/verificationSeal.d.ts +56 -0
  715. package/dist/lib/crypto/verificationSeal.js +220 -0
  716. package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
  717. package/dist/lib/mail/compose/composeQuoting.js +204 -0
  718. package/dist/lib/mail/compose/emojiData.d.ts +9 -0
  719. package/dist/lib/mail/compose/emojiData.js +18 -0
  720. package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
  721. package/dist/lib/mail/compose/giphyApi.js +20 -0
  722. package/dist/lib/mail/conversationsApi.d.ts +80 -0
  723. package/dist/lib/mail/conversationsApi.js +44 -0
  724. package/dist/lib/mail/dataExportApi.d.ts +50 -0
  725. package/dist/lib/mail/dataExportApi.js +40 -0
  726. package/dist/lib/mail/directoryApi.d.ts +49 -0
  727. package/dist/lib/mail/directoryApi.js +101 -0
  728. package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
  729. package/dist/lib/mail/erasureRequestApi.js +43 -0
  730. package/dist/lib/mail/flaggedMessages.d.ts +22 -0
  731. package/dist/lib/mail/flaggedMessages.js +73 -0
  732. package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
  733. package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
  734. package/dist/lib/mail/labelsApi.d.ts +47 -0
  735. package/dist/lib/mail/labelsApi.js +38 -0
  736. package/dist/lib/mail/mailAddress.d.ts +27 -0
  737. package/dist/lib/mail/mailAddress.js +54 -0
  738. package/dist/lib/mail/mailApi.d.ts +850 -0
  739. package/dist/lib/mail/mailApi.js +602 -0
  740. package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
  741. package/dist/lib/mail/mailDetailHooks.js +53 -0
  742. package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
  743. package/dist/lib/mail/mailFilterRulesApi.js +45 -0
  744. package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
  745. package/dist/lib/mail/mailSignaturesApi.js +42 -0
  746. package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
  747. package/dist/lib/mail/mailboxAccessApi.js +56 -0
  748. package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
  749. package/dist/lib/mail/mailboxImportApi.js +51 -0
  750. package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
  751. package/dist/lib/mail/messageBodySanitizer.js +118 -0
  752. package/dist/lib/mail/pushClient.d.ts +106 -0
  753. package/dist/lib/mail/pushClient.js +317 -0
  754. package/dist/lib/mail/sendEvents.d.ts +33 -0
  755. package/dist/lib/mail/sendEvents.js +44 -0
  756. package/dist/lib/mail/sendFailure.d.ts +16 -0
  757. package/dist/lib/mail/sendFailure.js +86 -0
  758. package/dist/lib/mail/senderListsApi.d.ts +69 -0
  759. package/dist/lib/mail/senderListsApi.js +126 -0
  760. package/dist/lib/search/queryGrammar.d.ts +51 -0
  761. package/dist/lib/search/queryGrammar.js +111 -0
  762. package/dist/lib/search/searchApi.d.ts +100 -0
  763. package/dist/lib/search/searchApi.js +107 -0
  764. package/dist/lib/search/searchScoring.d.ts +34 -0
  765. package/dist/lib/search/searchScoring.js +44 -0
  766. package/dist/lib/search/searchTier3.d.ts +64 -0
  767. package/dist/lib/search/searchTier3.js +335 -0
  768. package/dist/lib/tasks/tasksApi.d.ts +85 -0
  769. package/dist/lib/tasks/tasksApi.js +55 -0
  770. package/dist/lib/util/api.d.ts +160 -0
  771. package/dist/lib/util/api.js +251 -0
  772. package/dist/lib/util/apiClientContext.d.ts +7 -0
  773. package/dist/lib/util/apiClientContext.js +32 -0
  774. package/dist/lib/util/apiQuery.d.ts +32 -0
  775. package/dist/lib/util/apiQuery.js +42 -0
  776. package/dist/lib/util/clipboard.d.ts +7 -0
  777. package/dist/lib/util/clipboard.js +56 -0
  778. package/dist/lib/util/dateInput.d.ts +6 -0
  779. package/dist/lib/util/dateInput.js +14 -0
  780. package/dist/lib/util/timeZone.d.ts +12 -0
  781. package/dist/lib/util/timeZone.js +32 -0
  782. package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
  783. package/dist/lib/util/useCopyToClipboard.js +34 -0
  784. package/dist/lib/util/useIsMobile.d.ts +10 -0
  785. package/dist/lib/util/useIsMobile.js +29 -0
  786. package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
  787. package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
  788. package/lib/admin/auditLogApi.ts +48 -0
  789. package/lib/admin/distributionListsApi.ts +77 -0
  790. package/lib/admin/domainsApi.ts +113 -0
  791. package/lib/admin/escrowAccessRequestsApi.ts +110 -0
  792. package/lib/admin/escrowAuditLogApi.ts +101 -0
  793. package/lib/admin/escrowScopesApi.ts +112 -0
  794. package/lib/admin/leftoverMailboxApi.ts +120 -0
  795. package/lib/admin/mailboxPolicyApi.ts +38 -0
  796. package/lib/admin/matterExportApi.ts +62 -0
  797. package/lib/admin/matterSearchApi.ts +35 -0
  798. package/lib/admin/mattersApi.ts +86 -0
  799. package/lib/admin/pluginsApi.ts +339 -0
  800. package/lib/admin/retentionPolicyApi.ts +46 -0
  801. package/lib/admin/setupApi.ts +40 -0
  802. package/lib/admin/transportRulesApi.ts +106 -0
  803. package/lib/appearance/preferencesApi.ts +335 -0
  804. package/lib/auth/profileApi.ts +77 -0
  805. package/lib/auth/session.ts +238 -0
  806. package/lib/branding/brandingApi.ts +97 -0
  807. package/lib/branding/useBranding.ts +81 -0
  808. package/lib/calendar/calendarApi.ts +309 -0
  809. package/lib/calendar/calendarColors.ts +45 -0
  810. package/lib/calendar/calendarDragIds.ts +112 -0
  811. package/lib/calendar/calendarMutations.ts +236 -0
  812. package/lib/calendar/eventDescription.ts +211 -0
  813. package/lib/calendar/freeBusyApi.ts +197 -0
  814. package/lib/calendar/inviteApi.ts +154 -0
  815. package/lib/calendar/recurrence.ts +285 -0
  816. package/lib/components/avatar/ContactAvatar.tsx +47 -0
  817. package/lib/components/buttons/Button.tsx +40 -0
  818. package/lib/components/buttons/CopyButton.tsx +45 -0
  819. package/lib/components/feedback/Alert.tsx +13 -0
  820. package/lib/components/feedback/Skeleton.tsx +38 -0
  821. package/lib/components/forms/FormField.tsx +23 -0
  822. package/lib/components/navigation/BottomTabBar.tsx +66 -0
  823. package/lib/components/overlays/Drawer.tsx +72 -0
  824. package/lib/components/overlays/Modal.tsx +64 -0
  825. package/lib/components/overlays/PopoverPortal.tsx +74 -0
  826. package/lib/components/overlays/overlayStack.ts +165 -0
  827. package/lib/components/pickers/MiniDatePicker.tsx +90 -0
  828. package/lib/contacts/contactsApi.ts +289 -0
  829. package/lib/contacts/vcard.ts +197 -0
  830. package/lib/crypto/composeSecurity.ts +140 -0
  831. package/lib/crypto/encoding.ts +36 -0
  832. package/lib/crypto/escrowKeys.ts +74 -0
  833. package/lib/crypto/idleTimeout.ts +49 -0
  834. package/lib/crypto/keySession.ts +483 -0
  835. package/lib/crypto/keys.ts +105 -0
  836. package/lib/crypto/keyvaultApi.ts +674 -0
  837. package/lib/crypto/masterKey.ts +134 -0
  838. package/lib/crypto/masterKeyWraps.ts +269 -0
  839. package/lib/crypto/messageSecurity.ts +600 -0
  840. package/lib/crypto/mime.ts +568 -0
  841. package/lib/crypto/passkeyUnlock.ts +103 -0
  842. package/lib/crypto/passwordUnlock.ts +98 -0
  843. package/lib/crypto/recoveryCode.ts +93 -0
  844. package/lib/crypto/signingProviderApi.ts +135 -0
  845. package/lib/crypto/smime.ts +459 -0
  846. package/lib/crypto/smimeMessage.ts +491 -0
  847. package/lib/crypto/useIdleKeyTimeout.ts +176 -0
  848. package/lib/crypto/verificationSeal.ts +288 -0
  849. package/lib/mail/compose/composeQuoting.ts +243 -0
  850. package/lib/mail/compose/emojiData.ts +34 -0
  851. package/lib/mail/compose/giphyApi.ts +31 -0
  852. package/lib/mail/conversationsApi.ts +123 -0
  853. package/lib/mail/dataExportApi.ts +73 -0
  854. package/lib/mail/directoryApi.ts +161 -0
  855. package/lib/mail/erasureRequestApi.ts +71 -0
  856. package/lib/mail/flaggedMessages.ts +80 -0
  857. package/lib/mail/focusedInboxOverridesApi.ts +64 -0
  858. package/lib/mail/labelsApi.ts +71 -0
  859. package/lib/mail/mailAddress.ts +76 -0
  860. package/lib/mail/mailApi.ts +1286 -0
  861. package/lib/mail/mailDetailHooks.ts +57 -0
  862. package/lib/mail/mailFilterRulesApi.ts +116 -0
  863. package/lib/mail/mailSignaturesApi.ts +84 -0
  864. package/lib/mail/mailboxAccessApi.ts +106 -0
  865. package/lib/mail/mailboxImportApi.ts +87 -0
  866. package/lib/mail/messageBodySanitizer.ts +129 -0
  867. package/lib/mail/pushClient.ts +375 -0
  868. package/lib/mail/sendEvents.ts +72 -0
  869. package/lib/mail/sendFailure.ts +98 -0
  870. package/lib/mail/senderListsApi.ts +161 -0
  871. package/lib/search/queryGrammar.ts +179 -0
  872. package/lib/search/searchApi.ts +199 -0
  873. package/lib/search/searchScoring.ts +46 -0
  874. package/lib/search/searchTier3.ts +406 -0
  875. package/lib/tasks/tasksApi.ts +128 -0
  876. package/lib/util/api.ts +318 -0
  877. package/lib/util/apiClientContext.ts +35 -0
  878. package/lib/util/apiQuery.ts +61 -0
  879. package/lib/util/clipboard.ts +55 -0
  880. package/lib/util/dateInput.ts +15 -0
  881. package/lib/util/timeZone.ts +33 -0
  882. package/lib/util/useCopyToClipboard.ts +48 -0
  883. package/lib/util/useIsMobile.ts +34 -0
  884. package/lib/videoconf/videoMeetingsApi.ts +144 -0
  885. package/package.json +10 -4
@@ -0,0 +1,32 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /** The time zone a mailbox has when nothing better is known - the server's own default. */
6
+ export const DEFAULT_TIME_ZONE = "UTC";
7
+ /**
8
+ * The IANA time zone of the device this is running on (`"America/Los_Angeles"`), as the browser reports it, or `"UTC"` where it
9
+ * can't say (server-side rendering, an old engine). What a new mailbox, and a settings form with nothing chosen yet, start with.
10
+ */
11
+ export function deviceTimeZone() {
12
+ try {
13
+ return Intl.DateTimeFormat().resolvedOptions().timeZone || DEFAULT_TIME_ZONE;
14
+ }
15
+ catch {
16
+ return DEFAULT_TIME_ZONE;
17
+ }
18
+ }
19
+ /**
20
+ * Every time zone the browser can name, for a picker: `Intl.supportedValuesOf("timeZone")` where there is one (it leaves out `UTC`,
21
+ * which is added), else just `extra` - the zones the caller already holds, such as a mailbox's current one.
22
+ */
23
+ export function timeZoneOptions(...extra) {
24
+ let zones = [];
25
+ try {
26
+ zones = Intl.supportedValuesOf?.("timeZone") ?? [];
27
+ }
28
+ catch {
29
+ zones = [];
30
+ }
31
+ return [...new Set([DEFAULT_TIME_ZONE, ...zones, ...extra.filter(Boolean)])].sort((a, b) => a.localeCompare(b));
32
+ }
@@ -0,0 +1,12 @@
1
+ /** `"copied"`/`"failed"` are transient - they fall back to `"idle"` after the hook's reset delay. */
2
+ export type CopyStatus = "idle" | "copied" | "failed";
3
+ /** How long "Copied" stays up by default. */
4
+ export declare const COPY_FEEDBACK_MS = 2000;
5
+ /**
6
+ * Copy-to-clipboard with brief feedback state: `copy(text)` (see `copyTextToClipboard()`) sets `status` to
7
+ * `"copied"` or `"failed"` and back to `"idle"` after `resetMs`. Safe to unmount mid-copy or mid-feedback.
8
+ */
9
+ export default function useCopyToClipboard(resetMs?: number): {
10
+ status: CopyStatus;
11
+ copy: (text: string) => Promise<boolean>;
12
+ };
@@ -0,0 +1,34 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { useCallback, useEffect, useRef, useState } from "react";
6
+ import { copyTextToClipboard } from "./clipboard.js";
7
+ /** How long "Copied" stays up by default. */
8
+ export const COPY_FEEDBACK_MS = 2000;
9
+ /**
10
+ * Copy-to-clipboard with brief feedback state: `copy(text)` (see `copyTextToClipboard()`) sets `status` to
11
+ * `"copied"` or `"failed"` and back to `"idle"` after `resetMs`. Safe to unmount mid-copy or mid-feedback.
12
+ */
13
+ export default function useCopyToClipboard(resetMs = COPY_FEEDBACK_MS) {
14
+ const [status, setStatus] = useState("idle");
15
+ const timer = useRef(undefined);
16
+ const mounted = useRef(true);
17
+ useEffect(() => {
18
+ mounted.current = true;
19
+ return () => {
20
+ mounted.current = false;
21
+ clearTimeout(timer.current);
22
+ };
23
+ }, []);
24
+ const copy = useCallback(async (text) => {
25
+ const copied = await copyTextToClipboard(text);
26
+ if (mounted.current) {
27
+ setStatus(copied ? "copied" : "failed");
28
+ clearTimeout(timer.current);
29
+ timer.current = setTimeout(() => setStatus("idle"), resetMs);
30
+ }
31
+ return copied;
32
+ }, [resetMs]);
33
+ return { status, copy };
34
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * `true` below `breakpointPx` (default 768, i.e. Tailwind's `md`). Always `false` during SSR and the
3
+ * initial client render — corrected in an effect after mount, the same "read real client state once
4
+ * mounted" convention already used by `MailShell`'s query-param reads — so server-rendered markup and
5
+ * the first hydrated frame always agree (no hydration-mismatch warning), at the cost of a one-frame
6
+ * desktop-layout flash for mobile visitors on first load. Prefer plain Tailwind `md:` classes for pure
7
+ * layout/visibility; reach for this hook only when a component needs to make an actual JS-level
8
+ * decision (e.g. real navigation vs. local state).
9
+ */
10
+ export default function useIsMobile(breakpointPx?: number): boolean;
@@ -0,0 +1,29 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ import { useEffect, useState } from "react";
6
+ /** Matches this app's Tailwind `md` breakpoint, the cutoff used throughout for mobile vs. desktop layout. */
7
+ const DEFAULT_BREAKPOINT_PX = 768;
8
+ /**
9
+ * `true` below `breakpointPx` (default 768, i.e. Tailwind's `md`). Always `false` during SSR and the
10
+ * initial client render — corrected in an effect after mount, the same "read real client state once
11
+ * mounted" convention already used by `MailShell`'s query-param reads — so server-rendered markup and
12
+ * the first hydrated frame always agree (no hydration-mismatch warning), at the cost of a one-frame
13
+ * desktop-layout flash for mobile visitors on first load. Prefer plain Tailwind `md:` classes for pure
14
+ * layout/visibility; reach for this hook only when a component needs to make an actual JS-level
15
+ * decision (e.g. real navigation vs. local state).
16
+ */
17
+ export default function useIsMobile(breakpointPx = DEFAULT_BREAKPOINT_PX) {
18
+ const [isMobile, setIsMobile] = useState(false);
19
+ useEffect(() => {
20
+ const mql = window.matchMedia(`(max-width: ${breakpointPx - 1}px)`);
21
+ setIsMobile(mql.matches);
22
+ function handleChange(e) {
23
+ setIsMobile(e.matches);
24
+ }
25
+ mql.addEventListener("change", handleChange);
26
+ return () => mql.removeEventListener("change", handleChange);
27
+ }, [breakpointPx]);
28
+ return isMobile;
29
+ }
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Typed wrappers over `@rapidmx/meet-plugin`'s `/mail/video-meetings` REST surface — the owner-side
3
+ * management endpoints only (create, read, update/cancel). The anonymous `/join/:token` endpoint a guest's
4
+ * link resolves through is deliberately not wrapped here: it belongs to the meeting UI a guest loads, not to
5
+ * the authenticated webmail client this library serves.
6
+ *
7
+ * A plugin's routes are mounted on the same server, under the same `/api` prefix, as every first-party route,
8
+ * so there is nothing special about calling one: these go through the same `apiFetch()` (and therefore the
9
+ * same `jwt` cookie, the same `configureApiBaseUrl()` origin and the same `ApiRequestError` failure shape) as
10
+ * `calendarApi.ts`'s own calls. Authorization is the plugin's own: every call here is checked against the
11
+ * meeting's owning mailbox ACL, so a caller who neither owns nor holds a grant on that mailbox gets a 403/404
12
+ * rather than a meeting. When the plugin isn't installed at all, its routes simply aren't mounted and these
13
+ * calls fail with a 404 `ApiRequestError` — a caller that offers video conferencing optionally must treat
14
+ * that as "not available here" rather than as an error worth alarming the user with.
15
+ *
16
+ * Response bodies are typed, not runtime-validated, matching this library's convention for a plain typed
17
+ * `apiFetch<T>()` call (see `crypto/signingProviderApi.ts`'s own note on the same choice).
18
+ */
19
+ import { ApiClient } from "../util/api.js";
20
+ import { ListParams } from "../util/apiQuery.js";
21
+ export type { ListParams };
22
+ /** Whether a meeting is joinable only by its explicitly invited participants, or by anyone holding its link. */
23
+ export type VideoMeetingVisibility = "private" | "public";
24
+ export type VideoMeetingStatus = "scheduled" | "active" | "ended" | "cancelled";
25
+ /** The owner's view of a meeting. Only the fields a client actually reads are typed — the entity carries more. */
26
+ export interface VideoMeeting {
27
+ uid: string;
28
+ mailboxUid: string;
29
+ title: string;
30
+ visibility: VideoMeetingVisibility;
31
+ status: VideoMeetingStatus;
32
+ /** The `CalendarEvent` this meeting was minted for, when it was minted for one. */
33
+ calendarEventUid?: string;
34
+ startTime?: string;
35
+ endTime?: string;
36
+ /** ISO 8601 instant the meeting was created - every `BaseEntity` carries one; typed here because
37
+ * `apps/settings-video-conferencing` (Phase 4) both shows it and uses it to pick a mailbox's "personal room"
38
+ * (its oldest non-cancelled public meeting - see that app's own doc comment) out of `listVideoMeetings()`'s
39
+ * results. */
40
+ dateCreated: string;
41
+ }
42
+ /**
43
+ * A meeting as fetched by `getVideoMeeting()` or listed by `listVideoMeetings()` — the entity plus whichever join
44
+ * link(s) `BaseVideoMeetingRoute.withJoinUrls()` recomputes for it from its persisted slug(s). A meeting carries at
45
+ * most one of the two: `organizerJoinUrl` only for a private meeting that has an `organizerSlug`, `publicJoinUrl`
46
+ * only for a public one (see `VideoMeeting.visibility`) - never both, and neither at all when the deployment has no
47
+ * public URL configured for the plugin.
48
+ */
49
+ export interface VideoMeetingDetail extends VideoMeeting {
50
+ /** The owner's own working join link for a private meeting. */
51
+ organizerJoinUrl?: string;
52
+ /** The single shareable join link for a public meeting - what a host copies out to share their "personal
53
+ * room" or any other public meeting. */
54
+ publicJoinUrl?: string;
55
+ }
56
+ /** One person to invite to a private meeting. */
57
+ export interface VideoMeetingInvitee {
58
+ email: string;
59
+ displayName?: string;
60
+ }
61
+ /** One invitee as minted by `createVideoMeeting()`, carrying that person's own personal join link. */
62
+ export interface VideoMeetingInviteeJoinInfo extends VideoMeetingInvitee {
63
+ uid: string;
64
+ /** Absent when the deployment has no public URL configured for the plugin. */
65
+ joinUrl?: string;
66
+ }
67
+ export interface CreateVideoMeetingInput {
68
+ /** The mailbox that owns the meeting — the one whose ACL every later call on it is checked against. */
69
+ mailboxUid: string;
70
+ /** Non-empty, at most 200 characters (the server rejects anything else with a 400). */
71
+ title: string;
72
+ visibility: VideoMeetingVisibility;
73
+ /** The `CalendarEvent` this meeting is being minted for, when there is one. */
74
+ calendarEventUid?: string;
75
+ startTime?: string;
76
+ endTime?: string;
77
+ /** Required, and non-empty, for a `"private"` meeting — the server mints one personal join link per entry
78
+ * and 400s a private meeting with none. Never send the organizer here: they reach their own meeting
79
+ * through ownership (and `organizerJoinUrl`), not as a guest. */
80
+ invitees?: VideoMeetingInvitee[];
81
+ }
82
+ export interface VideoMeetingCreateResult {
83
+ meeting: VideoMeeting;
84
+ /** Present for a private meeting — one entry per requested invitee, each with their own join link. */
85
+ invitees?: VideoMeetingInviteeJoinInfo[];
86
+ /** Present for a private meeting — the organizer's own join link (see `VideoMeetingDetail`). */
87
+ organizerJoinUrl?: string;
88
+ /** Present for a public meeting — the single link everyone joins through. */
89
+ publicJoinUrl?: string;
90
+ }
91
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
92
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
93
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
94
+ /** Creates a meeting owned by `input.mailboxUid`. Requires CREATE on that mailbox. */
95
+ export declare function createVideoMeeting(input: CreateVideoMeetingInput, client?: ApiClient): Promise<VideoMeetingCreateResult>;
96
+ /**
97
+ * The only changes this route accepts. It deliberately cannot change a meeting's invitees: a private
98
+ * meeting's invitee list (and therefore its personal join links) is fixed at creation, so a caller whose
99
+ * invitee list has changed must cancel this meeting and create a new one.
100
+ */
101
+ export interface UpdateVideoMeetingInput {
102
+ title?: string;
103
+ status?: "cancelled";
104
+ }
105
+ /** Renames or cancels a meeting. Requires UPDATE on its owning mailbox. */
106
+ export declare function updateVideoMeeting(uid: string, input: UpdateVideoMeetingInput, client?: ApiClient): Promise<VideoMeeting>;
107
+ /** Fetches one meeting, with the organizer's own join link when it has one. Requires READ on its owning mailbox. */
108
+ export declare function getVideoMeeting(uid: string, client?: ApiClient): Promise<VideoMeetingDetail>;
109
+ /**
110
+ * Lists every meeting owned by `mailboxUid`, each carrying whichever join link `VideoMeetingDetail` describes for
111
+ * it. Requires LIST on that mailbox. Added for `apps/settings-video-conferencing` (Phase 4), which needs a
112
+ * mailbox's whole meeting history to both render its list and find the mailbox's "personal room" (its oldest
113
+ * non-cancelled public meeting) - `BaseVideoMeetingRoute.find()` already supported this exact query (no
114
+ * `calendarEventUid` filter), it just had no typed wrapper here yet.
115
+ */
116
+ export declare function listVideoMeetings(mailboxUid: string, params?: ListParams, client?: ApiClient): Promise<VideoMeetingDetail[]>;
@@ -0,0 +1,49 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Typed wrappers over `@rapidmx/meet-plugin`'s `/mail/video-meetings` REST surface — the owner-side
7
+ * management endpoints only (create, read, update/cancel). The anonymous `/join/:token` endpoint a guest's
8
+ * link resolves through is deliberately not wrapped here: it belongs to the meeting UI a guest loads, not to
9
+ * the authenticated webmail client this library serves.
10
+ *
11
+ * A plugin's routes are mounted on the same server, under the same `/api` prefix, as every first-party route,
12
+ * so there is nothing special about calling one: these go through the same `apiFetch()` (and therefore the
13
+ * same `jwt` cookie, the same `configureApiBaseUrl()` origin and the same `ApiRequestError` failure shape) as
14
+ * `calendarApi.ts`'s own calls. Authorization is the plugin's own: every call here is checked against the
15
+ * meeting's owning mailbox ACL, so a caller who neither owns nor holds a grant on that mailbox gets a 403/404
16
+ * rather than a meeting. When the plugin isn't installed at all, its routes simply aren't mounted and these
17
+ * calls fail with a 404 `ApiRequestError` — a caller that offers video conferencing optionally must treat
18
+ * that as "not available here" rather than as an error worth alarming the user with.
19
+ *
20
+ * Response bodies are typed, not runtime-validated, matching this library's convention for a plain typed
21
+ * `apiFetch<T>()` call (see `crypto/signingProviderApi.ts`'s own note on the same choice).
22
+ */
23
+ import { withClient } from "../util/api.js";
24
+ import { buildQuery } from "../util/apiQuery.js";
25
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
26
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
27
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
28
+ /** Creates a meeting owned by `input.mailboxUid`. Requires CREATE on that mailbox. */
29
+ export function createVideoMeeting(input, client) {
30
+ return withClient(client, "/mail/video-meetings", { method: "POST", body: JSON.stringify(input) });
31
+ }
32
+ /** Renames or cancels a meeting. Requires UPDATE on its owning mailbox. */
33
+ export function updateVideoMeeting(uid, input, client) {
34
+ return withClient(client, `/mail/video-meetings/${encodeURIComponent(uid)}`, { method: "PUT", body: JSON.stringify(input) });
35
+ }
36
+ /** Fetches one meeting, with the organizer's own join link when it has one. Requires READ on its owning mailbox. */
37
+ export function getVideoMeeting(uid, client) {
38
+ return withClient(client, `/mail/video-meetings/${encodeURIComponent(uid)}`);
39
+ }
40
+ /**
41
+ * Lists every meeting owned by `mailboxUid`, each carrying whichever join link `VideoMeetingDetail` describes for
42
+ * it. Requires LIST on that mailbox. Added for `apps/settings-video-conferencing` (Phase 4), which needs a
43
+ * mailbox's whole meeting history to both render its list and find the mailbox's "personal room" (its oldest
44
+ * non-cancelled public meeting) - `BaseVideoMeetingRoute.find()` already supported this exact query (no
45
+ * `calendarEventUid` filter), it just had no typed wrapper here yet.
46
+ */
47
+ export function listVideoMeetings(mailboxUid, params = {}, client) {
48
+ return withClient(client, `/mail/video-meetings?${buildQuery(params, { mailboxUid })}`);
49
+ }
@@ -0,0 +1,48 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Typed wrapper over `@rapidmx/restapi`'s `AuditLogEntry` route (`BaseAuditLogRoute`) — read-only: every
7
+ * write path (`create`/`update`/`delete`/`truncate`) unconditionally 403s, trusted callers included, so
8
+ * there is no write function here to mirror `domainsApi.ts`'s CRUD shape. The only writer is restapi's
9
+ * own server-internal `recordAuditLog()`.
10
+ */
11
+
12
+ import { ApiClient, withClient } from "../util/api.js";
13
+ import { ListParams, buildQuery } from "../util/apiQuery.js";
14
+
15
+ export type { ListParams };
16
+
17
+ export interface AuditLogEntry {
18
+ uid: string;
19
+ version: number;
20
+ dateCreated: string;
21
+ dateModified: string;
22
+ mailboxUid?: string;
23
+ actorUserUid?: string;
24
+ action: string;
25
+ targetType: string;
26
+ targetUid: string;
27
+ ip?: string;
28
+ details?: Record<string, unknown>;
29
+ }
30
+
31
+ export interface AuditLogFilters {
32
+ mailboxUid?: string;
33
+ actorUserUid?: string;
34
+ action?: string;
35
+ targetType?: string;
36
+ }
37
+
38
+ /** `client`, given below, is an explicit `ApiClient` from `createApiClient()` (e.g. one account of a multi-account
39
+ * app) to call instead of the default global `apiFetch()` - see `withClient()`'s own doc comment in `util/api.ts`.
40
+ * Omitted (the default), this behaves exactly as before. */
41
+ export function listAuditLog(filters: AuditLogFilters = {}, params: ListParams = {}, client?: ApiClient): Promise<AuditLogEntry[]> {
42
+ const extra: Record<string, string> = {};
43
+ if (filters.mailboxUid) extra.mailboxUid = filters.mailboxUid;
44
+ if (filters.actorUserUid) extra.actorUserUid = filters.actorUserUid;
45
+ if (filters.action) extra.action = filters.action;
46
+ if (filters.targetType) extra.targetType = filters.targetType;
47
+ return withClient(client, `/mail/audit-log?${buildQuery(params, extra)}`);
48
+ }
@@ -0,0 +1,77 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Typed wrappers over `@rapidmx/restapi`'s `DistributionList` CRUD route (`BaseDistributionListRoute`) —
7
+ * trusted-role-only, no self-service creation or per-list delegated ownership (v1).
8
+ */
9
+
10
+ import { ApiClient, withClient } from "../util/api.js";
11
+ import { ListParams, buildQuery } from "../util/apiQuery.js";
12
+
13
+ export type { ListParams };
14
+
15
+ export interface DistributionList {
16
+ uid: string;
17
+ version: number;
18
+ dateCreated: string;
19
+ dateModified: string;
20
+ primarySmtpAddress: string;
21
+ aliasAddresses?: string[];
22
+ name: string;
23
+ description?: string;
24
+ /** Informational only — v1 has no delegated-ownership enforcement; list management is trusted-role-only. */
25
+ ownerUserUid?: string;
26
+ memberAddresses: string[];
27
+ restrictSenders?: boolean;
28
+ }
29
+
30
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
31
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
32
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
33
+ export function listDistributionLists(params: ListParams = {}, client?: ApiClient): Promise<DistributionList[]> {
34
+ return withClient(client, `/mail/distribution-lists?${buildQuery(params)}`);
35
+ }
36
+
37
+ export function getDistributionList(uid: string, client?: ApiClient): Promise<DistributionList> {
38
+ return withClient(client, `/mail/distribution-lists/${encodeURIComponent(uid)}`);
39
+ }
40
+
41
+ export interface CreateDistributionListInput {
42
+ primarySmtpAddress: string;
43
+ aliasAddresses?: string[];
44
+ name: string;
45
+ description?: string;
46
+ ownerUserUid?: string;
47
+ memberAddresses?: string[];
48
+ restrictSenders?: boolean;
49
+ }
50
+
51
+ export function createDistributionList(input: CreateDistributionListInput, client?: ApiClient): Promise<DistributionList> {
52
+ return withClient(client, "/mail/distribution-lists", {
53
+ method: "POST",
54
+ body: JSON.stringify({ aliasAddresses: [], memberAddresses: [], ...input }),
55
+ });
56
+ }
57
+
58
+ export interface UpdateDistributionListInput {
59
+ uid: string;
60
+ version: number;
61
+ name?: string;
62
+ description?: string;
63
+ aliasAddresses?: string[];
64
+ memberAddresses?: string[];
65
+ restrictSenders?: boolean;
66
+ }
67
+
68
+ export function updateDistributionList(input: UpdateDistributionListInput, client?: ApiClient): Promise<DistributionList> {
69
+ return withClient(client, `/mail/distribution-lists/${encodeURIComponent(input.uid)}`, {
70
+ method: "PUT",
71
+ body: JSON.stringify(input),
72
+ });
73
+ }
74
+
75
+ export function deleteDistributionList(uid: string, version: number, client?: ApiClient): Promise<void> {
76
+ return withClient(client, `/mail/distribution-lists/${encodeURIComponent(uid)}?version=${version}`, { method: "DELETE" });
77
+ }
@@ -0,0 +1,113 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Typed wrappers over `@rapidmx/restapi`'s `Domain` CRUD + verification routes (`BaseDomainRoute`).
7
+ * Every route here is `@RequiresTrustedRole()` on the backend — admin-only, matching `mailApi.ts`'s other
8
+ * admin-scoped entities.
9
+ */
10
+
11
+ import { ApiClient, withClient } from "../util/api.js";
12
+ import { ListParams, buildQuery } from "../util/apiQuery.js";
13
+
14
+ export type { ListParams };
15
+
16
+ export interface Domain {
17
+ uid: string;
18
+ version: number;
19
+ dateCreated: string;
20
+ dateModified: string;
21
+ name: string;
22
+ enabled: boolean;
23
+ verified: boolean;
24
+ verificationToken: string;
25
+ verifiedAt?: string;
26
+ lastCheckedAt?: string;
27
+ dkimSelector?: string;
28
+ dkimPublicKey?: string;
29
+ dmarcPolicy?: "none" | "quarantine" | "reject";
30
+ dmarcReportEmail?: string;
31
+ /** When set, this domain is a pure alias of the domain named here - it has no mailboxes of its own; mail
32
+ * addressed to it is delivered to the matching mailbox on the domain it aliases instead. */
33
+ aliasOf?: string;
34
+ }
35
+
36
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
37
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
38
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
39
+ export function listDomains(params: ListParams = {}, client?: ApiClient): Promise<Domain[]> {
40
+ return withClient(client, `/mail/domains?${buildQuery(params)}`);
41
+ }
42
+
43
+ export function getDomain(uid: string, client?: ApiClient): Promise<Domain> {
44
+ return withClient(client, `/mail/domains/${encodeURIComponent(uid)}`);
45
+ }
46
+
47
+ export interface CreateDomainInput {
48
+ name: string;
49
+ enabled?: boolean;
50
+ dkimSelector?: string;
51
+ dkimPublicKey?: string;
52
+ dmarcPolicy?: "none" | "quarantine" | "reject";
53
+ dmarcReportEmail?: string;
54
+ aliasOf?: string;
55
+ }
56
+
57
+ export function createDomain(input: CreateDomainInput, client?: ApiClient): Promise<Domain> {
58
+ return withClient(client, "/mail/domains", {
59
+ method: "POST",
60
+ body: JSON.stringify({ enabled: true, ...input }),
61
+ });
62
+ }
63
+
64
+ export interface UpdateDomainInput {
65
+ uid: string;
66
+ version: number;
67
+ enabled?: boolean;
68
+ dkimSelector?: string;
69
+ dkimPublicKey?: string;
70
+ dmarcPolicy?: "none" | "quarantine" | "reject";
71
+ dmarcReportEmail?: string;
72
+ aliasOf?: string;
73
+ }
74
+
75
+ export function updateDomain(input: UpdateDomainInput, client?: ApiClient): Promise<Domain> {
76
+ return withClient(client, `/mail/domains/${encodeURIComponent(input.uid)}`, {
77
+ method: "PUT",
78
+ body: JSON.stringify(input),
79
+ });
80
+ }
81
+
82
+ export function deleteDomain(uid: string, version: number, client?: ApiClient): Promise<void> {
83
+ return withClient(client, `/mail/domains/${encodeURIComponent(uid)}?version=${version}`, { method: "DELETE" });
84
+ }
85
+
86
+ /** Triggers an immediate DNS ownership check rather than waiting for the next scheduled background pass.
87
+ * Idempotent on an already-verified domain; a still-unverified result is not an error (only
88
+ * `lastCheckedAt` advances) — always returns the domain's current state either way. */
89
+ export function verifyDomain(uid: string, client?: ApiClient): Promise<Domain> {
90
+ return withClient(client, `/mail/domains/${encodeURIComponent(uid)}/verify`, { method: "POST" });
91
+ }
92
+
93
+ export type DnsRecordType = "ownership" | "mx" | "spf" | "dkim" | "dmarc" | "autodiscover_cname" | "autodiscover_srv";
94
+
95
+ /** One mail-related DNS record this server recommends for a domain, live-checked against real DNS —
96
+ * purely diagnostic, never mutates anything (unlike `verifyDomain`). The two `autodiscover_*` types are only
97
+ * ever present while `@rapidmx/autodiscover-plugin` is active for this deployment. */
98
+ export interface DnsRecordCheck {
99
+ type: DnsRecordType;
100
+ recordKind: "TXT" | "MX" | "CNAME" | "SRV";
101
+ recordName: string;
102
+ /** `false` when there isn't enough information yet to know what to recommend (no DKIM
103
+ * selector/key configured, for example) — `recommendedValue`/`found`/`matches` are meaningless then. */
104
+ configured: boolean;
105
+ recommendedValue?: string;
106
+ found: boolean;
107
+ matches: boolean;
108
+ actualValue?: string;
109
+ }
110
+
111
+ export function getDnsSetup(uid: string, client?: ApiClient): Promise<DnsRecordCheck[]> {
112
+ return withClient(client, `/mail/domains/${encodeURIComponent(uid)}/dns-setup`);
113
+ }
@@ -0,0 +1,110 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Typed wrappers over `@rapidmx/restapi`'s `EscrowAccessRequest` route (`BaseEscrowAccessRequestRoute`) —
7
+ * a bespoke (non-`CRUDRoute`) route: no `update`/`delete`/`count`, and `create()` only ever accepts
8
+ * `{matterId, mailboxUid}` (everything else is derived server-side). Holder-gated throughout, same as
9
+ * `mattersApi.ts`. `find()`/`findById()` auto-scope to matters under scopes the caller holds; `approve()`/
10
+ * `deny()` mutate in place and return the updated request; `material()` is only ever readable once the
11
+ * request is `approved`/`fulfilled`, and returns still-encrypted `MasterKeyWraps` this server can't
12
+ * decrypt either — see `EscrowAccessMaterial`'s own doc comment.
13
+ */
14
+
15
+ import { ApiClient, withClient } from "../util/api.js";
16
+ import { ListParams, RequestListParams, buildQuery } from "../util/apiQuery.js";
17
+
18
+ export type { ListParams, RequestListParams };
19
+
20
+ export interface EscrowAccessRequestApproval {
21
+ holderUserUid: string;
22
+ /** ISO 8601 timestamp. */
23
+ approvedAt: string;
24
+ }
25
+
26
+ export type EscrowAccessRequestStatus = "pending" | "approved" | "denied" | "fulfilled";
27
+
28
+ export interface EscrowAccessRequest {
29
+ uid: string;
30
+ version: number;
31
+ dateCreated: string;
32
+ dateModified: string;
33
+ matterId: string;
34
+ mailboxUid: string;
35
+ requestedByUserUid: string;
36
+ approvals: EscrowAccessRequestApproval[];
37
+ /** Snapshotted from `EscrowScope.requiredHolders` at creation time — see this type's own restapi doc
38
+ * comment on why it's never re-read live. */
39
+ requiredHoldersAtCreation: number;
40
+ status: EscrowAccessRequestStatus;
41
+ /** Set the first time `getAccessRequestMaterial()` is successfully called — informational only. */
42
+ fulfilledAt?: string;
43
+ deniedByUserUid?: string;
44
+ deniedAt?: string;
45
+ }
46
+
47
+ /** Mirrors `@rapidmx/restapi`'s `MasterKeyWrap` — same shape `crypto/keyvaultApi.ts` already defines for
48
+ * the mailbox-owner side of this feature, duplicated here rather than cross-imported (same convention
49
+ * every other `*Api.ts` wrapper in this package already follows for overlapping wire shapes). */
50
+ export interface MasterKeyWrap {
51
+ method: "password" | "passkey" | "recovery" | "escrow";
52
+ methodId?: string;
53
+ escrowScopeId?: string;
54
+ ciphertext: string;
55
+ nonce: string;
56
+ salt: string;
57
+ kdf: string;
58
+ schemeVersion: number;
59
+ createdAt: number;
60
+ }
61
+
62
+ /** The wire shape `getAccessRequestMaterial()` returns — only ever the escrow-method wraps scoped to the
63
+ * matter's own escrow scope, never `wrappedKeys` or any other unlock method. This app deliberately never
64
+ * attempts to decrypt these — they're surfaced as-is for the holder to copy into their own offline
65
+ * tooling, per `specs/end-to-end_encryption.md`'s "this server never holds the scope's private key". */
66
+ export interface EscrowAccessMaterial {
67
+ masterKeyWraps: MasterKeyWrap[];
68
+ }
69
+
70
+ /** `client`, given by every function below, is an explicit `ApiClient` from `createApiClient()` (e.g. one
71
+ * account of a multi-account app) to call instead of the default global `apiFetch()` - see `withClient()`'s
72
+ * own doc comment in `util/api.ts`. Omitted (the default), every function here behaves exactly as before. */
73
+ /** Newest first. Every request belongs to one Matter, so `params.matterId` narrows the list to that
74
+ * Matter's requests (still only ever within scopes the caller holds). */
75
+ export function listAccessRequests(params: RequestListParams = {}, client?: ApiClient): Promise<EscrowAccessRequest[]> {
76
+ const { matterId, ...paging } = params;
77
+ return withClient(client, `/escrow/access-requests?${buildQuery(paging, matterId ? { matterId } : {})}`);
78
+ }
79
+
80
+ export function getAccessRequest(uid: string, client?: ApiClient): Promise<EscrowAccessRequest> {
81
+ return withClient(client, `/escrow/access-requests/${encodeURIComponent(uid)}`);
82
+ }
83
+
84
+ export interface CreateAccessRequestInput {
85
+ matterId: string;
86
+ mailboxUid: string;
87
+ }
88
+
89
+ /** The requester's own creation counts as their first approval — auto-approved immediately if
90
+ * `EscrowScope.requiredHolders` is `1`. */
91
+ export function createAccessRequest(input: CreateAccessRequestInput, client?: ApiClient): Promise<EscrowAccessRequest> {
92
+ return withClient(client, "/escrow/access-requests", { method: "POST", body: JSON.stringify(input) });
93
+ }
94
+
95
+ /** 409s if the request isn't `pending`; 400s if the caller already approved it. */
96
+ export function approveAccessRequest(uid: string, client?: ApiClient): Promise<EscrowAccessRequest> {
97
+ return withClient(client, `/escrow/access-requests/${encodeURIComponent(uid)}/approve`, { method: "POST" });
98
+ }
99
+
100
+ /** 409s if the request isn't `pending`. */
101
+ export function denyAccessRequest(uid: string, client?: ApiClient): Promise<EscrowAccessRequest> {
102
+ return withClient(client, `/escrow/access-requests/${encodeURIComponent(uid)}/deny`, { method: "POST" });
103
+ }
104
+
105
+ /** 403s ("Dual control threshold not yet met.") unless the request is `approved`/`fulfilled`. Marks the
106
+ * request `fulfilled` server-side as a side effect of a successful call, and records an
107
+ * `EscrowAuditAction.MATERIAL_READ` entry — see `escrowAuditLogApi.ts`. */
108
+ export function getAccessRequestMaterial(uid: string, client?: ApiClient): Promise<EscrowAccessMaterial> {
109
+ return withClient(client, `/escrow/access-requests/${encodeURIComponent(uid)}/material`);
110
+ }