@rapidmx/web-client 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +88 -0
  2. package/apps/admin/audit-log/index.tsx +35 -8
  3. package/apps/admin/data-requests/index.tsx +480 -485
  4. package/apps/admin/distribution-lists/[uid].tsx +19 -1
  5. package/apps/admin/escrow-scopes/[uid].tsx +348 -237
  6. package/apps/admin/escrow-scopes/new/index.tsx +8 -2
  7. package/apps/admin/index.tsx +19 -1
  8. package/apps/admin/ingest-queue/index.tsx +44 -5
  9. package/apps/admin/mailboxes/[uid].tsx +211 -184
  10. package/apps/admin/quarantine/index.tsx +46 -14
  11. package/apps/admin/transport-rules/[uid].tsx +30 -1
  12. package/apps/admin/transport-rules/_transportRuleConfig.tsx +38 -2
  13. package/apps/admin/transport-rules/index.tsx +24 -6
  14. package/apps/admin/transport-rules/new/index.tsx +30 -1
  15. package/apps/escrow/_layout.tsx +2 -3
  16. package/apps/escrow/audit-log/index.tsx +196 -168
  17. package/apps/escrow/matters/[uid].tsx +621 -521
  18. package/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.tsx +22 -1
  19. package/apps/shared/components/admin/layout/AdminShell.tsx +28 -9
  20. package/apps/shared/components/admin/mailboxes/EscrowScopeCard.tsx +152 -0
  21. package/apps/shared/components/admin/mailboxes/ResourceSettingsCard.tsx +3 -3
  22. package/apps/shared/components/admin/mailboxes/ShareAccessCard.tsx +55 -11
  23. package/apps/shared/components/admin/settings/BrandingForm.tsx +15 -4
  24. package/apps/shared/components/admin/settings/DomainDnsSetup.tsx +18 -7
  25. package/apps/shared/components/admin/settings/EncryptionPolicyForm.tsx +10 -2
  26. package/apps/shared/components/admin/settings/MailboxCreateForm.tsx +6 -0
  27. package/apps/shared/components/admin/settings/MailboxPolicyForm.tsx +45 -12
  28. package/apps/shared/components/admin/settings/PluginsManager.tsx +1235 -595
  29. package/apps/shared/components/admin/settings/RetentionPolicyForm.tsx +174 -98
  30. package/apps/shared/components/admin/setup/EscrowSetupStep.tsx +49 -13
  31. package/apps/shared/components/admin/setup/SetupWizard.tsx +150 -34
  32. package/apps/shared/components/admin/signOut.ts +79 -0
  33. package/apps/shared/components/admin/usePagedList.tsx +129 -0
  34. package/apps/shared/components/calendar/EventModal.tsx +717 -549
  35. package/apps/shared/components/calendar/MonthView.tsx +173 -139
  36. package/apps/shared/components/calendar/RecurrenceEditor.tsx +222 -180
  37. package/apps/shared/components/calendar/SplitDayView.tsx +143 -137
  38. package/apps/shared/components/calendar/TimeGridView.tsx +244 -198
  39. package/apps/shared/components/calendar/allDay.ts +124 -0
  40. package/apps/shared/components/calendar/layout/CalendarShell.tsx +194 -192
  41. package/apps/shared/components/contacts/ContactDetailPane.tsx +100 -21
  42. package/apps/shared/components/contacts/ContactForm.tsx +377 -348
  43. package/apps/shared/components/contacts/ContactsSidebar.tsx +6 -2
  44. package/apps/shared/components/contacts/KeyChangeReview.tsx +192 -0
  45. package/apps/shared/components/contacts/contactKeys.ts +78 -0
  46. package/apps/shared/components/contacts/layout/ContactsShell.tsx +199 -197
  47. package/apps/shared/components/escrow/layout/EscrowShell.tsx +148 -134
  48. package/apps/shared/components/layout/AppShell.tsx +123 -33
  49. package/apps/shared/components/layout/BrandingChrome.tsx +48 -10
  50. package/apps/shared/components/layout/KeyEnrollmentGate.tsx +389 -298
  51. package/apps/shared/components/layout/MailboxProvisioning.tsx +19 -3
  52. package/apps/shared/components/layout/RecoveryCodeUnlock.tsx +350 -0
  53. package/apps/shared/components/layout/UnlockPromptProvider.tsx +257 -128
  54. package/apps/shared/components/mail/ConversationThreadPane.tsx +216 -181
  55. package/apps/shared/components/mail/MessageDetailPane.tsx +1318 -630
  56. package/apps/shared/components/mail/compose/ComposeContext.tsx +20 -15
  57. package/apps/shared/components/mail/compose/ComposeWindow.tsx +854 -132
  58. package/apps/shared/components/mail/compose/composeFlushRegistry.ts +60 -0
  59. package/apps/shared/components/mail/layout/MailShell.tsx +420 -408
  60. package/apps/shared/components/mail/pinnedSigners.ts +124 -0
  61. package/apps/shared/components/mail/verificationSeals.ts +125 -0
  62. package/apps/shared/components/mail/writableMailboxes.ts +101 -0
  63. package/apps/shared/components/rules/RuleBuilder.tsx +311 -276
  64. package/apps/shared/components/settings/layout/SettingsShell.tsx +23 -9
  65. package/apps/shared/components/tasks/layout/TasksShell.tsx +201 -199
  66. package/apps/shared/mail/listAllPages.ts +39 -0
  67. package/apps/shared/plugins/pluginNav.ts +73 -0
  68. package/apps/shared/search/LocalIndexLifecycle.tsx +64 -55
  69. package/apps/shared/search/localIndexBuilder.ts +481 -179
  70. package/apps/shared/search/localIndexRpcClient.ts +231 -29
  71. package/apps/shared/search/localIndexSchema.ts +15 -6
  72. package/apps/shared/search/localIndexStorage.ts +98 -0
  73. package/apps/shared/search/localIndexVFS.ts +32 -1
  74. package/apps/shared/search/localIndexWorker.ts +648 -186
  75. package/apps/www/calendar/index.tsx +438 -417
  76. package/apps/www/contacts/[uid].tsx +21 -2
  77. package/apps/www/contacts/index.tsx +116 -12
  78. package/apps/www/index.tsx +1314 -1041
  79. package/apps/www/messages/[uid].tsx +18 -6
  80. package/apps/www/settings/auto-reply/index.tsx +134 -129
  81. package/apps/www/settings/encryption/index.tsx +739 -216
  82. package/apps/www/settings/filters/[uid].tsx +171 -155
  83. package/apps/www/settings/filters/new/index.tsx +8 -1
  84. package/apps/www/settings/focused-inbox/index.tsx +150 -148
  85. package/apps/www/settings/privacy/index.tsx +494 -436
  86. package/apps/www/settings/read-receipts/index.tsx +148 -125
  87. package/apps/www/settings/sharing/index.tsx +17 -14
  88. package/apps/www/tasks/index.tsx +638 -579
  89. package/dist/apps/admin/_404.d.ts +2 -0
  90. package/dist/apps/admin/_500.d.ts +2 -0
  91. package/dist/apps/admin/_layout.d.ts +8 -0
  92. package/dist/apps/admin/audit-log/index.d.ts +11 -0
  93. package/dist/apps/admin/audit-log/index.js +38 -8
  94. package/dist/apps/admin/branding/index.d.ts +3 -0
  95. package/dist/apps/admin/data-requests/index.d.ts +3 -0
  96. package/dist/apps/admin/data-requests/index.js +52 -72
  97. package/dist/apps/admin/distribution-lists/[uid].d.ts +7 -0
  98. package/dist/apps/admin/distribution-lists/[uid].js +1 -1
  99. package/dist/apps/admin/distribution-lists/index.d.ts +3 -0
  100. package/dist/apps/admin/distribution-lists/new/index.d.ts +3 -0
  101. package/dist/apps/admin/domains/[uid].d.ts +7 -0
  102. package/dist/apps/admin/domains/index.d.ts +3 -0
  103. package/dist/apps/admin/domains/new/index.d.ts +3 -0
  104. package/dist/apps/admin/encryption-policy/index.d.ts +3 -0
  105. package/dist/apps/admin/escrow-scopes/[uid].d.ts +21 -0
  106. package/dist/apps/admin/escrow-scopes/[uid].js +91 -12
  107. package/dist/apps/admin/escrow-scopes/index.d.ts +3 -0
  108. package/dist/apps/admin/escrow-scopes/new/index.d.ts +3 -0
  109. package/dist/apps/admin/escrow-scopes/new/index.js +8 -3
  110. package/dist/apps/admin/index.d.ts +3 -0
  111. package/dist/apps/admin/index.js +4 -1
  112. package/dist/apps/admin/ingest-queue/index.d.ts +4 -0
  113. package/dist/apps/admin/ingest-queue/index.js +24 -6
  114. package/dist/apps/admin/mailbox-policy/index.d.ts +3 -0
  115. package/dist/apps/admin/mailboxes/[uid].d.ts +7 -0
  116. package/dist/apps/admin/mailboxes/[uid].js +20 -4
  117. package/dist/apps/admin/mailboxes/new/index.d.ts +3 -0
  118. package/dist/apps/admin/plugins/index.d.ts +3 -0
  119. package/dist/apps/admin/quarantine/index.d.ts +6 -0
  120. package/dist/apps/admin/quarantine/index.js +20 -11
  121. package/dist/apps/admin/retention-policy/index.d.ts +3 -0
  122. package/dist/apps/admin/setup/index.d.ts +3 -0
  123. package/dist/apps/admin/transport-rules/[uid].d.ts +7 -0
  124. package/dist/apps/admin/transport-rules/[uid].js +18 -2
  125. package/dist/apps/admin/transport-rules/_transportRuleConfig.d.ts +21 -0
  126. package/dist/apps/admin/transport-rules/_transportRuleConfig.js +19 -0
  127. package/dist/apps/admin/transport-rules/index.d.ts +3 -0
  128. package/dist/apps/admin/transport-rules/index.js +22 -6
  129. package/dist/apps/admin/transport-rules/new/index.d.ts +3 -0
  130. package/dist/apps/admin/transport-rules/new/index.js +18 -2
  131. package/dist/apps/escrow/_layout.d.ts +10 -0
  132. package/dist/apps/escrow/_layout.js +3 -3
  133. package/dist/apps/escrow/audit-log/index.d.ts +9 -0
  134. package/dist/apps/escrow/audit-log/index.js +26 -1
  135. package/dist/apps/escrow/index.d.ts +3 -0
  136. package/dist/apps/escrow/matters/[uid].d.ts +7 -0
  137. package/dist/apps/escrow/matters/[uid].js +77 -42
  138. package/dist/apps/escrow/matters/new/index.d.ts +3 -0
  139. package/dist/apps/shared/components/admin/distributionLists/MemberListCard.d.ts +17 -0
  140. package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.d.ts +32 -0
  141. package/dist/apps/shared/components/admin/escrowScopes/EscrowScopeKeyAndHoldersFields.js +11 -2
  142. package/dist/apps/shared/components/admin/layout/AdminShell.d.ts +32 -0
  143. package/dist/apps/shared/components/admin/layout/AdminShell.js +15 -6
  144. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.d.ts +12 -0
  145. package/dist/apps/shared/components/admin/mailboxes/EscrowScopeCard.js +72 -0
  146. package/dist/apps/shared/components/admin/mailboxes/MailboxTable.d.ts +6 -0
  147. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.d.ts +19 -0
  148. package/dist/apps/shared/components/admin/mailboxes/ResourceSettingsCard.js +3 -3
  149. package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.d.ts +12 -0
  150. package/dist/apps/shared/components/admin/mailboxes/ShareAccessCard.js +22 -4
  151. package/dist/apps/shared/components/admin/settings/BrandingForm.d.ts +9 -0
  152. package/dist/apps/shared/components/admin/settings/BrandingForm.js +15 -4
  153. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.d.ts +12 -0
  154. package/dist/apps/shared/components/admin/settings/DomainDnsSetup.js +13 -7
  155. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.d.ts +12 -0
  156. package/dist/apps/shared/components/admin/settings/EncryptionPolicyForm.js +7 -2
  157. package/dist/apps/shared/components/admin/settings/LoadedSettingsForm.d.ts +9 -0
  158. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.d.ts +19 -0
  159. package/dist/apps/shared/components/admin/settings/MailboxCreateForm.js +6 -0
  160. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.d.ts +10 -0
  161. package/dist/apps/shared/components/admin/settings/MailboxPolicyForm.js +34 -12
  162. package/dist/apps/shared/components/admin/settings/PluginsManager.d.ts +4 -0
  163. package/dist/apps/shared/components/admin/settings/PluginsManager.js +390 -78
  164. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.d.ts +9 -0
  165. package/dist/apps/shared/components/admin/settings/RetentionPolicyForm.js +40 -11
  166. package/dist/apps/shared/components/admin/setup/EscrowSetupStep.d.ts +14 -0
  167. package/dist/apps/shared/components/admin/setup/EscrowSetupStep.js +29 -13
  168. package/dist/apps/shared/components/admin/setup/SetupWizard.d.ts +36 -0
  169. package/dist/apps/shared/components/admin/setup/SetupWizard.js +87 -21
  170. package/dist/apps/shared/components/admin/signOut.d.ts +23 -0
  171. package/dist/apps/shared/components/admin/signOut.js +75 -0
  172. package/dist/apps/shared/components/admin/usePagedList.d.ts +39 -0
  173. package/dist/apps/shared/components/admin/usePagedList.js +99 -0
  174. package/dist/apps/shared/components/calendar/CalendarListSidebar.d.ts +26 -0
  175. package/dist/apps/shared/components/calendar/EventModal.d.ts +46 -0
  176. package/dist/apps/shared/components/calendar/EventModal.js +142 -21
  177. package/dist/apps/shared/components/calendar/MonthView.d.ts +15 -0
  178. package/dist/apps/shared/components/calendar/MonthView.js +12 -5
  179. package/dist/apps/shared/components/calendar/RecurrenceEditor.d.ts +20 -0
  180. package/dist/apps/shared/components/calendar/RecurrenceEditor.js +40 -5
  181. package/dist/apps/shared/components/calendar/ResourcePicker.d.ts +19 -0
  182. package/dist/apps/shared/components/calendar/SplitDayView.d.ts +28 -0
  183. package/dist/apps/shared/components/calendar/SplitDayView.js +10 -4
  184. package/dist/apps/shared/components/calendar/TimeGridView.d.ts +17 -0
  185. package/dist/apps/shared/components/calendar/TimeGridView.js +23 -7
  186. package/dist/apps/shared/components/calendar/allDay.d.ts +51 -0
  187. package/dist/apps/shared/components/calendar/allDay.js +111 -0
  188. package/dist/apps/shared/components/calendar/layout/CalendarShell.d.ts +40 -0
  189. package/dist/apps/shared/components/calendar/layout/CalendarShell.js +3 -3
  190. package/dist/apps/shared/components/contacts/ContactDetailPane.d.ts +23 -0
  191. package/dist/apps/shared/components/contacts/ContactDetailPane.js +43 -5
  192. package/dist/apps/shared/components/contacts/ContactForm.d.ts +20 -0
  193. package/dist/apps/shared/components/contacts/ContactForm.js +32 -10
  194. package/dist/apps/shared/components/contacts/ContactsSidebar.d.ts +40 -0
  195. package/dist/apps/shared/components/contacts/ContactsSidebar.js +2 -2
  196. package/dist/apps/shared/components/contacts/ContactsToolbar.d.ts +25 -0
  197. package/dist/apps/shared/components/contacts/KeyChangeReview.d.ts +40 -0
  198. package/dist/apps/shared/components/contacts/KeyChangeReview.js +63 -0
  199. package/dist/apps/shared/components/contacts/contactKeys.d.ts +29 -0
  200. package/dist/apps/shared/components/contacts/contactKeys.js +64 -0
  201. package/dist/apps/shared/components/contacts/layout/ContactsShell.d.ts +21 -0
  202. package/dist/apps/shared/components/contacts/layout/ContactsShell.js +2 -2
  203. package/dist/apps/shared/components/escrow/layout/EscrowShell.d.ts +25 -0
  204. package/dist/apps/shared/components/escrow/layout/EscrowShell.js +24 -5
  205. package/dist/apps/shared/components/forms/StringListField.d.ts +22 -0
  206. package/dist/apps/shared/components/layout/AppShell.d.ts +49 -0
  207. package/dist/apps/shared/components/layout/AppShell.js +97 -26
  208. package/dist/apps/shared/components/layout/BrandingChrome.d.ts +18 -0
  209. package/dist/apps/shared/components/layout/BrandingChrome.js +45 -10
  210. package/dist/apps/shared/components/layout/KeyEnrollmentGate.d.ts +51 -0
  211. package/dist/apps/shared/components/layout/KeyEnrollmentGate.js +49 -12
  212. package/dist/apps/shared/components/layout/MailboxProvisioning.d.ts +13 -0
  213. package/dist/apps/shared/components/layout/MailboxProvisioning.js +10 -2
  214. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.d.ts +66 -0
  215. package/dist/apps/shared/components/layout/RecoveryCodeUnlock.js +174 -0
  216. package/dist/apps/shared/components/layout/UnlockPromptProvider.d.ts +45 -0
  217. package/dist/apps/shared/components/layout/UnlockPromptProvider.js +73 -14
  218. package/dist/apps/shared/components/layout/UserMenu.d.ts +23 -0
  219. package/dist/apps/shared/components/mail/ConversationList.d.ts +11 -0
  220. package/dist/apps/shared/components/mail/ConversationThreadPane.d.ts +23 -0
  221. package/dist/apps/shared/components/mail/ConversationThreadPane.js +50 -12
  222. package/dist/apps/shared/components/mail/MessageDetailPane.d.ts +93 -0
  223. package/dist/apps/shared/components/mail/MessageDetailPane.js +441 -36
  224. package/dist/apps/shared/components/mail/compose/ComposeContext.d.ts +58 -0
  225. package/dist/apps/shared/components/mail/compose/ComposeContext.js +9 -6
  226. package/dist/apps/shared/components/mail/compose/ComposeToolbar.d.ts +15 -0
  227. package/dist/apps/shared/components/mail/compose/ComposeWindow.d.ts +37 -0
  228. package/dist/apps/shared/components/mail/compose/ComposeWindow.js +699 -128
  229. package/dist/apps/shared/components/mail/compose/EmojiPicker.d.ts +14 -0
  230. package/dist/apps/shared/components/mail/compose/GifPicker.d.ts +13 -0
  231. package/dist/apps/shared/components/mail/compose/RichTextEditor.d.ts +34 -0
  232. package/dist/apps/shared/components/mail/compose/ScheduleSendPicker.d.ts +16 -0
  233. package/dist/apps/shared/components/mail/compose/composeFlushRegistry.d.ts +27 -0
  234. package/dist/apps/shared/components/mail/compose/composeFlushRegistry.js +50 -0
  235. package/dist/apps/shared/components/mail/layout/MailShell.d.ts +57 -0
  236. package/dist/apps/shared/components/mail/layout/MailShell.js +13 -4
  237. package/dist/apps/shared/components/mail/pinnedSigners.d.ts +33 -0
  238. package/dist/apps/shared/components/mail/pinnedSigners.js +98 -0
  239. package/dist/apps/shared/components/mail/verificationSeals.d.ts +22 -0
  240. package/dist/apps/shared/components/mail/verificationSeals.js +112 -0
  241. package/dist/apps/shared/components/mail/writableMailboxes.d.ts +15 -0
  242. package/dist/apps/shared/components/mail/writableMailboxes.js +87 -0
  243. package/dist/apps/shared/components/rules/RuleBuilder.d.ts +70 -0
  244. package/dist/apps/shared/components/rules/RuleBuilder.js +34 -6
  245. package/dist/apps/shared/components/settings/layout/SettingsShell.d.ts +41 -0
  246. package/dist/apps/shared/components/settings/layout/SettingsShell.js +19 -9
  247. package/dist/apps/shared/components/tasks/TasksSidebar.d.ts +41 -0
  248. package/dist/apps/shared/components/tasks/TasksToolbar.d.ts +14 -0
  249. package/dist/apps/shared/components/tasks/layout/TasksShell.d.ts +24 -0
  250. package/dist/apps/shared/components/tasks/layout/TasksShell.js +2 -2
  251. package/dist/apps/shared/mail/findWellKnownFolderUid.d.ts +5 -0
  252. package/dist/apps/shared/mail/listAllPages.d.ts +17 -0
  253. package/dist/apps/shared/mail/listAllPages.js +25 -0
  254. package/dist/apps/shared/plugins/pluginNav.d.ts +39 -0
  255. package/dist/apps/shared/plugins/pluginNav.js +33 -0
  256. package/dist/apps/shared/search/LocalIndexLifecycle.d.ts +13 -0
  257. package/dist/apps/shared/search/LocalIndexLifecycle.js +58 -54
  258. package/dist/apps/shared/search/localIndexBlockCipher.d.ts +36 -0
  259. package/dist/apps/shared/search/localIndexBuilder.d.ts +85 -0
  260. package/dist/apps/shared/search/localIndexBuilder.js +292 -37
  261. package/dist/apps/shared/search/localIndexKey.d.ts +4 -0
  262. package/dist/apps/shared/search/localIndexRpcClient.d.ts +71 -0
  263. package/dist/apps/shared/search/localIndexRpcClient.js +191 -26
  264. package/dist/apps/shared/search/localIndexSchema.d.ts +111 -0
  265. package/dist/apps/shared/search/localIndexSchema.js +12 -6
  266. package/dist/apps/shared/search/localIndexSizePreference.d.ts +27 -0
  267. package/dist/apps/shared/search/localIndexStorage.d.ts +28 -0
  268. package/dist/apps/shared/search/localIndexStorage.js +86 -0
  269. package/dist/apps/shared/search/localIndexVFS.d.ts +101 -0
  270. package/dist/apps/shared/search/localIndexVFS.js +68 -40
  271. package/dist/apps/shared/search/localIndexWorker.d.ts +145 -0
  272. package/dist/apps/shared/search/localIndexWorker.js +519 -173
  273. package/dist/apps/shared/search/searchTier2.d.ts +30 -0
  274. package/dist/apps/www/_404.d.ts +2 -0
  275. package/dist/apps/www/_500.d.ts +2 -0
  276. package/dist/apps/www/_layout.d.ts +14 -0
  277. package/dist/apps/www/calendar/index.d.ts +3 -0
  278. package/dist/apps/www/calendar/index.js +28 -10
  279. package/dist/apps/www/contacts/[uid].d.ts +13 -0
  280. package/dist/apps/www/contacts/[uid].js +13 -2
  281. package/dist/apps/www/contacts/index.d.ts +3 -0
  282. package/dist/apps/www/contacts/index.js +80 -10
  283. package/dist/apps/www/index.d.ts +3 -0
  284. package/dist/apps/www/index.js +339 -108
  285. package/dist/apps/www/messages/[uid].d.ts +11 -0
  286. package/dist/apps/www/messages/[uid].js +18 -6
  287. package/dist/apps/www/settings/auto-reply/index.d.ts +4 -0
  288. package/dist/apps/www/settings/auto-reply/index.js +9 -4
  289. package/dist/apps/www/settings/encryption/index.d.ts +7 -0
  290. package/dist/apps/www/settings/encryption/index.js +514 -97
  291. package/dist/apps/www/settings/filters/[uid].d.ts +8 -0
  292. package/dist/apps/www/settings/filters/[uid].js +22 -7
  293. package/dist/apps/www/settings/filters/_mailFilterRuleConfig.d.ts +11 -0
  294. package/dist/apps/www/settings/filters/index.d.ts +4 -0
  295. package/dist/apps/www/settings/filters/new/index.d.ts +4 -0
  296. package/dist/apps/www/settings/filters/new/index.js +8 -2
  297. package/dist/apps/www/settings/focused-inbox/index.d.ts +4 -0
  298. package/dist/apps/www/settings/focused-inbox/index.js +3 -1
  299. package/dist/apps/www/settings/labels/index.d.ts +4 -0
  300. package/dist/apps/www/settings/privacy/index.d.ts +4 -0
  301. package/dist/apps/www/settings/privacy/index.js +57 -22
  302. package/dist/apps/www/settings/read-receipts/index.d.ts +4 -0
  303. package/dist/apps/www/settings/read-receipts/index.js +10 -3
  304. package/dist/apps/www/settings/sharing/index.d.ts +4 -0
  305. package/dist/apps/www/settings/sharing/index.js +7 -11
  306. package/dist/apps/www/settings/signatures/[uid].d.ts +8 -0
  307. package/dist/apps/www/settings/signatures/index.d.ts +4 -0
  308. package/dist/apps/www/settings/signatures/new/index.d.ts +4 -0
  309. package/dist/apps/www/settings/signatures/signatureDefaults.d.ts +10 -0
  310. package/dist/apps/www/tasks/index.d.ts +3 -0
  311. package/dist/apps/www/tasks/index.js +50 -10
  312. package/package.json +3 -3
  313. package/apps/shared/components/booking/AvailabilityEditor.tsx +0 -118
  314. package/apps/www/settings/booking-types/[uid].tsx +0 -300
  315. package/apps/www/settings/booking-types/index.tsx +0 -98
  316. package/apps/www/settings/booking-types/new/index.tsx +0 -212
  317. package/dist/apps/shared/components/booking/AvailabilityEditor.js +0 -45
  318. package/dist/apps/www/settings/booking-types/[uid].js +0 -129
  319. package/dist/apps/www/settings/booking-types/index.js +0 -29
  320. package/dist/apps/www/settings/booking-types/new/index.js +0 -86
