@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
package/dist/apps/www/index.js
CHANGED
|
@@ -10,17 +10,18 @@ import { prefetchComposeWindow } from "../shared/components/mail/compose/Compose
|
|
|
10
10
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
11
11
|
import { createPortal } from "react-dom";
|
|
12
12
|
import { HiOutlineFlag, HiOutlineLockClosed, HiOutlinePaperClip } from "react-icons/hi2";
|
|
13
|
-
import { ApiRequestError } from "
|
|
14
|
-
import { archiveMessage, bulkUpdateMessages, createFolder, getMessage, getMessageRawContent, listFolders, listMessages, moveMessages, setMessagesFlagged, } from "
|
|
15
|
-
import { listLabels } from "
|
|
16
|
-
import { listConversationMessages, listConversations, } from "
|
|
17
|
-
import { search as searchMailbox } from "
|
|
18
|
-
import {
|
|
13
|
+
import { ApiRequestError } from "../../lib/util/api.js";
|
|
14
|
+
import { archiveMessage, bulkUpdateMessages, createFolder, getMessage, getMessageRawContent, listFolders, listMessages, moveMessages, setMessagesFlagged, } from "../../lib/mail/mailApi.js";
|
|
15
|
+
import { listLabels } from "../../lib/mail/labelsApi.js";
|
|
16
|
+
import { listConversationMessages, listConversations, } from "../../lib/mail/conversationsApi.js";
|
|
17
|
+
import { search as searchMailbox } from "../../lib/search/searchApi.js";
|
|
18
|
+
import { useApiClient } from "../../lib/util/apiClientContext.js";
|
|
19
|
+
import { parseSearchQuery } from "../../lib/search/queryGrammar.js";
|
|
19
20
|
import { searchLocalIndex } from "../shared/search/searchTier2.js";
|
|
20
21
|
import { SEARCH_LIMITS, classifyFailure, describeFailures, hitKey, mergeSearchResults, runLimited, searchPageSize, tagHits, withTimeout, } from "../shared/search/crossMailboxSearch.js";
|
|
21
|
-
import { getUnlockedKeys, subscribeKeySession } from "
|
|
22
|
-
import { useMessageAttachments } from "
|
|
23
|
-
import useIsMobile from "
|
|
22
|
+
import { getUnlockedKeys, subscribeKeySession } from "../../lib/crypto/keySession.js";
|
|
23
|
+
import { useMessageAttachments } from "../../lib/mail/mailDetailHooks.js";
|
|
24
|
+
import useIsMobile from "../../lib/util/useIsMobile.js";
|
|
24
25
|
import MailShell, { useMailShell, } from "../shared/components/mail/layout/MailShell.js";
|
|
25
26
|
import MailAddress from "../shared/components/mail/MailAddress.js";
|
|
26
27
|
import OutboxRowStatus from "../shared/components/mail/OutboxRowStatus.js";
|
|
@@ -31,6 +32,7 @@ import { setReadStateMany } from "../shared/mail/messageReadState.js";
|
|
|
31
32
|
import { useMarkMessageRead } from "../shared/mail/useMarkMessageRead.js";
|
|
32
33
|
import { ROW_FOCUS_CLASS, UnreadBar, UnreadLabel, dateClass, isUnread, rowClass, senderClass, subjectClass } from "../shared/components/mail/unreadStyle.js";
|
|
33
34
|
import { LazyConversationThreadPane, LazyMessageDetailPane, prefetchReadingPane } from "../shared/components/mail/LazyReadingPane.js";
|
|
35
|
+
import { rememberDecrypted } from "../shared/mail/decryptedMessages.js";
|
|
34
36
|
import ConversationList, { conversationRowKey } from "../shared/components/mail/ConversationList.js";
|
|
35
37
|
import SwipeRow from "../shared/components/mail/SwipeRow.js";
|
|
36
38
|
import InviteRowChip from "../shared/components/mail/invite/InviteRowChip.js";
|
|
@@ -43,8 +45,8 @@ import { EMPTIABLE_FOLDER_TYPES } from "../shared/mail/permanentDelete.js";
|
|
|
43
45
|
import { usePermanentDelete } from "../shared/mail/usePermanentDelete.js";
|
|
44
46
|
import { useMailboxUpdateAccess } from "../shared/mail/useMailboxUpdateAccess.js";
|
|
45
47
|
import { CONVERSATION_SORT_NOTE, CONVERSATION_SORT_UNAVAILABLE, MAIL_LIST_CLASSIFICATION_FILTERS, getMailListPreferences, setMailListPreferences, sortConversations, } from "../shared/components/mail/listPreferences.js";
|
|
46
|
-
import Alert from "
|
|
47
|
-
import Skeleton, { SkeletonList } from "
|
|
48
|
+
import Alert from "../../lib/components/feedback/Alert.js";
|
|
49
|
+
import Skeleton, { SkeletonList } from "../../lib/components/feedback/Skeleton.js";
|
|
48
50
|
import { useUnlockPrompt } from "../shared/components/layout/UnlockPromptProvider.js";
|
|
49
51
|
import { SHORTCUTS } from "../shared/keyboard/keymap.js";
|
|
50
52
|
import { isActivatable } from "../shared/keyboard/targets.js";
|
|
@@ -94,12 +96,13 @@ async function decryptEncryptedRows(messages, unlocked) {
|
|
|
94
96
|
const rawMime = await getMessageRawContent(message.uid);
|
|
95
97
|
// Loaded here, on first use: the S/MIME code (PKI.js, ASN.1, X.509) is over half a megabyte and an inbox with
|
|
96
98
|
// no encrypted mail in it never needs it.
|
|
97
|
-
const { evaluateMessageSecurity } = await (securityModule ?? (securityModule = import("
|
|
99
|
+
const { evaluateMessageSecurity } = await (securityModule ?? (securityModule = import("../../lib/crypto/messageSecurity.js")));
|
|
98
100
|
const security = await evaluateMessageSecurity(rawMime, unlocked);
|
|
99
101
|
if (!security.subject && !security.html) {
|
|
100
102
|
return null;
|
|
101
103
|
}
|
|
102
104
|
const preview = security.html ? stripHtmlToText(security.html).slice(0, LIST_PREVIEW_MAX_LENGTH) : undefined;
|
|
105
|
+
rememberDecrypted(message.uid, message.mailboxUid, { subject: security.subject, preview });
|
|
103
106
|
return [message.uid, { subject: security.subject, preview }];
|
|
104
107
|
}
|
|
105
108
|
catch {
|
|
@@ -242,10 +245,10 @@ function mailboxesWithMore(cursor) {
|
|
|
242
245
|
* (deleted after being indexed, or the fetch itself failed) is cached as `null` and dropped - the same
|
|
243
246
|
* "a search hit can briefly outlive the message it points to" tolerance this function's inline
|
|
244
247
|
* predecessor already had. */
|
|
245
|
-
async function resolveHitsToMessages(hits, cache) {
|
|
248
|
+
async function resolveHitsToMessages(hits, cache, client) {
|
|
246
249
|
const toFetch = hits.filter((hit) => !cache.has(hit.entityUid));
|
|
247
250
|
await Promise.all(toFetch.map(async (hit) => {
|
|
248
|
-
const message = await getMessage(hit.entityUid).catch(() => null);
|
|
251
|
+
const message = await getMessage(hit.entityUid, client).catch(() => null);
|
|
249
252
|
cache.set(hit.entityUid, message);
|
|
250
253
|
}));
|
|
251
254
|
const messages = [];
|
|
@@ -334,7 +337,7 @@ function mergeInboxMessages(perMailbox) {
|
|
|
334
337
|
* composite-cursor "load more" per mailbox is a natural v2 if usage shows people scrolling past the first
|
|
335
338
|
* page in aggregate view often.
|
|
336
339
|
*/
|
|
337
|
-
async function fetchAggregateMessages(mailboxFolders, type, filter) {
|
|
340
|
+
async function fetchAggregateMessages(mailboxFolders, type, filter, client) {
|
|
338
341
|
const perMailbox = await Promise.all(mailboxFolders.map(async ({ mailbox, folders }) => {
|
|
339
342
|
const folder = folders.find((f) => f.type === type);
|
|
340
343
|
if (!folder) {
|
|
@@ -344,7 +347,7 @@ async function fetchAggregateMessages(mailboxFolders, type, filter) {
|
|
|
344
347
|
// this function's own pagination scope trim) - each mailbox contributes its own newest page and
|
|
345
348
|
// they're merged newest-first, which a different sort key couldn't be made honest across an
|
|
346
349
|
// arbitrary number of independently-paged folders.
|
|
347
|
-
const messages = await listMessages(folder.uid, { limit: MESSAGE_PAGE_SIZE, filter }).catch(() => []);
|
|
350
|
+
const messages = await listMessages(folder.uid, { limit: MESSAGE_PAGE_SIZE, filter }, client).catch(() => []);
|
|
348
351
|
return { mailbox, messages };
|
|
349
352
|
}));
|
|
350
353
|
return mergeInboxMessages(perMailbox);
|
|
@@ -355,13 +358,13 @@ async function fetchAggregateMessages(mailboxFolders, type, filter) {
|
|
|
355
358
|
* grouping pulls in) and each row tagged with its mailbox, then merged newest activity first. Same first-page-only scope, and the same
|
|
356
359
|
* rule that a mailbox that has no such folder or fails to answer contributes nothing rather than blanking the rest.
|
|
357
360
|
*/
|
|
358
|
-
async function fetchAggregateConversations(mailboxFolders, type, params) {
|
|
361
|
+
async function fetchAggregateConversations(mailboxFolders, type, params, client) {
|
|
359
362
|
const perMailbox = await Promise.all(mailboxFolders.map(async ({ mailbox, folders }) => {
|
|
360
363
|
const folder = folders.find((f) => f.type === type);
|
|
361
364
|
if (!folder) {
|
|
362
365
|
return [];
|
|
363
366
|
}
|
|
364
|
-
const rows = await listConversations(mailbox.uid, { ...params, folderUid: folder.uid, page: 0 }).catch(() => []);
|
|
367
|
+
const rows = await listConversations(mailbox.uid, { ...params, folderUid: folder.uid, page: 0 }, client).catch(() => []);
|
|
365
368
|
return rows.map((row) => ({ ...row, mailboxUid: mailbox.uid }));
|
|
366
369
|
}));
|
|
367
370
|
return perMailbox.flat().sort((a, b) => Date.parse(b.latestDate) - Date.parse(a.latestDate));
|
|
@@ -390,6 +393,7 @@ function InboxContent({ userUid }) {
|
|
|
390
393
|
const isMobile = useIsMobile();
|
|
391
394
|
const navigate = useNavigate();
|
|
392
395
|
const { requestUnlock } = useUnlockPrompt();
|
|
396
|
+
const client = useApiClient();
|
|
393
397
|
const [messages, setMessages] = useState([]);
|
|
394
398
|
const [conversations, setConversations] = useState([]);
|
|
395
399
|
const [loading, setLoading] = useState(true);
|
|
@@ -748,7 +752,7 @@ function InboxContent({ userUid }) {
|
|
|
748
752
|
}
|
|
749
753
|
let cancelled = false;
|
|
750
754
|
setOtherMailboxLabels([]);
|
|
751
|
-
listLabels(labelsMailboxUid, { limit: 200 })
|
|
755
|
+
listLabels(labelsMailboxUid, { limit: 200 }, client)
|
|
752
756
|
.then((result) => {
|
|
753
757
|
if (!cancelled) {
|
|
754
758
|
setOtherMailboxLabels(result);
|
|
@@ -758,11 +762,11 @@ function InboxContent({ userUid }) {
|
|
|
758
762
|
return () => {
|
|
759
763
|
cancelled = true;
|
|
760
764
|
};
|
|
761
|
-
}, [labelsMailboxUid, otherMailbox]);
|
|
765
|
+
}, [labelsMailboxUid, otherMailbox, client]);
|
|
762
766
|
useEffect(() => {
|
|
763
767
|
let cancelled = false;
|
|
764
768
|
setMailboxLabels([]);
|
|
765
|
-
listLabels(activeMailboxUid, { limit: 200 })
|
|
769
|
+
listLabels(activeMailboxUid, { limit: 200 }, client)
|
|
766
770
|
.then((result) => {
|
|
767
771
|
if (!cancelled) {
|
|
768
772
|
setMailboxLabels(result);
|
|
@@ -772,7 +776,7 @@ function InboxContent({ userUid }) {
|
|
|
772
776
|
return () => {
|
|
773
777
|
cancelled = true;
|
|
774
778
|
};
|
|
775
|
-
}, [activeMailboxUid]);
|
|
779
|
+
}, [activeMailboxUid, client]);
|
|
776
780
|
// Debounce the raw input into the query actually searched, so every keystroke doesn't fire a request.
|
|
777
781
|
useEffect(() => {
|
|
778
782
|
const handle = setTimeout(() => setSearchQuery(searchInput.trim()), SEARCH_DEBOUNCE_MS);
|
|
@@ -884,7 +888,7 @@ function InboxContent({ userUid }) {
|
|
|
884
888
|
setLoading(true);
|
|
885
889
|
setError(null);
|
|
886
890
|
setHasMore(false);
|
|
887
|
-
void fetchAggregateConversations(mailboxFolders, aggregateFolderType, conversationParams(0))
|
|
891
|
+
void fetchAggregateConversations(mailboxFolders, aggregateFolderType, conversationParams(0), client)
|
|
888
892
|
.then((results) => {
|
|
889
893
|
if (isCurrentRun()) {
|
|
890
894
|
setConversations(results);
|
|
@@ -912,7 +916,7 @@ function InboxContent({ userUid }) {
|
|
|
912
916
|
setLoading(true);
|
|
913
917
|
}
|
|
914
918
|
setError(null);
|
|
915
|
-
listConversations(activeMailboxUid, conversationParams(0))
|
|
919
|
+
listConversations(activeMailboxUid, conversationParams(0), client)
|
|
916
920
|
.then((result) => {
|
|
917
921
|
if (isCurrentRun()) {
|
|
918
922
|
shownListKeyRef.current = listKey;
|
|
@@ -945,7 +949,7 @@ function InboxContent({ userUid }) {
|
|
|
945
949
|
setLoading(true);
|
|
946
950
|
setError(null);
|
|
947
951
|
// hasMore stays false (set above) - see fetchAggregateMessages()'s own pagination scope trim.
|
|
948
|
-
void fetchAggregateMessages(mailboxFolders, aggregateFolderType, effectiveFilter)
|
|
952
|
+
void fetchAggregateMessages(mailboxFolders, aggregateFolderType, effectiveFilter, client)
|
|
949
953
|
.then((results) => {
|
|
950
954
|
if (isCurrentRun()) {
|
|
951
955
|
setMessages(results);
|
|
@@ -979,7 +983,7 @@ function InboxContent({ userUid }) {
|
|
|
979
983
|
const isSuperseded = () => searchRunIdRef.current !== myRunId;
|
|
980
984
|
// Tier 3's code, imported when the first mailbox needs it and shared by the rest.
|
|
981
985
|
let tier3Module;
|
|
982
|
-
const loadTier3 = () => (tier3Module ?? (tier3Module = import("
|
|
986
|
+
const loadTier3 = () => (tier3Module ?? (tier3Module = import("../../lib/search/searchTier3.js")));
|
|
983
987
|
const failures = [];
|
|
984
988
|
/** The failed mailbox's notice entry. A search of one mailbox has none: its failure fails the search. */
|
|
985
989
|
const noteFailure = (uid, encrypted, err) => {
|
|
@@ -1021,7 +1025,7 @@ function InboxContent({ userUid }) {
|
|
|
1021
1025
|
const isUnconfirmed = (hit) => !!hit.metadataOnly && !confirmed.has(hitKey(hit));
|
|
1022
1026
|
const effectiveTier1 = capped.filter((hit) => !runs.get(hit.mailboxUid).tier3Settled || !isUnconfirmed(hit));
|
|
1023
1027
|
const merged = mergeSearchResults(effectiveTier1, tier2Hits, tier3Hits).slice(0, rowCap);
|
|
1024
|
-
const { messages: resolved, snippets: resolvedSnippets } = await resolveHitsToMessages(merged, resolvedMessageCacheRef.current);
|
|
1028
|
+
const { messages: resolved, snippets: resolvedSnippets } = await resolveHitsToMessages(merged, resolvedMessageCacheRef.current, client);
|
|
1025
1029
|
if (isSuperseded() || revealId < revealsApplied) {
|
|
1026
1030
|
return;
|
|
1027
1031
|
}
|
|
@@ -1047,7 +1051,7 @@ function InboxContent({ userUid }) {
|
|
|
1047
1051
|
const run = runs.get(uid);
|
|
1048
1052
|
try {
|
|
1049
1053
|
const [tier1Page, tier2Page] = await Promise.all([
|
|
1050
|
-
withTimeout(searchMailbox(parsed.text, tier1SearchParams(parsed, undefined, uid, pageSize)), tier1TimeoutMs),
|
|
1054
|
+
withTimeout(searchMailbox(parsed.text, tier1SearchParams(parsed, undefined, uid, pageSize), client), tier1TimeoutMs),
|
|
1051
1055
|
searchLocalIndex(uid, parsed, run.unlocked, pageSize, 0),
|
|
1052
1056
|
]);
|
|
1053
1057
|
if (isSuperseded()) {
|
|
@@ -1156,7 +1160,7 @@ function InboxContent({ userUid }) {
|
|
|
1156
1160
|
shownListKeyRef.current = listKey;
|
|
1157
1161
|
pendingScrollRef.current = snapshot.scrollTop;
|
|
1158
1162
|
}
|
|
1159
|
-
listMessages(folderUid, listParams)
|
|
1163
|
+
listMessages(folderUid, listParams, client)
|
|
1160
1164
|
.then((results) => {
|
|
1161
1165
|
if (isCurrentRun()) {
|
|
1162
1166
|
shownListKeyRef.current = listKey;
|
|
@@ -1213,6 +1217,7 @@ function InboxContent({ userUid }) {
|
|
|
1213
1217
|
crossMailbox,
|
|
1214
1218
|
searchTargetKey,
|
|
1215
1219
|
activeMailboxUid,
|
|
1220
|
+
client,
|
|
1216
1221
|
]);
|
|
1217
1222
|
// Which folders the messages on screen live in: one the sidebar does not know (the Outbox and Sent Items are made by the server on first use) is looked for -
|
|
1218
1223
|
// its mailbox's folders are listed again, once - so it appears without a reload. A conversation names every folder it has a message in.
|
|
@@ -1246,13 +1251,13 @@ function InboxContent({ userUid }) {
|
|
|
1246
1251
|
try {
|
|
1247
1252
|
if (asConversations && aggregateFolderType) {
|
|
1248
1253
|
// No paging here either: the fresh merged first pages are the list.
|
|
1249
|
-
const fresh = await fetchAggregateConversations(mailboxFolders, aggregateFolderType, conversationParams(0));
|
|
1254
|
+
const fresh = await fetchAggregateConversations(mailboxFolders, aggregateFolderType, conversationParams(0), client);
|
|
1250
1255
|
if (isCurrent()) {
|
|
1251
1256
|
setConversations(fresh);
|
|
1252
1257
|
}
|
|
1253
1258
|
}
|
|
1254
1259
|
else if (asConversations) {
|
|
1255
|
-
const fresh = await listConversations(activeMailboxUid, conversationParams(0));
|
|
1260
|
+
const fresh = await listConversations(activeMailboxUid, conversationParams(0), client);
|
|
1256
1261
|
if (!isCurrent()) {
|
|
1257
1262
|
return;
|
|
1258
1263
|
}
|
|
@@ -1263,13 +1268,13 @@ function InboxContent({ userUid }) {
|
|
|
1263
1268
|
}
|
|
1264
1269
|
else if (aggregateFolderType) {
|
|
1265
1270
|
// No paging here (see `fetchAggregateMessages()`): the fresh merged first pages are the list.
|
|
1266
|
-
const fresh = await fetchAggregateMessages(mailboxFolders, aggregateFolderType, effectiveFilter);
|
|
1271
|
+
const fresh = await fetchAggregateMessages(mailboxFolders, aggregateFolderType, effectiveFilter, client);
|
|
1267
1272
|
if (isCurrent()) {
|
|
1268
1273
|
setMessages(fresh);
|
|
1269
1274
|
}
|
|
1270
1275
|
}
|
|
1271
1276
|
else {
|
|
1272
|
-
const fresh = await listMessages(folderUid, listParams);
|
|
1277
|
+
const fresh = await listMessages(folderUid, listParams, client);
|
|
1273
1278
|
if (!isCurrent()) {
|
|
1274
1279
|
return;
|
|
1275
1280
|
}
|
|
@@ -1340,7 +1345,7 @@ function InboxContent({ userUid }) {
|
|
|
1340
1345
|
try {
|
|
1341
1346
|
if (asConversations) {
|
|
1342
1347
|
const page = Math.floor(listedOffsetRef.current / MESSAGE_PAGE_SIZE);
|
|
1343
|
-
const more = await listConversations(activeMailboxUid, conversationParams(page));
|
|
1348
|
+
const more = await listConversations(activeMailboxUid, conversationParams(page), client);
|
|
1344
1349
|
if (!isCurrentRun()) {
|
|
1345
1350
|
return;
|
|
1346
1351
|
}
|
|
@@ -1362,7 +1367,7 @@ function InboxContent({ userUid }) {
|
|
|
1362
1367
|
const mailboxCursor = cursor.perMailbox.get(uid);
|
|
1363
1368
|
try {
|
|
1364
1369
|
const [tier1Page, tier2Page] = await Promise.all([
|
|
1365
|
-
withTimeout(searchMailbox(parsed.text, tier1SearchParams(parsed, mailboxCursor.tier1Cursor, uid, cursor.pageSize)), tier1TimeoutMs),
|
|
1370
|
+
withTimeout(searchMailbox(parsed.text, tier1SearchParams(parsed, mailboxCursor.tier1Cursor, uid, cursor.pageSize), client), tier1TimeoutMs),
|
|
1366
1371
|
searchLocalIndex(uid, parsed, getUnlockedKeys(uid), cursor.pageSize, mailboxCursor.tier2Offset),
|
|
1367
1372
|
]);
|
|
1368
1373
|
// The first page cached this pass under `tier3Key` before it created the cursor - unless Tier 3 had nothing to give.
|
|
@@ -1405,7 +1410,7 @@ function InboxContent({ userUid }) {
|
|
|
1405
1410
|
// confirms simply keeps showing its existing placeholder text rather than a live skeleton
|
|
1406
1411
|
// - a deliberate, documented scope trim of progressive reveal to the first page only.
|
|
1407
1412
|
const merged = mergeSearchResults(capSkeletons(answered.flatMap((page) => page.tier1)), answered.flatMap((page) => page.tier2), answered.flatMap((page) => page.tier3));
|
|
1408
|
-
const { messages: more, snippets: moreSnippets } = await resolveHitsToMessages(merged, resolvedMessageCacheRef.current);
|
|
1413
|
+
const { messages: more, snippets: moreSnippets } = await resolveHitsToMessages(merged, resolvedMessageCacheRef.current, client);
|
|
1409
1414
|
if (!isCurrentRun()) {
|
|
1410
1415
|
return;
|
|
1411
1416
|
}
|
|
@@ -1443,7 +1448,7 @@ function InboxContent({ userUid }) {
|
|
|
1443
1448
|
// no longer a page boundary, so this page overlaps rows already shown - `appendUnseenRows()`
|
|
1444
1449
|
// drops those - rather than skipping the message that shifted back across the boundary.
|
|
1445
1450
|
const page = Math.floor(listedOffsetRef.current / MESSAGE_PAGE_SIZE);
|
|
1446
|
-
const more = await listMessages(folderUid, { ...listParams, page });
|
|
1451
|
+
const more = await listMessages(folderUid, { ...listParams, page }, client);
|
|
1447
1452
|
if (!isCurrentRun()) {
|
|
1448
1453
|
return;
|
|
1449
1454
|
}
|
|
@@ -1479,6 +1484,7 @@ function InboxContent({ userUid }) {
|
|
|
1479
1484
|
activeMailboxUid,
|
|
1480
1485
|
crossMailbox,
|
|
1481
1486
|
searchTargetKey,
|
|
1487
|
+
client,
|
|
1482
1488
|
]);
|
|
1483
1489
|
// Always calls the latest `loadMore` closure so the effect below doesn't need `loadMore` itself in its
|
|
1484
1490
|
// dependency array (it changes on every keystroke/page load, which would otherwise mean nothing here).
|
|
@@ -1623,7 +1629,7 @@ function InboxContent({ userUid }) {
|
|
|
1623
1629
|
}
|
|
1624
1630
|
setResolvingSelection((n) => n + 1);
|
|
1625
1631
|
try {
|
|
1626
|
-
const loaded = await Promise.all(missing.map(async (id) => [id, await listConversationMessages(activeMailboxUid, id)]));
|
|
1632
|
+
const loaded = await Promise.all(missing.map(async (id) => [id, await listConversationMessages(activeMailboxUid, id, {}, client)]));
|
|
1627
1633
|
setConversationMessagesById((prev) => ({ ...prev, ...Object.fromEntries(loaded) }));
|
|
1628
1634
|
}
|
|
1629
1635
|
catch (err) {
|
|
@@ -1726,11 +1732,11 @@ function InboxContent({ userUid }) {
|
|
|
1726
1732
|
return inEachMailbox(chosen, async (ofMailbox, group) => {
|
|
1727
1733
|
const archiveFolderUid = foldersOf(ofMailbox).find((f) => f.type === "archive")?.uid;
|
|
1728
1734
|
if (archiveFolderUid) {
|
|
1729
|
-
return moveMessages(group, archiveFolderUid);
|
|
1735
|
+
return moveMessages(group, archiveFolderUid, client);
|
|
1730
1736
|
}
|
|
1731
|
-
const first = await archiveMessage(group[0].uid);
|
|
1737
|
+
const first = await archiveMessage(group[0].uid, client);
|
|
1732
1738
|
const rest = group.slice(1);
|
|
1733
|
-
return rest.length === 0 ? [first] : [first, ...(await moveMessages(rest, first.folderUid))];
|
|
1739
|
+
return rest.length === 0 ? [first] : [first, ...(await moveMessages(rest, first.folderUid, client))];
|
|
1734
1740
|
});
|
|
1735
1741
|
}
|
|
1736
1742
|
/**
|
|
@@ -1760,19 +1766,19 @@ function InboxContent({ userUid }) {
|
|
|
1760
1766
|
if (known) {
|
|
1761
1767
|
return known;
|
|
1762
1768
|
}
|
|
1763
|
-
const listed = (await listFolders(ofMailbox)).find((f) => f.type === type);
|
|
1769
|
+
const listed = (await listFolders(ofMailbox, client)).find((f) => f.type === type);
|
|
1764
1770
|
if (listed) {
|
|
1765
1771
|
onFolderCreated(listed);
|
|
1766
1772
|
lazyFoldersRef.current.set(key, listed.uid);
|
|
1767
1773
|
return listed.uid;
|
|
1768
1774
|
}
|
|
1769
|
-
const created = await createFolder({ mailboxUid: ofMailbox, name, type });
|
|
1775
|
+
const created = await createFolder({ mailboxUid: ofMailbox, name, type }, client);
|
|
1770
1776
|
lazyFoldersRef.current.set(key, created.uid);
|
|
1771
1777
|
return created.uid;
|
|
1772
1778
|
}
|
|
1773
1779
|
/** Moves `chosen` into each of its mailbox's own folder of `type` (Deleted Items, Junk), making it where the server has none yet. */
|
|
1774
1780
|
function moveToFolderOfType(chosen, type, name) {
|
|
1775
|
-
return inEachMailbox(chosen, async (ofMailbox, group) => moveMessages(group, await resolveFolderOfType(type, name, ofMailbox)));
|
|
1781
|
+
return inEachMailbox(chosen, async (ofMailbox, group) => moveMessages(group, await resolveFolderOfType(type, name, ofMailbox), client));
|
|
1776
1782
|
}
|
|
1777
1783
|
/**
|
|
1778
1784
|
* Sets every selected message's labels in one bulk update: each ends up with `labelUids`, plus the
|
|
@@ -1786,7 +1792,7 @@ function InboxContent({ userUid }) {
|
|
|
1786
1792
|
void runBulkAction((chosen) => bulkUpdateMessages(chosen.map((message) => {
|
|
1787
1793
|
const kept = (message.labelUids ?? []).filter((uid) => keepPartial.includes(uid) || !mailboxLabels.some((label) => label.uid === uid));
|
|
1788
1794
|
return { uid: message.uid, version: message.version, labelUids: [...new Set([...labelUids, ...kept])] };
|
|
1789
|
-
})), false);
|
|
1795
|
+
}), client), false);
|
|
1790
1796
|
}
|
|
1791
1797
|
function moveSelectionToType(type, name, chosen) {
|
|
1792
1798
|
return runBulkAction((moving) => moveToFolderOfType(moving, type, name), true, chosen);
|
|
@@ -1871,7 +1877,7 @@ function InboxContent({ userUid }) {
|
|
|
1871
1877
|
setMoveDialog(null);
|
|
1872
1878
|
return;
|
|
1873
1879
|
}
|
|
1874
|
-
await runBulkAction((moving) => moveMessages(moving, folderUidToMoveTo), true, chosen);
|
|
1880
|
+
await runBulkAction((moving) => moveMessages(moving, folderUidToMoveTo, client), true, chosen);
|
|
1875
1881
|
setMoveDialog(null);
|
|
1876
1882
|
}
|
|
1877
1883
|
const loadMoreStatus = loadingMore ? ("Loading more\u2026") : loadMoreError ? (_jsxs("span", { className: "inline-flex items-center gap-2", children: [_jsx("span", { role: "alert", className: "text-danger", children: loadMoreError }), _jsx("button", { type: "button", onClick: () => void loadMoreRef.current(), className: "text-primary-dark hover:underline font-medium", children: "Retry" })] })) : loadMoreStalled ? (_jsx("button", { type: "button", onClick: () => void loadMoreRef.current(), className: "text-primary-dark hover:underline font-medium", children: "Load more" })) : null;
|
|
@@ -2009,7 +2015,7 @@ function InboxContent({ userUid }) {
|
|
|
2009
2015
|
const cacheKey = ofMailbox === activeMailboxUid ? id : `${ofMailbox}\u0000${id}`;
|
|
2010
2016
|
let all = conversationMessagesById[cacheKey];
|
|
2011
2017
|
if (!all) {
|
|
2012
|
-
all = await listConversationMessages(ofMailbox, id);
|
|
2018
|
+
all = await listConversationMessages(ofMailbox, id, {}, client);
|
|
2013
2019
|
const loaded = all;
|
|
2014
2020
|
setConversationMessagesById((prev) => ({ ...prev, [cacheKey]: loaded }));
|
|
2015
2021
|
}
|
|
@@ -2072,16 +2078,24 @@ function InboxContent({ userUid }) {
|
|
|
2072
2078
|
}
|
|
2073
2079
|
await actOnKeyboardTargets(targets.filter((message) => !inDeletedItems(message)), (chosen) => moveToFolderOfType(chosen, "deleted_items", "Deleted Items"), true);
|
|
2074
2080
|
}
|
|
2081
|
+
/** Shift+Delete, from the keyboard: permanently deletes the targets wherever they are, after the same confirmation as Delete in Deleted Items. */
|
|
2082
|
+
async function permanentDeleteFromKeyboard() {
|
|
2083
|
+
const targets = await keyboardTargets();
|
|
2084
|
+
if (targets.length > 0 && (await purgeChosen(targets)) && threadPane && !selectMode) {
|
|
2085
|
+
closeOpenThread();
|
|
2086
|
+
}
|
|
2087
|
+
}
|
|
2075
2088
|
useShortcut(SHORTCUTS.mail.next, () => selectNeighbour(1), { enabled: canMoveSelection });
|
|
2076
2089
|
useShortcut(SHORTCUTS.mail.previous, () => selectNeighbour(-1), { enabled: canMoveSelection });
|
|
2077
2090
|
useShortcut(SHORTCUTS.mail.nextUnread, () => selectNextUnread(1), { enabled: canMoveSelection });
|
|
2078
2091
|
useShortcut(SHORTCUTS.mail.previousUnread, () => selectNextUnread(-1), { enabled: canMoveSelection });
|
|
2079
2092
|
useShortcut(SHORTCUTS.mail.delete, () => void deleteFromKeyboard(), { enabled: keyboardActions && keyboardTargetExists });
|
|
2093
|
+
useShortcut(SHORTCUTS.mail.permanentDelete, () => void permanentDeleteFromKeyboard(), { enabled: keyboardActions && keyboardTargetExists });
|
|
2080
2094
|
useShortcut(SHORTCUTS.mail.markRead, () => void runOnKeyboardTargets((chosen) => setReadStateMany(chosen, true, { patch: patchListedMessage, track: trackMessageChange }), false, isUnread), { enabled: keyboardActions && keyboardTargetExists });
|
|
2081
2095
|
useShortcut(SHORTCUTS.mail.markUnread, () => void runOnKeyboardTargets((chosen) => setReadStateMany(chosen, false, { patch: patchListedMessage, track: trackMessageChange }), false, (message) => !isUnread(message)), { enabled: keyboardActions && keyboardTargetExists });
|
|
2082
2096
|
useShortcut(SHORTCUTS.mail.flag, () =>
|
|
2083
2097
|
// Flags them all unless every one already is - what the bar's Flag and Unflag would do on this selection.
|
|
2084
|
-
void runOnKeyboardTargets((chosen) => setMessagesFlagged(chosen, !chosen.every((m) => m.flags.flagged)), false), { enabled: keyboardActions && keyboardTargetExists });
|
|
2098
|
+
void runOnKeyboardTargets((chosen) => setMessagesFlagged(chosen, !chosen.every((m) => m.flags.flagged), client), false), { enabled: keyboardActions && keyboardTargetExists });
|
|
2085
2099
|
useShortcut(SHORTCUTS.mail.open, (event) => {
|
|
2086
2100
|
// Enter on a row that is not selected yet is the row button's own click (it selects). On the selected one - or with the focus
|
|
2087
2101
|
// elsewhere - it opens the message on its own page, as it does in Outlook.
|
|
@@ -2146,8 +2160,8 @@ function InboxContent({ userUid }) {
|
|
|
2146
2160
|
? selectAllConversations()
|
|
2147
2161
|
: setSelectedUids(new Set(messages.map((m) => m.uid))), onClearSelection: () => asConversations ? setSelectedConversationIds(new Set()) : setSelectedUids(new Set()), onCancel: leaveSelectMode, folders: foldersOf(selectionMailboxUid), currentFolderUid: folderUid, labels: mailboxLabels, mailboxUid: selectionMailboxUid, moveDisabledReason: moveDisabledReason, labelsDisabledReason: labelsDisabledReason, onLabelCreated: (label) => setMailboxLabels((prev) => [...prev, label]), onFolderCreated: onFolderCreated, onApplyLabels: applyLabelsToSelection, onSetRead: (read) => void runBulkAction(
|
|
2148
2162
|
// Optimistic: the rows and the folder badges change now, and change back if the server refuses.
|
|
2149
|
-
(chosen) => setReadStateMany(chosen, read, { patch: patchListedMessage, track: trackMessageChange }), false), onSetFlagged: (flagged) => void runBulkAction((chosen) => setMessagesFlagged(chosen, flagged), false), shortcuts: keyboardActions, onArchive: () => void runBulkAction(bulkArchive, true), onMoveTo: async (targetFolderUid) => {
|
|
2150
|
-
await runBulkAction((chosen) => moveMessages(chosen, targetFolderUid), true);
|
|
2163
|
+
(chosen) => setReadStateMany(chosen, read, { patch: patchListedMessage, track: trackMessageChange }), false), onSetFlagged: (flagged) => void runBulkAction((chosen) => setMessagesFlagged(chosen, flagged, client), false), shortcuts: keyboardActions, onArchive: () => void runBulkAction(bulkArchive, true), onMoveTo: async (targetFolderUid) => {
|
|
2164
|
+
await runBulkAction((chosen) => moveMessages(chosen, targetFolderUid, client), true);
|
|
2151
2165
|
}, onReportJunk: () => void moveSelectionToType("junk", "Junk Email"), onDelete: () => void (deletesPermanently
|
|
2152
2166
|
? purgeChosen(selectedMessages)
|
|
2153
2167
|
: // A mix (search results from several folders) moves only what is not in Deleted Items yet.
|
|
@@ -14,5 +14,5 @@ declare function MessageDetailPage(props: MailShellProps & {
|
|
|
14
14
|
export default MessageDetailPage;
|
|
15
15
|
/** The tab's title: `Brand: Mail` (see `pageTitle()`). */
|
|
16
16
|
export declare const title: (props: {
|
|
17
|
-
branding?: Pick<import("
|
|
17
|
+
branding?: Pick<import("../../../lib/branding/brandingApi.js").Branding, "title" | "companyName"> | null;
|
|
18
18
|
}) => string;
|
|
@@ -5,16 +5,17 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
5
5
|
///////////////////////////////////////////////////////////////////////////////
|
|
6
6
|
import { pageTitle } from "../../shared/navigation/pageTitle.js";
|
|
7
7
|
import { useEffect, useState } from "react";
|
|
8
|
-
import { ApiRequestError } from "
|
|
9
|
-
import { getMessage } from "
|
|
10
|
-
import { listLabels } from "
|
|
11
|
-
import { useMessageAttachments } from "
|
|
8
|
+
import { ApiRequestError } from "../../../lib/util/api.js";
|
|
9
|
+
import { getMessage } from "../../../lib/mail/mailApi.js";
|
|
10
|
+
import { listLabels } from "../../../lib/mail/labelsApi.js";
|
|
11
|
+
import { useMessageAttachments } from "../../../lib/mail/mailDetailHooks.js";
|
|
12
|
+
import { useApiClient } from "../../../lib/util/apiClientContext.js";
|
|
12
13
|
import { useMarkMessageRead } from "../../shared/mail/useMarkMessageRead.js";
|
|
13
14
|
import MailShell, { useMailShell } from "../../shared/components/mail/layout/MailShell.js";
|
|
14
15
|
import { LazyConversationThreadPane, LazyMessageDetailPane } from "../../shared/components/mail/LazyReadingPane.js";
|
|
15
16
|
import { useSearchParams } from "@rapidrest/react/client";
|
|
16
17
|
import { ReadingPaneSkeleton } from "../../shared/components/mail/reading/MessageCard.js";
|
|
17
|
-
import Alert from "
|
|
18
|
+
import Alert from "../../../lib/components/feedback/Alert.js";
|
|
18
19
|
/**
|
|
19
20
|
* Only reached on mobile (below the `md` breakpoint) — desktop's `apps/www/index.tsx` keeps its existing
|
|
20
21
|
* inline reading pane and never navigates here; see that file's `handleSelect`. A row of the conversation list
|
|
@@ -26,6 +27,7 @@ function MessageDetailPage(props) {
|
|
|
26
27
|
}
|
|
27
28
|
function MessageDetailContent({ uid }) {
|
|
28
29
|
const { mailboxFolders, mailboxUid, onFolderCreated } = useMailShell();
|
|
30
|
+
const client = useApiClient();
|
|
29
31
|
const [message, setMessage] = useState(null);
|
|
30
32
|
const [loading, setLoading] = useState(true);
|
|
31
33
|
const [error, setError] = useState(null);
|
|
@@ -34,11 +36,11 @@ function MessageDetailContent({ uid }) {
|
|
|
34
36
|
useEffect(() => {
|
|
35
37
|
setLoading(true);
|
|
36
38
|
setError(null);
|
|
37
|
-
getMessage(uid)
|
|
39
|
+
getMessage(uid, client)
|
|
38
40
|
.then(setMessage)
|
|
39
41
|
.catch((err) => setError(err instanceof ApiRequestError ? err.message : "Could not load this message."))
|
|
40
42
|
.finally(() => setLoading(false));
|
|
41
|
-
}, [uid]);
|
|
43
|
+
}, [uid, client]);
|
|
42
44
|
// See `apps/www/index.tsx`'s identical effect's own doc comment - a failure here just hides the
|
|
43
45
|
// Labels control rather than blocking the rest of the page. Keyed on the message's own mailbox, not the
|
|
44
46
|
// shell's ambient one: this route is reached from aggregate/search rows too, where they can differ.
|
|
@@ -48,7 +50,7 @@ function MessageDetailContent({ uid }) {
|
|
|
48
50
|
return;
|
|
49
51
|
}
|
|
50
52
|
let cancelled = false;
|
|
51
|
-
listLabels(messageMailboxUid, { limit: 200 })
|
|
53
|
+
listLabels(messageMailboxUid, { limit: 200 }, client)
|
|
52
54
|
.then((result) => {
|
|
53
55
|
if (!cancelled) {
|
|
54
56
|
setLabels(result);
|
|
@@ -58,7 +60,7 @@ function MessageDetailContent({ uid }) {
|
|
|
58
60
|
return () => {
|
|
59
61
|
cancelled = true;
|
|
60
62
|
};
|
|
61
|
-
}, [messageMailboxUid]);
|
|
63
|
+
}, [messageMailboxUid, client]);
|
|
62
64
|
// A thread loads, marks read and fetches the attachments of each message it opens itself.
|
|
63
65
|
const attachments = useMessageAttachments(conversationId ? null : message);
|
|
64
66
|
useMarkMessageRead(conversationId ? null : message, setMessage);
|
|
@@ -6,5 +6,5 @@ declare function SettingsAppearancePage(props: SettingsAppearancePageProps): Rea
|
|
|
6
6
|
export default SettingsAppearancePage;
|
|
7
7
|
/** The tab's title: `Brand: Settings` (see `pageTitle()`). */
|
|
8
8
|
export declare const title: (props: {
|
|
9
|
-
branding?: Pick<import("
|
|
9
|
+
branding?: Pick<import("../../../../lib/branding/brandingApi.js").Branding, "title" | "companyName"> | null;
|
|
10
10
|
}) => string;
|
|
@@ -5,5 +5,5 @@ declare function SettingsAutoReplyPage(props: SettingsAutoReplyPageProps): React
|
|
|
5
5
|
export default SettingsAutoReplyPage;
|
|
6
6
|
/** The tab's title: `Brand: Settings` (see `pageTitle()`). */
|
|
7
7
|
export declare const title: (props: {
|
|
8
|
-
branding?: Pick<import("
|
|
8
|
+
branding?: Pick<import("../../../../lib/branding/brandingApi.js").Branding, "title" | "companyName"> | null;
|
|
9
9
|
}) => string;
|
|
@@ -5,10 +5,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
5
5
|
///////////////////////////////////////////////////////////////////////////////
|
|
6
6
|
import { pageTitle } from "../../../shared/navigation/pageTitle.js";
|
|
7
7
|
import { useState } from "react";
|
|
8
|
-
import { toDatetimeLocal } from "
|
|
9
|
-
import { updateMailbox } from "
|
|
8
|
+
import { toDatetimeLocal } from "../../../../lib/util/dateInput.js";
|
|
9
|
+
import { updateMailbox } from "../../../../lib/mail/mailApi.js";
|
|
10
|
+
import { useApiClient } from "../../../../lib/util/apiClientContext.js";
|
|
10
11
|
import SettingsShell, { useSettingsShell } from "../../../shared/components/settings/layout/SettingsShell.js";
|
|
11
|
-
import Button from "
|
|
12
|
+
import Button from "../../../../lib/components/buttons/Button.js";
|
|
12
13
|
import { notifyApiError } from "../../../shared/notifications/apiErrors.js";
|
|
13
14
|
const INPUT_CLASS = "w-full text-sm py-2 px-3 border border-border rounded-sm bg-surface text-text focus:outline-none focus:border-primary";
|
|
14
15
|
function SettingsAutoReplyPage(props) {
|
|
@@ -20,6 +21,7 @@ function AutoReplyContent() {
|
|
|
20
21
|
// resolved to one of them (a mailbox-less caller sees `MailboxProvisioning` instead) — this lookup
|
|
21
22
|
// can't miss, same established non-null pattern as `apps/www/contacts/index.tsx`'s `mailboxUid!`.
|
|
22
23
|
const mailbox = mailboxes.find((mb) => mb.uid === mailboxUid);
|
|
24
|
+
const client = useApiClient();
|
|
23
25
|
const [oofEnabled, setOofEnabled] = useState(mailbox.oofEnabled ?? false);
|
|
24
26
|
const [oofMessage, setOofMessage] = useState(mailbox.oofMessage ?? "");
|
|
25
27
|
const [oofStartTime, setOofStartTime] = useState(mailbox.oofStartTime ? toDatetimeLocal(mailbox.oofStartTime) : "");
|
|
@@ -42,7 +44,7 @@ function AutoReplyContent() {
|
|
|
42
44
|
// `null` (not omitted) clears a previously saved window - an omitted field is left as-is.
|
|
43
45
|
oofStartTime: oofStartTime ? new Date(oofStartTime).toISOString() : null,
|
|
44
46
|
oofEndTime: oofEndTime ? new Date(oofEndTime).toISOString() : null,
|
|
45
|
-
});
|
|
47
|
+
}, client);
|
|
46
48
|
setVersion(updated.version);
|
|
47
49
|
setSaved(true);
|
|
48
50
|
}
|
|
@@ -5,5 +5,5 @@ declare function SettingsBlockedSendersPage(props: SettingsBlockedSendersPagePro
|
|
|
5
5
|
export default SettingsBlockedSendersPage;
|
|
6
6
|
/** The tab's title: `Brand: Settings` (see `pageTitle()`). */
|
|
7
7
|
export declare const title: (props: {
|
|
8
|
-
branding?: Pick<import("
|
|
8
|
+
branding?: Pick<import("../../../../lib/branding/brandingApi.js").Branding, "title" | "companyName"> | null;
|
|
9
9
|
}) => string;
|
|
@@ -5,10 +5,11 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
5
5
|
///////////////////////////////////////////////////////////////////////////////
|
|
6
6
|
import { pageTitle } from "../../../shared/navigation/pageTitle.js";
|
|
7
7
|
import { useId, useRef, useState } from "react";
|
|
8
|
-
import { blockedSendersOf, isSharedWithMe, safeSendersOf } from "
|
|
9
|
-
import { MAX_SENDER_LIST_ENTRIES, addBlockedSender, addSafeSender, checkSenderEntry, removeBlockedSender, removeSafeSender, } from "
|
|
8
|
+
import { blockedSendersOf, isSharedWithMe, safeSendersOf } from "../../../../lib/mail/mailApi.js";
|
|
9
|
+
import { MAX_SENDER_LIST_ENTRIES, addBlockedSender, addSafeSender, checkSenderEntry, removeBlockedSender, removeSafeSender, } from "../../../../lib/mail/senderListsApi.js";
|
|
10
10
|
import SettingsShell, { useSettingsShell } from "../../../shared/components/settings/layout/SettingsShell.js";
|
|
11
|
-
import Button from "
|
|
11
|
+
import Button from "../../../../lib/components/buttons/Button.js";
|
|
12
|
+
import { useApiClient } from "../../../../lib/util/apiClientContext.js";
|
|
12
13
|
import { useMailboxUpdateAccess } from "../../../shared/mail/useMailboxUpdateAccess.js";
|
|
13
14
|
import { notifyApiError } from "../../../shared/notifications/apiErrors.js";
|
|
14
15
|
function SettingsBlockedSendersPage(props) {
|
|
@@ -105,6 +106,7 @@ function ListsContent() {
|
|
|
105
106
|
// `SettingsShell` only ever renders its children once `mailboxes` has loaded and `mailboxUid` has resolved to one of them - same established
|
|
106
107
|
// non-null pattern as `apps/www/settings/read-receipts/index.tsx`.
|
|
107
108
|
const mailbox = mailboxes.find((mb) => mb.uid === mailboxUid);
|
|
109
|
+
const client = useApiClient();
|
|
108
110
|
const writable = useMailboxUpdateAccess(mailbox);
|
|
109
111
|
// The lists are the owner's (and a manager's) to change; the server does not say which of the two a delegate is, so one who may update is offered the
|
|
110
112
|
// forms and told what a refusal means.
|
|
@@ -127,7 +129,7 @@ function ListsContent() {
|
|
|
127
129
|
return undefined;
|
|
128
130
|
}
|
|
129
131
|
}
|
|
130
|
-
return (_jsx("div", { className: "flex-1 min-w-0 overflow-y-auto p-4 sm:p-6", children: _jsxs("div", { className: "max-w-4xl", children: [_jsx("h1", { className: "text-lg font-bold tracking-tight mb-1", children: "Blocked and safe senders" }), _jsxs("p", { className: "text-sm text-text-muted mb-4", children: ["These lists belong to ", _jsx("span", { className: "font-medium text-text", children: mailbox.displayName }), " (", mailbox.primarySmtpAddress, "). Each entry is an email address or a domain. An entry is on one list at a time: adding it to one takes it off the other."] }), !supported ? (_jsx("p", { role: "status", className: "text-sm text-text-muted", children: "This server does not support blocked and safe senders yet." })) : (_jsxs(_Fragment, { children: [!writable && (_jsx("p", { role: "status", className: "text-sm rounded-md border border-border bg-surface-alt px-3 py-2 mb-4", children: "You have view-only access to this mailbox, so you can see these lists but not change them." })), writable && delegated && (_jsx("p", { className: "text-sm text-text-muted mb-4", children: "Only this mailbox\u2019s owner, or someone with full access to it, can change these lists. If you cannot, the server says so when you try." })), _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsx(ListSection, { kind: "blocked", entries: blocked, otherEntries: safe, ownAddresses: ownAddresses, editable: writable, onAdd: (entry) => change(() => addBlockedSender(mailbox.uid, entry), "Couldn't block this sender"), onRemove: (entry) => change(() => removeBlockedSender(mailbox.uid, entry), "Couldn't unblock this sender") }), _jsx(ListSection, { kind: "safe", entries: safe, otherEntries: blocked, ownAddresses: ownAddresses, editable: writable, onAdd: (entry) => change(() => addSafeSender(mailbox.uid, entry), "Couldn't add this safe sender"), onRemove: (entry) => change(() => removeSafeSender(mailbox.uid, entry), "Couldn't remove this safe sender") })] })] }))] }) }));
|
|
132
|
+
return (_jsx("div", { className: "flex-1 min-w-0 overflow-y-auto p-4 sm:p-6", children: _jsxs("div", { className: "max-w-4xl", children: [_jsx("h1", { className: "text-lg font-bold tracking-tight mb-1", children: "Blocked and safe senders" }), _jsxs("p", { className: "text-sm text-text-muted mb-4", children: ["These lists belong to ", _jsx("span", { className: "font-medium text-text", children: mailbox.displayName }), " (", mailbox.primarySmtpAddress, "). Each entry is an email address or a domain. An entry is on one list at a time: adding it to one takes it off the other."] }), !supported ? (_jsx("p", { role: "status", className: "text-sm text-text-muted", children: "This server does not support blocked and safe senders yet." })) : (_jsxs(_Fragment, { children: [!writable && (_jsx("p", { role: "status", className: "text-sm rounded-md border border-border bg-surface-alt px-3 py-2 mb-4", children: "You have view-only access to this mailbox, so you can see these lists but not change them." })), writable && delegated && (_jsx("p", { className: "text-sm text-text-muted mb-4", children: "Only this mailbox\u2019s owner, or someone with full access to it, can change these lists. If you cannot, the server says so when you try." })), _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsx(ListSection, { kind: "blocked", entries: blocked, otherEntries: safe, ownAddresses: ownAddresses, editable: writable, onAdd: (entry) => change(() => addBlockedSender(mailbox.uid, entry, client), "Couldn't block this sender"), onRemove: (entry) => change(() => removeBlockedSender(mailbox.uid, entry, client), "Couldn't unblock this sender") }), _jsx(ListSection, { kind: "safe", entries: safe, otherEntries: blocked, ownAddresses: ownAddresses, editable: writable, onAdd: (entry) => change(() => addSafeSender(mailbox.uid, entry, client), "Couldn't add this safe sender"), onRemove: (entry) => change(() => removeSafeSender(mailbox.uid, entry, client), "Couldn't remove this safe sender") })] })] }))] }) }));
|
|
131
133
|
}
|
|
132
134
|
export default SettingsBlockedSendersPage;
|
|
133
135
|
/** The tab's title: `Brand: Settings` (see `pageTitle()`). */
|
|
@@ -8,5 +8,5 @@ declare function SettingsEncryptionPage(props: SettingsEncryptionPageProps): Rea
|
|
|
8
8
|
export default SettingsEncryptionPage;
|
|
9
9
|
/** The tab's title: `Brand: Settings` (see `pageTitle()`). */
|
|
10
10
|
export declare const title: (props: {
|
|
11
|
-
branding?: Pick<import("
|
|
11
|
+
branding?: Pick<import("../../../../lib/branding/brandingApi.js").Branding, "title" | "companyName"> | null;
|
|
12
12
|
}) => string;
|