sojorn/sojorn_docs/LINKS_FIX.md
Patrick Britton 3c4680bdd7 Initial commit: Complete threaded conversation system with inline replies
**Major Features Added:**
- **Inline Reply System**: Replace compose screen with inline reply boxes
- **Thread Navigation**: Parent/child navigation with jump functionality
- **Chain Flow UI**: Reply counts, expand/collapse animations, visual hierarchy
- **Enhanced Animations**: Smooth transitions, hover effects, micro-interactions

 **Frontend Changes:**
- **ThreadedCommentWidget**: Complete rewrite with animations and navigation
- **ThreadNode Model**: Added parent references and descendant counting
- **ThreadedConversationScreen**: Integrated navigation handlers
- **PostDetailScreen**: Replaced with threaded conversation view
- **ComposeScreen**: Added reply indicators and context
- **PostActions**: Fixed visibility checks for chain buttons

 **Backend Changes:**
- **API Route**: Added /posts/:id/thread endpoint
- **Post Repository**: Include allow_chain and visibility fields in feed
- **Thread Handler**: Support for fetching post chains

 **UI/UX Improvements:**
- **Reply Context**: Clear indication when replying to specific posts
- **Character Counting**: 500 character limit with live counter
- **Visual Hierarchy**: Depth-based indentation and styling
- **Smooth Animations**: SizeTransition, FadeTransition, hover states
- **Chain Navigation**: Parent/child buttons with visual feedback

 **Technical Enhancements:**
- **Animation Controllers**: Proper lifecycle management
- **State Management**: Clean separation of concerns
- **Navigation Callbacks**: Reusable navigation system
- **Error Handling**: Graceful fallbacks and user feedback

This creates a Reddit-style threaded conversation experience with smooth
animations, inline replies, and intuitive navigation between posts in a chain.
2026-01-30 07:40:19 -06:00

25 lines
2.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Links Fix Profile Deep Link Bug
## Issue
- Clicking any user profile link (e.g., from a post, notification, or shared URL) always opened the current users profile instead of the target profile.
- Root cause: GoRouter tab shell state was local to `HomeShell` (an `IndexedStack` driven by `_currentIndex`), so `context.go('/u/<handle>')` left the UI stuck on the “Profile” tab (current user view) even when the route was for another user.
- Backend `GetProfile` endpoint only returned full profile data by user ID; when the app requested by handle it fell back to the signedin user, reinforcing the wrong profile display.
## Fix
- Frontend routing:
- Replaced manual `IndexedStack` shell with GoRouter `StatefulShellRoute.indexedStack`; tab index now follows router state.
- `/profile` (current user) is a shell branch; `/u/:username` is a separate root route that renders `ViewableProfileScreen` so it no longer competes with the shell tab.
- `HomeShell` now uses the GoRouter navigation shell (no local `_currentIndex`) and passes branch index to quips for playback pausing.
- `ViewableProfileScreen` ownership check now compares both authenticated user id and handle against the requested handle.
- Backend:
- `GetProfile` now accepts `?handle=<username>` and resolves in order: handle → :id → auth user.
- `GetProfileByHandle` returns full profile fields (id, handle, display_name, bio, avatar_url, origin_country, onboarding flag, created_at) so clients can render the viewed user.
## Files Touched
- Frontend: `lib/routes/app_routes.dart`, `lib/screens/home/home_shell.dart`, `lib/screens/auth/auth_gate.dart`, `lib/screens/auth/category_select_screen.dart`, `lib/screens/quips/feed/quips_feed_screen.dart`, `lib/screens/profile/viewable_profile_screen.dart`.
- Backend: `internal/handlers/user_handler.go`, `internal/repository/user_repository.go`.
## Deployment Notes
- Backend binary rebuilt at `/opt/sojorn/go-backend/bin/sojorn-api` (tests pass). Needs sudo to copy over `/opt/sojorn/bin/sojorn-api` and restart `sojorn-api.service`.
- Frontend changes live in the local workspace; rebuild/deploy the app to pick up the routing fix.