@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,160 @@
1
+ /**
2
+ * Minimal client-side helper shared by every app in this project: a `fetch` wrapper that talks to the
3
+ * same-origin RapidMX API. There is no client router or HTTP client shipped by `@rapidrest/react`, so this
4
+ * is deliberately small and framework-free.
5
+ *
6
+ * This service never issues its own JWTs — identity comes entirely from a separate `auth-server` deployment
7
+ * (see `.claude/NOTES.md`). Authentication rides along via the `jwt` HttpOnly cookie that auth-server sets on
8
+ * sign-in — the browser attaches it automatically to every same-origin `fetch()` call (the default
9
+ * `credentials: "same-origin"` mode), and this server's `JWTStrategy` accepts it as a credential for every
10
+ * authenticated request, not just SSR page loads. There is no local elevation/step-up flow here (unlike
11
+ * auth-server's own `api.ts`, which this is a trimmed sibling of): a request to an elevation-gated endpoint
12
+ * (`@RequiresElevation()` on the server) made with a non-elevated token fails with an `ApiRequestError` of
13
+ * status 403 and code `"api-104"`, and it is up to the caller to send the browser to auth-server's
14
+ * `/auth/elevate?return_to=...` page, which returns it to `return_to` once the user has confirmed their identity
15
+ * (the admin console does exactly that - see `AdminShell` in `@rapidmx/web-client`). Code `"api-103"` is a
16
+ * different 403 - the caller lacks a required role, and elevating won't help.
17
+ */
18
+ export declare class ApiRequestError extends Error {
19
+ status: number;
20
+ code?: string;
21
+ /**
22
+ * The response's whole parsed JSON body, for an endpoint that says more than `message` - e.g. a failed send's
23
+ * per-recipient SMTP results under `details`. `undefined` when the response had no JSON body (or the error
24
+ * was raised on the client), so a caller must treat it as untyped, untrusted data and read it defensively.
25
+ */
26
+ details?: unknown;
27
+ constructor(message: string, status: number, code?: string, details?: unknown);
28
+ }
29
+ /**
30
+ * Points `apiFetch()` at `baseUrl` (e.g. `"https://mail.example.com"`) instead of the default
31
+ * same-origin relative path. Only needed by a consumer whose own origin genuinely differs from the
32
+ * RapidMX server's - see `apiBaseUrl`'s own doc comment. Requires that server's `cors:origins` config
33
+ * include this consumer's own origin (see `@rapidrest/service-core`'s `Server.js` CORS middleware,
34
+ * which only reflects `access-control-allow-credentials` for an explicitly allow-listed origin - the
35
+ * default "allow every origin" behavior when `cors:origins` is unset does NOT carry credentials) and
36
+ * that whatever sets the `jwt` cookie issues it with `SameSite=None; Secure` - a same-origin deployment
37
+ * never needed either, and this function alone does not make a cross-origin deployment secure or
38
+ * functional on its own.
39
+ */
40
+ export declare function configureApiBaseUrl(baseUrl: string): void;
41
+ /**
42
+ * The origin `configureApiBaseUrl()` set - `""` (same origin) when it never was. For a caller that talks to the
43
+ * RapidMX server some way `apiFetch()` can't, such as the push WebSocket, which must go to the same origin.
44
+ */
45
+ export declare function apiOrigin(): string;
46
+ /**
47
+ * The full URL for an `@ApiRoute`-declared `path` (e.g. `/mail/attachments/a1/content`) - the `/api`
48
+ * prefix plus whatever origin `configureApiBaseUrl()` set (a same-origin relative `/api/...` path when
49
+ * it was never called). Every call site that can't go through `apiFetch()` - a raw-bytes upload, a
50
+ * non-JSON download, or a plain URL handed to an `<a href>`/`<img src>` - must build its URL here rather
51
+ * than hard-coding `/api...`, or it silently ignores a configured cross-origin base URL. A raw `fetch()`
52
+ * built on this should also pass `credentials: "include"` so a cross-origin call still carries the `jwt`
53
+ * cookie (harmless for a same-origin one).
54
+ */
55
+ export declare function apiUrl(path: string): string;
56
+ /**
57
+ * `headers` as a `Headers` with the CSRF double-submit header added, for a mutating request that is built without `apiFetch()` - an upload of a
58
+ * file's own bytes, which cannot go through `apiFetch()` because that always sends JSON. Without it the server refuses the request as "missing a valid
59
+ * CSRF token". `method` defaults to `POST`; a safe method or no cookie leaves the headers as they were, exactly as `apiFetch()` does.
60
+ */
61
+ export declare function withCsrfHeader(headers: Record<string, string>, method?: string): Headers;
62
+ /**
63
+ * `fetch()` against the RapidMX server's API - same-origin unless `configureApiBaseUrl()` has been
64
+ * called, in which case this also switches to `credentials: "include"` so the configured cross-origin
65
+ * call still carries the `jwt` cookie (a plain relative fetch never needs this - `credentials:
66
+ * "same-origin"`, fetch's own default, already attaches it). `path` is the route as declared by
67
+ * `@ApiRoute` (e.g. `/mail/mailboxes`) — the `/api` prefix that decorator always adds is applied here,
68
+ * in one place, rather than repeated at every call site.
69
+ */
70
+ export declare function apiFetch<T = unknown>(path: string, init?: RequestInit): Promise<T>;
71
+ /**
72
+ * `fetch()` against auth-server's API — a *different* origin than this app, unlike `apiFetch()` above. Used
73
+ * only for the handful of actions that must be issued by auth-server itself (e.g. admin impersonation, which
74
+ * needs to mint a token with the target user's real roles/scopes the way auth-server's own sign-in does —
75
+ * see `.claude/NOTES.md`).
76
+ *
77
+ * Requires `credentials: "include"` so the browser both attaches this app's own `jwt` cookie to the request
78
+ * and accepts whatever `Set-Cookie` auth-server's response carries back. This only actually works when
79
+ * auth-server and this app are deployed under a shared parent cookie domain (e.g. `Domain=.example.com`) —
80
+ * a deployment-level requirement owned by auth-server/the Helm chart, not configured here — and auth-server's
81
+ * CORS config must explicitly allow this app's origin with credentials.
82
+ *
83
+ * `applyCsrfHeader()` is still called here for consistency, but it never actually finds a token for a truly
84
+ * cross-origin call — see its own doc comment on `readCsrfCookie()` for why that's correct rather than a
85
+ * gap: auth-server's CSRF protection for this call shape comes from its own Origin allow-list check, not a
86
+ * double-submit cookie this app's JavaScript could never read in the first place.
87
+ */
88
+ export declare function authApiFetch<T = unknown>(authServerUrl: string, path: string, init?: RequestInit): Promise<T>;
89
+ /**
90
+ * Registers the one function that hears about every `401` this server's API (`apiFetch()`, not auth-server's) answers - the
91
+ * signed-in session has ended or expired. It only observes: the request still rejects with the same `ApiRequestError`, so
92
+ * a caller's own handling is unchanged. The app frame uses it to say "Your session expired" once, whichever request noticed
93
+ * first (a background refresh included). Pass `undefined` to remove it. A throwing observer never affects the request.
94
+ */
95
+ export declare function setApiUnauthorizedObserver(observer: ((error: ApiRequestError) => void) | undefined): void;
96
+ /**
97
+ * The low-level shape both the default global client (`apiFetch()`, driven by `configureApiBaseUrl()` and the
98
+ * `jwt` cookie) and an explicit `createApiClient()` instance expose - so a `mailApi.ts`-style module can be
99
+ * written once against this interface and used from either. There is deliberately no `authFetch`/cross-origin
100
+ * counterpart here: `authApiFetch()`'s `authServerUrl` is already explicit per call, so it doesn't need this
101
+ * abstraction the way the single implicit `apiBaseUrl` global does.
102
+ */
103
+ export interface ApiClient {
104
+ /** Same contract as `apiFetch()`: prefixes `path` with `/api`, parses a JSON response, and rejects with
105
+ * `ApiRequestError` on a non-ok response. */
106
+ fetch<T = unknown>(path: string, init?: RequestInit): Promise<T>;
107
+ /**
108
+ * This client instance's own `setApiUnauthorizedObserver()` equivalent - see `createApiClient()`'s doc
109
+ * comment for why it is per-instance rather than shared with the module-level `setApiUnauthorizedObserver()`
110
+ * (or across other `ApiClient` instances).
111
+ */
112
+ setUnauthorizedObserver(observer: ((error: ApiRequestError) => void) | undefined): void;
113
+ }
114
+ /** `createApiClient()`'s options. */
115
+ export interface CreateApiClientOptions {
116
+ /** This client's origin, e.g. `"https://mail.example.com"` - always used, never the global
117
+ * `configureApiBaseUrl()` value. A trailing slash is stripped, matching `configureApiBaseUrl()`. */
118
+ baseUrl: string;
119
+ /**
120
+ * Called fresh before every single request this client makes - never cached or reused across calls, so a
121
+ * caller can transparently rotate/refresh the underlying session token between requests (e.g. a
122
+ * background refresh keyed on this one account) without this client needing to know anything about
123
+ * refresh logic itself. Its resolved value is sent as `Authorization: jwt <token>` - the same header
124
+ * format `JWTStrategy` already accepts server-side alongside the `jwt` cookie - never `credentials:
125
+ * "include"`, since a native multi-account app has no relevant cookie jar for a given account's origin.
126
+ * A rejection here rejects the request itself (the underlying `fetch()` is never called).
127
+ */
128
+ getAccessToken: () => Promise<string>;
129
+ }
130
+ /**
131
+ * Builds an explicit-context `ApiClient`: everything `apiFetch()` does, but always against `baseUrl` (never
132
+ * the `configureApiBaseUrl()` global) and always authenticated with a bearer token from `getAccessToken()`
133
+ * (never the `jwt` cookie / `credentials: "include"`). ADDITIVE to the existing global-config mode -
134
+ * `apiFetch()`/`authApiFetch()`/`configureApiBaseUrl()` are untouched and keep working exactly as before for
135
+ * every existing caller; this is for a consumer (the Tauri multi-account client) that needs several fully
136
+ * independent origin/session contexts open at once, which the single module-level `apiBaseUrl` global can't
137
+ * represent.
138
+ *
139
+ * Distinct instances never share state: each closes over its own `baseUrl`, `getAccessToken` and unauthorized
140
+ * observer, so two accounts' clients never cross-talk even when both are live in the same process.
141
+ *
142
+ * **401 handling is per-instance, not global.** The existing `setApiUnauthorizedObserver()` is one process-wide
143
+ * "you're signed out" signal, correct for a single-session app (one browser tab, one Electron window - there is
144
+ * only ever one session to lose). A multi-account app has no single account whose 401 means "the app" is
145
+ * unauthorized, so an `ApiClient` from `createApiClient()` does NOT invoke the global observer at all; instead
146
+ * each instance has its own `setUnauthorizedObserver()` a caller can register per account (e.g. to mark that
147
+ * one account's tab as needing re-authentication without touching the others).
148
+ */
149
+ export declare function createApiClient(options: CreateApiClientOptions): ApiClient;
150
+ /**
151
+ * Routes a request to `client.fetch()` when `client` is given, else to the default global `apiFetch()` - the
152
+ * one call every REST client module (`mailApi.ts` etc.) uses to add optional explicit-`ApiClient` support to
153
+ * each of its exported functions with minimal churn: give the function a trailing `client?: ApiClient`
154
+ * parameter (so every existing call site, which never passes one, is unaffected - `undefined` here means
155
+ * exactly what calling `apiFetch()` directly always meant), and swap its `apiFetch(...)` call for
156
+ * `withClient(client, ...)`. A function that calls another exported function of the same module internally
157
+ * (e.g. `mailApi.ts`'s `grantMailboxAccess()` calling `getMailboxAcl()`) threads its own `client` through
158
+ * that call too, so a whole call chain stays pinned to one account.
159
+ */
160
+ export declare function withClient<T = unknown>(client: ApiClient | undefined, path: string, init?: RequestInit): Promise<T>;
@@ -0,0 +1,251 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Minimal client-side helper shared by every app in this project: a `fetch` wrapper that talks to the
7
+ * same-origin RapidMX API. There is no client router or HTTP client shipped by `@rapidrest/react`, so this
8
+ * is deliberately small and framework-free.
9
+ *
10
+ * This service never issues its own JWTs — identity comes entirely from a separate `auth-server` deployment
11
+ * (see `.claude/NOTES.md`). Authentication rides along via the `jwt` HttpOnly cookie that auth-server sets on
12
+ * sign-in — the browser attaches it automatically to every same-origin `fetch()` call (the default
13
+ * `credentials: "same-origin"` mode), and this server's `JWTStrategy` accepts it as a credential for every
14
+ * authenticated request, not just SSR page loads. There is no local elevation/step-up flow here (unlike
15
+ * auth-server's own `api.ts`, which this is a trimmed sibling of): a request to an elevation-gated endpoint
16
+ * (`@RequiresElevation()` on the server) made with a non-elevated token fails with an `ApiRequestError` of
17
+ * status 403 and code `"api-104"`, and it is up to the caller to send the browser to auth-server's
18
+ * `/auth/elevate?return_to=...` page, which returns it to `return_to` once the user has confirmed their identity
19
+ * (the admin console does exactly that - see `AdminShell` in `@rapidmx/web-client`). Code `"api-103"` is a
20
+ * different 403 - the caller lacks a required role, and elevating won't help.
21
+ */
22
+ export class ApiRequestError extends Error {
23
+ constructor(message, status, code, details) {
24
+ super(message);
25
+ this.name = "ApiRequestError";
26
+ this.status = status;
27
+ this.code = code;
28
+ this.details = details;
29
+ }
30
+ }
31
+ /**
32
+ * Absolute origin `apiFetch()` targets instead of a same-origin relative path - unset (`""`, the
33
+ * default) everywhere this library has run until now (the SSR web/admin apps, always served from the
34
+ * same origin as the API they call). Set once via `configureApiBaseUrl()` by a consumer that genuinely
35
+ * runs on a *different* origin than the API - e.g. the Electron desktop client, whose renderer has no
36
+ * "same origin as the server" to rely on the way a browser tab loaded from that server does.
37
+ */
38
+ let apiBaseUrl = "";
39
+ /**
40
+ * Points `apiFetch()` at `baseUrl` (e.g. `"https://mail.example.com"`) instead of the default
41
+ * same-origin relative path. Only needed by a consumer whose own origin genuinely differs from the
42
+ * RapidMX server's - see `apiBaseUrl`'s own doc comment. Requires that server's `cors:origins` config
43
+ * include this consumer's own origin (see `@rapidrest/service-core`'s `Server.js` CORS middleware,
44
+ * which only reflects `access-control-allow-credentials` for an explicitly allow-listed origin - the
45
+ * default "allow every origin" behavior when `cors:origins` is unset does NOT carry credentials) and
46
+ * that whatever sets the `jwt` cookie issues it with `SameSite=None; Secure` - a same-origin deployment
47
+ * never needed either, and this function alone does not make a cross-origin deployment secure or
48
+ * functional on its own.
49
+ */
50
+ export function configureApiBaseUrl(baseUrl) {
51
+ apiBaseUrl = baseUrl.replace(/\/$/, "");
52
+ }
53
+ /**
54
+ * The origin `configureApiBaseUrl()` set - `""` (same origin) when it never was. For a caller that talks to the
55
+ * RapidMX server some way `apiFetch()` can't, such as the push WebSocket, which must go to the same origin.
56
+ */
57
+ export function apiOrigin() {
58
+ return apiBaseUrl;
59
+ }
60
+ /**
61
+ * The full URL for an `@ApiRoute`-declared `path` (e.g. `/mail/attachments/a1/content`) - the `/api`
62
+ * prefix plus whatever origin `configureApiBaseUrl()` set (a same-origin relative `/api/...` path when
63
+ * it was never called). Every call site that can't go through `apiFetch()` - a raw-bytes upload, a
64
+ * non-JSON download, or a plain URL handed to an `<a href>`/`<img src>` - must build its URL here rather
65
+ * than hard-coding `/api...`, or it silently ignores a configured cross-origin base URL. A raw `fetch()`
66
+ * built on this should also pass `credentials: "include"` so a cross-origin call still carries the `jwt`
67
+ * cookie (harmless for a same-origin one).
68
+ */
69
+ export function apiUrl(path) {
70
+ return `${apiBaseUrl}/api${path}`;
71
+ }
72
+ /**
73
+ * Mirrors `@rapidrest/service-core`'s `DEFAULT_CSRF_COOKIE_NAME`/`DEFAULT_CSRF_HEADER_NAME` — kept as
74
+ * local literals since this package has no dependency on that one.
75
+ */
76
+ const CSRF_COOKIE_NAME = "csrf";
77
+ const CSRF_HEADER_NAME = "x-csrf-token";
78
+ const CSRF_SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);
79
+ /**
80
+ * Reads the CSRF double-submit cookie a `jwt`-cookie-issuing server sets (see `@rapidrest/auth`'s
81
+ * `CsrfUtils`) directly off `document.cookie`. That cookie is deliberately host-only and non-`HttpOnly`
82
+ * — see `@rapidrest/service-core`'s `src/http/csrf/csrf.ts` for the full rationale, in particular why a
83
+ * *cross-origin* call (`authApiFetch()` below) can never find one here: a cookie set by auth-server's
84
+ * host is never present in this app's own `document.cookie`, by design — that's what makes the cookie
85
+ * host-only in the first place, and it's why `authApiFetch()`'s CSRF protection has to come from the
86
+ * server checking its Origin allow-list instead (see its own doc comment).
87
+ */
88
+ function readCsrfCookie() {
89
+ if (typeof document === "undefined") {
90
+ return undefined;
91
+ }
92
+ for (const part of document.cookie.split("; ")) {
93
+ const idx = part.indexOf("=");
94
+ if (idx > 0 && part.slice(0, idx) === CSRF_COOKIE_NAME) {
95
+ return part.slice(idx + 1);
96
+ }
97
+ }
98
+ return undefined;
99
+ }
100
+ /**
101
+ * Echoes the CSRF double-submit cookie back as a header on `headers`, for a mutating request that doesn't
102
+ * already carry one — the browser-side half of the double-submit check `@rapidrest/service-core`'s
103
+ * `RouteUtils.checkCsrf()` enforces server-side. A safe method, a caller-supplied header already present,
104
+ * or simply no cookie yet (e.g. this page's very first request) all leave `headers` untouched — the
105
+ * server itself never requires this for any of those cases.
106
+ */
107
+ function applyCsrfHeader(headers, method) {
108
+ const m = (method ?? "GET").toUpperCase();
109
+ if (CSRF_SAFE_METHODS.has(m) || headers.has(CSRF_HEADER_NAME)) {
110
+ return;
111
+ }
112
+ const token = readCsrfCookie();
113
+ if (token) {
114
+ headers.set(CSRF_HEADER_NAME, token);
115
+ }
116
+ }
117
+ /**
118
+ * `headers` as a `Headers` with the CSRF double-submit header added, for a mutating request that is built without `apiFetch()` - an upload of a
119
+ * file's own bytes, which cannot go through `apiFetch()` because that always sends JSON. Without it the server refuses the request as "missing a valid
120
+ * CSRF token". `method` defaults to `POST`; a safe method or no cookie leaves the headers as they were, exactly as `apiFetch()` does.
121
+ */
122
+ export function withCsrfHeader(headers, method = "POST") {
123
+ const result = new Headers(headers);
124
+ applyCsrfHeader(result, method);
125
+ return result;
126
+ }
127
+ /**
128
+ * `fetch()` against the RapidMX server's API - same-origin unless `configureApiBaseUrl()` has been
129
+ * called, in which case this also switches to `credentials: "include"` so the configured cross-origin
130
+ * call still carries the `jwt` cookie (a plain relative fetch never needs this - `credentials:
131
+ * "same-origin"`, fetch's own default, already attaches it). `path` is the route as declared by
132
+ * `@ApiRoute` (e.g. `/mail/mailboxes`) — the `/api` prefix that decorator always adds is applied here,
133
+ * in one place, rather than repeated at every call site.
134
+ */
135
+ export async function apiFetch(path, init = {}) {
136
+ const headers = new Headers(init.headers);
137
+ headers.set("Content-Type", "application/json");
138
+ applyCsrfHeader(headers, init.method);
139
+ const credentials = apiBaseUrl ? "include" : init.credentials;
140
+ const res = await fetch(apiUrl(path), { ...init, headers, credentials });
141
+ return decodeApiResponse(res, (error) => unauthorizedObserver?.(error));
142
+ }
143
+ /**
144
+ * `fetch()` against auth-server's API — a *different* origin than this app, unlike `apiFetch()` above. Used
145
+ * only for the handful of actions that must be issued by auth-server itself (e.g. admin impersonation, which
146
+ * needs to mint a token with the target user's real roles/scopes the way auth-server's own sign-in does —
147
+ * see `.claude/NOTES.md`).
148
+ *
149
+ * Requires `credentials: "include"` so the browser both attaches this app's own `jwt` cookie to the request
150
+ * and accepts whatever `Set-Cookie` auth-server's response carries back. This only actually works when
151
+ * auth-server and this app are deployed under a shared parent cookie domain (e.g. `Domain=.example.com`) —
152
+ * a deployment-level requirement owned by auth-server/the Helm chart, not configured here — and auth-server's
153
+ * CORS config must explicitly allow this app's origin with credentials.
154
+ *
155
+ * `applyCsrfHeader()` is still called here for consistency, but it never actually finds a token for a truly
156
+ * cross-origin call — see its own doc comment on `readCsrfCookie()` for why that's correct rather than a
157
+ * gap: auth-server's CSRF protection for this call shape comes from its own Origin allow-list check, not a
158
+ * double-submit cookie this app's JavaScript could never read in the first place.
159
+ */
160
+ export async function authApiFetch(authServerUrl, path, init = {}) {
161
+ const headers = new Headers(init.headers);
162
+ headers.set("Content-Type", "application/json");
163
+ applyCsrfHeader(headers, init.method);
164
+ const res = await fetch(`${authServerUrl}/api${path}`, { ...init, headers, credentials: "include" });
165
+ return decodeApiResponse(res);
166
+ }
167
+ let unauthorizedObserver;
168
+ /**
169
+ * Registers the one function that hears about every `401` this server's API (`apiFetch()`, not auth-server's) answers - the
170
+ * signed-in session has ended or expired. It only observes: the request still rejects with the same `ApiRequestError`, so
171
+ * a caller's own handling is unchanged. The app frame uses it to say "Your session expired" once, whichever request noticed
172
+ * first (a background refresh included). Pass `undefined` to remove it. A throwing observer never affects the request.
173
+ */
174
+ export function setApiUnauthorizedObserver(observer) {
175
+ unauthorizedObserver = observer;
176
+ }
177
+ /**
178
+ * `onUnauthorized`, when given, is invoked (never awaited) for a `401` response only - `apiFetch()` passes one
179
+ * that forwards to whatever `setApiUnauthorizedObserver()` last registered; `authApiFetch()` and a plain
180
+ * `createApiClient()`-made client's `fetch()` (which forwards to that instance's own
181
+ * `setUnauthorizedObserver()`) pass their own. A throwing `onUnauthorized` never changes what the caller sees.
182
+ */
183
+ async function decodeApiResponse(res, onUnauthorized) {
184
+ const contentType = res.headers.get("content-type") ?? "";
185
+ const body = contentType.includes("application/json") ? await res.json().catch(() => undefined) : undefined;
186
+ if (!res.ok) {
187
+ const message = (body && (body.message || body.error)) || res.statusText || "Request failed.";
188
+ const error = new ApiRequestError(message, res.status, body?.code, body);
189
+ if (res.status === 401 && onUnauthorized) {
190
+ try {
191
+ onUnauthorized(error);
192
+ }
193
+ catch {
194
+ // An observer's failure must not change what the caller sees.
195
+ }
196
+ }
197
+ throw error;
198
+ }
199
+ return body;
200
+ }
201
+ /**
202
+ * Builds an explicit-context `ApiClient`: everything `apiFetch()` does, but always against `baseUrl` (never
203
+ * the `configureApiBaseUrl()` global) and always authenticated with a bearer token from `getAccessToken()`
204
+ * (never the `jwt` cookie / `credentials: "include"`). ADDITIVE to the existing global-config mode -
205
+ * `apiFetch()`/`authApiFetch()`/`configureApiBaseUrl()` are untouched and keep working exactly as before for
206
+ * every existing caller; this is for a consumer (the Tauri multi-account client) that needs several fully
207
+ * independent origin/session contexts open at once, which the single module-level `apiBaseUrl` global can't
208
+ * represent.
209
+ *
210
+ * Distinct instances never share state: each closes over its own `baseUrl`, `getAccessToken` and unauthorized
211
+ * observer, so two accounts' clients never cross-talk even when both are live in the same process.
212
+ *
213
+ * **401 handling is per-instance, not global.** The existing `setApiUnauthorizedObserver()` is one process-wide
214
+ * "you're signed out" signal, correct for a single-session app (one browser tab, one Electron window - there is
215
+ * only ever one session to lose). A multi-account app has no single account whose 401 means "the app" is
216
+ * unauthorized, so an `ApiClient` from `createApiClient()` does NOT invoke the global observer at all; instead
217
+ * each instance has its own `setUnauthorizedObserver()` a caller can register per account (e.g. to mark that
218
+ * one account's tab as needing re-authentication without touching the others).
219
+ */
220
+ export function createApiClient(options) {
221
+ const baseUrl = options.baseUrl.replace(/\/$/, "");
222
+ const { getAccessToken } = options;
223
+ let unauthorizedObserver;
224
+ async function clientFetch(path, init = {}) {
225
+ const headers = new Headers(init.headers);
226
+ headers.set("Content-Type", "application/json");
227
+ const token = await getAccessToken();
228
+ headers.set("Authorization", `jwt ${token}`);
229
+ const res = await fetch(`${baseUrl}/api${path}`, { ...init, headers });
230
+ return decodeApiResponse(res, (error) => unauthorizedObserver?.(error));
231
+ }
232
+ return {
233
+ fetch: clientFetch,
234
+ setUnauthorizedObserver(observer) {
235
+ unauthorizedObserver = observer;
236
+ },
237
+ };
238
+ }
239
+ /**
240
+ * Routes a request to `client.fetch()` when `client` is given, else to the default global `apiFetch()` - the
241
+ * one call every REST client module (`mailApi.ts` etc.) uses to add optional explicit-`ApiClient` support to
242
+ * each of its exported functions with minimal churn: give the function a trailing `client?: ApiClient`
243
+ * parameter (so every existing call site, which never passes one, is unaffected - `undefined` here means
244
+ * exactly what calling `apiFetch()` directly always meant), and swap its `apiFetch(...)` call for
245
+ * `withClient(client, ...)`. A function that calls another exported function of the same module internally
246
+ * (e.g. `mailApi.ts`'s `grantMailboxAccess()` calling `getMailboxAcl()`) threads its own `client` through
247
+ * that call too, so a whole call chain stays pinned to one account.
248
+ */
249
+ export function withClient(client, path, init) {
250
+ return client ? client.fetch(path, init) : apiFetch(path, init);
251
+ }
@@ -0,0 +1,7 @@
1
+ import { ApiClient } from "./api.js";
2
+ /** The active account's `ApiClient`, or `undefined` when nothing above the caller provided one — see this
3
+ * file's own doc comment. */
4
+ export declare const ApiClientContext: import("react").Context<ApiClient | undefined>;
5
+ /** The nearest `ApiClientContext.Provider`'s value, or `undefined` when there is none — the same `client`
6
+ * every converted REST function's own optional trailing parameter accepts. */
7
+ export declare function useApiClient(): ApiClient | undefined;
@@ -0,0 +1,32 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * Lets a deeply-nested component reach "the active account's `ApiClient`" without prop-drilling it through
7
+ * every layer in between — the missing piece `createApiClient()` (see `api.ts`) left open: that function
8
+ * gives a host app (e.g. the native, multi-account `tauri-client`) a way to *build* a per-account client, but
9
+ * nothing let a component *read* one back out short of threading it through every prop list by hand.
10
+ *
11
+ * Same shape as `overlays/overlayStack.ts`'s `OverlayDepthContext` — a bare `createContext()` plus a `useX()`
12
+ * reader, no dedicated `<Provider>` wrapper component, so a host app wraps its tree in `ApiClientContext.Provider`
13
+ * directly (e.g. `<ApiClientContext.Provider value={client}>{children}</ApiClientContext.Provider>`) exactly the
14
+ * way `Modal.tsx`/`Drawer.tsx` already do for `OverlayDepthContext`.
15
+ *
16
+ * The default value is `undefined`, meaning "no override" — every existing consumer (the SSR web/admin apps,
17
+ * the Electron client) renders with no `ApiClientContext.Provider` anywhere above it, so `useApiClient()` there
18
+ * always returns `undefined`, which is exactly what every converted REST function's own `client?: ApiClient`
19
+ * parameter already treats as "use the default global cookie-based `apiFetch()` path" (see `withClient()`'s doc
20
+ * comment in `api.ts`). A component under a `tauri-client`-style provider instead gets that account's own
21
+ * `ApiClient` back, and can pass it straight through as the trailing `client` argument of any converted
22
+ * function with no adapter needed: `const client = useApiClient(); await listMessages(params, client);`.
23
+ */
24
+ import { createContext, useContext } from "react";
25
+ /** The active account's `ApiClient`, or `undefined` when nothing above the caller provided one — see this
26
+ * file's own doc comment. */
27
+ export const ApiClientContext = createContext(undefined);
28
+ /** The nearest `ApiClientContext.Provider`'s value, or `undefined` when there is none — the same `client`
29
+ * every converted REST function's own optional trailing parameter accepts. */
30
+ export function useApiClient() {
31
+ return useContext(ApiClientContext);
32
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The pagination query-string convention shared by every `*Api.ts` wrapper (`mailApi.ts`,
3
+ * `contactsApi.ts`, `tasksApi.ts`, `calendarApi.ts`) — split out of `mailApi.ts` once more than one of
4
+ * them needed it, rather than each reimplementing it or importing it from `mailApi.ts` for no reason
5
+ * other than it happening to live there first.
6
+ */
7
+ export interface ListParams {
8
+ page?: number;
9
+ limit?: number;
10
+ }
11
+ /**
12
+ * Builds a `limit`/`page` query string, plus any extra scope/filter params (e.g. `folderUid`,
13
+ * or one of `@rapidmx/restapi`'s generic query-operator values like `startDate=lte(...)`).
14
+ */
15
+ export declare function buildQuery(params: ListParams, extra?: Record<string, string>): string;
16
+ /**
17
+ * Optional paging/scope params for the async-request list endpoints (`listExportRequests()`,
18
+ * `listImportRequests()`, `listErasureRequests()`, `listMatterExportRequests()`,
19
+ * `listAccessRequests()`). Server contract: newest first, `limit` capped at 500, `page` zero-based,
20
+ * `matterId` honored only by the Matter-scoped (escrow) endpoints.
21
+ */
22
+ export interface RequestListParams extends ListParams {
23
+ /** Restricts the list to one Matter - only meaningful for Matter-scoped request lists. */
24
+ matterId?: string;
25
+ }
26
+ /**
27
+ * Builds a `?limit=&page=&matterId=` suffix from only the params actually supplied - unlike
28
+ * `buildQuery()`, applies no default page size (these endpoints historically returned every request
29
+ * with no params at all, so a caller passing nothing keeps that exact request). Returns `""` when no
30
+ * param is set.
31
+ */
32
+ export declare function buildRequestListQuery(params?: RequestListParams): string;
@@ -0,0 +1,42 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * The pagination query-string convention shared by every `*Api.ts` wrapper (`mailApi.ts`,
7
+ * `contactsApi.ts`, `tasksApi.ts`, `calendarApi.ts`) — split out of `mailApi.ts` once more than one of
8
+ * them needed it, rather than each reimplementing it or importing it from `mailApi.ts` for no reason
9
+ * other than it happening to live there first.
10
+ */
11
+ const DEFAULT_PAGE_SIZE = 25;
12
+ /**
13
+ * Builds a `limit`/`page` query string, plus any extra scope/filter params (e.g. `folderUid`,
14
+ * or one of `@rapidmx/restapi`'s generic query-operator values like `startDate=lte(...)`).
15
+ */
16
+ export function buildQuery(params, extra = {}) {
17
+ const parts = [`limit=${params.limit ?? DEFAULT_PAGE_SIZE}`, `page=${params.page ?? 0}`];
18
+ for (const [key, value] of Object.entries(extra)) {
19
+ parts.push(`${key}=${encodeURIComponent(value)}`);
20
+ }
21
+ return parts.join("&");
22
+ }
23
+ /**
24
+ * Builds a `?limit=&page=&matterId=` suffix from only the params actually supplied - unlike
25
+ * `buildQuery()`, applies no default page size (these endpoints historically returned every request
26
+ * with no params at all, so a caller passing nothing keeps that exact request). Returns `""` when no
27
+ * param is set.
28
+ */
29
+ export function buildRequestListQuery(params = {}) {
30
+ const query = new URLSearchParams();
31
+ if (params.limit !== undefined) {
32
+ query.set("limit", String(params.limit));
33
+ }
34
+ if (params.page !== undefined) {
35
+ query.set("page", String(params.page));
36
+ }
37
+ if (params.matterId) {
38
+ query.set("matterId", params.matterId);
39
+ }
40
+ const encoded = query.toString();
41
+ return encoded ? `?${encoded}` : "";
42
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copies `text` to the system clipboard and reports whether it worked - never rejects, so a caller can
3
+ * simply show "Copied" or "Couldn't copy". Tries `navigator.clipboard.writeText()` first and, when that is
4
+ * unavailable or rejects, the hidden-textarea `execCommand("copy")` fallback. Must run from a user gesture
5
+ * (a click handler) for either route to be allowed.
6
+ */
7
+ export declare function copyTextToClipboard(text: string): Promise<boolean>;
@@ -0,0 +1,56 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /**
6
+ * The legacy copy path: selects `text` in an off-screen, read-only `<textarea>` and runs
7
+ * `document.execCommand("copy")`. Used where the async Clipboard API is missing (an insecure `http:` origin,
8
+ * an older browser) or refuses (permission denied, the document isn't focused). Puts focus back where it was,
9
+ * since selecting the textarea moves it. `false` when there is no DOM or the browser declines the command.
10
+ */
11
+ function copyWithExecCommand(text) {
12
+ if (typeof document === "undefined") {
13
+ return false;
14
+ }
15
+ const previouslyFocused = document.activeElement;
16
+ const textarea = document.createElement("textarea");
17
+ textarea.value = text;
18
+ textarea.setAttribute("readonly", "");
19
+ textarea.setAttribute("aria-hidden", "true");
20
+ textarea.style.cssText = "position:fixed;top:0;left:0;width:1px;height:1px;padding:0;border:0;opacity:0;pointer-events:none";
21
+ document.body.appendChild(textarea);
22
+ let copied = false;
23
+ try {
24
+ textarea.select();
25
+ textarea.setSelectionRange(0, text.length);
26
+ copied = typeof document.execCommand === "function" && document.execCommand("copy");
27
+ }
28
+ catch {
29
+ copied = false;
30
+ }
31
+ finally {
32
+ textarea.remove();
33
+ if (previouslyFocused instanceof HTMLElement) {
34
+ previouslyFocused.focus();
35
+ }
36
+ }
37
+ return copied;
38
+ }
39
+ /**
40
+ * Copies `text` to the system clipboard and reports whether it worked - never rejects, so a caller can
41
+ * simply show "Copied" or "Couldn't copy". Tries `navigator.clipboard.writeText()` first and, when that is
42
+ * unavailable or rejects, the hidden-textarea `execCommand("copy")` fallback. Must run from a user gesture
43
+ * (a click handler) for either route to be allowed.
44
+ */
45
+ export async function copyTextToClipboard(text) {
46
+ try {
47
+ if (typeof navigator !== "undefined" && typeof navigator.clipboard?.writeText === "function") {
48
+ await navigator.clipboard.writeText(text);
49
+ return true;
50
+ }
51
+ }
52
+ catch {
53
+ // Denied or unavailable right now - the legacy path below may still succeed.
54
+ }
55
+ return copyWithExecCommand(text);
56
+ }
@@ -0,0 +1,6 @@
1
+ /** Shared by every form with a `<input type="datetime-local">` bound to a server-side ISO instant
2
+ * (originally `EventModal.tsx`'s own private helper, split out once the Settings Auto-Reply page needed
3
+ * the identical conversion — same "extract once a second consumer needs it" precedent as `apiQuery.ts`). */
4
+ /** `<input type="datetime-local">` reads/writes local time with no timezone suffix — `new Date(str)`
5
+ * parses that as the browser's own local time, matching what the picker visually showed the user. */
6
+ export declare function toDatetimeLocal(iso: string): string;
@@ -0,0 +1,14 @@
1
+ ///////////////////////////////////////////////////////////////////////////////
2
+ // Copyright (C) 2026 Jean-Philippe Steinmetz
3
+ // SPDX-License-Identifier: MPL-2.0
4
+ ///////////////////////////////////////////////////////////////////////////////
5
+ /** Shared by every form with a `<input type="datetime-local">` bound to a server-side ISO instant
6
+ * (originally `EventModal.tsx`'s own private helper, split out once the Settings Auto-Reply page needed
7
+ * the identical conversion — same "extract once a second consumer needs it" precedent as `apiQuery.ts`). */
8
+ /** `<input type="datetime-local">` reads/writes local time with no timezone suffix — `new Date(str)`
9
+ * parses that as the browser's own local time, matching what the picker visually showed the user. */
10
+ export function toDatetimeLocal(iso) {
11
+ const d = new Date(iso);
12
+ const local = new Date(d.getTime() - d.getTimezoneOffset() * 60000);
13
+ return local.toISOString().slice(0, 16);
14
+ }
@@ -0,0 +1,12 @@
1
+ /** The time zone a mailbox has when nothing better is known - the server's own default. */
2
+ export declare const DEFAULT_TIME_ZONE = "UTC";
3
+ /**
4
+ * The IANA time zone of the device this is running on (`"America/Los_Angeles"`), as the browser reports it, or `"UTC"` where it
5
+ * can't say (server-side rendering, an old engine). What a new mailbox, and a settings form with nothing chosen yet, start with.
6
+ */
7
+ export declare function deviceTimeZone(): string;
8
+ /**
9
+ * Every time zone the browser can name, for a picker: `Intl.supportedValuesOf("timeZone")` where there is one (it leaves out `UTC`,
10
+ * which is added), else just `extra` - the zones the caller already holds, such as a mailbox's current one.
11
+ */
12
+ export declare function timeZoneOptions(...extra: string[]): string[];