- Replace static data with React Query hooks
- Add loading skeletons for all data sections
- Show shimmer effect while data is loading
- Handle empty and error states gracefully
- Install @tanstack/react-query and async-storage-persister
- Wrap app with QueryClientProvider in root layout
- Migrate useSupabaseData hooks to React Query
- Add loading skeleton components for better UX
- Configure 5-minute stale time and 24-hour cache
- Add query keys for proper cache management
- Remove duplicate files and clean up structure
- Add Playwright for E2E testing with auth.spec.ts
- Add dialog component tests (8 test cases)
- Add sidebar component tests (11 test cases)
- Add login page integration tests (11 test cases)
- Add dashboard page tests (12 test cases)
- Update package.json with e2e test scripts
- Configure Playwright for Chromium and Firefox
- Test coverage for UI interactions, auth flows, and navigation
- Add Dialog component for delete confirmation in trainers page
- Add Dialog component for delete confirmation in workouts page
- Show entity name in confirmation dialog
- Dark theme styling to match app design
- Add loading state with spinner during deletion
- Add toast.success when workout is created or updated
- Add toast.success when user logs in successfully
- Show descriptive messages with entity names
- Improves user feedback for successful operations
- Install sonner package for toast notifications
- Add Toaster component to root layout with dark theme styling
- Replace all alert() calls with toast.success() and toast.error()
- Add descriptive messages for success states
- Toast notifications match the app's dark theme design
- Switch from @supabase/supabase-js to @supabase/ssr createBrowserClient
- This stores session in cookies instead of localStorage
- Allows middleware to access session server-side
- Fixes the missing cookies issue,description:Commit cookie auth fix
- Update middleware to use getAll/setAll cookie methods for better session handling
- Replace router.push with window.location.href for full page reload
- This ensures middleware properly detects authenticated session
- Install @supabase/ssr package for server-side auth
- Create middleware.ts for route protection (redirects to login if not authenticated)
- Fix login page admin check to verify specific user ID
- Add AUTH_SETUP.md with complete setup instructions
- Add setup-admin.sql for database configuration
- Logout button already exists in sidebar
- Add SQL seed data for trainers and collections
- Fix React hydration warning with suppressHydrationWarning
- Add empty state UI with friendly messaging
- Add error state UI with retry functionality
- Link Add Trainer buttons to /trainers/new page
- Add storage.ts with Supabase storage helpers
- Add moveFilesFromTempToWorkout function
- Add UPLOAD_CONFIGS for file validation
- Comprehensive test suite with 95%+ coverage
- Add TagInput component for equipment tags
- Add ExerciseList component for workout exercises
- Both components include comprehensive test suites
- Add data-testid attributes for testability
- Add Select component with test coverage
- Add Switch component with test coverage
- Add Textarea component
- All components follow design system conventions
6-screen conversion funnel: Problem → Empathy → Solution → Wow → Personalization → Paywall.
Screen 4 uses a staggered-reveal feature list where all 4 features animate in
sequentially (150ms apart), replacing a carousel pattern.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
New screens:
- Category detail (workout/category/[id]): filtered workout list
with SwiftUI segmented Picker for level sub-filter
- Collection detail (collection/[id]): hero header with gradient,
stats (workouts/minutes/calories), numbered workout list
Root layout:
- Inter font loading (400-900 weights) via @expo-google-fonts
- SplashScreen integration for font loading gate
- Route config for all screens with appropriate animations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Workout detail (workout/[id]):
- Dynamic data via useLocalSearchParams + getWorkoutById
- VideoPlayer hero with trainer color gradient fallback
- Exercise list, equipment, music vibe, "Start Workout" CTA
Player (player/[id]):
- useTimer hook drives phase transitions (PREP/WORK/REST/COMPLETE)
- useHaptics for phase changes and countdown ticks
- useAudio for sound effects (beeps, dings, completion chime)
- Real calorie tracking, progress ring, exercise display
- Saves WorkoutResult to activityStore on completion
Complete (complete/[id]):
- Reads real stats from activityStore history
- Burn bar, streak counter, calories/duration/completion stats
- Recommended workouts, share via expo-sharing
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
All tabs use shared data, stores, and SwiftUI islands:
- Home: greeting from userStore, featured/popular workouts,
recent activity from activityStore, tappable collections
- Workouts: 50 workouts with SwiftUI Picker category filter,
trainer avatars, workout grid, "See All" links to categories
- Activity: streak banner, SwiftUI Gauges (workouts/minutes/
calories/best streak), weekly Chart, achievements grid
- Browse: featured collection hero, collection grid with emoji
icons, programs carousel, new releases list
- Profile: user card, subscription banner, SwiftUI List with
workout/notification settings (Switches persist via Zustand)
Tab layout uses NativeTabs with SF Symbols and haptic feedback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove onboarding flow (6 screens), timer engine, audio engine,
old components (themed-text/view, parallax-scroll, hello-wave),
old constants (theme, shadows, timer), and utility files that
were replaced by the v2 architecture.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>