Commit Graph
510 Commits
Author SHA1 Message Date
Jannis Braun a9d330f013 fix(federation): normalize federated username display across UI
Use parseFederatedUsername() consistently to show base username instead
of raw user@domain format. Replace inline domain text in Username
component with compact globe icon + tooltip. Add globe icons to DM
header and sidebar for federated users.
2026-03-27 02:23:04 +01:00
Jannis Braun 660505b954 feat(federation): use isSelf and identity objects in AddDmMemberModal
Replace myUserId with full myUser object so isSelf() can handle cross-instance
identity matching when finding the other 1-on-1 DM member. Pass GroupDmUserIdentity
objects (id, homeUserId, homeInstance) to api.dm.createGroup instead of raw id strings.
2026-03-26 23:18:23 +01:00
Jannis Braun bf8fc589f9 fix(dm): populate store before navigating to new group DM
addDmChannel must be called before navigate() so the route effect
finds the channel in the store immediately. Without this, the chat
view renders empty until the WS dm_channel_created event arrives.
Also show an error instead of silently returning when otherMember
cannot be determined.
2026-03-26 22:36:21 +01:00
Jannis Braun be20f23500 feat(frontend): add createGroup API method and update AddDmMemberModal branching
- Add CreateGroupDmRequest to API client imports, type declaration, and implementation (POST /dm/group)
- Update AddDmMemberModal to branch on channel type: 1-on-1 DMs call createGroup and navigate to new channel, group DMs call addMember directly
- Remove legacy getApiForOrigin/channelOriginMap usage — S2S federation relay is now entirely server-side
2026-03-26 22:32:30 +01:00
Jannis Braun 6a83b6c6a5 fix(federation): compute relay targets before member deletion in leave handler
getGroupDmTargetOrigins() was called after the leaving user's dm_members row
was deleted, causing their instance to be excluded from member_remove and
ownership_transfer relay fan-out if they were the only member from that peer.
Move the target origins and leaving user lookups to before the deletion.
2026-03-26 20:19:55 +01:00
Jannis Braun 44de9b6f41 feat(federation): add client peering integration, transparency indicator, and admin federation settings
Task 13: Hook server-to-server peering into connectToRemote (non-fatal)
and add federation API namespace to the client (initiate, peers, revoke).

Task 14: Show a transparency notice in the DM welcome header when the
other user is on a remote instance, informing that messages are stored
on both home instances and are not end-to-end encrypted.

