feat: reply + search + forward + archive/mute + error boundary
Messages: - Reply-to: hover action, composer chip with cancel, quote bubble inside the replying message with tap-to-jump + amber highlight ring - Search: header search button toggles in-conversation search bar with prev/next + match counter, auto-jump to active match - Forward: multi-select conversation picker. Attachments are now carried over: download + decrypt source, re-encrypt under each target conv-key, re-upload with fresh per-attachment keys, insert new attachment rows Conversations: - Archive + mute per member. New migration 20260420000001 adds `archived` + `muted_until` on conversation_members. Shared helpers: setConversationArchived / setConversationMutedUntil / isConversationMuted - ChatsPage: archive toggle in header with unread badge for archived bucket, split active/archived lists, muted indicator (BellOff icon, dimmed unread badge) - ConversationRowMenu via createPortal (escapes sidebar overflow clip), forwardRef-based MenuItem so submenu positioning refs survive React 18 - ConversationsContext: suppresses notification sound + OS notif when target conversation is muted - Refresh on `profiles UPDATE` realtime so peer avatar / displayName changes flow to conversation.members without manual refresh Resilience: - ErrorBoundary (Discord-style): centred spinner + escalating copy, no manual reload button. Backoff retry schedule [2s, 4s, 8s, 15s, 30s]. Uses a keyed Fragment (not a div wrapper) so flex h-full chains survive - App wrapped root + per-route RouteBoundary, conversation-level boundary - AuthContext: flip `ready` immediately on cached session read; validate getUser in background so a stalled/offline Supabase doesn't freeze the app on the loading spinner Crypto: - Swap libsodium-wrappers -> libsodium-wrappers-sumo (compact build was missing crypto_pwhash so Argon2id vault KDF threw, falling back to plaintext localStorage on every launch) - Shim d.ts for sumo types (sumo is API superset, no official types ship) - vite optimizeDeps includes sumo with the "require" condition - secureFileStore: exists(dir) check before mkdir; surface genuine permission errors instead of silent catch Tauri: - fs scope adds `$APPLOCALDATA` direct entry (not just /**) so the app data directory itself can be mkdir'd on first launch Chat layout: - Skip call_event messages when computing avatar run boundaries so a regular bubble followed by a call event from the same sender still shows its avatar
This commit is contained in:
Generated
+24
-1
@@ -86,7 +86,7 @@ importers:
|
||||
i18next:
|
||||
specifier: ^23.16.4
|
||||
version: 23.16.8
|
||||
libsodium-wrappers:
|
||||
libsodium-wrappers-sumo:
|
||||
specifier: 0.7.15
|
||||
version: 0.7.15
|
||||
livekit-client:
|
||||
@@ -114,6 +114,9 @@ importers:
|
||||
'@types/libsodium-wrappers':
|
||||
specifier: ^0.7.14
|
||||
version: 0.7.14
|
||||
'@types/libsodium-wrappers-sumo':
|
||||
specifier: ^0.8.2
|
||||
version: 0.8.2
|
||||
'@types/react':
|
||||
specifier: ^18.3.12
|
||||
version: 18.3.28
|
||||
@@ -1853,6 +1856,10 @@ packages:
|
||||
'@types/json5@0.0.29':
|
||||
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
|
||||
|
||||
'@types/libsodium-wrappers-sumo@0.8.2':
|
||||
resolution: {integrity: sha512-uFOBpg/r21hExVlh2ty8YpDfSR+Yy3Jn8XS4+SSjitbhTxdYq+pBz/49XRxyUFe8SzqujHf/Wu0/O4d+FUtNfQ==}
|
||||
deprecated: This is a stub types definition. libsodium-wrappers-sumo provides its own type definitions, so you do not need this installed.
|
||||
|
||||
'@types/libsodium-wrappers@0.7.14':
|
||||
resolution: {integrity: sha512-5Kv68fXuXK0iDuUir1WPGw2R9fOZUlYlSAa0ztMcL0s0BfIDTqg9GXz8K30VJpPP3sxWhbolnQma2x+/TfkzDQ==}
|
||||
|
||||
@@ -3642,9 +3649,15 @@ packages:
|
||||
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
|
||||
engines: {node: '>= 0.8.0'}
|
||||
|
||||
libsodium-sumo@0.7.16:
|
||||
resolution: {integrity: sha512-x6atrz2AdXCJg6G709x9W9TTJRI6/0NcL5dD0l5GGVqNE48UJmDsjO4RUWYTeyXXUpg+NXZ2SHECaZnFRYzwGA==}
|
||||
|
||||
libsodium-sumo@0.8.3:
|
||||
resolution: {integrity: sha512-z5CLkGJqilCXpfYxrXWh8fHVv2C8lpnIVxsZAHkxbEFyS+zZtL8VyM8FjtAmuDYP/rHgw8ftdwxSV8Efhzb8GQ==}
|
||||
|
||||
libsodium-wrappers-sumo@0.7.15:
|
||||
resolution: {integrity: sha512-aSWY8wKDZh5TC7rMvEdTHoyppVq/1dTSAeAR7H6pzd6QRT3vQWcT5pGwCotLcpPEOLXX6VvqihSPkpEhYAjANA==}
|
||||
|
||||
libsodium-wrappers-sumo@0.8.3:
|
||||
resolution: {integrity: sha512-EfLSlxKJ7RUGVospOlvbvse0suAAVPR+CkZfFcFjPzPtTEgVfvIaZUPsWndVjxYp/om2HDc0iLeR5wLF8YbHZg==}
|
||||
|
||||
@@ -7492,6 +7505,10 @@ snapshots:
|
||||
|
||||
'@types/json5@0.0.29': {}
|
||||
|
||||
'@types/libsodium-wrappers-sumo@0.8.2':
|
||||
dependencies:
|
||||
libsodium-wrappers-sumo: 0.7.15
|
||||
|
||||
'@types/libsodium-wrappers@0.7.14': {}
|
||||
|
||||
'@types/node-forge@1.3.14':
|
||||
@@ -9591,8 +9608,14 @@ snapshots:
|
||||
prelude-ls: 1.2.1
|
||||
type-check: 0.4.0
|
||||
|
||||
libsodium-sumo@0.7.16: {}
|
||||
|
||||
libsodium-sumo@0.8.3: {}
|
||||
|
||||
libsodium-wrappers-sumo@0.7.15:
|
||||
dependencies:
|
||||
libsodium-sumo: 0.7.16
|
||||
|
||||
libsodium-wrappers-sumo@0.8.3:
|
||||
dependencies:
|
||||
libsodium-sumo: 0.8.3
|
||||
|
||||
Reference in New Issue
Block a user