Commit Graph
1392 Commits
Author SHA1 Message Date
Jannis Braun f02cb4e52a feat: add allow_custom_bitrate column to instance_settings schema and migration 2026-03-25 04:05:43 +01:00
Jannis Braun 35573c9f37 feat: add allowCustomBitrate to InstanceStreamingLimits shared type 2026-03-25 04:05:40 +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 c255b0066a fix: copy GIF URLs as text to preserve animation
PNG conversion strips GIF animation. GIFs are now detected by URL
pattern (.gif extension or Tenor/Klipy CDN) and copied as URL text
instead, so pasting back into chat re-renders the animated GIF.
2026-03-25 03:28:00 +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 91ffbb5d0a fix: add noopener to window.open fallback in saveImage 2026-03-25 03:15:54 +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 6bd2100e04 feat: add saveImage and copyImageToClipboard utilities
Implements image save/download (blob fetch + anchor trigger, fallback to window.open)
and clipboard copy (PNG write via ClipboardItem, fallback to URL text copy) with
toast feedback. Also adds ClipboardItem polyfill and Response.blob() content-type
fix to the jsdom test setup so the clipboard test suite runs correctly.
2026-03-25 03:09:51 +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 7240aac2e0 fix(social): allow single-char search and prefer native federated profiles
Lower minimum query length from 2 to 1 character so single-letter
searches return results.

Fix dedup to prefer native profiles (homeUserId=null) over replicated
ones. Previously the first-seen result won, which was usually the
local replicated profile (no instance badge, namespaced username).
Now when a native profile is found on the remote instance, it replaces
the replicated copy — showing the clean username with the instance badge.
2026-03-25 02:26:33 +01:00
Jannis Braun f0e72dc257 fix(social): deduplicate federated search results by canonical identity
Replicated profiles on remote instances have different local IDs but
share the same homeUserId as the native profile. Use homeUserId ?? id
as the dedup key so the same person only appears once. Home instance
is queried first, so the native profile (with clean username) wins.
2026-03-25 02:19:51 +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 4e170f0b69 feat(social): add TaggedUser type and origin-tag searchUsers results 2026-03-25 01:54:36 +01:00
Jannis Braun 123e40bb9a feat(server): populate embed width/height from OG tags and image probing 2026-03-25 01:53:39 +01:00
Jannis Braun bbb2c8bd19 feat(server): extract og:image:width/height from HTML metadata 2026-03-25 01:51:31 +01:00
Jannis Braun 2f883c6f63 refactor(server): extract SSRF validation into shared ssrf.ts utility 2026-03-25 01:48:18 +01:00
Jannis Braun d9094fabe1 feat(ws): re-push activities on new instance connections
When a WS connection receives its ready event, push cached myActivities
to that instance so federated users see activities immediately without
waiting for the next debounce cycle.
2026-03-24 22:00:28 +01:00
Jannis Braun 9705304be9 feat(activity): fan out activity updates to all connected instances
Switch pushActivities and setShowActivity from wsSend (home-only) to
wsSendAll (all instances). Add myActivities cache for re-push on late
connections.
2026-03-24 21:55:45 +01:00
Jannis Braun 38ffc214f0 test(context-menu): add tests for reactive checkbox behavior 2026-03-24 21:53:46 +01:00
Jannis Braun 7f4f40a1e5 feat(ws): add wsSendAll utility for multi-instance broadcast 2026-03-24 21:52:51 +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 2513ba10e7 refactor(context-menu): replace static checked with reactive subscribe+getChecked 2026-03-24 21:47:16 +01:00
Jannis Braun f21a1f75ce feat(voice): add cachedUser fallback tier to useVoiceParticipantMeta
Inserts a new tier 3 between DM member lookup and identity-only fallback.
When the current space's member list doesn't contain the voice participant
(user navigated to a different space/instance), the hook now falls back
to the cached User object from ParticipantInfo. This preserves avatar,
avatarColor, displayName, and homeUserId for federated users in PiP.
2026-03-24 21:03:46 +01:00
Jannis Braun 1ca5ca3132 fix(voice): align local user homeUserId fallback with null contract
The isLocal branch was falling through to cachedUser.id when
homeUserId was null, diverging from the null-for-home-instance
contract used by the memberMatch and carry-forward branches.
Avatar.tsx already falls back to user.id internally.
2026-03-24 21:01:37 +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 947fb30901 feat: add useInstanceConnect hook for federation connect flow 2026-03-24 18:32:20 +01:00
Jannis Braun 70f9700e43 feat: add typed errors for federation friend request failures 2026-03-24 18:31:11 +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 69a16ccdd5 fix: preserve hwOverdrive across mid-stream codec restart
stopScreenShare() resets hwOverdrive: false, which clobbers the
user's intent when switching VP9 → H.264 HW mid-stream. Save
and restore the flag around the restart.
2026-03-24 04:35:33 +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