@rapidmx/web-client 0.21.0 → 0.23.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 +28 -24
- 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 +5 -3
- 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 +25 -10
- package/apps/shared/components/mail/ConversationThreadPane.tsx +33 -17
- 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 +69 -48
- 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 +10 -14
- package/apps/shared/components/mail/invite/InviteRsvpPopover.tsx +11 -9
- 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/conversationPrint.ts +76 -0
- package/apps/shared/components/mail/reading/messageExport.ts +1 -1
- package/apps/shared/components/mail/reading/printMessage.ts +46 -9
- 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/keyboard/keymap.ts +1 -0
- package/apps/shared/mail/decryptedMessages.ts +116 -0
- 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 +68 -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.d.ts +4 -4
- package/dist/apps/shared/components/admin/setup/SetupWizard.js +27 -23
- 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 +2 -2
- 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 +23 -8
- package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +3 -3
- package/dist/apps/shared/components/mail/ConversationThreadPane.js +19 -13
- 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 +61 -46
- 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 +3 -3
- package/dist/apps/shared/components/mail/invite/InviteRowChip.js +7 -9
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.d.ts +2 -2
- package/dist/apps/shared/components/mail/invite/InviteRsvpPopover.js +11 -9
- 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/conversationPrint.d.ts +15 -0
- package/dist/apps/shared/components/mail/reading/conversationPrint.js +69 -0
- package/dist/apps/shared/components/mail/reading/messageExport.js +1 -1
- package/dist/apps/shared/components/mail/reading/printMessage.d.ts +9 -3
- package/dist/apps/shared/components/mail/reading/printMessage.js +33 -6
- 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/keyboard/keymap.d.ts +6 -0
- package/dist/apps/shared/keyboard/keymap.js +1 -0
- package/dist/apps/shared/mail/decryptedMessages.d.ts +27 -0
- package/dist/apps/shared/mail/decryptedMessages.js +97 -0
- 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 +64 -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
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import { ApiRequestError } from "
|
|
6
|
-
import { assembleDraft, assembleDraftRaw, getMailbox, getMessage, queueMessageSend, sendMessage, setMessageRequestReceipt, } from "
|
|
7
|
-
import { describeSendFailure } from "
|
|
8
|
-
import { resolveRecipientEncryption } from "
|
|
9
|
-
import { getUnlockedKeys } from "
|
|
10
|
-
import { findActivePublicKey, getEncryptionPolicy, lookupKeys } from "
|
|
11
|
-
import { fromBase64 } from "
|
|
5
|
+
import { ApiRequestError } from "../../../../lib/util/api.js";
|
|
6
|
+
import { assembleDraft, assembleDraftRaw, getMailbox, getMessage, queueMessageSend, sendMessage, setMessageRequestReceipt, } from "../../../../lib/mail/mailApi.js";
|
|
7
|
+
import { describeSendFailure } from "../../../../lib/mail/sendFailure.js";
|
|
8
|
+
import { resolveRecipientEncryption } from "../../../../lib/crypto/composeSecurity.js";
|
|
9
|
+
import { getUnlockedKeys } from "../../../../lib/crypto/keySession.js";
|
|
10
|
+
import { findActivePublicKey, getEncryptionPolicy, lookupKeys } from "../../../../lib/crypto/keyvaultApi.js";
|
|
11
|
+
import { fromBase64 } from "../../../../lib/crypto/encoding.js";
|
|
12
12
|
import { policyCanAutoEncrypt } from "../../components/mail/compose/encryptionRequirement.js";
|
|
13
13
|
import { dismiss, notify } from "../../notifications/store.js";
|
|
14
14
|
import { INLINE_IMAGE_PATTERN, decideSend } from "./sendDecision.js";
|
|
@@ -79,16 +79,16 @@ export function sendDecisionInput(request, mailbox, policy, recipients, lookupsC
|
|
|
79
79
|
}
|
|
80
80
|
const OPEN_POLICY = { encryptSameOrg: "optional", encryptFederated: "optional", encryptExternal: "optional" };
|
|
81
81
|
/** The mailbox and policy this send is missing, loaded now: the sender is not waiting, so a slow answer costs nothing - but it is not waited on for ever. */
|
|
82
|
-
async function completeContext(request) {
|
|
82
|
+
async function completeContext(request, client) {
|
|
83
83
|
let mailbox = request.mailbox;
|
|
84
84
|
let policy = request.policy;
|
|
85
85
|
const keysNow = readSendKeys(request.mailboxUid, request.signEnabled, mailbox);
|
|
86
86
|
const loads = [];
|
|
87
87
|
if (!mailbox) {
|
|
88
|
-
loads.push(getMailbox(request.mailboxUid).then((loaded) => void (mailbox = loaded)));
|
|
88
|
+
loads.push(getMailbox(request.mailboxUid, undefined, client).then((loaded) => void (mailbox = loaded)));
|
|
89
89
|
}
|
|
90
90
|
if (!policy && (!mailbox || senderHasEncryptionKey({ mailbox, offeredEncrypt: request.offeredEncrypt }, keysNow.canEncryptSelf))) {
|
|
91
|
-
loads.push(getEncryptionPolicy().then((loaded) => void (policy = loaded)));
|
|
91
|
+
loads.push(getEncryptionPolicy(client).then((loaded) => void (policy = loaded)));
|
|
92
92
|
}
|
|
93
93
|
if (loads.length > 0) {
|
|
94
94
|
let timer;
|
|
@@ -101,10 +101,10 @@ async function completeContext(request) {
|
|
|
101
101
|
return { mailbox, policy };
|
|
102
102
|
}
|
|
103
103
|
/** Builds the message's final content into the draft (plain, signed, or signed and encrypted in this browser) and returns the stored message. */
|
|
104
|
-
async function assemble(request, mailbox, mode, statuses, withSignature) {
|
|
104
|
+
async function assemble(request, mailbox, mode, statuses, withSignature, client) {
|
|
105
105
|
const { draft, to, cc, bcc, subject, html } = request;
|
|
106
106
|
if (mode === "plain") {
|
|
107
|
-
return assembleDraft(draft.uid, { to, cc, bcc, subject, html });
|
|
107
|
+
return assembleDraft(draft.uid, { to, cc, bcc, subject, html }, client);
|
|
108
108
|
}
|
|
109
109
|
const keys = readSendKeys(request.mailboxUid, request.signEnabled, mailbox);
|
|
110
110
|
const own = mailbox;
|
|
@@ -122,31 +122,32 @@ async function assemble(request, mailbox, mode, statuses, withSignature) {
|
|
|
122
122
|
const signing = withSignature ? { certDer: keys.unlocked.signingCertDer, privateKey: keys.unlocked.signingPrivateKey } : undefined;
|
|
123
123
|
// The S/MIME code (PKI.js and the ASN.1/X.509 libraries, over half a megabyte) is only needed here, to sign or encrypt - a plain message
|
|
124
124
|
// never loads it, and it is kept out of the compose window's own chunk.
|
|
125
|
-
const { applyBaselineOuterHeaders, assembleOutboundMime, buildEncryptedMessage, buildSignedOnlyMessage } = await import("
|
|
125
|
+
const { applyBaselineOuterHeaders, assembleOutboundMime, buildEncryptedMessage, buildSignedOnlyMessage } = await import("../../../../lib/crypto/smimeMessage.js");
|
|
126
126
|
const encrypt = mode === "encrypt";
|
|
127
127
|
const outerHeaders = encrypt ? applyBaselineOuterHeaders(protectedHeaders) : protectedHeaders;
|
|
128
128
|
const mimePart = encrypt
|
|
129
129
|
? await buildEncryptedMessage(bodyContentType, html, protectedHeaders, outerHeaders, [keys.unlocked.encryptionCertDer, ...statuses.map((status) => fromBase64(status.encryptCert.publicKey))], signing)
|
|
130
130
|
: await buildSignedOnlyMessage(bodyContentType, html, protectedHeaders, signing.certDer, signing.privateKey);
|
|
131
131
|
const rawMime = assembleOutboundMime(outerHeaders, mimePart);
|
|
132
|
-
return assembleDraftRaw(draft.uid, { to, cc, bcc, subject: outerHeaders.subject, rawMime });
|
|
132
|
+
return assembleDraftRaw(draft.uid, { to, cc, bcc, subject: outerHeaders.subject, rawMime }, client);
|
|
133
133
|
}
|
|
134
134
|
function failureOf(err, fallback) {
|
|
135
135
|
const failure = describeSendFailure(err, fallback);
|
|
136
136
|
return { message: failure.message, details: failure.lines };
|
|
137
137
|
}
|
|
138
138
|
/** Whether the server already holds `request`'s message as accepted (out of Drafts, or leased) - the answer to "did that request that never returned actually land?". */
|
|
139
|
-
async function alreadyAccepted(request) {
|
|
139
|
+
async function alreadyAccepted(request, client) {
|
|
140
140
|
try {
|
|
141
|
-
const fresh = await getMessage(request.draft.uid);
|
|
141
|
+
const fresh = await getMessage(request.draft.uid, client);
|
|
142
142
|
return fresh.folderUid !== request.draft.folderUid || !!fresh.scheduledSendLeaseExpiresAt || !!fresh.scheduledSendRelayedAt;
|
|
143
143
|
}
|
|
144
144
|
catch {
|
|
145
145
|
return false;
|
|
146
146
|
}
|
|
147
147
|
}
|
|
148
|
-
/** The whole client-side path of one send: settle, decide, assemble, hand over. Never rejects.
|
|
149
|
-
|
|
148
|
+
/** The whole client-side path of one send: settle, decide, assemble, hand over. Never rejects. `client` is the explicit `ApiClient` (from
|
|
149
|
+
* `useApiClient()`) the window that built `request` was rendered under, `undefined` for the default global cookie-based session. */
|
|
150
|
+
async function attempt(request, client) {
|
|
150
151
|
try {
|
|
151
152
|
await request.saved?.catch(() => undefined);
|
|
152
153
|
const all = [...request.to, ...request.cc, ...request.bcc];
|
|
@@ -155,14 +156,14 @@ async function attempt(request) {
|
|
|
155
156
|
let statuses = all.map(() => undefined);
|
|
156
157
|
let lookupsComplete = false;
|
|
157
158
|
if (!request.forcePlaintext) {
|
|
158
|
-
({ mailbox, policy } = await completeContext(request));
|
|
159
|
+
({ mailbox, policy } = await completeContext(request, client));
|
|
159
160
|
const keys = readSendKeys(request.mailboxUid, request.signEnabled, mailbox);
|
|
160
161
|
const hasKey = senderHasEncryptionKey({ mailbox, offeredEncrypt: request.offeredEncrypt }, keys.canEncryptSelf);
|
|
161
162
|
// Recipients' keys are only looked up when the answer can matter: encryption was asked for, or the loaded policy auto-applies.
|
|
162
163
|
if (mailbox && hasKey && (request.encryptRequested || (policy && policyCanAutoEncrypt(policy)))) {
|
|
163
164
|
const own = mailbox;
|
|
164
165
|
const ownPrefersMutual = own.encryptPreference?.preferEncrypt === "mutual";
|
|
165
|
-
const lookups = await Promise.all(all.map((recipient) => lookupKeys(request.mailboxUid, recipient.address).then((lookup) => ({ lookup }), () => null)));
|
|
166
|
+
const lookups = await Promise.all(all.map((recipient) => lookupKeys(request.mailboxUid, recipient.address, client).then((lookup) => ({ lookup }), () => null)));
|
|
166
167
|
statuses = all.map((recipient, index) => {
|
|
167
168
|
const found = lookups[index];
|
|
168
169
|
return found ? resolveRecipientEncryption(own.primarySmtpAddress, ownPrefersMutual, policy ?? OPEN_POLICY, recipient.address, found.lookup) : undefined;
|
|
@@ -177,20 +178,20 @@ async function attempt(request) {
|
|
|
177
178
|
if (decision.action === "rejected") {
|
|
178
179
|
return { kind: "failed", failure: { message: decision.message, details: [] } };
|
|
179
180
|
}
|
|
180
|
-
const assembled = await assemble(request, mailbox, decision.action, statuses, decision.action === "sign" || (decision.action === "encrypt" && decision.sign));
|
|
181
|
-
const withReceipt = request.requestReceipt ? await setMessageRequestReceipt(assembled, true) : assembled;
|
|
181
|
+
const assembled = await assemble(request, mailbox, decision.action, statuses, decision.action === "sign" || (decision.action === "encrypt" && decision.sign), client);
|
|
182
|
+
const withReceipt = request.requestReceipt ? await setMessageRequestReceipt(assembled, true, client) : assembled;
|
|
182
183
|
setPendingStage(request.draft.uid, "queuing");
|
|
183
184
|
try {
|
|
184
185
|
if (request.scheduledSendTime) {
|
|
185
|
-
await sendMessage(withReceipt.uid, { scheduledSendTime: request.scheduledSendTime });
|
|
186
|
+
await sendMessage(withReceipt.uid, { scheduledSendTime: request.scheduledSendTime }, client);
|
|
186
187
|
return { kind: "scheduled" };
|
|
187
188
|
}
|
|
188
|
-
const result = await queueMessageSend(withReceipt.uid);
|
|
189
|
+
const result = await queueMessageSend(withReceipt.uid, client);
|
|
189
190
|
return { kind: result.queued ? "queued" : "sent" };
|
|
190
191
|
}
|
|
191
192
|
catch (err) {
|
|
192
193
|
// A request that never came back may still have landed: never offer to send it twice if it did.
|
|
193
|
-
if (!(err instanceof ApiRequestError) && (await alreadyAccepted(request))) {
|
|
194
|
+
if (!(err instanceof ApiRequestError) && (await alreadyAccepted(request, client))) {
|
|
194
195
|
return { kind: request.scheduledSendTime ? "scheduled" : "queued" };
|
|
195
196
|
}
|
|
196
197
|
throw err;
|
|
@@ -236,7 +237,7 @@ function failureNotificationId(draftUid) {
|
|
|
236
237
|
return `send-failed:${draftUid}`;
|
|
237
238
|
}
|
|
238
239
|
/** The sticky "This message wasn't sent" pop-up for a send that failed on this side, with what can be done about it. */
|
|
239
|
-
function notifyFailure(request, failure) {
|
|
240
|
+
function notifyFailure(request, failure, client) {
|
|
240
241
|
const uid = request.draft.uid;
|
|
241
242
|
const actions = [];
|
|
242
243
|
const { block } = failure;
|
|
@@ -244,15 +245,15 @@ function notifyFailure(request, failure) {
|
|
|
244
245
|
actions.push({
|
|
245
246
|
label: "Unlock",
|
|
246
247
|
onClick: () => {
|
|
247
|
-
void requestUnlockFromOutside(request.mailboxUid, request.mailbox.keys).then(() => void retrySend(request), () => undefined);
|
|
248
|
+
void requestUnlockFromOutside(request.mailboxUid, request.mailbox.keys).then(() => void retrySend(request, client), () => undefined);
|
|
248
249
|
},
|
|
249
250
|
});
|
|
250
251
|
}
|
|
251
252
|
if (block) {
|
|
252
|
-
actions.push({ label: block.overrideLabel, onClick: () => void retrySend({ ...request, forcePlaintext: true }) });
|
|
253
|
+
actions.push({ label: block.overrideLabel, onClick: () => void retrySend({ ...request, forcePlaintext: true }, client) });
|
|
253
254
|
}
|
|
254
255
|
else {
|
|
255
|
-
actions.push({ label: "Retry", onClick: () => void retrySend(request) });
|
|
256
|
+
actions.push({ label: "Retry", onClick: () => void retrySend(request, client) });
|
|
256
257
|
}
|
|
257
258
|
actions.push({ label: "Open draft", onClick: () => void openDraftFromRequest(request) });
|
|
258
259
|
notify({
|
|
@@ -279,8 +280,11 @@ export function notifySent(message = "Message sent") {
|
|
|
279
280
|
* under way here. The outcome is shown as pop-ups and the Outbox indicator, never as a window that waits: a failure at any stage (assembling,
|
|
280
281
|
* encrypting, the request) is a sticky "This message wasn't sent" with the reason, and Retry / Open draft; the server's own later outcome
|
|
281
282
|
* (`send-succeeded`, `send-failed`, `send-retrying`) is `handleSendEvent()`'s.
|
|
283
|
+
*
|
|
284
|
+
* `client` is the explicit `ApiClient` (from `useApiClient()`) the compose window that built `request` was rendered under - `undefined` (the
|
|
285
|
+
* default) for every existing caller, which keeps using the default global cookie-based session exactly as before.
|
|
282
286
|
*/
|
|
283
|
-
export function startSend(request) {
|
|
287
|
+
export function startSend(request, client) {
|
|
284
288
|
const uid = request.draft.uid;
|
|
285
289
|
const recipients = [...request.to, ...request.cc, ...request.bcc].map((recipient) => recipient.address);
|
|
286
290
|
if (!beginPendingSend({ draftUid: uid, mailboxUid: request.mailboxUid, subject: request.subject, recipients, scheduled: !!request.scheduledSendTime })) {
|
|
@@ -291,11 +295,11 @@ export function startSend(request) {
|
|
|
291
295
|
// A reply or forward is on screen in its conversation from this moment, before any of the work below.
|
|
292
296
|
trackOutgoing(request);
|
|
293
297
|
const tracker = sendState.countTracker?.(request.mailboxUid);
|
|
294
|
-
void attempt(request).then((outcome) => {
|
|
298
|
+
void attempt(request, client).then((outcome) => {
|
|
295
299
|
finishPendingSend(uid);
|
|
296
300
|
if (outcome.kind === "failed") {
|
|
297
301
|
tracker?.revert();
|
|
298
|
-
notifyFailure(request, outcome.failure);
|
|
302
|
+
notifyFailure(request, outcome.failure, client);
|
|
299
303
|
return;
|
|
300
304
|
}
|
|
301
305
|
tracker?.settle();
|
|
@@ -321,12 +325,12 @@ export function startSend(request) {
|
|
|
321
325
|
return true;
|
|
322
326
|
}
|
|
323
327
|
/** Tries a failed send again - unless the server already has the message (an earlier request that seemed to fail did land), which it must not send twice. */
|
|
324
|
-
export async function retrySend(request) {
|
|
325
|
-
if (await alreadyAccepted(request)) {
|
|
328
|
+
export async function retrySend(request, client) {
|
|
329
|
+
if (await alreadyAccepted(request, client)) {
|
|
326
330
|
dismiss(failureNotificationId(request.draft.uid));
|
|
327
331
|
markOutgoingSending(request.draft.uid);
|
|
328
332
|
notify({ id: `already-sent:${request.draft.uid}`, kind: "info", title: "This message is already on its way", timeoutMs: 5000 });
|
|
329
333
|
return;
|
|
330
334
|
}
|
|
331
|
-
startSend({ ...request, saved: undefined });
|
|
335
|
+
startSend({ ...request, saved: undefined }, client);
|
|
332
336
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
-
import { SendEvent } from "
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { SendEvent } from "../../../../lib/mail/sendEvents.js";
|
|
2
|
+
import type { ApiClient } from "../../../../lib/util/api.js";
|
|
3
|
+
/** Shows what a send event means to the user. `client` is the explicit `ApiClient` (from `useApiClient()`) whichever code observed this push
|
|
4
|
+
* event was rendered under - `undefined` (the default) for every existing caller, which keeps using the default global cookie-based session
|
|
5
|
+
* exactly as before. */
|
|
6
|
+
export declare function handleSendEvent(event: SendEvent, client?: ApiClient): void;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import { cancelScheduledSend, getMessage, listAttachments, listFolders, queueMessageSend } from "
|
|
6
|
-
import { describeSendEventError } from "
|
|
5
|
+
import { cancelScheduledSend, getMessage, listAttachments, listFolders, queueMessageSend } from "../../../../lib/mail/mailApi.js";
|
|
6
|
+
import { describeSendEventError } from "../../../../lib/mail/sendEvents.js";
|
|
7
7
|
import { formatRecipient } from "../../components/mail/compose/recipients.js";
|
|
8
8
|
import { loadOriginalMessage } from "../../components/mail/compose/quotedBody.js";
|
|
9
9
|
import { notifyApiError } from "../../notifications/apiErrors.js";
|
|
@@ -25,21 +25,21 @@ function summary(recipients) {
|
|
|
25
25
|
return recipients.length <= 2 ? recipients.join(" and ") : `${recipients[0]} and ${recipients.length - 1} others`;
|
|
26
26
|
}
|
|
27
27
|
/** Moves a message the server failed to relay back into Drafts (the only place it can be edited or sent again), and returns it as it is there. */
|
|
28
|
-
async function moveBackToDrafts(uid, mailboxUid) {
|
|
29
|
-
const message = await getMessage(uid);
|
|
30
|
-
const drafts = (await listFolders(mailboxUid)).find((folder) => folder.type === "drafts");
|
|
28
|
+
async function moveBackToDrafts(uid, mailboxUid, client) {
|
|
29
|
+
const message = await getMessage(uid, client);
|
|
30
|
+
const drafts = (await listFolders(mailboxUid, client)).find((folder) => folder.type === "drafts");
|
|
31
31
|
if (!drafts || message.folderUid === drafts.uid) {
|
|
32
32
|
return message;
|
|
33
33
|
}
|
|
34
|
-
return cancelScheduledSend(message, drafts.uid);
|
|
34
|
+
return cancelScheduledSend(message, drafts.uid, client);
|
|
35
35
|
}
|
|
36
36
|
function escapeHtml(text) {
|
|
37
37
|
return text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
38
38
|
}
|
|
39
39
|
/** "Open draft" for a message the server failed to relay: back into Drafts, and into a compose window with what was written. */
|
|
40
|
-
async function openFailedDraft(event) {
|
|
40
|
+
async function openFailedDraft(event, client) {
|
|
41
41
|
try {
|
|
42
|
-
const moved = await moveBackToDrafts(event.uid, event.mailboxUid ?? "");
|
|
42
|
+
const moved = await moveBackToDrafts(event.uid, event.mailboxUid ?? "", client);
|
|
43
43
|
// Back in Drafts it is no longer a message on its way in its conversation.
|
|
44
44
|
forgetOutgoing(event.uid);
|
|
45
45
|
const request = retainedRequest(event.uid);
|
|
@@ -57,8 +57,10 @@ async function openFailedDraft(event) {
|
|
|
57
57
|
});
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
|
+
// loadOriginalMessage() (quotedBody.ts) does not yet accept an explicit ApiClient itself - out of scope here (that module is not one of
|
|
61
|
+
// this task's files); it still falls back to the default global session even under an ApiClientContext.Provider.
|
|
60
62
|
const original = await loadOriginalMessage(moved, null);
|
|
61
|
-
const attachments = await listAttachments(moved.folderUid, moved.uid).catch(() => []);
|
|
63
|
+
const attachments = await listAttachments(moved.folderUid, moved.uid, client).catch(() => []);
|
|
62
64
|
const byType = (type) => moved.recipients.filter((recipient) => recipient.type === type).map(formatRecipient).join(", ");
|
|
63
65
|
openComposeFromOutside({
|
|
64
66
|
mailboxUid: moved.mailboxUid,
|
|
@@ -82,7 +84,7 @@ async function openFailedDraft(event) {
|
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
/** "Retry" for a message the server failed to relay: the same send call again - a failed message stays in Outbox and the server queues it afresh (with a new retry budget). */
|
|
85
|
-
async function retryFailed(event) {
|
|
87
|
+
async function retryFailed(event, client) {
|
|
86
88
|
if (!beginPendingSend({ draftUid: event.uid, mailboxUid: event.mailboxUid ?? "", subject: event.subject, recipients: event.recipients, scheduled: false })) {
|
|
87
89
|
return;
|
|
88
90
|
}
|
|
@@ -90,7 +92,7 @@ async function retryFailed(event) {
|
|
|
90
92
|
markOutgoingSending(event.uid);
|
|
91
93
|
try {
|
|
92
94
|
setPendingStage(event.uid, "queuing");
|
|
93
|
-
const result = await queueMessageSend(event.uid);
|
|
95
|
+
const result = await queueMessageSend(event.uid, client);
|
|
94
96
|
if (!result.queued) {
|
|
95
97
|
notifySent();
|
|
96
98
|
}
|
|
@@ -102,8 +104,10 @@ async function retryFailed(event) {
|
|
|
102
104
|
finishPendingSend(event.uid);
|
|
103
105
|
}
|
|
104
106
|
}
|
|
105
|
-
/** Shows what a send event means to the user.
|
|
106
|
-
|
|
107
|
+
/** Shows what a send event means to the user. `client` is the explicit `ApiClient` (from `useApiClient()`) whichever code observed this push
|
|
108
|
+
* event was rendered under - `undefined` (the default) for every existing caller, which keeps using the default global cookie-based session
|
|
109
|
+
* exactly as before. */
|
|
110
|
+
export function handleSendEvent(event, client) {
|
|
107
111
|
if (event.action === "send-succeeded") {
|
|
108
112
|
dismiss(retryId(event.uid));
|
|
109
113
|
dismiss(failedId(event.uid));
|
|
@@ -134,8 +138,8 @@ export function handleSendEvent(event) {
|
|
|
134
138
|
}
|
|
135
139
|
dismiss(retryId(event.uid));
|
|
136
140
|
const actions = [
|
|
137
|
-
{ label: "Retry", onClick: () => void retryFailed(event) },
|
|
138
|
-
{ label: "Open draft", onClick: () => void openFailedDraft(event) },
|
|
141
|
+
{ label: "Retry", onClick: () => void retryFailed(event, client) },
|
|
142
|
+
{ label: "Open draft", onClick: () => void openFailedDraft(event, client) },
|
|
139
143
|
];
|
|
140
144
|
notify({
|
|
141
145
|
id: failedId(event.uid),
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
5
|
import { useEffect, useMemo, useState } from "react";
|
|
6
|
-
import { listMessages } from "
|
|
6
|
+
import { listMessages } from "../../../../lib/mail/mailApi.js";
|
|
7
|
+
import { useApiClient } from "../../../../lib/util/apiClientContext.js";
|
|
7
8
|
import { countOfFolder } from "../folderCounts.js";
|
|
8
9
|
import { summarizeOutbox } from "./outboxState.js";
|
|
9
10
|
/** The most Outbox messages read to say what state they are in; beyond this the pill still shows the folder's own total. */
|
|
@@ -14,6 +15,7 @@ export const OUTBOX_STATUS_LIMIT = 50;
|
|
|
14
15
|
* whenever that count or the live updates change, so an empty Outbox - almost always - is free. A failed read keeps what was known.
|
|
15
16
|
*/
|
|
16
17
|
export function useOutboxStatus(mailboxFolders, counts, liveTick, enabled) {
|
|
18
|
+
const client = useApiClient();
|
|
17
19
|
const [statuses, setStatuses] = useState({});
|
|
18
20
|
const outboxes = useMemo(() => mailboxFolders.flatMap((entry) => entry.folders.filter((folder) => folder.type === "outbox")).map((folder) => ({ uid: folder.uid, total: countOfFolder(folder, counts).total })), [mailboxFolders, counts]);
|
|
19
21
|
const key = outboxes.map((outbox) => `${outbox.uid}:${outbox.total}`).join("|");
|
|
@@ -35,7 +37,7 @@ export function useOutboxStatus(mailboxFolders, counts, liveTick, enabled) {
|
|
|
35
37
|
});
|
|
36
38
|
let cancelled = false;
|
|
37
39
|
for (const outbox of occupied) {
|
|
38
|
-
listMessages(outbox.uid, { limit: OUTBOX_STATUS_LIMIT }).then((messages) => {
|
|
40
|
+
listMessages(outbox.uid, { limit: OUTBOX_STATUS_LIMIT }, client).then((messages) => {
|
|
39
41
|
if (!cancelled) {
|
|
40
42
|
setStatuses((previous) => ({ ...previous, [outbox.uid]: summarizeOutbox(messages) }));
|
|
41
43
|
}
|
|
@@ -44,6 +46,6 @@ export function useOutboxStatus(mailboxFolders, counts, liveTick, enabled) {
|
|
|
44
46
|
return () => {
|
|
45
47
|
cancelled = true;
|
|
46
48
|
};
|
|
47
|
-
}, [enabled, key, liveTick]);
|
|
49
|
+
}, [enabled, key, liveTick, client]);
|
|
48
50
|
return statuses;
|
|
49
51
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Message } from "
|
|
1
|
+
import { Message } from "../../../lib/mail/mailApi.js";
|
|
2
|
+
import { ApiClient } from "../../../lib/util/api.js";
|
|
2
3
|
/**
|
|
3
4
|
* Permanent delete: what "Delete" does to a message that is already in Deleted Items (and what "Empty folder" does to Deleted Items and
|
|
4
5
|
* Junk Email). Unlike a move into Deleted Items it cannot be undone, so it is never reached without a confirmation (see
|
|
@@ -38,7 +39,7 @@ export declare function messageCount(count: number): string;
|
|
|
38
39
|
* to delete, a message that is already gone) is recorded against its message and the rest carry on. `deleted` and `failed` keep the order of
|
|
39
40
|
* `messages`.
|
|
40
41
|
*/
|
|
41
|
-
export declare function purgeMessages(messages: Message[]): Promise<PurgeOutcome>;
|
|
42
|
+
export declare function purgeMessages(messages: Message[], client?: ApiClient): Promise<PurgeOutcome>;
|
|
42
43
|
/**
|
|
43
44
|
* Permanently deletes everything in `folderUid`: one request for the whole folder, which is all or nothing. The server refuses it as a whole
|
|
44
45
|
* when a message in it is under a legal hold (`409`) or when the caller may delete messages but not empty a folder (`403`, a delegate) - and
|
|
@@ -48,7 +49,7 @@ export declare function purgeMessages(messages: Message[]): Promise<PurgeOutcome
|
|
|
48
49
|
export declare function purgeFolder(folderUid: string, paging?: {
|
|
49
50
|
pageSize: number;
|
|
50
51
|
maxPages: number;
|
|
51
|
-
}): Promise<EmptyFolderOutcome>;
|
|
52
|
+
}, client?: ApiClient): Promise<EmptyFolderOutcome>;
|
|
52
53
|
/**
|
|
53
54
|
* Tells the reader what a delete of several messages came to: "3 messages permanently deleted" (no Undo - there is none), or "2 deleted, 1
|
|
54
55
|
* could not be deleted" with the server's reasons.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import { emptyFolder, listMessages, purgeMessage } from "
|
|
6
|
-
import { ApiRequestError } from "
|
|
5
|
+
import { emptyFolder, listMessages, purgeMessage } from "../../../lib/mail/mailApi.js";
|
|
6
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
7
7
|
import { displaySubject } from "../components/mail/reading/EncryptedPreview.js";
|
|
8
8
|
import { notifySessionExpired } from "../notifications/apiErrors.js";
|
|
9
9
|
import { notify } from "../notifications/store.js";
|
|
@@ -37,14 +37,14 @@ export function messageCount(count) {
|
|
|
37
37
|
* to delete, a message that is already gone) is recorded against its message and the rest carry on. `deleted` and `failed` keep the order of
|
|
38
38
|
* `messages`.
|
|
39
39
|
*/
|
|
40
|
-
export async function purgeMessages(messages) {
|
|
40
|
+
export async function purgeMessages(messages, client) {
|
|
41
41
|
const failures = new Array(messages.length).fill(null);
|
|
42
42
|
let next = 0;
|
|
43
43
|
async function worker() {
|
|
44
44
|
while (next < messages.length) {
|
|
45
45
|
const index = next++;
|
|
46
46
|
try {
|
|
47
|
-
await purgeMessage(messages[index].uid);
|
|
47
|
+
await purgeMessage(messages[index].uid, client);
|
|
48
48
|
}
|
|
49
49
|
catch (err) {
|
|
50
50
|
failures[index] = { message: messages[index], ...describeFailure(err) };
|
|
@@ -63,9 +63,9 @@ export async function purgeMessages(messages) {
|
|
|
63
63
|
* then this lists the folder and deletes message by message instead, so what may go does and each refusal is reported. Any other failure
|
|
64
64
|
* (the server is down) rejects, and the caller says so.
|
|
65
65
|
*/
|
|
66
|
-
export async function purgeFolder(folderUid, paging = { pageSize: LIST_PAGE_SIZE, maxPages: MAX_LIST_PAGES }) {
|
|
66
|
+
export async function purgeFolder(folderUid, paging = { pageSize: LIST_PAGE_SIZE, maxPages: MAX_LIST_PAGES }, client) {
|
|
67
67
|
try {
|
|
68
|
-
await emptyFolder(folderUid);
|
|
68
|
+
await emptyFolder(folderUid, client);
|
|
69
69
|
return { emptied: true, deleted: [], failed: [] };
|
|
70
70
|
}
|
|
71
71
|
catch (err) {
|
|
@@ -73,8 +73,8 @@ export async function purgeFolder(folderUid, paging = { pageSize: LIST_PAGE_SIZE
|
|
|
73
73
|
throw err;
|
|
74
74
|
}
|
|
75
75
|
}
|
|
76
|
-
const listed = await listAllPages((page) => listMessages(folderUid, { limit: paging.pageSize, page }), paging.pageSize, paging.maxPages);
|
|
77
|
-
const outcome = await purgeMessages(listed.items);
|
|
76
|
+
const listed = await listAllPages((page) => listMessages(folderUid, { limit: paging.pageSize, page }, client), paging.pageSize, paging.maxPages);
|
|
77
|
+
const outcome = await purgeMessages(listed.items, client);
|
|
78
78
|
return { ...outcome, emptied: outcome.failed.length === 0 && !listed.truncated };
|
|
79
79
|
}
|
|
80
80
|
/** The line for one refusal, in the notification's details. */
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* `orderMailboxes()` puts the primary mailbox first, then the caller's other mailboxes, then the shared ones, each group alphabetical.
|
|
15
15
|
*/
|
|
16
|
-
import { type Mailbox } from "
|
|
16
|
+
import { type Mailbox } from "../../../lib/mail/mailApi.js";
|
|
17
17
|
/** Whether `mailbox` is the signed-in user's own. */
|
|
18
18
|
export declare function isOwnMailbox(mailbox: Mailbox, userUid: string | undefined): boolean;
|
|
19
19
|
/** Whether `mailbox` is one the caller only has access to (an ownerless one, or somebody else's shared with them). */
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
*
|
|
18
18
|
* `orderMailboxes()` puts the primary mailbox first, then the caller's other mailboxes, then the shared ones, each group alphabetical.
|
|
19
19
|
*/
|
|
20
|
-
import { isSharedWithMe } from "
|
|
20
|
+
import { isSharedWithMe } from "../../../lib/mail/mailApi.js";
|
|
21
21
|
/** Whether `mailbox` is the signed-in user's own. */
|
|
22
22
|
export function isOwnMailbox(mailbox, userUid) {
|
|
23
23
|
return !!userUid && mailbox.ownerUserUid === userUid;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MessageReportKind, MessageReportResult } from "
|
|
1
|
+
import type { MessageReportKind, MessageReportResult } from "../../../lib/mail/mailApi.js";
|
|
2
2
|
/** Where a notification's "Manage blocked senders" goes: the Blocked and safe senders page of the mailbox. */
|
|
3
3
|
export declare function senderListsHref(mailboxUid: string): string;
|
|
4
4
|
/** The noun of `kind` for a failure's title ("Couldn't report this message as phishing"). */
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { MailFilterRule } from "
|
|
1
|
+
import { MailFilterRule } from "../../../lib/mail/mailFilterRulesApi.js";
|
|
2
|
+
import type { ApiClient } from "../../../lib/util/api.js";
|
|
2
3
|
export declare const BLOCK_RULE_PREFIX = "Block ";
|
|
3
4
|
export declare const NEVER_BLOCK_RULE_PREFIX = "Never block ";
|
|
4
5
|
/** `addresses` trimmed, lowercased and without repeats, keeping only what has an `@`. */
|
|
@@ -19,8 +20,8 @@ export interface NeverBlockResult {
|
|
|
19
20
|
* usually has both) goes to `junkFolderUid` from now on. Idempotent: the rule is made once, and a rule that was turned off is turned on.
|
|
20
21
|
* A "Never block" rule for the same sender is taken away, since the two would fight.
|
|
21
22
|
*/
|
|
22
|
-
export declare function blockSender(mailboxUid: string, addresses: string[], junkFolderUid: string, inboxFolderUid: string): Promise<BlockResult>;
|
|
23
|
+
export declare function blockSender(mailboxUid: string, addresses: string[], junkFolderUid: string, inboxFolderUid: string, client?: ApiClient): Promise<BlockResult>;
|
|
23
24
|
/** Never blocks a sender: takes away the block rule for `addresses` and makes (once) the rule that keeps their mail in the Inbox. */
|
|
24
|
-
export declare function neverBlockSender(mailboxUid: string, addresses: string[], junkFolderUid: string, inboxFolderUid: string): Promise<NeverBlockResult>;
|
|
25
|
+
export declare function neverBlockSender(mailboxUid: string, addresses: string[], junkFolderUid: string, inboxFolderUid: string, client?: ApiClient): Promise<NeverBlockResult>;
|
|
25
26
|
/** Takes back a rule this module made (the notification's Undo). */
|
|
26
|
-
export declare function removeSenderRule(rule: MailFilterRule): Promise<void>;
|
|
27
|
+
export declare function removeSenderRule(rule: MailFilterRule, client?: ApiClient): Promise<void>;
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Copyright (C) 2026 Jean-Philippe Steinmetz
|
|
3
3
|
// SPDX-License-Identifier: MPL-2.0
|
|
4
4
|
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
-
import { createMailFilterRule, deleteMailFilterRule, listMailFilterRules, updateMailFilterRule, } from "
|
|
5
|
+
import { createMailFilterRule, deleteMailFilterRule, listMailFilterRules, updateMailFilterRule, } from "../../../lib/mail/mailFilterRulesApi.js";
|
|
6
6
|
/**
|
|
7
7
|
* "Block sender" and "Never block sender", expressed as the mailbox's own mail filter rules - the server has no blocked-senders list.
|
|
8
8
|
* A rule's "From contains" is a case-insensitive substring match on the From header (restapi's `matchesConditions()`), which is the
|
|
@@ -41,7 +41,7 @@ function firstSequence(rules) {
|
|
|
41
41
|
return Math.min(0, ...rules.map((rule) => rule.sequence)) - 1;
|
|
42
42
|
}
|
|
43
43
|
/** Finds the rule that does `folderUid` for `addresses`, makes one (named `${prefix}${addresses[0]}`) if there is none, and turns a found one on. */
|
|
44
|
-
async function ensureRule(rules, mailboxUid, addresses, folderUid, prefix) {
|
|
44
|
+
async function ensureRule(rules, mailboxUid, addresses, folderUid, prefix, client) {
|
|
45
45
|
const found = rules.find((rule) => isSenderRule(rule, addresses, folderUid));
|
|
46
46
|
if (found) {
|
|
47
47
|
if (found.enabled) {
|
|
@@ -49,7 +49,10 @@ async function ensureRule(rules, mailboxUid, addresses, folderUid, prefix) {
|
|
|
49
49
|
}
|
|
50
50
|
// The whole rule, as the filters page saves one: the update replaces the record.
|
|
51
51
|
const { uid, version, name, sequence, stopProcessingRules, conditions, actions } = found;
|
|
52
|
-
return {
|
|
52
|
+
return {
|
|
53
|
+
outcome: "enabled",
|
|
54
|
+
rule: await updateMailFilterRule({ uid, version, name, enabled: true, sequence, stopProcessingRules, conditions, actions }, client),
|
|
55
|
+
};
|
|
53
56
|
}
|
|
54
57
|
const rule = await createMailFilterRule({
|
|
55
58
|
mailboxUid,
|
|
@@ -58,14 +61,14 @@ async function ensureRule(rules, mailboxUid, addresses, folderUid, prefix) {
|
|
|
58
61
|
stopProcessingRules: true,
|
|
59
62
|
conditions: { fromContains: addresses },
|
|
60
63
|
actions: [{ type: "move_to_folder", folderUid }],
|
|
61
|
-
});
|
|
64
|
+
}, client);
|
|
62
65
|
return { outcome: "created", rule };
|
|
63
66
|
}
|
|
64
67
|
/** Takes away every rule that is `folderUid` for `addresses`. */
|
|
65
|
-
async function removeRules(rules, addresses, folderUid) {
|
|
68
|
+
async function removeRules(rules, addresses, folderUid, client) {
|
|
66
69
|
const doomed = rules.filter((rule) => isSenderRule(rule, addresses, folderUid));
|
|
67
70
|
for (const rule of doomed) {
|
|
68
|
-
await deleteMailFilterRule(rule.uid, rule.version);
|
|
71
|
+
await deleteMailFilterRule(rule.uid, rule.version, client);
|
|
69
72
|
}
|
|
70
73
|
return doomed;
|
|
71
74
|
}
|
|
@@ -74,19 +77,19 @@ async function removeRules(rules, addresses, folderUid) {
|
|
|
74
77
|
* usually has both) goes to `junkFolderUid` from now on. Idempotent: the rule is made once, and a rule that was turned off is turned on.
|
|
75
78
|
* A "Never block" rule for the same sender is taken away, since the two would fight.
|
|
76
79
|
*/
|
|
77
|
-
export async function blockSender(mailboxUid, addresses, junkFolderUid, inboxFolderUid) {
|
|
78
|
-
const rules = await listMailFilterRules(mailboxUid, { limit: RULE_LIMIT });
|
|
79
|
-
await removeRules(rules, addresses, inboxFolderUid);
|
|
80
|
-
return ensureRule(rules, mailboxUid, addresses, junkFolderUid, BLOCK_RULE_PREFIX);
|
|
80
|
+
export async function blockSender(mailboxUid, addresses, junkFolderUid, inboxFolderUid, client) {
|
|
81
|
+
const rules = await listMailFilterRules(mailboxUid, { limit: RULE_LIMIT }, client);
|
|
82
|
+
await removeRules(rules, addresses, inboxFolderUid, client);
|
|
83
|
+
return ensureRule(rules, mailboxUid, addresses, junkFolderUid, BLOCK_RULE_PREFIX, client);
|
|
81
84
|
}
|
|
82
85
|
/** Never blocks a sender: takes away the block rule for `addresses` and makes (once) the rule that keeps their mail in the Inbox. */
|
|
83
|
-
export async function neverBlockSender(mailboxUid, addresses, junkFolderUid, inboxFolderUid) {
|
|
84
|
-
const rules = await listMailFilterRules(mailboxUid, { limit: RULE_LIMIT });
|
|
85
|
-
const removed = await removeRules(rules, addresses, junkFolderUid);
|
|
86
|
-
const kept = await ensureRule(rules.filter((rule) => !removed.includes(rule)), mailboxUid, addresses, inboxFolderUid, NEVER_BLOCK_RULE_PREFIX);
|
|
86
|
+
export async function neverBlockSender(mailboxUid, addresses, junkFolderUid, inboxFolderUid, client) {
|
|
87
|
+
const rules = await listMailFilterRules(mailboxUid, { limit: RULE_LIMIT }, client);
|
|
88
|
+
const removed = await removeRules(rules, addresses, junkFolderUid, client);
|
|
89
|
+
const kept = await ensureRule(rules.filter((rule) => !removed.includes(rule)), mailboxUid, addresses, inboxFolderUid, NEVER_BLOCK_RULE_PREFIX, client);
|
|
87
90
|
return { removed, ...kept };
|
|
88
91
|
}
|
|
89
92
|
/** Takes back a rule this module made (the notification's Undo). */
|
|
90
|
-
export function removeSenderRule(rule) {
|
|
91
|
-
return deleteMailFilterRule(rule.uid, rule.version);
|
|
93
|
+
export function removeSenderRule(rule, client) {
|
|
94
|
+
return deleteMailFilterRule(rule.uid, rule.version, client);
|
|
92
95
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Folder, Mailbox } from "
|
|
1
|
+
import { Folder, Mailbox } from "../../../lib/mail/mailApi.js";
|
|
2
2
|
import { FOLDER_ORDER, MAIL_FOLDER_TYPES } from "./folderTree.js";
|
|
3
3
|
import type { MailboxFolders } from "../components/mail/layout/MailShell.js";
|
|
4
4
|
import { LiveUpdates } from "./useMailLiveUpdates.js";
|