Commit graph

26 commits

Author SHA1 Message Date
Patrick Britton 8844a95f3f feat: Central ComposerBar widget + fix GIF proxy 401 + broaden GIF filter
- Move /image-proxy to public (unauthenticated) route so CachedNetworkImage
  can fetch proxied GIFs without Bearer token (fixes 401 errors)
- Expand image proxy SSRF allowlist to include i.imgur.com + media.giphy.com
- Broaden GIF filter in gif_picker: accept i.redd.it, preview.redd.it,
  i.imgur.com URLs (not just .gif extension) so Reddit posts actually show
- Change GIF search hint to 'Search GIFs…' (no subreddit mention)
- Add i.imgur.com + media.giphy.com to client-side needsProxy() list
- Create lib/widgets/composer/composer_bar.dart — single ComposerBar widget
  with ComposerConfig presets (publicPost/comment/threadReply/chat/privatePost)
  that handles text, GIF picker, image picker, upload, and send button uniformly
- Apply ComposerBar to: group feed posts, group feed comments sheet,
  group thread reply bar, quips comment sheet, group chat bar
- Remove all duplicate TextField+send-button+media-button implementations

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 09:45:58 -06:00
Patrick Britton c98c73f724 feat: Add capsule entry reporting system with image proxy for external GIFs
- Add capsule_reports table and admin UI: new /capsule-reports page with list/update handlers
- POST /capsules/:id/entries/:entryId/report: members can report encrypted entries with voluntary decrypted sample
- GET /image-proxy: stream external images (Reddit, GifCities) through server to hide client IPs
- group_chat_tab: add GIF picker, report button, proxy external GIF URLs through ApiConfig.proxyImageUrl()
- api.ts: add list
2026-02-18 09:03:30 -06:00
Patrick Britton 93a2c45a92 feat: Reaction system for Quips feed + fix groups 500 + reduce jank
- Replace heart/like in Quips sidebar with full reaction system:
  tap = quick ❤️, long-press = full ReactionPicker dialog
- Add reactionPackageProvider (CDN → local assets → emoji fallback)
- Switch ReactionPicker to ConsumerStatefulWidget using provider
- Add CachedNetworkImage support in ReactionPicker + _ReactionIcon
- Fix CreateGroup handler: use 'privacy' column, drop non-existent
  'is_private'/'banner_url' columns (were causing 500 on group creation)
- Cache overlayJson parsing in QuipVideoItem initState/didUpdateWidget
  to eliminate double jsonDecode per build frame (was causing 174ms jank)
- Add post_hides table + HidePost handler + feed filtering
- Add showNavActions param to TraditionalQuipsSheet for clean Quips header

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-18 08:11:08 -06:00
Patrick Britton 5b5e89e383 feat: Add overlay_json field for Quip text/sticker decorations
- Go: Add overlay_json to Post model, CreatePost handler, and all post queries
- Flutter: Rename QuipTextOverlay → QuipOverlayItem with type enum (text/sticker)
- QuipOverlayItem: add id field, content replaces text, backward-compat alias
- quip_video_item: parse overlay_json and render non-interactive overlays in feed
- quip_upload_provider: accept overlayJson param and pass to publishPost
- api_service: add overlayJson param to publish
2026-02-17 20:06:53 -06:00
Patrick Britton 0753fd91e6 fix: Resolve Flutter compile errors across 15 files
- Fix GroupCategory enum duplication (group.dart re-exports from cluster.dart)
- Fix stitchVideos arg count (use stitchVideosLegacy in quip_recorder)
- Fix enhanced_quip_recorder: getter/field conflict, XFile→File, static calls, CameraLensDirection, setState syntax
- Fix blocking_service: imports, ShareXFiles, SnackBar content, nullable bool
- Fix audio_overlay_service: path_provider import, getOutput() stub, fade icons
- Fix enhanced_beacon_detail_screen: flutter_map v8 interactionOptions, const constraints, Uri.parse
- Fix private_capsule_screen: add api_provider import
- Stub e2ee_device_sync_service (packages not in pubspec)
- Add generic post()/delete() helpers to api_service
- Fix repost_service: remove static, migrate StateNotifier→Notifier (Riverpod 3.x)
- Fix repost_widget: Repost? null assertion, RepostState type, Post field names, timeago, context param
- Fix sojorn_swipeable_post: close if-block, remove undefined _updateChainSetting
- Fix draggable_widget_grid: use this.widget for isEditable/theme/callbacks when ProfileWidget param shadows

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 17:43:30 -06:00
Patrick Britton c3329a0893 feat: Implement repost/boost API, profile layout persistence, feed algorithm wiring, and legacy cleanup
Backend:
- Add repost_handler.go with full CRUD (create, boost, delete, report, trending, amplification analytics)
- Add profile_layout_handler.go for profile widget layout persistence (GET/PUT)
- Wire FeedAlgorithmService into main.go as 15-min background score refresh job
- Fix follow_handler.go (broken interface, dead query pattern, naming conflict)
- Add DB migration for reposts, repost_reports, profile_layouts, post_feed_scores tables
- Add engagement count columns to posts table for feed algorithm
- Remove stale Supabase comments from auth middleware
- Delete cmd/supabase-migrate/ directory (legacy migration tool)