@@ -3,74 +3,78 @@
3
3
  // SPDX-License-Identifier: MPL-2.0
4
4
  ///////////////////////////////////////////////////////////////////////////////
5
5
  /**
6
- * Mounts the Tier 2 local index's lifecycle for one mailbox: starts the background build once it's
7
- * unlocked, and destroys the index on the same events that destroy the unlocked keys themselves (spec
8
- * §11 "MUST be destroyed on the same events that destroy private keys: explicit logout, session
9
- * revocation, and the configurable idle timeout").
6
+ * Mounts the Tier 2 local index's lifecycle: starts the background build for the active mailbox once it's
7
+ * unlocked, and destroys an index on the same events that destroy that mailbox's unlocked keys (spec §11
8
+ * "MUST be destroyed on the same events that destroy private keys: explicit logout, session revocation,
9
+ * and the configurable idle timeout").
10
10
  *
11
11
  * **Why polling, not hooking the existing destroy call sites directly**: `destroyUnlockedKeys()`
12
- * (`react-shared/src/crypto/keySession.ts`) has no observer/callback hook, and its own two real call
13
- * sites are `useIdleKeyTimeout.ts` (in `react-shared`, not this repo) and the manual "Destroy keys now"
14
- * button in Settings - editing the former would mean a react-shared source change that (per this
15
- * session's own earlier finding) doesn't reach `web-client` without a package republish + patch refresh
16
- * cycle, which is out of scope for wiring up a destroy signal. Watching `getUnlockedKeys()` for a
17
- * present-to-absent transition instead catches *every* destroy path uniformly - idle timeout, the manual
12
+ * (`react-shared/src/crypto/keySession.ts`) has no observer/callback hook. Watching `getUnlockedKeys()`
13
+ * for a present-to-absent transition catches *every* destroy path uniformly - idle timeout, the manual
18
14
  * button, or anything else that calls it - without needing to know which one fired.
19
15
  *
20
- * **Explicit logout is the one gap this polling doesn't reliably cover**: `AppShell.tsx`'s sign-out
21
- * navigates away immediately, which may not leave time for a poll tick to fire first. That case is
22
- * handled separately, directly in `AppShell.tsx`, via `destroyAllLocalIndexes()` - see that call site's
23
- * own comment.
16
+ * Every mailbox this component has seen unlocked is tracked for the life of the mount - not just whichever
17
+ * is active right now - so switching mailboxes (or a folders-list refresh re-running the build effect)
18
+ * can never lose a pending unlocked-to-locked transition for a mailbox whose index was already built.
19
+ *
20
+ * **Explicit logout** navigates away immediately, which may not leave time for a poll tick - `AppShell.tsx`
21
+ * handles that case itself via `destroyAllLocalIndexes()`.
24
22
  */
