Commit Graph

49 Commits

Author SHA1 Message Date
Millian Lamiaux
cd065d07c3 feat: explore tab, React Query data layer, programs, sync, analytics, testing infrastructure
- Replace browse tab with Supabase-connected explore tab with filters
- Add React Query for data fetching with loading states
- Add 3 structured programs with weekly progression
- Add Supabase anonymous auth sync service
- Add PostHog analytics with screen tracking and events
- Add comprehensive test strategy (Vitest + Maestro E2E)
- Add RevenueCat subscription system with DEV simulation
- Add i18n translations for new screens (EN/FR/DE/ES)
- Add data deletion modal, sync consent modal
- Add assessment screen and program routes
- Add GitHub Actions CI workflow
- Update activity store with sync integration
2026-03-24 12:04:48 +01:00
Millian Lamiaux
8703c484e8 Replace workouts tab with explore tab connected to Supabase
- Rename workouts.tsx to explore.tsx with new functionality
- Add horizontal scrolling collections section with gradient cards
- Add featured workouts section
- Implement filtering by category (All, Full Body, Upper Body, Lower Body, Core, Cardio)
- Implement filtering by level (All Levels, Beginner, Intermediate, Advanced)
- Implement filtering by equipment (All, No Equipment, Band, Dumbbells, Mat)
- Add clear filters button when filters are active
- Add loading states with ActivityIndicator
- Add empty state for no results
- Update tab label from "Workouts" to "Explore"
- Add explore translations for en, fr, de, es
2026-03-23 21:27:19 +01:00
Millian Lamiaux
197324188c feat: update Home screen to use React Query with loading states
- 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
2026-03-17 14:29:27 +01:00
Millian Lamiaux
b1741e965c feat: implement React Query for Supabase data fetching
- 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
2026-03-17 14:25:41 +01:00
Millian Lamiaux
e13d917466 docs: add test implementation summary document
- Document all test files created
- Show coverage improvements
- Add usage instructions
- List remaining work items
2026-03-17 13:52:37 +01:00
Millian Lamiaux
3da40c97ce test: implement comprehensive test strategy
- 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
2026-03-17 13:51:39 +01:00
Millian Lamiaux
b177656efc feat: replace native confirm() dialogs with custom delete confirmation dialogs
- 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
2026-03-17 11:53:10 +01:00
Millian Lamiaux
fc43f73b82 feat: add success toasts for create operations and login
- 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
2026-03-17 11:47:17 +01:00
Millian Lamiaux
3d026b68ee feat: implement beautiful toast notifications with Sonner
- 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
2026-03-17 11:45:29 +01:00
Millian Lamiaux
554ad2a352 fix: use createBrowserClient for proper cookie-based auth
- 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
2026-03-17 11:23:04 +01:00
Millian Lamiaux
d2babbeee3 fix: resolve redirect loop after login
- 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
2026-03-17 11:16:33 +01:00
Millian Lamiaux
e0057e18e0 feat: implement full authentication system with middleware protection
- 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
2026-03-17 10:59:52 +01:00
Millian Lamiaux
4c5bcc41c5 fix: support both EXPO_PUBLIC and NEXT_PUBLIC env vars
- Update Supabase client to check for both naming conventions
- Fixes connection issue when using Expo env vars in Next.js app
2026-03-17 10:14:32 +01:00
Millian Lamiaux
66a211ce8b debug: add detailed error logging for trainers fetch
- Add console logs to debug Supabase connection
- Improve error message handling for non-Error objects
- Add client-side logging for Supabase configuration
2026-03-17 10:08:56 +01:00
Millian Lamiaux
42d9b2671b fix: resolve trainers page issues and add seed data
- 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
2026-03-17 09:37:00 +01:00
Millian Lamiaux
b397f1fb17 chore: add supabase schema
- Add database schema definitions
- Include workouts, trainers, and related tables
2026-03-14 20:44:32 +01:00
Millian Lamiaux
79ead1404d chore: update i18n translations
- Add new translation keys for de, en, es, fr locales
- Update screens.json files with new content
2026-03-14 20:44:25 +01:00
Millian Lamiaux
001b376fc0 feat: add shared card components
- Add CollectionCard component for collection displays
- Add WorkoutCard component for workout previews
- Reusable across mobile and admin-web
2026-03-14 20:44:19 +01:00
Millian Lamiaux
8c8dbebd17 feat: update mobile app screens
- Enhance browse tab with improved navigation
- Update home tab with new features
- Refactor profile tab
- Update paywall screen styling
2026-03-14 20:44:10 +01:00
Millian Lamiaux
64cdb75b39 chore: add testing dependencies
- Add vitest and @vitest/coverage-v8
- Add @testing-library/react and user-event
- Add jsdom for browser environment simulation
2026-03-14 20:43:47 +01:00
Millian Lamiaux
06af2ec10c refactor: update workouts listing page
- Enhance workouts page with improved layout
- Add navigation to new workout pages
- Prepare for integration with new components
2026-03-14 20:43:26 +01:00
Millian Lamiaux
bd14922efa feat: add workout management pages
- Add workout detail page at /workouts/[id]
- Add workout creation page at /workouts/new
- Integrate WorkoutForm component
2026-03-14 20:43:20 +01:00
Millian Lamiaux
9dd1a4fe7c feat: add workout form component with advanced test mocking
- Add WorkoutForm component for creating/editing workouts
- Implement tabbed interface (Basics, Timing, Content, Media)
- Add form validation and error handling
- Add sophisticated mock infrastructure for Supabase
- Include 32 test cases covering rendering, validation, and submission
- Setup dynamic mock functions for testing different scenarios
2026-03-14 20:42:59 +01:00
Millian Lamiaux
6adf709dce feat: add media upload component with comprehensive tests
- Add MediaUpload component for thumbnails and videos
- Implement drag-and-drop file upload
- Add upload progress tracking
- Include 42 test cases covering all scenarios
- Achieve 90%+ test coverage
2026-03-14 20:42:51 +01:00
Millian Lamiaux
e2e99887ac feat: add storage utilities for file management
- Add storage.ts with Supabase storage helpers
- Add moveFilesFromTempToWorkout function
- Add UPLOAD_CONFIGS for file validation
- Comprehensive test suite with 95%+ coverage
2026-03-14 20:42:43 +01:00
Millian Lamiaux
3df7dd4a47 feat: add form input components with tests
- Add TagInput component for equipment tags
- Add ExerciseList component for workout exercises
- Both components include comprehensive test suites
- Add data-testid attributes for testability
2026-03-14 20:42:36 +01:00
Millian Lamiaux
71e9a9bdb5 feat: add reusable UI components with tests
- Add Select component with test coverage
- Add Switch component with test coverage
- Add Textarea component
- All components follow design system conventions
2026-03-14 20:42:30 +01:00
Millian Lamiaux
592d04e170 test: add vitest test infrastructure and configuration
- Add vitest.config.ts with coverage thresholds
- Add test/setup.ts with testing-library setup
- Add test/helpers.ts with test utilities
2026-03-14 20:42:22 +01:00
Millian Lamiaux
52429d957f docs: add AGENTS.md with project best practices and workflows 2026-03-14 20:42:15 +01:00
Millian Lamiaux
2ad7ae3a34 feat: Apple Watch app + Paywall + Privacy Policy + rebranding
## Major Features
- Apple Watch companion app (6 phases complete)
  - WatchConnectivity iPhone ↔ Watch
  - HealthKit integration (HR, calories)
  - SwiftUI premium UI
  - 9 complication types
  - Always-On Display support