Flutter:
- Fix all repost_service.dart API paths (were doubling /api/ prefix against base URL)
- Rename forceResetBrokenKeys() -> resetIdentityKeys() in E2EE services
- Remove dead _forceResetBrokenKeys method from secure_chat_screen.dart
- Implement _navigateToProfile(), _navigateToHashtag(), _navigateToUrl() in sojorn_rich_text.dart

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-17 14:04:24 -06:00
Patrick Britton 56a9dd032f feat: Add enhanced video moderation with frame extraction and implement placeholder UI methods
- Add VideoProcessor service to PostHandler for frame-based video moderation
- Implement multi-frame extraction and Azure OpenAI Vision analysis for video content
- Enhance VideoStitchingService with filters, speed control, and text overlays
- Add image upload dialogs for group avatar and banner in GroupCreationModal
- Implement navigation placeholders for mentions, hashtags, and URLs in sojornRichText
2026-02-17 13:32:58 -06:00
Patrick Britton 04c632eae2 fix: Resolve all compilation errors - GroupCategory conflicts, ref access, privacy types, and icon/color properties 2026-02-17 11:24:48 -06:00
Patrick Britton d01be18b12 fix: Final compilation errors - update API calls to use new Groups system 2026-02-17 11:19:25 -06:00
Patrick Britton 6217cb2ffd fix: Resolve remaining compilation errors in Groups feature 2026-02-17 11:16:39 -06:00
Patrick Britton f1ee925057 fix: Resolve compilation errors in Groups feature 2026-02-17 11:13:41 -06:00
Patrick Britton 6cba4e5c59 feat: Complete Groups discovery UI and creation modal 2026-02-17 11:10:03 -06:00
Patrick Britton 31d7816e92 feat: Add GroupCard widget and start integrating Groups UI into ClustersScreen 2026-02-17 11:06:07 -06:00
Patrick Britton 00b4705a00 fix: Remove duplicate follow methods and fix FollowButton to use provider 2026-02-17 10:42:08 -06:00
Patrick Britton 7f618bcdf2 feat: Add feed filtering UI with FeedFilterButton and integrate into personal feed 2026-02-17 10:33:32 -06:00
Patrick Britton 5f7dfa7a93 feat: Add error handling utilities, NetworkService, RetryHelper, and OfflineIndicator 2026-02-17 10:22:07 -06:00
Patrick Britton d403749092 feat: Add SuggestedUsersSection widget with horizontal scrolling cards 2026-02-17 10:19:56 -06:00
Patrick Britton da93bc3579 feat: Follow system - database migration, backend handlers, FollowButton widget, API methods 2026-02-17 10:16:44 -06:00
Patrick Britton 2c6c8a7c20 feat: Phase 6 - Skeleton loaders for Groups/feed, seed groups SQL migration 2026-02-17 03:41:39 -06:00
Patrick Britton f5612be301 feat: Phase 5 - Harmony State explainer modal with progression chart, tappable from profile 2026-02-17 03:38:10 -06:00
Patrick Britton 0c183c3491 feat: Phase 1.2 - 3-screen onboarding modal (Welcome, Features, Harmony) 2026-02-17 03:31:32 -06:00
Patrick Britton 2bfb8eecea feat: replace Turnstile with ALTCHA across Flutter app, Go backend, and website 2026-02-17 03:18:50 -06:00
Patrick Britton 602a139349 fix: update auth screens to use ALTCHA instead of Turnstile 2026-02-17 01:53:09 -06:00
Patrick Britton a3fcfe67ab feat: replace Turnstile with ALTCHA for all authentication
- Add ALTCHA service with challenge generation and verification
- Update auth and admin handlers to use ALTCHA tokens
- Replace Turnstile widget with ALTCHA widget in Flutter app
- Update admin frontend to use ALTCHA token
- Add ALTCHA challenge endpoints for both auth and admin
- Maintain development bypass for testing
- Remove Turnstile dependencies from authentication flow
2026-02-16 22:18:29 -06:00
Patrick Britton d5fc89b97a 2026-02-16 07:27:41 -06:00
Patrick Britton 434937961c security: sanitized baseline for public release 2026-02-15 00:33:24 -06:00