Commit Graph

4447 Commits

Author SHA1 Message Date
Alex Gleason cd77be0e61 Make platform brand icon link to the original external post 2026-03-02 00:48:02 -06:00
Alex Gleason 630dfd10dc Extract shared ExternalPostCard for Bluesky and Mastodon embeds
Introduce ExternalPostData as a shared shape that both useBlueskyPost
and the new useMastodonPost hook normalize into. Both BlueskyEmbed and
MastodonEmbed are now thin wrappers that fetch data from their respective
APIs and render via the shared ExternalPostCard component.

MastodonEmbed now fetches from the instance's public API instead of
using an iframe, matching the native card treatment already applied to
Bluesky. Both embeds have built-in /i/ navigation so the DiscussBar
is no longer rendered for them.
2026-03-02 00:46:47 -06:00
Chad Curtis 225fa168a6 Implement Media Session API for Android notification panel controls 2026-03-02 00:36:02 -06:00
Chad Curtis 1310295cdf Fix emoji pack rendering in post detail; add mobile bottom padding to books page 2026-03-02 00:36:02 -06:00
Chad Curtis daa436569e Keep minimized audio bar above mobile bottom nav 2026-03-02 00:36:02 -06:00
Chad Curtis 22b4b5a6e6 Fix AI chat height on mobile and move model selector below title 2026-03-02 00:36:02 -06:00
Chad Curtis 28d18f7890 Add bottom padding to settings page on mobile 2026-03-02 00:36:02 -06:00
Chad Curtis 054e424d1a Add bottom padding to post detail replies on mobile 2026-03-02 00:36:02 -06:00
Alex Gleason dcf6838574 Navigate Bluesky embed clicks to /i/ discuss pages
Clicking the card body navigates to /i/{postUrl} instead of opening
bsky.app externally. Avatar and display name are separately clickable
buttons that navigate to /i/{profileUrl}.
2026-03-02 00:34:56 -06:00
Mary Kate 18a46fbcfa Merge branch 'feat/nip-38-user-statuses' into 'main'
Add NIP-38 user status support (kind 30315)

See merge request soapbox-pub/ditto!22
2026-03-02 06:34:30 +00:00
Alex Gleason c24493c2e0 Replace Bluesky iframe embed with native quote-post card
Fetch post data from the public Bluesky API (getPostThread) and render
it natively with avatar, display name, handle, text content, images,
external link thumbnails, and interaction stats (replies, reposts, likes).
This eliminates the iframe dependency on embed.bsky.app and provides a
more consistent look matching the existing EmbeddedNote style.
2026-03-02 00:32:49 -06:00
Mary Kate Fain 7acaaeb160 Relocate NIP-38 user status display and clean up UI
- Remove status from NoteCard (no longer shown inline next to author
  names in the feed)
- Add status as a speech bubble beside the avatar on profile pages,
  with a small triangular tail pointing toward the avatar
- Add status to ProfileHoverCard below the bio section
- Widen profile status bubble to 280/360px for longer statuses
- Remove SmilePlus emoji icon from status editor trigger in sidebar
  and mobile drawer
2026-03-02 00:30:54 -06:00
Alex Gleason 8b64e4f85f Hide FAB entirely on wall tab when profile owner doesn't follow you 2026-03-02 00:21:06 -06:00
Alex Gleason a964eaaeb6 Hide wall compose box when profile owner doesn't follow you
Wall posts are filtered by the profile owner's follow list, so posts
from non-followed users wouldn't show up anyway. This hides the compose
box, FAB button, and shows a contextual message instead.
2026-03-02 00:09:57 -06:00
Chad Curtis 6c5f54a859 Remove min-h-screen from page components to fix overscroll 2026-03-02 00:01:49 -06:00
Mary Kate Fain 1098057905 Merge main into feat/nip-38-user-statuses
Resolve merge conflicts in 5 files, keeping both NIP-38 user statuses
and music/podcasts/events features from main:
- src/App.tsx
- src/contexts/AppContext.ts
- src/lib/extraKinds.ts
- src/lib/schemas.ts
- src/test/TestApp.tsx
2026-03-01 23:33:51 -06:00
Mary Kate Fain d46ce9d012 Merge origin/main into feature/music-podcasts
Resolve conflicts in AppRouter, NoteCard, sidebarItems, and PostDetailPage
by keeping both music/podcast features and main's additions (books,
calendar events).
2026-03-01 23:26:54 -06:00
Alex Gleason ca97d674b6 Move Books higher in sidebar, right after Articles, with distinct icon 2026-03-01 23:14:36 -06:00
Alex Gleason 468b66f9d4 Merge branch 'main' of gitlab.com:soapbox-pub/ditto 2026-03-01 23:13:38 -06:00
Alex Gleason 50e1d21ceb Switch to OpenLibrary Search API for dramatically faster book loading
The trending endpoint returned massive payloads with no field filtering support.
The search API with sort=readinglog and fields parameter returns slim responses
in under a second while still showing genuinely popular books.
2026-03-01 23:12:37 -06:00
Alex Gleason 659033516d Switch books from yearly to hourly trending for faster API response 2026-03-01 23:09:19 -06:00
Derek Ross bac91af1f8 Add user statuses to Settings > Content as a display toggle
Register kind 30315 in extraKinds as a feedOnly entry with showKey
(not feedKey) so statuses appear as a toggle in Other Stuff > Social
but are NOT included in the main feed query. The toggle controls
whether statuses are displayed on NoteCard author rows and profile
pages.

