@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.
- package/README.md +48 -14
- package/apps/admin/_layout.tsx +2 -2
- package/apps/admin/audit-log/index.tsx +4 -4
- package/apps/admin/branding/index.tsx +3 -3
- package/apps/admin/data-requests/index.tsx +8 -8
- package/apps/admin/distribution-lists/[uid].tsx +3 -3
- package/apps/admin/distribution-lists/index.tsx +4 -4
- package/apps/admin/distribution-lists/new/index.tsx +5 -5
- package/apps/admin/domains/[uid].tsx +6 -6
- package/apps/admin/domains/index.tsx +4 -4
- package/apps/admin/domains/new/index.tsx +5 -5
- package/apps/admin/encryption-policy/index.tsx +1 -1
- package/apps/admin/escrow-scopes/[uid].tsx +7 -7
- package/apps/admin/escrow-scopes/index.tsx +4 -4
- package/apps/admin/escrow-scopes/new/index.tsx +5 -5
- package/apps/admin/index.tsx +6 -6
- package/apps/admin/ingest-queue/index.tsx +4 -4
- package/apps/admin/mailbox-policy/index.tsx +1 -1
- package/apps/admin/mailboxes/[uid].tsx +5 -5
- package/apps/admin/quarantine/index.tsx +5 -5
- package/apps/admin/retention-policy/index.tsx +3 -3
- package/apps/admin/signing-certificates/index.tsx +5 -5
- package/apps/admin/transport-rules/[uid].tsx +5 -5
- package/apps/admin/transport-rules/_transportRuleConfig.tsx +3 -3
- package/apps/admin/transport-rules/index.tsx +4 -4
- package/apps/admin/transport-rules/new/index.tsx +5 -5
- package/apps/escrow/_layout.tsx +1 -1
- package/apps/escrow/audit-log/index.tsx +4 -4
- package/apps/escrow/index.tsx +4 -4
- package/apps/escrow/matters/[uid].tsx +10 -10
- package/apps/escrow/matters/new/index.tsx +6 -6
- package/apps/shared/appearance/AppearanceForm.tsx +3 -3
- package/apps/shared/appearance/AppearanceHead.tsx +1 -1
- package/apps/shared/appearance/AppearanceProvider.tsx +3 -3
- package/apps/shared/appearance/appearanceCache.ts +1 -1
- package/apps/shared/appearance/appearanceContext.ts +1 -1
- package/apps/shared/appearance/theme.ts +1 -1
- package/apps/shared/auth/adminAccess.ts +1 -1
- package/apps/shared/calendar/bookingPlugin.ts +1 -1
- package/apps/shared/calendar/calendarLiveUpdates.ts +1 -1
- package/apps/shared/calendar/calendarReminders.ts +1 -1
- package/apps/shared/calendar/useCalendarReminders.ts +1 -1
- package/apps/shared/components/admin/diagnostics/DiagnosticsManager.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/InstalledPlugins.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/LogsPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/PackagesTable.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/RuntimePanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/SystemPanel.tsx +2 -2
- package/apps/shared/components/admin/diagnostics/VersionsPanel.tsx +1 -1
- package/apps/shared/components/admin/diagnostics/diagnosticsApi.ts +1 -1
- package/apps/shared/components/admin/diagnostics/format.ts +1 -1
- package/apps/shared/components/admin/diagnostics/logClient.ts +1 -1
- package/apps/shared/components/admin/distributionLists/MemberListCard.tsx +4 -4
- package/apps/shared/components/admin/elevation.ts +1 -1
- package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +3 -3
- package/apps/shared/components/admin/layout/AdminShell.tsx +8 -8
- package/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.tsx +6 -6
- package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +10 -8
- package/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.tsx +4 -4
- package/apps/shared/components/admin/mailboxes/MailboxTable.tsx +1 -1
- package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +19 -14
- package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +5 -5
- package/apps/shared/components/admin/settings/BrandingForm.tsx +5 -5
- package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +5 -5
- package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +4 -4
- package/apps/shared/components/admin/settings/LoadedSettingsForm.tsx +2 -2
- package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +32 -27
- package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +4 -4
- package/apps/shared/components/admin/settings/PluginsManager.tsx +5 -5
- package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +5 -5
- package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +7 -7
- package/apps/shared/components/admin/setup/SetupWizard.tsx +27 -23
- package/apps/shared/components/admin/signOut.ts +1 -1
- package/apps/shared/components/admin/usePagedList.tsx +2 -2
- package/apps/shared/components/calendar/AppointmentQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/CalendarListSidebar.tsx +3 -3
- package/apps/shared/components/calendar/DescriptionEditor.tsx +1 -1
- package/apps/shared/components/calendar/EventDescriptionView.tsx +1 -1
- package/apps/shared/components/calendar/EventDetails.tsx +16 -14
- package/apps/shared/components/calendar/EventEditor.tsx +54 -39
- package/apps/shared/components/calendar/EventExpandedForm.tsx +3 -3
- package/apps/shared/components/calendar/EventFormParts.tsx +2 -2
- package/apps/shared/components/calendar/EventModal.tsx +5 -5
- package/apps/shared/components/calendar/EventQuickForm.tsx +3 -3
- package/apps/shared/components/calendar/EventShell.tsx +1 -1
- package/apps/shared/components/calendar/FindATime.tsx +6 -4
- package/apps/shared/components/calendar/GuestInput.tsx +2 -2
- package/apps/shared/components/calendar/MonthView.tsx +2 -2
- package/apps/shared/components/calendar/QuickCreateFaces.tsx +1 -1
- package/apps/shared/components/calendar/QuickFaceFrame.tsx +1 -1
- package/apps/shared/components/calendar/RecurrenceEditor.tsx +2 -2
- package/apps/shared/components/calendar/RequestChangeForm.tsx +8 -6
- package/apps/shared/components/calendar/ResourcePicker.tsx +7 -5
- package/apps/shared/components/calendar/SplitDayView.tsx +1 -1
- package/apps/shared/components/calendar/TaskQuickForm.tsx +23 -18
- package/apps/shared/components/calendar/TimeGridView.tsx +2 -2
- package/apps/shared/components/calendar/allDay.ts +2 -2
- package/apps/shared/components/calendar/eventDialogFields.ts +3 -3
- package/apps/shared/components/calendar/eventForm.ts +3 -3
- package/apps/shared/components/calendar/eventFormat.ts +3 -3
- package/apps/shared/components/calendar/findTimeGrid.ts +2 -2
- package/apps/shared/components/calendar/layout/CalendarShell.tsx +11 -9
- package/apps/shared/components/contacts/ContactDetailPane.tsx +4 -4
- package/apps/shared/components/contacts/ContactForm.tsx +27 -17
- package/apps/shared/components/contacts/ContactsSidebar.tsx +7 -5
- package/apps/shared/components/contacts/KeyChangeReview.tsx +5 -5
- package/apps/shared/components/contacts/contactKeys.ts +3 -3
- package/apps/shared/components/contacts/layout/ContactsShell.tsx +9 -7
- package/apps/shared/components/escrow/layout/EscrowShell.tsx +6 -6
- package/apps/shared/components/forms/StringListField.tsx +1 -1
- package/apps/shared/components/layout/AppShell.tsx +12 -10
- package/apps/shared/components/layout/BrandingChrome.tsx +1 -1
- package/apps/shared/components/layout/KeyEnrollmentGate.tsx +9 -9
- package/apps/shared/components/layout/MailboxProvisioning.tsx +8 -6
- package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +9 -9
- package/apps/shared/components/layout/ThemeSwitch.tsx +1 -1
- package/apps/shared/components/layout/UnlockPromptProvider.tsx +6 -6
- package/apps/shared/components/layout/UserMenu.tsx +6 -4
- package/apps/shared/components/mail/ConversationList.tsx +7 -5
- package/apps/shared/components/mail/ConversationThreadPane.tsx +26 -15
- package/apps/shared/components/mail/InviteCard.tsx +11 -9
- package/apps/shared/components/mail/LazyReadingPane.tsx +2 -2
- package/apps/shared/components/mail/MailAddress.tsx +1 -1
- package/apps/shared/components/mail/MailListToolbar.tsx +2 -2
- package/apps/shared/components/mail/MailSelectionBar.tsx +2 -2
- package/apps/shared/components/mail/MenuButton.tsx +1 -1
- package/apps/shared/components/mail/MessageDetailPane.tsx +32 -30
- package/apps/shared/components/mail/MoveToFolderDialog.tsx +8 -6
- package/apps/shared/components/mail/OutboxRowStatus.tsx +1 -1
- package/apps/shared/components/mail/PermanentDeleteDialog.tsx +2 -2
- package/apps/shared/components/mail/compose/ComposeContext.tsx +14 -3
- package/apps/shared/components/mail/compose/ComposeWindow.tsx +34 -30
- package/apps/shared/components/mail/compose/ComposeWindowPlaceholder.tsx +4 -4
- package/apps/shared/components/mail/compose/EmojiPicker.tsx +2 -2
- package/apps/shared/components/mail/compose/GifPicker.tsx +3 -3
- package/apps/shared/components/mail/compose/RecipientInput.tsx +1 -1
- package/apps/shared/components/mail/compose/ScheduleSendPicker.tsx +1 -1
- package/apps/shared/components/mail/compose/encryptionRequirement.ts +2 -2
- package/apps/shared/components/mail/compose/quotedBody.ts +5 -5
- package/apps/shared/components/mail/compose/recipients.ts +1 -1
- package/apps/shared/components/mail/invite/InviteRowChip.tsx +2 -2
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +9 -7
- package/apps/shared/components/mail/invite/InviteTimeline.tsx +1 -1
- package/apps/shared/components/mail/invite/ProposeTimeForm.tsx +2 -2
- package/apps/shared/components/mail/invite/inviteFormat.ts +2 -2
- package/apps/shared/components/mail/invite/inviteStore.ts +14 -6
- package/apps/shared/components/mail/labelMenu.tsx +9 -7
- package/apps/shared/components/mail/layout/MailShell.tsx +4 -4
- package/apps/shared/components/mail/listPreferences.ts +2 -2
- package/apps/shared/components/mail/pinnedSigners.ts +45 -19
- package/apps/shared/components/mail/reading/EncryptedBody.tsx +2 -2
- package/apps/shared/components/mail/reading/MessageBody.tsx +6 -6
- package/apps/shared/components/mail/reading/MessageCard.tsx +3 -3
- package/apps/shared/components/mail/reading/MessageSourceDialog.tsx +3 -3
- package/apps/shared/components/mail/reading/PendingMessageCard.tsx +1 -1
- package/apps/shared/components/mail/reading/bodyContent.ts +3 -3
- package/apps/shared/components/mail/reading/bodyHtml.ts +1 -1
- package/apps/shared/components/mail/reading/messageExport.ts +1 -1
- package/apps/shared/components/mail/reading/printMessage.ts +2 -2
- package/apps/shared/components/mail/reading/useMessageActions.ts +28 -21
- package/apps/shared/components/mail/unreadStyle.tsx +1 -1
- package/apps/shared/components/mail/verificationSeals.ts +16 -12
- package/apps/shared/components/mail/writableMailboxes.ts +14 -7
- package/apps/shared/components/rules/RuleBuilder.tsx +1 -1
- package/apps/shared/components/settings/SigningCertificateCard.tsx +4 -4
- package/apps/shared/components/settings/layout/SettingsShell.tsx +8 -6
- package/apps/shared/components/sharing/PrincipalListField.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalPicker.tsx +1 -1
- package/apps/shared/components/sharing/PrincipalResolver.tsx +4 -4
- package/apps/shared/components/tasks/TasksSidebar.tsx +7 -5
- package/apps/shared/components/tasks/layout/TasksShell.tsx +9 -7
- package/apps/shared/keyboard/ShortcutsDialog.tsx +1 -1
- package/apps/shared/mail/findWellKnownFolderUid.ts +6 -4
- package/apps/shared/mail/folderCounts.ts +8 -4
- package/apps/shared/mail/folderOfType.ts +5 -3
- package/apps/shared/mail/folderTree.ts +1 -1
- package/apps/shared/mail/listSnapshots.ts +2 -2
- package/apps/shared/mail/messageReadState.ts +6 -5
- package/apps/shared/mail/newMailNotifications.ts +2 -2
- package/apps/shared/mail/outbox/composeBridge.ts +2 -2
- package/apps/shared/mail/outbox/outboxState.ts +1 -1
- package/apps/shared/mail/outbox/outgoingReplies.ts +2 -2
- package/apps/shared/mail/outbox/sendDecision.ts +2 -2
- package/apps/shared/mail/outbox/sendJob.ts +40 -35
- package/apps/shared/mail/outbox/sendOutcomes.ts +20 -15
- package/apps/shared/mail/outbox/useOutboxStatus.ts +5 -3
- package/apps/shared/mail/permanentDelete.ts +8 -7
- package/apps/shared/mail/primaryMailbox.ts +1 -1
- package/apps/shared/mail/reportNotices.ts +1 -1
- package/apps/shared/mail/senderBlocking.ts +36 -20
- package/apps/shared/mail/useMailConnection.ts +12 -10
- package/apps/shared/mail/useMailLiveUpdates.ts +3 -3
- package/apps/shared/mail/useMailboxUpdateAccess.ts +35 -11
- package/apps/shared/mail/useMarkMessageRead.ts +14 -7
- package/apps/shared/mail/useNewMailNotifications.ts +1 -1
- package/apps/shared/mail/usePermanentDelete.tsx +5 -3
- package/apps/shared/navigation/pageTitle.ts +1 -1
- package/apps/shared/notifications/NotificationCenter.tsx +1 -1
- package/apps/shared/notifications/NotificationHistoryDialog.tsx +2 -2
- package/apps/shared/notifications/apiErrors.ts +2 -2
- package/apps/shared/notifications/pushStatus.ts +1 -1
- package/apps/shared/notifications/systemErrors.ts +1 -1
- package/apps/shared/search/LocalIndexLifecycle.tsx +18 -12
- package/apps/shared/search/crossMailboxSearch.ts +3 -3
- package/apps/shared/search/localIndexBuilder.ts +24 -12
- package/apps/shared/search/localIndexKey.ts +1 -1
- package/apps/shared/search/localIndexRpcClient.ts +150 -30
- package/apps/shared/search/localIndexTransport.ts +84 -0
- package/apps/shared/search/localIndexWorker.ts +1 -1
- package/apps/shared/search/searchTier2.ts +3 -3
- package/apps/shared/signing/enrollmentTracker.ts +3 -3
- package/apps/shared/signing/enrollmentView.ts +1 -1
- package/apps/shared/signing/signingInfo.ts +1 -1
- package/apps/shared/signing/useSigningEnrollmentWatcher.ts +6 -4
- package/apps/shared/styles/app.css +14 -23
- package/apps/www/_layout.tsx +2 -2
- package/apps/www/calendar/index.tsx +20 -18
- package/apps/www/contacts/[uid].tsx +8 -6
- package/apps/www/contacts/index.tsx +19 -17
- package/apps/www/index.tsx +57 -48
- package/apps/www/messages/[uid].tsx +11 -9
- package/apps/www/settings/auto-reply/index.tsx +6 -4
- package/apps/www/settings/blocked-senders/index.tsx +9 -7
- package/apps/www/settings/encryption/index.tsx +38 -32
- package/apps/www/settings/filters/[uid].tsx +19 -14
- package/apps/www/settings/filters/_mailFilterRuleConfig.tsx +2 -2
- package/apps/www/settings/filters/index.tsx +4 -4
- package/apps/www/settings/filters/new/index.tsx +10 -8
- package/apps/www/settings/labels/index.tsx +12 -10
- package/apps/www/settings/privacy/index.tsx +18 -14
- package/apps/www/settings/profile/index.tsx +16 -11
- package/apps/www/settings/read-receipts/index.tsx +17 -12
- package/apps/www/settings/sharing/index.tsx +6 -6
- package/apps/www/settings/signatures/[uid].tsx +5 -5
- package/apps/www/settings/signatures/index.tsx +4 -4
- package/apps/www/settings/signatures/new/index.tsx +4 -4
- package/apps/www/settings/signatures/signatureDefaults.ts +1 -1
- package/apps/www/tasks/index.tsx +28 -23
- package/dist/apps/admin/_layout.d.ts +1 -1
- package/dist/apps/admin/_layout.js +1 -1
- package/dist/apps/admin/audit-log/index.d.ts +1 -1
- package/dist/apps/admin/audit-log/index.js +4 -4
- package/dist/apps/admin/branding/index.js +3 -3
- package/dist/apps/admin/data-requests/index.js +8 -8
- package/dist/apps/admin/distribution-lists/[uid].js +3 -3
- package/dist/apps/admin/distribution-lists/index.js +4 -4
- package/dist/apps/admin/distribution-lists/new/index.js +5 -5
- package/dist/apps/admin/domains/[uid].js +6 -6
- package/dist/apps/admin/domains/index.js +4 -4
- package/dist/apps/admin/domains/new/index.js +5 -5
- package/dist/apps/admin/encryption-policy/index.js +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].d.ts +1 -1
- package/dist/apps/admin/escrow-scopes/[uid].js +7 -7
- package/dist/apps/admin/escrow-scopes/index.js +4 -4
- package/dist/apps/admin/escrow-scopes/new/index.js +5 -5
- package/dist/apps/admin/index.js +6 -6
- package/dist/apps/admin/ingest-queue/index.js +4 -4
- package/dist/apps/admin/mailbox-policy/index.js +1 -1
- package/dist/apps/admin/mailboxes/[uid].js +5 -5
- package/dist/apps/admin/quarantine/index.js +5 -5
- package/dist/apps/admin/retention-policy/index.js +3 -3
- package/dist/apps/admin/signing-certificates/index.js +5 -5
- package/dist/apps/admin/transport-rules/[uid].js +5 -5
- package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +1 -1
- package/dist/apps/admin/transport-rules/_transportRuleConfig.js +2 -2
- package/dist/apps/admin/transport-rules/index.js +4 -4
- package/dist/apps/admin/transport-rules/new/index.js +5 -5
- package/dist/apps/escrow/_layout.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.d.ts +1 -1
- package/dist/apps/escrow/audit-log/index.js +4 -4
- package/dist/apps/escrow/index.js +4 -4
- package/dist/apps/escrow/matters/[uid].js +10 -10
- package/dist/apps/escrow/matters/new/index.js +6 -6
- package/dist/apps/shared/appearance/AppearanceForm.js +3 -3
- package/dist/apps/shared/appearance/AppearanceHead.js +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.d.ts +1 -1
- package/dist/apps/shared/appearance/AppearanceProvider.js +3 -3
- package/dist/apps/shared/appearance/appearanceCache.d.ts +1 -1
- package/dist/apps/shared/appearance/appearanceCache.js +1 -1
- package/dist/apps/shared/appearance/appearanceContext.d.ts +1 -1
- package/dist/apps/shared/appearance/theme.d.ts +1 -1
- package/dist/apps/shared/auth/adminAccess.js +1 -1
- package/dist/apps/shared/calendar/bookingPlugin.js +1 -1
- package/dist/apps/shared/calendar/calendarLiveUpdates.d.ts +1 -1
- package/dist/apps/shared/calendar/calendarReminders.d.ts +1 -1
- package/dist/apps/shared/calendar/useCalendarReminders.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/DiagnosticsManager.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.d.ts +1 -1
- package/dist/apps/shared/components/admin/diagnostics/InstalledPlugins.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/LogsPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/PackagesTable.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/RuntimePanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/SystemPanel.js +2 -2
- package/dist/apps/shared/components/admin/diagnostics/VersionsPanel.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/diagnosticsApi.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/format.js +1 -1
- package/dist/apps/shared/components/admin/diagnostics/logClient.js +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/distributionLists/MemberListCard.js +4 -4
- package/dist/apps/shared/components/admin/elevation.js +1 -1
- package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +3 -3
- package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +1 -1
- package/dist/apps/shared/components/admin/layout/AdminShell.js +7 -7
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EraseLeftoverDataDialog.js +6 -6
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +10 -8
- package/dist/apps/shared/components/admin/mailboxes/LeftoverMailboxesSection.js +4 -4
- package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +1 -1
- package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +7 -5
- package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +5 -5
- package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/BrandingForm.js +5 -5
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +5 -5
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.js +2 -2
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +14 -12
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +4 -4
- package/dist/apps/shared/components/admin/settings/PluginsManager.js +5 -5
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +1 -1
- package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +5 -5
- package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +7 -7
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +26 -22
- package/dist/apps/shared/components/admin/signOut.js +1 -1
- package/dist/apps/shared/components/admin/usePagedList.js +2 -2
- package/dist/apps/shared/components/calendar/AppointmentQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +1 -1
- package/dist/apps/shared/components/calendar/CalendarListSidebar.js +2 -2
- package/dist/apps/shared/components/calendar/DescriptionEditor.js +1 -1
- package/dist/apps/shared/components/calendar/EventDescriptionView.js +1 -1
- package/dist/apps/shared/components/calendar/EventDetails.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventDetails.js +16 -14
- package/dist/apps/shared/components/calendar/EventEditor.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventEditor.js +22 -20
- package/dist/apps/shared/components/calendar/EventExpandedForm.js +2 -2
- package/dist/apps/shared/components/calendar/EventFormParts.d.ts +1 -1
- package/dist/apps/shared/components/calendar/EventFormParts.js +1 -1
- package/dist/apps/shared/components/calendar/EventModal.d.ts +2 -2
- package/dist/apps/shared/components/calendar/EventModal.js +3 -3
- package/dist/apps/shared/components/calendar/EventQuickForm.js +3 -3
- package/dist/apps/shared/components/calendar/EventShell.js +1 -1
- package/dist/apps/shared/components/calendar/FindATime.js +6 -4
- package/dist/apps/shared/components/calendar/GuestInput.d.ts +2 -2
- package/dist/apps/shared/components/calendar/MonthView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/MonthView.js +1 -1
- package/dist/apps/shared/components/calendar/QuickCreateFaces.js +1 -1
- package/dist/apps/shared/components/calendar/QuickFaceFrame.js +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +1 -1
- package/dist/apps/shared/components/calendar/RecurrenceEditor.js +1 -1
- package/dist/apps/shared/components/calendar/RequestChangeForm.js +8 -6
- package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +1 -1
- package/dist/apps/shared/components/calendar/ResourcePicker.js +7 -5
- package/dist/apps/shared/components/calendar/SplitDayView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TaskQuickForm.js +9 -7
- package/dist/apps/shared/components/calendar/TimeGridView.d.ts +1 -1
- package/dist/apps/shared/components/calendar/TimeGridView.js +1 -1
- package/dist/apps/shared/components/calendar/allDay.d.ts +2 -2
- package/dist/apps/shared/components/calendar/allDay.js +1 -1
- package/dist/apps/shared/components/calendar/eventDialogFields.d.ts +2 -2
- package/dist/apps/shared/components/calendar/eventDialogFields.js +2 -2
- package/dist/apps/shared/components/calendar/eventForm.d.ts +3 -3
- package/dist/apps/shared/components/calendar/eventFormat.d.ts +1 -1
- package/dist/apps/shared/components/calendar/eventFormat.js +2 -2
- package/dist/apps/shared/components/calendar/findTimeGrid.d.ts +1 -1
- package/dist/apps/shared/components/calendar/findTimeGrid.js +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +1 -1
- package/dist/apps/shared/components/calendar/layout/CalendarShell.js +11 -9
- package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactDetailPane.js +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.d.ts +2 -2
- package/dist/apps/shared/components/contacts/ContactForm.js +12 -8
- package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +1 -1
- package/dist/apps/shared/components/contacts/ContactsSidebar.js +7 -5
- package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +1 -1
- package/dist/apps/shared/components/contacts/KeyChangeReview.js +5 -5
- package/dist/apps/shared/components/contacts/contactKeys.d.ts +2 -2
- package/dist/apps/shared/components/contacts/contactKeys.js +2 -2
- package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +1 -1
- package/dist/apps/shared/components/contacts/layout/ContactsShell.js +9 -7
- package/dist/apps/shared/components/escrow/layout/EscrowShell.js +6 -6
- package/dist/apps/shared/components/forms/StringListField.js +1 -1
- package/dist/apps/shared/components/layout/AppShell.d.ts +2 -2
- package/dist/apps/shared/components/layout/AppShell.js +11 -9
- package/dist/apps/shared/components/layout/BrandingChrome.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +1 -1
- package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +9 -9
- package/dist/apps/shared/components/layout/MailboxProvisioning.js +8 -6
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +1 -1
- package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +9 -9
- package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +2 -2
- package/dist/apps/shared/components/layout/UnlockPromptProvider.js +5 -5
- package/dist/apps/shared/components/layout/UserMenu.js +6 -4
- package/dist/apps/shared/components/mail/ConversationList.d.ts +2 -2
- package/dist/apps/shared/components/mail/ConversationList.js +6 -4
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +13 -11
- package/dist/apps/shared/components/mail/InviteCard.js +10 -8
- package/dist/apps/shared/components/mail/LazyReadingPane.js +2 -2
- package/dist/apps/shared/components/mail/MailAddress.d.ts +1 -1
- package/dist/apps/shared/components/mail/MailAddress.js +1 -1
- package/dist/apps/shared/components/mail/MailListToolbar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MailSelectionBar.d.ts +2 -2
- package/dist/apps/shared/components/mail/MenuButton.js +1 -1
- package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/MessageDetailPane.js +30 -28
- package/dist/apps/shared/components/mail/MoveToFolderDialog.d.ts +1 -1
- package/dist/apps/shared/components/mail/MoveToFolderDialog.js +8 -6
- package/dist/apps/shared/components/mail/OutboxRowStatus.d.ts +1 -1
- package/dist/apps/shared/components/mail/PermanentDeleteDialog.js +2 -2
- package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +10 -1
- package/dist/apps/shared/components/mail/compose/ComposeContext.js +4 -2
- package/dist/apps/shared/components/mail/compose/ComposeWindow.js +34 -30
- package/dist/apps/shared/components/mail/compose/ComposeWindowPlaceholder.js +4 -4
- package/dist/apps/shared/components/mail/compose/EmojiPicker.js +2 -2
- package/dist/apps/shared/components/mail/compose/GifPicker.js +3 -3
- package/dist/apps/shared/components/mail/compose/RecipientInput.d.ts +1 -1
- package/dist/apps/shared/components/mail/compose/RecipientInput.js +1 -1
- package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.js +1 -1
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.d.ts +2 -2
- package/dist/apps/shared/components/mail/compose/encryptionRequirement.js +1 -1
- package/dist/apps/shared/components/mail/compose/quotedBody.d.ts +3 -3
- package/dist/apps/shared/components/mail/compose/quotedBody.js +3 -3
- package/dist/apps/shared/components/mail/compose/recipients.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRowChip.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +9 -7
- package/dist/apps/shared/components/mail/invite/InviteTimeline.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.d.ts +1 -1
- package/dist/apps/shared/components/mail/invite/ProposeTimeForm.js +1 -1
- package/dist/apps/shared/components/mail/invite/inviteFormat.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/inviteStore.d.ts +9 -3
- package/dist/apps/shared/components/mail/invite/inviteStore.js +13 -6
- package/dist/apps/shared/components/mail/labelMenu.d.ts +1 -1
- package/dist/apps/shared/components/mail/labelMenu.js +9 -7
- package/dist/apps/shared/components/mail/layout/MailShell.d.ts +1 -1
- package/dist/apps/shared/components/mail/layout/MailShell.js +3 -3
- package/dist/apps/shared/components/mail/listPreferences.d.ts +2 -2
- package/dist/apps/shared/components/mail/listPreferences.js +1 -1
- package/dist/apps/shared/components/mail/pinnedSigners.d.ts +12 -5
- package/dist/apps/shared/components/mail/pinnedSigners.js +37 -18
- package/dist/apps/shared/components/mail/reading/EncryptedBody.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/MessageBody.js +4 -4
- package/dist/apps/shared/components/mail/reading/MessageCard.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/MessageCard.js +2 -2
- package/dist/apps/shared/components/mail/reading/MessageSourceDialog.js +3 -3
- package/dist/apps/shared/components/mail/reading/PendingMessageCard.js +1 -1
- package/dist/apps/shared/components/mail/reading/bodyContent.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/bodyContent.js +2 -2
- package/dist/apps/shared/components/mail/reading/bodyHtml.js +1 -1
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +2 -2
- package/dist/apps/shared/components/mail/reading/useMessageActions.d.ts +1 -1
- package/dist/apps/shared/components/mail/reading/useMessageActions.js +18 -16
- package/dist/apps/shared/components/mail/unreadStyle.d.ts +1 -1
- package/dist/apps/shared/components/mail/verificationSeals.d.ts +27 -6
- package/dist/apps/shared/components/mail/verificationSeals.js +15 -11
- package/dist/apps/shared/components/mail/writableMailboxes.d.ts +8 -3
- package/dist/apps/shared/components/mail/writableMailboxes.js +12 -6
- package/dist/apps/shared/components/rules/RuleBuilder.js +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.d.ts +1 -1
- package/dist/apps/shared/components/settings/SigningCertificateCard.js +3 -3
- package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +1 -1
- package/dist/apps/shared/components/settings/layout/SettingsShell.js +8 -6
- package/dist/apps/shared/components/sharing/PrincipalListField.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalPicker.js +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.d.ts +1 -1
- package/dist/apps/shared/components/sharing/PrincipalResolver.js +3 -3
- package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +1 -1
- package/dist/apps/shared/components/tasks/TasksSidebar.js +7 -5
- package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +1 -1
- package/dist/apps/shared/components/tasks/layout/TasksShell.js +9 -7
- package/dist/apps/shared/keyboard/ShortcutsDialog.js +1 -1
- package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -3
- package/dist/apps/shared/mail/findWellKnownFolderUid.js +5 -4
- package/dist/apps/shared/mail/folderCounts.d.ts +1 -1
- package/dist/apps/shared/mail/folderCounts.js +6 -4
- package/dist/apps/shared/mail/folderOfType.d.ts +3 -2
- package/dist/apps/shared/mail/folderOfType.js +4 -4
- package/dist/apps/shared/mail/folderTree.d.ts +1 -1
- package/dist/apps/shared/mail/listSnapshots.d.ts +2 -2
- package/dist/apps/shared/mail/messageReadState.d.ts +4 -3
- package/dist/apps/shared/mail/messageReadState.js +5 -5
- package/dist/apps/shared/mail/newMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/newMailNotifications.js +1 -1
- package/dist/apps/shared/mail/outbox/composeBridge.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/outboxState.d.ts +1 -1
- package/dist/apps/shared/mail/outbox/outgoingReplies.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.d.ts +2 -2
- package/dist/apps/shared/mail/outbox/sendDecision.js +1 -1
- package/dist/apps/shared/mail/outbox/sendJob.d.ts +10 -6
- package/dist/apps/shared/mail/outbox/sendJob.js +39 -35
- package/dist/apps/shared/mail/outbox/sendOutcomes.d.ts +6 -3
- package/dist/apps/shared/mail/outbox/sendOutcomes.js +19 -15
- package/dist/apps/shared/mail/outbox/useOutboxStatus.js +5 -3
- package/dist/apps/shared/mail/permanentDelete.d.ts +4 -3
- package/dist/apps/shared/mail/permanentDelete.js +8 -8
- package/dist/apps/shared/mail/primaryMailbox.d.ts +1 -1
- package/dist/apps/shared/mail/primaryMailbox.js +1 -1
- package/dist/apps/shared/mail/reportNotices.d.ts +1 -1
- package/dist/apps/shared/mail/senderBlocking.d.ts +5 -4
- package/dist/apps/shared/mail/senderBlocking.js +19 -16
- package/dist/apps/shared/mail/useMailConnection.d.ts +1 -1
- package/dist/apps/shared/mail/useMailConnection.js +12 -10
- package/dist/apps/shared/mail/useMailLiveUpdates.d.ts +2 -2
- package/dist/apps/shared/mail/useMailLiveUpdates.js +2 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.d.ts +3 -2
- package/dist/apps/shared/mail/useMailboxUpdateAccess.js +31 -10
- package/dist/apps/shared/mail/useMarkMessageRead.d.ts +1 -1
- package/dist/apps/shared/mail/useMarkMessageRead.js +5 -3
- package/dist/apps/shared/mail/useNewMailNotifications.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.d.ts +1 -1
- package/dist/apps/shared/mail/usePermanentDelete.js +4 -2
- package/dist/apps/shared/navigation/pageTitle.d.ts +1 -1
- package/dist/apps/shared/notifications/NotificationCenter.js +1 -1
- package/dist/apps/shared/notifications/NotificationHistoryDialog.js +2 -2
- package/dist/apps/shared/notifications/apiErrors.js +2 -2
- package/dist/apps/shared/notifications/pushStatus.js +1 -1
- package/dist/apps/shared/notifications/systemErrors.js +1 -1
- package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +2 -2
- package/dist/apps/shared/search/LocalIndexLifecycle.js +15 -10
- package/dist/apps/shared/search/crossMailboxSearch.d.ts +1 -1
- package/dist/apps/shared/search/crossMailboxSearch.js +2 -2
- package/dist/apps/shared/search/localIndexBuilder.d.ts +4 -3
- package/dist/apps/shared/search/localIndexBuilder.js +15 -12
- package/dist/apps/shared/search/localIndexKey.js +1 -1
- package/dist/apps/shared/search/localIndexRpcClient.d.ts +43 -31
- package/dist/apps/shared/search/localIndexRpcClient.js +113 -20
- package/dist/apps/shared/search/localIndexTransport.d.ts +77 -0
- package/dist/apps/shared/search/localIndexTransport.js +1 -0
- package/dist/apps/shared/search/localIndexWorker.d.ts +1 -1
- package/dist/apps/shared/search/searchTier2.d.ts +3 -3
- package/dist/apps/shared/signing/enrollmentTracker.d.ts +1 -1
- package/dist/apps/shared/signing/enrollmentTracker.js +3 -3
- package/dist/apps/shared/signing/enrollmentView.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.d.ts +1 -1
- package/dist/apps/shared/signing/signingInfo.js +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.d.ts +1 -1
- package/dist/apps/shared/signing/useSigningEnrollmentWatcher.js +5 -3
- package/dist/apps/shared/styles/app.css +14 -23
- package/dist/apps/www/_layout.d.ts +1 -1
- package/dist/apps/www/_layout.js +1 -1
- package/dist/apps/www/calendar/index.d.ts +1 -1
- package/dist/apps/www/calendar/index.js +20 -18
- package/dist/apps/www/contacts/[uid].d.ts +1 -1
- package/dist/apps/www/contacts/[uid].js +8 -6
- package/dist/apps/www/contacts/index.d.ts +1 -1
- package/dist/apps/www/contacts/index.js +19 -17
- package/dist/apps/www/index.d.ts +1 -1
- package/dist/apps/www/index.js +54 -50
- package/dist/apps/www/messages/[uid].d.ts +1 -1
- package/dist/apps/www/messages/[uid].js +11 -9
- package/dist/apps/www/settings/appearance/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.d.ts +1 -1
- package/dist/apps/www/settings/auto-reply/index.js +6 -4
- package/dist/apps/www/settings/blocked-senders/index.d.ts +1 -1
- package/dist/apps/www/settings/blocked-senders/index.js +6 -4
- package/dist/apps/www/settings/encryption/index.d.ts +1 -1
- package/dist/apps/www/settings/encryption/index.js +31 -29
- package/dist/apps/www/settings/filters/[uid].d.ts +1 -1
- package/dist/apps/www/settings/filters/[uid].js +11 -9
- package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +2 -2
- package/dist/apps/www/settings/filters/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/index.js +4 -4
- package/dist/apps/www/settings/filters/new/index.d.ts +1 -1
- package/dist/apps/www/settings/filters/new/index.js +10 -8
- package/dist/apps/www/settings/labels/index.d.ts +1 -1
- package/dist/apps/www/settings/labels/index.js +12 -10
- package/dist/apps/www/settings/privacy/index.d.ts +1 -1
- package/dist/apps/www/settings/privacy/index.js +18 -14
- package/dist/apps/www/settings/profile/index.d.ts +1 -1
- package/dist/apps/www/settings/profile/index.js +7 -5
- package/dist/apps/www/settings/read-receipts/index.d.ts +1 -1
- package/dist/apps/www/settings/read-receipts/index.js +5 -3
- package/dist/apps/www/settings/sharing/index.d.ts +1 -1
- package/dist/apps/www/settings/sharing/index.js +6 -6
- package/dist/apps/www/settings/signatures/[uid].d.ts +1 -1
- package/dist/apps/www/settings/signatures/[uid].js +5 -5
- package/dist/apps/www/settings/signatures/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/index.js +4 -4
- package/dist/apps/www/settings/signatures/new/index.d.ts +1 -1
- package/dist/apps/www/settings/signatures/new/index.js +4 -4
- package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +1 -1
- package/dist/apps/www/settings/signatures/signatureDefaults.js +1 -1
- package/dist/apps/www/tasks/index.d.ts +1 -1
- package/dist/apps/www/tasks/index.js +17 -15
- package/dist/lib/admin/auditLogApi.d.ts +32 -0
- package/dist/lib/admin/auditLogApi.js +27 -0
- package/dist/lib/admin/distributionListsApi.d.ts +47 -0
- package/dist/lib/admin/distributionListsApi.js +34 -0
- package/dist/lib/admin/domainsApi.d.ts +75 -0
- package/dist/lib/admin/domainsApi.js +44 -0
- package/dist/lib/admin/escrowAccessRequestsApi.d.ts +79 -0
- package/dist/lib/admin/escrowAccessRequestsApi.js +46 -0
- package/dist/lib/admin/escrowAuditLogApi.d.ts +66 -0
- package/dist/lib/admin/escrowAuditLogApi.js +31 -0
- package/dist/lib/admin/escrowScopesApi.d.ts +78 -0
- package/dist/lib/admin/escrowScopesApi.js +50 -0
- package/dist/lib/admin/leftoverMailboxApi.d.ts +73 -0
- package/dist/lib/admin/leftoverMailboxApi.js +67 -0
- package/dist/lib/admin/mailboxPolicyApi.d.ts +27 -0
- package/dist/lib/admin/mailboxPolicyApi.js +21 -0
- package/dist/lib/admin/matterExportApi.d.ts +40 -0
- package/dist/lib/admin/matterExportApi.js +39 -0
- package/dist/lib/admin/matterSearchApi.d.ts +20 -0
- package/dist/lib/admin/matterSearchApi.js +27 -0
- package/dist/lib/admin/mattersApi.d.ts +56 -0
- package/dist/lib/admin/mattersApi.js +40 -0
- package/dist/lib/admin/pluginsApi.d.ts +265 -0
- package/dist/lib/admin/pluginsApi.js +102 -0
- package/dist/lib/admin/retentionPolicyApi.d.ts +32 -0
- package/dist/lib/admin/retentionPolicyApi.js +29 -0
- package/dist/lib/admin/setupApi.d.ts +23 -0
- package/dist/lib/admin/setupApi.js +26 -0
- package/dist/lib/admin/transportRulesApi.d.ts +66 -0
- package/dist/lib/admin/transportRulesApi.js +43 -0
- package/dist/lib/appearance/preferencesApi.d.ts +128 -0
- package/dist/lib/appearance/preferencesApi.js +257 -0
- package/dist/lib/auth/profileApi.d.ts +33 -0
- package/dist/lib/auth/profileApi.js +52 -0
- package/dist/lib/auth/session.d.ts +70 -0
- package/dist/lib/auth/session.js +210 -0
- package/dist/lib/branding/brandingApi.d.ts +47 -0
- package/dist/lib/branding/brandingApi.js +61 -0
- package/dist/lib/branding/useBranding.d.ts +23 -0
- package/dist/lib/branding/useBranding.js +65 -0
- package/dist/lib/calendar/calendarApi.d.ts +230 -0
- package/dist/lib/calendar/calendarApi.js +106 -0
- package/dist/lib/calendar/calendarColors.d.ts +18 -0
- package/dist/lib/calendar/calendarColors.js +39 -0
- package/dist/lib/calendar/calendarDragIds.d.ts +42 -0
- package/dist/lib/calendar/calendarDragIds.js +92 -0
- package/dist/lib/calendar/calendarMutations.d.ts +68 -0
- package/dist/lib/calendar/calendarMutations.js +190 -0
- package/dist/lib/calendar/eventDescription.d.ts +43 -0
- package/dist/lib/calendar/eventDescription.js +195 -0
- package/dist/lib/calendar/freeBusyApi.d.ts +100 -0
- package/dist/lib/calendar/freeBusyApi.js +119 -0
- package/dist/lib/calendar/inviteApi.d.ts +121 -0
- package/dist/lib/calendar/inviteApi.js +54 -0
- package/dist/lib/calendar/recurrence.d.ts +60 -0
- package/dist/lib/calendar/recurrence.js +225 -0
- package/dist/lib/components/avatar/ContactAvatar.d.ts +8 -0
- package/dist/lib/components/avatar/ContactAvatar.js +26 -0
- package/dist/lib/components/buttons/Button.d.ts +9 -0
- package/dist/lib/components/buttons/Button.js +14 -0
- package/dist/lib/components/buttons/CopyButton.d.ts +18 -0
- package/dist/lib/components/buttons/CopyButton.js +14 -0
- package/dist/lib/components/feedback/Alert.d.ts +4 -0
- package/dist/lib/components/feedback/Alert.js +4 -0
- package/dist/lib/components/feedback/Skeleton.d.ts +21 -0
- package/dist/lib/components/feedback/Skeleton.js +14 -0
- package/dist/lib/components/forms/FormField.d.ts +8 -0
- package/dist/lib/components/forms/FormField.js +5 -0
- package/dist/lib/components/navigation/BottomTabBar.d.ts +27 -0
- package/dist/lib/components/navigation/BottomTabBar.js +32 -0
- package/dist/lib/components/overlays/Drawer.d.ts +20 -0
- package/dist/lib/components/overlays/Drawer.js +27 -0
- package/dist/lib/components/overlays/Modal.d.ts +17 -0
- package/dist/lib/components/overlays/Modal.js +25 -0
- package/dist/lib/components/overlays/PopoverPortal.d.ts +23 -0
- package/dist/lib/components/overlays/PopoverPortal.js +53 -0
- package/dist/lib/components/overlays/overlayStack.d.ts +31 -0
- package/dist/lib/components/overlays/overlayStack.js +143 -0
- package/dist/lib/components/pickers/MiniDatePicker.d.ts +13 -0
- package/dist/lib/components/pickers/MiniDatePicker.js +42 -0
- package/dist/lib/contacts/contactsApi.d.ts +174 -0
- package/dist/lib/contacts/contactsApi.js +139 -0
- package/dist/lib/contacts/vcard.d.ts +23 -0
- package/dist/lib/contacts/vcard.js +179 -0
- package/dist/lib/crypto/composeSecurity.d.ts +67 -0
- package/dist/lib/crypto/composeSecurity.js +93 -0
- package/dist/lib/crypto/encoding.d.ts +9 -0
- package/dist/lib/crypto/encoding.js +32 -0
- package/dist/lib/crypto/escrowKeys.d.ts +25 -0
- package/dist/lib/crypto/escrowKeys.js +59 -0
- package/dist/lib/crypto/idleTimeout.d.ts +16 -0
- package/dist/lib/crypto/idleTimeout.js +47 -0
- package/dist/lib/crypto/keySession.d.ts +159 -0
- package/dist/lib/crypto/keySession.js +367 -0
- package/dist/lib/crypto/keys.d.ts +50 -0
- package/dist/lib/crypto/keys.js +89 -0
- package/dist/lib/crypto/keyvaultApi.d.ts +394 -0
- package/dist/lib/crypto/keyvaultApi.js +350 -0
- package/dist/lib/crypto/masterKey.d.ts +59 -0
- package/dist/lib/crypto/masterKey.js +104 -0
- package/dist/lib/crypto/masterKeyWraps.d.ts +108 -0
- package/dist/lib/crypto/masterKeyWraps.js +228 -0
- package/dist/lib/crypto/messageSecurity.d.ts +248 -0
- package/dist/lib/crypto/messageSecurity.js +367 -0
- package/dist/lib/crypto/mime.d.ts +143 -0
- package/dist/lib/crypto/mime.js +504 -0
- package/dist/lib/crypto/passkeyUnlock.d.ts +20 -0
- package/dist/lib/crypto/passkeyUnlock.js +79 -0
- package/dist/lib/crypto/passwordUnlock.d.ts +39 -0
- package/dist/lib/crypto/passwordUnlock.js +73 -0
- package/dist/lib/crypto/recoveryCode.d.ts +28 -0
- package/dist/lib/crypto/recoveryCode.js +86 -0
- package/dist/lib/crypto/signingProviderApi.d.ts +95 -0
- package/dist/lib/crypto/signingProviderApi.js +60 -0
- package/dist/lib/crypto/smime.d.ts +128 -0
- package/dist/lib/crypto/smime.js +402 -0
- package/dist/lib/crypto/smimeMessage.d.ts +132 -0
- package/dist/lib/crypto/smimeMessage.js +341 -0
- package/dist/lib/crypto/useIdleKeyTimeout.d.ts +10 -0
- package/dist/lib/crypto/useIdleKeyTimeout.js +163 -0
- package/dist/lib/crypto/verificationSeal.d.ts +56 -0
- package/dist/lib/crypto/verificationSeal.js +220 -0
- package/dist/lib/mail/compose/composeQuoting.d.ts +88 -0
- package/dist/lib/mail/compose/composeQuoting.js +204 -0
- package/dist/lib/mail/compose/emojiData.d.ts +9 -0
- package/dist/lib/mail/compose/emojiData.js +18 -0
- package/dist/lib/mail/compose/giphyApi.d.ts +17 -0
- package/dist/lib/mail/compose/giphyApi.js +20 -0
- package/dist/lib/mail/conversationsApi.d.ts +80 -0
- package/dist/lib/mail/conversationsApi.js +44 -0
- package/dist/lib/mail/dataExportApi.d.ts +50 -0
- package/dist/lib/mail/dataExportApi.js +40 -0
- package/dist/lib/mail/directoryApi.d.ts +49 -0
- package/dist/lib/mail/directoryApi.js +101 -0
- package/dist/lib/mail/erasureRequestApi.d.ts +45 -0
- package/dist/lib/mail/erasureRequestApi.js +43 -0
- package/dist/lib/mail/flaggedMessages.d.ts +22 -0
- package/dist/lib/mail/flaggedMessages.js +73 -0
- package/dist/lib/mail/focusedInboxOverridesApi.d.ts +37 -0
- package/dist/lib/mail/focusedInboxOverridesApi.js +34 -0
- package/dist/lib/mail/labelsApi.d.ts +47 -0
- package/dist/lib/mail/labelsApi.js +38 -0
- package/dist/lib/mail/mailAddress.d.ts +27 -0
- package/dist/lib/mail/mailAddress.js +54 -0
- package/dist/lib/mail/mailApi.d.ts +850 -0
- package/dist/lib/mail/mailApi.js +602 -0
- package/dist/lib/mail/mailDetailHooks.d.ts +10 -0
- package/dist/lib/mail/mailDetailHooks.js +53 -0
- package/dist/lib/mail/mailFilterRulesApi.d.ts +76 -0
- package/dist/lib/mail/mailFilterRulesApi.js +45 -0
- package/dist/lib/mail/mailSignaturesApi.d.ts +49 -0
- package/dist/lib/mail/mailSignaturesApi.js +42 -0
- package/dist/lib/mail/mailboxAccessApi.d.ts +74 -0
- package/dist/lib/mail/mailboxAccessApi.js +56 -0
- package/dist/lib/mail/mailboxImportApi.d.ts +53 -0
- package/dist/lib/mail/mailboxImportApi.js +51 -0
- package/dist/lib/mail/messageBodySanitizer.d.ts +16 -0
- package/dist/lib/mail/messageBodySanitizer.js +118 -0
- package/dist/lib/mail/pushClient.d.ts +106 -0
- package/dist/lib/mail/pushClient.js +317 -0
- package/dist/lib/mail/sendEvents.d.ts +33 -0
- package/dist/lib/mail/sendEvents.js +44 -0
- package/dist/lib/mail/sendFailure.d.ts +16 -0
- package/dist/lib/mail/sendFailure.js +86 -0
- package/dist/lib/mail/senderListsApi.d.ts +69 -0
- package/dist/lib/mail/senderListsApi.js +126 -0
- package/dist/lib/search/queryGrammar.d.ts +51 -0
- package/dist/lib/search/queryGrammar.js +111 -0
- package/dist/lib/search/searchApi.d.ts +100 -0
- package/dist/lib/search/searchApi.js +107 -0
- package/dist/lib/search/searchScoring.d.ts +34 -0
- package/dist/lib/search/searchScoring.js +44 -0
- package/dist/lib/search/searchTier3.d.ts +64 -0
- package/dist/lib/search/searchTier3.js +335 -0
- package/dist/lib/tasks/tasksApi.d.ts +85 -0
- package/dist/lib/tasks/tasksApi.js +55 -0
- package/dist/lib/util/api.d.ts +160 -0
- package/dist/lib/util/api.js +251 -0
- package/dist/lib/util/apiClientContext.d.ts +7 -0
- package/dist/lib/util/apiClientContext.js +32 -0
- package/dist/lib/util/apiQuery.d.ts +32 -0
- package/dist/lib/util/apiQuery.js +42 -0
- package/dist/lib/util/clipboard.d.ts +7 -0
- package/dist/lib/util/clipboard.js +56 -0
- package/dist/lib/util/dateInput.d.ts +6 -0
- package/dist/lib/util/dateInput.js +14 -0
- package/dist/lib/util/timeZone.d.ts +12 -0
- package/dist/lib/util/timeZone.js +32 -0
- package/dist/lib/util/useCopyToClipboard.d.ts +12 -0
- package/dist/lib/util/useCopyToClipboard.js +34 -0
- package/dist/lib/util/useIsMobile.d.ts +10 -0
- package/dist/lib/util/useIsMobile.js +29 -0
- package/dist/lib/videoconf/videoMeetingsApi.d.ts +116 -0
- package/dist/lib/videoconf/videoMeetingsApi.js +49 -0
- package/lib/admin/auditLogApi.ts +48 -0
- package/lib/admin/distributionListsApi.ts +77 -0
- package/lib/admin/domainsApi.ts +113 -0
- package/lib/admin/escrowAccessRequestsApi.ts +110 -0
- package/lib/admin/escrowAuditLogApi.ts +101 -0
- package/lib/admin/escrowScopesApi.ts +112 -0
- package/lib/admin/leftoverMailboxApi.ts +120 -0
- package/lib/admin/mailboxPolicyApi.ts +38 -0
- package/lib/admin/matterExportApi.ts +62 -0
- package/lib/admin/matterSearchApi.ts +35 -0
- package/lib/admin/mattersApi.ts +86 -0
- package/lib/admin/pluginsApi.ts +339 -0
- package/lib/admin/retentionPolicyApi.ts +46 -0
- package/lib/admin/setupApi.ts +40 -0
- package/lib/admin/transportRulesApi.ts +106 -0
- package/lib/appearance/preferencesApi.ts +335 -0
- package/lib/auth/profileApi.ts +77 -0
- package/lib/auth/session.ts +238 -0
- package/lib/branding/brandingApi.ts +97 -0
- package/lib/branding/useBranding.ts +81 -0
- package/lib/calendar/calendarApi.ts +309 -0
- package/lib/calendar/calendarColors.ts +45 -0
- package/lib/calendar/calendarDragIds.ts +112 -0
- package/lib/calendar/calendarMutations.ts +236 -0
- package/lib/calendar/eventDescription.ts +211 -0
- package/lib/calendar/freeBusyApi.ts +197 -0
- package/lib/calendar/inviteApi.ts +154 -0
- package/lib/calendar/recurrence.ts +285 -0
- package/lib/components/avatar/ContactAvatar.tsx +47 -0
- package/lib/components/buttons/Button.tsx +40 -0
- package/lib/components/buttons/CopyButton.tsx +45 -0
- package/lib/components/feedback/Alert.tsx +13 -0
- package/lib/components/feedback/Skeleton.tsx +38 -0
- package/lib/components/forms/FormField.tsx +23 -0
- package/lib/components/navigation/BottomTabBar.tsx +66 -0
- package/lib/components/overlays/Drawer.tsx +72 -0
- package/lib/components/overlays/Modal.tsx +64 -0
- package/lib/components/overlays/PopoverPortal.tsx +74 -0
- package/lib/components/overlays/overlayStack.ts +165 -0
- package/lib/components/pickers/MiniDatePicker.tsx +90 -0
- package/lib/contacts/contactsApi.ts +289 -0
- package/lib/contacts/vcard.ts +197 -0
- package/lib/crypto/composeSecurity.ts +140 -0
- package/lib/crypto/encoding.ts +36 -0
- package/lib/crypto/escrowKeys.ts +74 -0
- package/lib/crypto/idleTimeout.ts +49 -0
- package/lib/crypto/keySession.ts +483 -0
- package/lib/crypto/keys.ts +105 -0
- package/lib/crypto/keyvaultApi.ts +674 -0
- package/lib/crypto/masterKey.ts +134 -0
- package/lib/crypto/masterKeyWraps.ts +269 -0
- package/lib/crypto/messageSecurity.ts +600 -0
- package/lib/crypto/mime.ts +568 -0
- package/lib/crypto/passkeyUnlock.ts +103 -0
- package/lib/crypto/passwordUnlock.ts +98 -0
- package/lib/crypto/recoveryCode.ts +93 -0
- package/lib/crypto/signingProviderApi.ts +135 -0
- package/lib/crypto/smime.ts +459 -0
- package/lib/crypto/smimeMessage.ts +491 -0
- package/lib/crypto/useIdleKeyTimeout.ts +176 -0
- package/lib/crypto/verificationSeal.ts +288 -0
- package/lib/mail/compose/composeQuoting.ts +243 -0
- package/lib/mail/compose/emojiData.ts +34 -0
- package/lib/mail/compose/giphyApi.ts +31 -0
- package/lib/mail/conversationsApi.ts +123 -0
- package/lib/mail/dataExportApi.ts +73 -0
- package/lib/mail/directoryApi.ts +161 -0
- package/lib/mail/erasureRequestApi.ts +71 -0
- package/lib/mail/flaggedMessages.ts +80 -0
- package/lib/mail/focusedInboxOverridesApi.ts +64 -0
- package/lib/mail/labelsApi.ts +71 -0
- package/lib/mail/mailAddress.ts +76 -0
- package/lib/mail/mailApi.ts +1286 -0
- package/lib/mail/mailDetailHooks.ts +57 -0
- package/lib/mail/mailFilterRulesApi.ts +116 -0
- package/lib/mail/mailSignaturesApi.ts +84 -0
- package/lib/mail/mailboxAccessApi.ts +106 -0
- package/lib/mail/mailboxImportApi.ts +87 -0
- package/lib/mail/messageBodySanitizer.ts +129 -0
- package/lib/mail/pushClient.ts +375 -0
- package/lib/mail/sendEvents.ts +72 -0
- package/lib/mail/sendFailure.ts +98 -0
- package/lib/mail/senderListsApi.ts +161 -0
- package/lib/search/queryGrammar.ts +179 -0
- package/lib/search/searchApi.ts +199 -0
- package/lib/search/searchScoring.ts +46 -0
- package/lib/search/searchTier3.ts +406 -0
- package/lib/tasks/tasksApi.ts +128 -0
- package/lib/util/api.ts +318 -0
- package/lib/util/apiClientContext.ts +35 -0
- package/lib/util/apiQuery.ts +61 -0
- package/lib/util/clipboard.ts +55 -0
- package/lib/util/dateInput.ts +15 -0
- package/lib/util/timeZone.ts +33 -0
- package/lib/util/useCopyToClipboard.ts +48 -0
- package/lib/util/useIsMobile.ts +34 -0
- package/lib/videoconf/videoMeetingsApi.ts +144 -0
- 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[];
|