Task 15: Add Federation section to the instance settings General panel
with DM relay toggle, TTL config, and a live peer list with revoke
buttons. Also extends InstanceAdminSettings type and the server settings
route to support federationRelayEnabled / federationRelayTtlDays.
2026-03-25 21:47:10 +01:00
Jannis Braun a1363a1ab3 fix: match GIF-only message size to standard media constraints
GIFs from Klipy were capped at 250×250px while all other visual media
(attachments, image embeds) used 400×300px. Unified to 400×300px.
2026-03-25 14:42:27 +01:00
Jannis Braun f7fa7371d6 fix: hide Open Original when sourceUrl is present to avoid redundancy 2026-03-25 05:13:14 +01:00
Jannis Braun e0d45da97c refactor: skip imageEmbedSourceUrl computation when isGifOnly is true 2026-03-25 05:05:49 +01:00
Jannis Braun 4fd72cd29b fix: remove redundant !isEditing guard in image-embed-only branch 2026-03-25 05:02:38 +01:00
Jannis Braun 001d45da2b feat: suppress URL text for image-only messages, add sourceUrl to context menu 2026-03-25 04:59:53 +01:00
Jannis Braun 5c45a55ef7 fix: add clipboard error handling for Copy Link context menu item 2026-03-25 04:58:27 +01:00
Jannis Braun d1fad2b262 feat: add sourceUrl param to context menu with Copy Link and Open Link items 2026-03-25 04:55:44 +01:00
Jannis Braun f433093777 fix: remove 150px threshold from scroll observers
The dist < 150 check caused the ResizeObserver and media load
listener to miss large layout shifts (e.g., GIF loading adding
400+ px of height). The isAtBottomRef gate already determines
whether to auto-scroll — the pixel threshold is redundant.
2026-03-25 04:50:24 +01:00
Jannis Braun f0104d19b7 feat: conditionally show bitrate slider based on instance allowCustomBitrate 2026-03-25 04:09:18 +01:00
Jannis Braun 3627974ba1 feat: add Allow Custom Bitrate toggle to admin streaming panel 2026-03-25 04:08:10 +01:00
Jannis Braun c60fb5af6d fix: resolve chat scroll race condition on channel open
Remove isAtBottom state from scroll effect deps to break the
re-triggering feedback loop. Use isAtBottomRef (ref) instead.
Gate ResizeObserver and media load effects behind the ref so
they only auto-scroll after the initial snap completes.
2026-03-25 04:03:14 +01:00
Jannis Braun dae6f2d518 fix: remove forced 4/3 aspect ratio and dark background from image containers
Images now size naturally within max constraints instead of being
letterboxed into a 4/3 bg-surface-input container. Fixes dark bars
on GIFs and images whose aspect ratio doesn't match 4/3.
2026-03-25 03:37:18 +01:00
Jannis Braun aeb4ea6e1d fix: exclude embed thumbnails from image context menu actions
Add data-embed-thumbnail marker to VideoEmbed, GenericEmbed, and
RichEmbed thumbnail containers. Update detection logic to skip
these alongside avatars. Also remove redundant filename derivation
in Save Image menu item.
2026-03-25 03:23:23 +01:00
Jannis Braun 4ea319646a feat: add save/copy buttons to image preview modal 2026-03-25 03:19:17 +01:00
Jannis Braun 97f0ebc915 feat: add image actions to message context menu
Detect right-clicked images in handleContextMenu and prepend
Save Image, Copy Image, and Open Original to the custom menu.
Avatars are excluded via the data-avatar semantic marker.
2026-03-25 03:13:58 +01:00
Jannis Braun 74939f045f feat: add data-avatar attribute for image context menu exclusion 2026-03-25 03:10:37 +01:00
Jannis Braun 78555a43f8 fix(voice): stabilize grid layout across focus-mode and fullscreen transitions
Refactor useGridLayout from RefObject to callback-ref API so the
ResizeObserver reattaches when the grid container remounts after
focus-mode toggle. Fixes tiles rendering at stale fullscreen dimensions
on 4:3 monitors.

Also clamp focus-mode participant strip height (max-h-[20vh] min-h-[80px])
to prevent it from crowding the focused stream on short viewports.
2026-03-25 03:08:45 +01:00
Jannis Braun d59ec4abf2 Merge branch 'feature/unified-friend-search' 2026-03-25 02:07:29 +01:00
Jannis Braun 277b69a732 test(friends): update tests for unified friend search UI
Replace old "Add Friend" form tests (placeholder/button/inline messages) with
new tests for the Find People panel: search input, Direct Add row, toast feedback,
and searchUsers debounce. Also fix ancillary mocks (discoverStore, authStore,
activityStore, ConnectInstanceModal, findExistingDmForUser) required by the
rewritten component.
2026-03-25 02:06:01 +01:00
Jannis Braun a9266a3ad8 feat(friends): rewrite AddFriendTab with unified search
Replace the two separate inputs (direct add + discover search) with a
single unified search field. When the user types, results come from
socialStore.searchUsers() across all connected instances. When empty,
the discover grid is shown as before. A user@instance pattern surfaces
a Direct Add action row for sending friend requests to federated users.