- extraKinds: registered with showKey='showUserStatuses', feedOnly=true
- ContentSettings: handle feedOnly entries with showKey as display toggles
- NoteCard: gate useUserStatus behind feedSettings.showUserStatuses
- ProfilePage: gate status display behind feedSettings.showUserStatuses
- Defaults: showUserStatuses=true (enabled by default)
2026-03-02 00:06:05 -05:00
Alex Gleason 662d290305 Add Books page with trending books from OpenLibrary and show book titles in comment context
- Add /books page displaying popular books fetched from OpenLibrary's trending API
- Add Books entry to sidebar registry so users can add it from the More menu
- Add /books route to AppRouter
- Show book title instead of raw 'isbn:...' in comment context by fetching book info via useBookInfo hook
2026-03-01 23:02:49 -06:00
Derek Ross 79002cdc43 Add NIP-38 user status support (kind 30315)
Implement reading, displaying, and publishing NIP-38 general statuses:

Hooks:
- useUserStatus: query kind 30315 (d='general') for a pubkey, handles
  NIP-40 expiration and empty-content clearing
- usePublishStatus: publish/clear kind 30315 via useNostrPublish

Display:
- ProfilePage: status shown below NIP-05 badge, clickable if it has
  an r-tag URL
- NoteCard: compact inline status after author name, separated by dot,
  truncated to 120px, italic muted text

Editing:
- LeftSidebar popover: inline status editor between user profile and
  account switcher — tap 'Set a status' to expand input, Save/Clear/
  Cancel controls, Enter to submit, Escape to cancel
- MobileDrawer: same inline editor between account section and nav

Status is NOT shown on the bottom-left avatar trigger button or mobile
drawer user row — only inside the opened menu.
2026-03-02 00:02:34 -05:00
Mary Kate Fain ba4ddff11b Merge remote-tracking branch 'origin/main' into feat/nip-52-calendar-events
# Conflicts:
#	src/AppRouter.tsx
#	src/components/InitialSyncGate.tsx
#	src/components/NoteCard.tsx
#	src/lib/sidebarItems.tsx
2026-03-01 23:01:39 -06:00
Derek Ross cf9ed10ee6 fix: lint errors 2026-03-01 23:59:57 -05:00
Derek Ross 6f31a681d7 feat: add podcast and music 2026-03-01 23:59:57 -05:00
Mary Kate Fain fef31b8079 Remove duplicate Custom Emojis entry from Whimsy section in content settings 2026-03-01 22:57:23 -06:00
Mary Kate Fain 525a8cfc32 Remove activity/RSVP feature and filter toggle from events feed 2026-03-01 22:52:31 -06:00
Mary Kate Fain 2e16083b12 Simplify events feed to Follows/Global tabs with filter toggle for activity 2026-03-01 22:48:46 -06:00
Alex Gleason 9717312d34 Show country at bottom unless exact match or no profile results
Country suggestion only appears at the top of search results when
the query is an exact match on name or code. For prefix matches
(e.g. 'angol' -> Angola), the country appears below profile results.
If there are no profile results, the country is shown at the top.
2026-03-01 22:43:34 -06:00
Mary Kate Fain 57bc0aa4bd Enable floating compose button with coming soon dialog on events feed 2026-03-01 22:40:17 -06:00
Alex Gleason 3b6325af7e Match countries by name prefix instead of exact match only
Queries like 'angol' now match 'Angola'. Prefers exact code matches
first, then the shortest prefix match. Requires at least 2 characters.
2026-03-01 22:40:04 -06:00
Alex Gleason a1de680f72 Restrict country search suggestion to exact name/code match only
Show at most 1 country result, and only when the query exactly
matches a country name or ISO code (case-insensitive).
2026-03-01 22:38:24 -06:00
Mary Kate Fain 1757ef4093 Fix text color in event descriptions and parse JSON-encoded location tags 2026-03-01 22:33:45 -06:00
Alex Gleason 8280f0ee2d Add country suggestions to sidebar search autocomplete
Typing a country name in the search bar now shows matching countries
with their flag emoji, navigating to /i/iso3166:<CODE> on click.
Works on both desktop (ProfileSearchDropdown) and mobile
(MobileSearchSheet) with full keyboard navigation support.
2026-03-01 22:31:24 -06:00
Mary Kate Fain 7647aa8f28 Fix duplicate images in calendar events by hiding link preview thumbnails when cover image is shown 2026-03-01 22:29:20 -06:00
Alex Gleason e5e7dd6564 Merge branch 'main' of gitlab.com:soapbox-pub/ditto
# Conflicts:
#	src/lib/sidebarItems.tsx
2026-03-01 22:23:17 -06:00
Alex Gleason 9d52e3a42c Add World page with country flags grid at /world
Browse all countries in a searchable grid. Clicking a flag navigates
to the existing /i/iso3166:<CODE> external content page. The World
item is also registered in the sidebar so users can add it via the
More menu.
2026-03-01 22:20:38 -06:00
Mary Kate 95deb01787 Merge branch 'emoji-packs' into 'main'
Add NIP-30 custom emoji packs support