- Paywall screen with RevenueCat integration
- Privacy Policy screen
- App rebranding: tabatago → TabataFit
- Bundle ID: com.millianlmx.tabatafit

## Changes
- New: ios/TabataFit Watch App/ (complete Watch app)
- New: app/paywall.tsx (subscription UI)
- New: app/privacy.tsx (privacy policy)
- New: src/features/watch/ (Watch sync hooks)
- New: admin-web/ (admin dashboard)
- Updated: app.json, package.json (branding)
- Updated: profile.tsx (paywall + privacy links)
- Updated: i18n translations (EN/FR/DE/ES)
- New: app icon 1024x1024

## Watch App Files
- TabataFitWatchApp.swift (entry point)
- ContentView.swift (premium UI)
- HealthKitManager.swift (HR + calories)
- WatchSessionManager.swift (communication)
- Complications/ (WidgetKit)
- UserDefaults+Shared.swift (data sharing)
2026-03-11 09:43:53 +01:00
Millian Lamiaux
f80798069b feat: integrate theme and i18n across all screens
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:05:14 +01:00
Millian Lamiaux
f17125e231 feat: system light/dark theme infrastructure
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:59 +01:00
Millian Lamiaux
b60083341e feat: extend user profile with onboarding data model
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:53 +01:00
Millian Lamiaux
540bb015c7 feat: notification, purchase, and analytics services
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:47 +01:00
Millian Lamiaux
d6bc7f5a4c feat: i18n infrastructure with 4-locale support (en, fr, es, de)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:40 +01:00
Millian Lamiaux
6a94d545f2 feat: add dependencies for i18n, notifications, purchases, and analytics
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:29 +01:00
Millian Lamiaux
0bcd8185f0 chore: archive v1 docs and update project documentation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-21 00:04:22 +01:00
Millian Lamiaux
e59c87fd1b feat: i18n locale files for all screens (en, fr, es, de)
Adds translated strings for tabs, home, workouts, activity, browse, profile,
player, complete, collection, category, workout detail, and onboarding screens.
Unused voiceCoaching/hapticCues keys removed from onboarding.wow section.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 18:52:11 +01:00
Millian Lamiaux
aa75afb1b7 feat: onboarding flow with staggered-reveal wow screen
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>
2026-02-20 18:52:05 +01:00
Millian Lamiaux
2d24831f8e feat: category/collection detail screens + Inter font loading
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>
2026-02-20 13:24:35 +01:00
Millian Lamiaux
b0521ded5a feat: workout flow — detail, player, and complete screens
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>
2026-02-20 13:24:21 +01:00
Millian Lamiaux
99d8fba852 feat: 5 tab screens wired to centralized data layer
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>
2026-02-20 13:24:06 +01:00
Millian Lamiaux
13faf21b8d feat: shared components, hooks, and audio engine
Components:
- StyledText: unified text component replacing 5 local copies
- GlassCard: reusable glassmorphic card with blur background
- VideoPlayer: expo-video wrapper with preview/background modes
  and gradient fallback when no video URL