25
23
  import { useEffect, useRef } from "react";
26
24
  import { getUnlockedKeys } from "@rapidmx/react-shared/crypto/keySession.js";
27
- import { buildLocalIndex } from "./localIndexBuilder.js";
28
- import { destroyLocalIndex } from "./localIndexRpcClient.js";
29
- const POLL_INTERVAL_MS = 5000;
30
- /** Renders nothing - pure side-effect component, mounted by `MailShell.tsx` (which is where a
31
- * `mailboxUid` is actually known; `AppShell.tsx` itself is mailbox-agnostic, shared by every app). Each
32
- * `buildLocalIndex()` call below omits its `windowConfig` argument deliberately - that leaves the byte
33
- * budget to its own default, which already resolves per-device (Web vs. Electron) and per-user
34
- * preference (Settings > Encryption) on its own; see `localIndexBuilder.ts`/`localIndexSizePreference.ts`
35
- * for how. */
36
- export default function LocalIndexLifecycle({ mailboxUid, folders }) {
37
- // Guards against re-triggering a build every time this component re-renders (e.g. on an unrelated
38
- // folders-list refresh) for a mailbox already built/building this session.
39
- const buildStartedForRef = useRef(undefined);
40
- const wasUnlockedRef = useRef(false);
41
- useEffect(() => {
42
- if (!mailboxUid || folders.length === 0) {
25
+ import { buildLocalIndex, cancelLocalIndexBuild } from "./localIndexBuilder.js";
26
+ import { destroyLocalIndex, pruneInaccessibleLocalIndexes } from "./localIndexRpcClient.js";
27
+ export const POLL_INTERVAL_MS = 5000;
28
+ /** Renders nothing - pure side-effect component, mounted by `MailShell.tsx`. */
29
+ export default function LocalIndexLifecycle({ mailboxUid, folders, accessibleMailboxUids }) {
30
+ // mailboxUid -> whether it was unlocked at the last check. An entry exists for every mailbox whose
31
+ // build this component started; only ever changed by a real observed transition, never reset by an
32
+ // effect re-run.
33
+ const trackedRef = useRef(new Map());
34
+ // The latest props, for the long-lived polling interval below.
35
+ const latestRef = useRef({ mailboxUid, folders });
36
+ latestRef.current = { mailboxUid, folders };
37
+ function startBuildIfUnlocked(targetMailboxUid, targetFolders) {
38
+ const unlocked = getUnlockedKeys(targetMailboxUid);
39
+ if (!unlocked || targetFolders.length === 0 || trackedRef.current.get(targetMailboxUid)) {
43
40
  return;
44
41
  }
45
- const unlocked = getUnlockedKeys(mailboxUid);
46
- wasUnlockedRef.current = !!unlocked;
47
- if (unlocked && buildStartedForRef.current !== mailboxUid) {
48
- buildStartedForRef.current = mailboxUid;
49
- // Never an unhandled rejection - a broken local index (Worker/WASM/OPFS unsupported or
50
- // unavailable, a corrupted store) is best-effort infrastructure, not a build the rest of the
51
- // app depends on. searchTier2.ts's own callers already degrade gracefully independent of
52
- // whether a build ever completed at all.
53
- buildLocalIndex(mailboxUid, unlocked, folders).catch(() => undefined);
42
+ trackedRef.current.set(targetMailboxUid, true);
43
+ // Never an unhandled rejection - a broken local index is best-effort infrastructure, not a build
44
+ // the rest of the app depends on.
45
+ buildLocalIndex(targetMailboxUid, unlocked, targetFolders).catch(() => undefined);
46
+ }
47
+ useEffect(() => {
48
+ if (mailboxUid) {
49
+ startBuildIfUnlocked(mailboxUid, folders);
54
50
  }
51
+ }, [mailboxUid, folders]);
52
+ useEffect(() => {
55
53
  const interval = setInterval(() => {
56
- const stillUnlocked = !!getUnlockedKeys(mailboxUid);
57
- if (wasUnlockedRef.current && !stillUnlocked) {
58
- // A present-to-absent transition: something just destroyed this mailbox's unlocked keys
59
- // (idle timeout or the manual "Destroy keys now" button - see this module's own doc
60
- // comment on why this is observed rather than hooked directly).
61
- void destroyLocalIndex(mailboxUid);
62
- buildStartedForRef.current = undefined;
54
+ for (const [trackedUid, wasUnlocked] of trackedRef.current) {
55
+ if (wasUnlocked && !getUnlockedKeys(trackedUid)) {
56
+ // A present-to-absent transition: something just destroyed this mailbox's keys.
57
+ trackedRef.current.set(trackedUid, false);
58
+ // Stop the pass still running with the now-destroyed keys; the destroy itself also makes
59
+ // the Worker reject anything that pass still sends.
60
+ void cancelLocalIndexBuild(trackedUid);
61
+ void destroyLocalIndex(trackedUid);
62
+ }
63
63
  }
64
- else if (!wasUnlockedRef.current && stillUnlocked && buildStartedForRef.current !== mailboxUid) {
65
- // The mailbox was re-unlocked this session (e.g. via ComposeWindow's or
66
- // MessageDetailPane's own on-demand unlock prompt) - start the build it missed the first
67
- // time around.
68
- buildStartedForRef.current = mailboxUid;
69
- buildLocalIndex(mailboxUid, getUnlockedKeys(mailboxUid), folders).catch(() => undefined);
64
+ // The active mailbox was (re-)unlocked since the last check, e.g. via an on-demand unlock prompt.
65
+ const { mailboxUid: activeUid, folders: activeFolders } = latestRef.current;
66
+ if (activeUid) {
67
+ startBuildIfUnlocked(activeUid, activeFolders);
70
68
  }
71
- wasUnlockedRef.current = stillUnlocked;
72
69
  }, POLL_INTERVAL_MS);
73
70
  return () => clearInterval(interval);
74
- }, [mailboxUid, folders]);
71
+ }, []);
72
+ // A stable string key so a re-render with an equal-but-new array doesn't re-scan OPFS.
73
+ const accessibleKey = accessibleMailboxUids && accessibleMailboxUids.length > 0 ? JSON.stringify([...accessibleMailboxUids].sort()) : "";
74
+ useEffect(() => {
75
+ if (accessibleKey) {
76
+ void pruneInaccessibleLocalIndexes(JSON.parse(accessibleKey));
77
+ }
78
+ }, [accessibleKey]);
75
79
  return null;
76
80
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * The actual AES-256-GCM block cipher `localIndexVFS.ts`'s `EncryptingVFS` uses to encrypt/decrypt one
3
+ * physical storage block - deliberately split out from that file so it can be exercised with real
4
+ * WebCrypto in a plain unit test, with no OPFS/Worker/wa-sqlite involved at all (none of those are
5
+ * available under Vitest's jsdom environment, matching the same "node" test environment convention
6
+ * `react-shared`'s other crypto modules already use for exactly this reason).
7
+ *
8
+ * See `localIndexVFS.ts`'s own doc comment for the full design rationale (page layout, why a fresh
9
+ * random nonce per write, why AAD binds to filename+block index). This module is pure mechanism; that
10
+ * one is where the design is explained.
11
+ */
12
+ /** The logical SQLite page size `EncryptingVFS` is designed for - MUST match the `PRAGMA page_size` the
13
+ * database was created with (`localIndexWorker.ts` sets this before the first write). */
14
+ export declare const LOGICAL_BLOCK_SIZE = 4096;
15
+ /** One physical block on disk: `nonce || ciphertext || tag`. */
16
+ export declare const PHYSICAL_BLOCK_SIZE: number;
17
+ /** Thrown when a stored block fails AES-GCM authentication - a wrong/rotated key, on-disk corruption, or
18
+ * a block moved to the wrong position (see `localIndexVFS.ts`'s doc comment on why AAD binds position).
19
+ * The worker's caller treats this identically to a schema-version mismatch: discard the whole index and
20
+ * rebuild (spec §11 "Invalidation"). */
21
+ export declare class PageCorruptedError extends Error {
22
+ /** The underlying `DOMException`/error `crypto.subtle.decrypt()` threw, or an inner-VFS read failure
23
+ * - kept as a plain field rather than the ES2022 `Error` constructor's `cause` option, since
24
+ * web-client's `tsconfig.json` targets ES2020. */
25
+ readonly cause: unknown;
26
+ constructor(filename: string, blockIndex: number, cause: unknown);
27
+ }
28
+ export declare function importAesGcmKey(rawKey: Uint8Array): Promise<CryptoKey>;
29
+ /** Encrypts one logical block (`plaintext`, exactly `LOGICAL_BLOCK_SIZE` bytes) into its physical,
30
+ * on-disk representation (`PHYSICAL_BLOCK_SIZE` bytes: a fresh random nonce followed by
31
+ * ciphertext+tag). */
32
+ export declare function encryptBlock(key: CryptoKey, filename: string, blockIndex: number, plaintext: Uint8Array): Promise<Uint8Array>;
33
+ /** Inverse of `encryptBlock()`. Throws `PageCorruptedError` (never a raw `DOMException`) on auth
34
+ * failure - a wrong key, tampered ciphertext, or a block swapped into the wrong position (caught by the
35
+ * position-bound AAD not matching). */
36
+ export declare function decryptBlock(key: CryptoKey, filename: string, blockIndex: number, physical: Uint8Array): Promise<Uint8Array>;
@@ -0,0 +1,85 @@
1
+ /**
2
+ * The Tier 2 local index's background builder (`specs/search.md` §11 "Initial build... incrementally,
3
+ * newest-first"). Runs on the main thread - the actual storage I/O and encryption happen in
4
+ * `localIndexWorker.ts` (off the UI thread, per that file's own doc comment); this module's own work is
5
+ * orchestration (deciding what to fetch) plus already-async fetch/decrypt calls, not CPU-heavy work that
6
+ * would itself need to move off-thread.
7
+ *
8
+ * **Known scoping simplification**: walks the mailbox's real mail folders one at a time (a fixed,
9
+ * reasonable priority order - Inbox and Sent first), each already newest-first via `listMessages()`'s own
10
+ * default sort, rather than a true interleaved k-way merge producing one single globally-newest-first
11
+ * stream across folders. A message in, say, Sent slightly older than the *oldest-processed-so-far*
12
+ * message in Inbox can therefore be indexed slightly out of true global date order relative to it. Given
13
+ * the byte-budget eviction below is itself date-based (oldest `date_for_sort` first, enforced by
14
+ * `localIndexWorker.ts`'s own `applyEviction()` after every insert - see that file), a small amount of
15
+ * cross-folder interleaving imprecision here does not affect *what* ultimately survives the window, only
16
+ * the exact order entities are inserted (and therefore briefly evicted-and-reinserted) in.
17
+ *
18
+ * Only encrypted messages (`subject === "[...]"`) are indexed - see `ENCRYPTED_SUBJECT_PLACEHOLDER`'s
19
+ * own precedent in `apps/www/index.tsx`'s inbox-list decrypt work. An unencrypted message is already
20
+ * fully searchable via Tier 1; indexing it here too would spend this index's bounded byte budget on
21
+ * content that didn't need it.
22
+ *
23
+ * **Verification seals.** A message this pass decrypts that has no seal for the vault's current `masterKeyGeneration` is
24
+ * evaluated with `evaluateMessageSecurityWithSeal()`, against the sender's pinned signing keys from the reader's
25
+ * contacts (`pinnedSigners.ts`, the message pane's own source, looked up once per sender per pass), so a verified
26
+ * message gets its seal without being opened (see `apps/shared/components/mail/verificationSeals.ts`). Pins only change
27
+ * the security state, never the recovered subject or body this index stores. Seal writes are best effort and bounded:
28
+ * at most `SEAL_WRITE_CONCURRENCY` in flight, at most `MAX_SEAL_WRITES_PER_PASS` per pass (past it, messages are
29
+ * evaluated without seals), failures ignored, and nothing new starts once the pass is aborted or its keys are destroyed.
30
+ * A seal carries only a hash, fingerprint, state and time, never plaintext. With no readable vault generation the pass
31
+ * seals nothing. Signed-only (unencrypted) messages aren't sealed here: this pass never fetches their raw MIME (see
32
+ * above), and fetching it only to seal would cost a download per message; they are sealed when opened.
33
+ */
34
+ import { type Folder } from "@rapidmx/react-shared/mail/mailApi.js";
35
+ import type { UnlockedKeys } from "@rapidmx/react-shared/crypto/keySession.js";
36
+ /** §11's Window Sizing table's time-floor column - explicitly unvalidated starting-point default per the
37
+ * spec's own §16 "Measurement Task" ("cannot be supplied by design work... MUST NOT be treated as
38
+ * validated"). Used as-is rather than invented/adjusted here. Not user-adjustable today (unlike the byte
39
+ * budget - see `localIndexSizePreference.ts`) - nothing in this codebase has asked for that yet. */
40
+ export declare const WEB_TIME_FLOOR_MONTHS = 12;
41
+ /** Either bound as `0` means "no limit": `applyEviction()` (`localIndexWorker.ts`) already treats a
42
+ * falsy byte budget as unconfigured/unenforced, and `buildLocalIndex()` below mirrors that same
43
+ * convention for `timeFloorMonths` so a single `0` means the same thing in both dimensions. */
44
+ export interface LocalIndexWindowConfig {
45
+ timeFloorMonths: number;
46
+ byteBudgetBytes: number;
47
+ }
48
+ /** How many times a pass walks a folder whose total count changed during the walk. `listMessages()` only
49
+ * pages by offset, so a message removed from an already-walked page shifts a later one onto it unseen;
50
+ * only a folder whose count held steady across a whole walk is trusted for completeness and pruning. */
51
+ export declare const MAX_WALK_ATTEMPTS = 3;
52
+ /** Subtracted from the pass's start time before it's recorded as the end of guaranteed coverage - a
53
+ * message's server-assigned `receivedDate` can be ahead of this device's clock. */
54
+ export declare const CLOCK_SKEW_MARGIN_MS: number;
55
+ /** How many raw-MIME fetch+decrypt calls run at once - a page of 100 encrypted messages used to fire all
56
+ * 100 requests simultaneously. */
57
+ export declare const FETCH_CONCURRENCY = 6;
58
+ /** How many verification seal writes run at once during a pass. */
59
+ export declare const SEAL_WRITE_CONCURRENCY = 2;
60
+ /** The most verification seals one pass writes. */
61
+ export declare const MAX_SEAL_WRITES_PER_PASS = 200;
62
+ /** Runs one full incremental build pass for `mailboxUid`: sets the window, walks mail folders newest-first
63
+ * (per this module's own doc comment on the folder-order simplification), decrypts and indexes only
64
+ * `"[...]"`-subject messages until each folder's own coverage passes the time floor, then clears the
65
+ * `building` flag. Messages already indexed at the same version are skipped, fetches run at most
66
+ * `FETCH_CONCURRENCY` at a time, and messages older than the eviction watermark (`WindowState.evictedBefore`)
67
+ * are neither fetched nor walked past. A failure partway through leaves whatever was indexed so far in place
68
+ * and records the pass as incomplete (spec §11's "incomplete-index UX... MUST indicate that coverage is
69
+ * partial" - see `Coverage.complete`). Rows the server no longer lists (deleted or moved elsewhere by any
70
+ * client) are pruned only within folders whose count held steady for a whole walk (see `MAX_WALK_ATTEMPTS`).
71
+ *
72
+ * Only one pass runs per mailbox (a newer call cancels the older), and every Worker call carries this pass's
73
+ * generation, so a pass outlived by a destroy can't write anything (see `cancelLocalIndexBuild()`).
74
+ *
75
+ * `windowConfig` defaults to this device's own configured byte budget (`getLocalIndexByteBudget()` -
76
+ * 500 MB in a browser tab, 1 GB in Electron, or whatever the user has since set in Settings > Encryption)
77
+ * alongside the fixed time floor above. Evaluated fresh on every call with no explicit override, so a
78
+ * preference change in Settings takes effect starting with this mailbox's next build pass (its next
79
+ * unlock), without requiring a reload.
80
+ */
81
+ export declare function buildLocalIndex(mailboxUid: string, unlocked: UnlockedKeys, folders: Folder[], windowConfig?: LocalIndexWindowConfig): Promise<void>;
82
+ /** Stops a mailbox's running build pass, if any (e.g. its keys were just destroyed), resolving once it has
83
+ * wound down. The Worker independently rejects the pass's later calls once the index is destroyed (see
84
+ * `GenerationParams`); this just stops the fetching and decrypting too. Never rejects. */
85
+ export declare function cancelLocalIndexBuild(mailboxUid: string): Promise<void>;