See merge request soapbox-pub/ditto!24
2026-03-02 04:19:54 +00:00
Alex Gleason fad790be16 Extract non-component exports to separate modules to fix react-refresh warnings
Move helper functions, types, and constants out of component files into
dedicated lib/hooks modules so each component file only exports components:

- getContentWarning -> src/lib/contentWarning.ts
- isCustomEmoji, getCustomEmojiUrl, buildEmojiMap, ResolvedEmoji, resolveReactionEmoji -> src/lib/customEmoji.ts
- ExternalContent, parseExternalUri, formatIsbn, headerLabel, seoTitle -> src/lib/externalContent.ts
- extractYouTubeId, extractTweetId, and other URL helpers -> src/lib/linkEmbed.ts
- isSingleImagePost -> src/lib/noteContent.ts
- useOnboarding, OnboardingContext -> src/hooks/useOnboarding.ts

Also un-exported module-private symbols in VinesFeedPage and SettingsPage.
2026-03-01 22:15:47 -06:00
Mary Kate Fain 5561240a47 Show preview toggle when compose content contains custom emojis 2026-03-01 22:15:23 -06:00
Mary Kate Fain 068b3a667b Merge remote-tracking branch 'origin/main' into emoji-packs
# Conflicts:
#	src/components/NoteCard.tsx
#	src/contexts/AppContext.ts
#	src/lib/sidebarItems.tsx
#	src/test/TestApp.tsx
2026-03-01 22:13:51 -06:00
Mary Kate Fain ccb0844e98 Fix ESLint errors: move hooks before early return in ThemeContent 2026-03-01 22:10:15 -06:00
Mary Kate Fain 8df5fa7d16 Remove superseded files, fix quick reactions and compose preview for custom emojis
- Remove CustomEmojiPicker.tsx and useUserEmojiPacks.ts (replaced by
  Derek's useCustomEmojis + emoji-mart custom categories)
- Update EmojiPackContent to use local kind 10030 query
- Update EmojiShortcodeAutocomplete to use useCustomEmojis
- Fix quick reaction buttons to render custom emojis as images
- Fix quick reaction buttons to include emoji tag when reacting
- Filter stale custom emojis from quick reaction row
- Add emoji tags to compose box mock event for preview rendering
2026-03-01 22:04:44 -06:00
Mary Kate Fain 84d69b4426 Merge remote-tracking branch 'origin/feat/nip-30-custom-emoji-picker' into emoji-packs
# Conflicts:
#	src/App.tsx
#	src/components/ComposeBox.tsx
#	src/components/EmojiPicker.tsx
#	src/components/InitialSyncGate.tsx
#	src/components/QuickReactMenu.tsx
#	src/contexts/AppContext.ts
#	src/lib/schemas.ts
#	src/lib/sidebarItems.tsx
#	src/test/TestApp.tsx
2026-03-01 22:02:03 -06:00
Alex Gleason d147a25590 Fix all ESLint errors and warnings across 15 files 2026-03-01 21:59:19 -06:00
Alex Gleason 774db2798c Merge branch 'main' of gitlab.com:soapbox-pub/ditto 2026-03-01 21:27:20 -06:00
Alex Gleason afcc5549fa Fix reply to a reaction commenting label 2026-03-01 21:26:21 -06:00
Chad Curtis fed4a66fda fix blurhash crossfade: keep mounted, fade out on image load, img absolute positioned 2026-03-01 20:40:37 -06:00