Hooks:
- useTimer: extracted timer engine with phase transitions
  (PREP → WORK → REST → repeat → COMPLETE), calorie tracking,
  and actions (start, pause, resume, skip, stop)
- useHaptics: centralized haptic feedback respecting user settings
- useAudio: expo-av sound effects (countdown beep, phase ding,
  completion chime) respecting soundEffects setting

Audio assets: 3 generated WAV files for timer events.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 13:23:50 +01:00
Millian Lamiaux
5477ecb852 feat: data layer with types, 50 workouts, and Zustand stores
Types: Workout, Exercise, Trainer, UserProfile, UserSettings,
WorkoutResult, Achievement, Collection, Program.

Mock data: 50 workouts across 5 categories (full-body, core,
upper-body, lower-body, cardio), 4 durations (4/8/12/20 min),
3 levels, 5 trainers. Plus 6 collections, 3 programs, and
8 achievements.

Zustand stores with AsyncStorage persistence:
- userStore: profile, settings (haptics, sound, voice, reminders)
- activityStore: workout history, streak tracking
- playerStore: ephemeral timer state (not persisted)

Helper lookups: getWorkoutById, getWorkoutsByCategory,
getTrainerById, getPopularWorkouts, getCollectionWorkouts, etc.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 13:23:32 +01:00
Millian Lamiaux
511e207762 feat: design system v2 with liquid glass aesthetic
Overhaul design constants for OLED-first dark mode:
- Colors: brand palette, phase colors, glass/shadow tokens, gradients
- Typography: Inter font scale matching iOS type system
- Spacing: 4px base unit with layout constants
- Border radius: liquid glass card radii
- Animations: spring/timing presets for UI transitions

Add v2 product docs (PRD, PDD, BDSD) and update CLAUDE.md.
Install expo-video, expo-sharing, @expo-google-fonts/inter.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-20 13:23:18 +01:00
Millian Lamiaux
54ac8326fa chore: remove v1 features and old scaffolding
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>
2026-02-20 13:23:04 +01:00
Millian Lamiaux
fa189fe72e feat: onboarding flow (6 screens) + audio engine + design system
Onboarding:
- 6-screen flow: Problem → Empathy → Solution → Wow → Personalization → Paywall
- useOnboarding hook with Zustand + AsyncStorage persistence
- MiniTimerDemo with live 20s timer + haptics
- Auto-redirect for first-time users
- Mock RevenueCat for dev testing

Audio:
- useAudioEngine hook with expo-av
- Phase sounds (count_3/2/1, beep, bell, fanfare)
- Placeholder music tracks

Design System:
- Typography component + constants
- GlassView component
- Spacing, shadows, animations, borderRadius constants
- Extended color palette (phase gradients, glass, surfaces)

Timer:
- Fix: handle 0-duration phases (immediate advance)
- Enhanced TimerDisplay with phase gradients

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 21:52:23 +01:00
Millian Lamiaux
31bdb1586f feat: timer engine + full-screen timer UI
Implement the core timer feature following the src/features/ architecture:

- useTimerEngine hook: drift-free Date.now() delta countdown (100ms tick),
  explicit state machine (IDLE → GET_READY → WORK → REST → COMPLETE),
  event emitter for external consumers (PHASE_CHANGED, ROUND_COMPLETED,
  COUNTDOWN_TICK, SESSION_COMPLETE), auto-pause on AppState interruption
  (phone calls, background), expo-keep-awake during session
- TimerDisplay component: full-screen animated UI with 600ms color
  transitions between phases, pulse animation on countdown, flash red
  on last 3 seconds, round progress dots, IDLE/active/COMPLETE views
- TimerControls component: stop/pause-resume/skip buttons with Ionicons
- Timer route (app/timer.tsx): fullScreenModal wiring hook → display
- Home screen: dark theme with START button navigating to /timer
- Project docs: CLAUDE.md (constitution), PRD v1.1, skill files
- Shared constants: PHASE_COLORS, TIMER_DEFAULTS, formatTime utility
- Types: TimerPhase, TimerState, TimerConfig, TimerActions, TimerEvent

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 19:05:25 +01:00
Millian Lamiaux
5cefe864ec Initial commit
Generated by create-expo-app 3.5.3.
2026-02-17 17:34:06 +01:00