Parent FriendsPage no longer owns add-friend state — it all lives inside
AddFriendTab now, keeping the component self-contained.
2026-03-25 02:01:44 +01:00
Jannis Braun 30c3b9b352 fix(web): add aspect-ratio fallback for markdown inline images 2026-03-25 01:56:33 +01:00
Jannis Braun 970af77169 refactor(friends): extract onRelationshipChange prop from UserDiscoverCard 2026-03-25 01:56:25 +01:00
Jannis Braun 995c71367e fix(web): add aspect-ratio fallback for bare GIF URL messages 2026-03-25 01:56:08 +01:00
Jannis Braun 234ee9cd23 fix(web): add 16:9 aspect-ratio reservation to direct video embeds 2026-03-25 01:55:41 +01:00
Jannis Braun b96c16b622 fix(web): add dimension reservation to ImageEmbed component 2026-03-25 01:55:12 +01:00
Jannis Braun 38ffc214f0 test(context-menu): add tests for reactive checkbox behavior 2026-03-24 21:53:46 +01:00
Jannis Braun 0d91df166a fix(context-menu): update all checkbox call sites to reactive subscribe+getChecked 2026-03-24 21:48:26 +01:00
Jannis Braun 7a25a2df7b feat(context-menu): add ReactiveCheckboxItem with useSyncExternalStore 2026-03-24 21:47:52 +01:00
Jannis Braun 8910de3053 feat(voice): add cachedUser carry-forward to ParticipantInfo
Extends ParticipantInfo with cachedUser: User | null. In updateParticipants,
snapshots the previous participant list and carries forward the cached User
object when spaceStore member lookup fails (user navigated to a different
space). Local user falls back to authStore. homeUserId is now derived from
cachedUser when the direct member lookup misses. Updates EMPTY_PARTICIPANT
in PictureInPicture.tsx.
2026-03-24 19:01:34 +01:00
Jannis Braun 52c93ae0c5 chore: clean up review feedback — consolidate imports, fix reconnect verb, DRY username 2026-03-24 18:42:45 +01:00
Jannis Braun a97dc95877 feat: wire ConnectInstanceModal into discover people cards 2026-03-24 18:38:36 +01:00
Jannis Braun 0dc5e8f8f4 feat: wire ConnectInstanceModal into FriendsPage add-friend input 2026-03-24 18:37:17 +01:00
Jannis Braun 13485bc20a feat: wire ConnectInstanceModal into UserProfileModal friend actions
InstanceNotConnectedError and InstanceDisconnectedError now open the
ConnectInstanceModal instead of being swallowed silently. After the user
connects/reconnects, the friend request is retried automatically and a
success toast confirms both the connection and the sent request. All
other friend action errors (remove, cancel, accept, decline) now surface
as warning toasts instead of being silently discarded.
2026-03-24 18:35:29 +01:00
Jannis Braun 19bae17730 feat: add ConnectInstanceModal for federation friend connect flow 2026-03-24 18:33:51 +01:00
Jannis Braun 8c2e20165a feat: rename codec buttons to Standard/NVIDIA · Apple with codec subtitles 2026-03-24 16:41:23 +01:00
Jannis Braun b6e8aee24b fix: cap markdown images to 400x300 2026-03-24 05:16:56 +01:00
Jannis Braun 7e9020f5a6 fix: cap all embed types to 400px max-width 2026-03-24 05:16:31 +01:00
Jannis Braun e64658bdd5 fix: cap image and video attachments to 400x300 2026-03-24 05:15:51 +01:00
Jannis Braun acb79c9de7 fix: cap GIF-only messages to 250x250 2026-03-24 05:15:10 +01:00
Jannis Braun cc30080ba8 chore: sync repo with deployed state — clean up old specs/plans, desktop tweaks 2026-03-24 04:33:23 +01:00
Jannis Braun c6c44d1bdd feat: replace codec pills with VP9/H.264 HW, wire to hwOverdrive 2026-03-24 03:51:22 +01:00
Jannis Braun e53d3bcb98 fix: switch backup codec to VP8@30fps, dim H.264 pill with warning
- Backup codec changed from H.264 (OpenH264, slow) to VP8 (libvpx,
  fast) — same encoder family as VP9, lower dual-encode overhead
- Backup capped at 30fps with proportional bitrate to keep CPU
  overhead low during SIMULCAST dual-encoding
- H.264 pill visually dimmed with amber warning when selected
2026-03-24 01:14:47 +01:00
Jannis Braun a54dd9084a feat: show encoder implementation in Connection Info, VP9 recommended hint
- Connection Info now shows encoder impl (e.g. libvpx, OpenH264,
  ExternalEncoder) on send-side video tracks alongside quality
  limitation reason
- Amber warning "VP9 is recommended" when H.264 is selected
2026-03-24 01:06:19 +01:00
Jannis Braun 65a1fc1402 fix: VP9 default for both modes, clean up codec pill UI
VP9 empirically outperforms H.264 in gaming (Chrome may not use
NVENC for screen share H.264). Codec pills now match other pill
styles — simple labels, no description text. Mode change no longer
auto-switches codec; user's codec choice is independent.
2026-03-24 00:59:04 +01:00