Skip to content

Latest commit

 

History

History
141 lines (109 loc) · 8.95 KB

File metadata and controls

141 lines (109 loc) · 8.95 KB

FoxRitual — Журнал изменений

Этап 1: Создание приложения

Что было сделано

  • Инициализирован проект React + TypeScript + Vite + Tailwind CSS
  • Создана схема базы данных Supabase (4 таблицы: ritual_logs, diary_entries, workout_progress, user_profiles)
  • Создан Supabase-клиент и утилиты localStorage
  • Подготовлены моковые данные: 30 тренировок пилатеса, 10 рецептов PP-кухни, 6 ежедневных ритуалов
  • Реализованы 6 страниц с нижней навигацией (TabBar):
    • Главная — обзор дня, прогресс ритуалов, следующая тренировка, плейлист
    • Тренировка — 30-дневная программа, выбор длительности, видео-зона, сетка прогресса
    • Планер — чекбоксы ритуалов, календарь с тепловой картой
    • Дневник — выбор настроения, заметки до/после, последние записи
    • Рецепты — фильтры по категории и происхождению, раскрывающиеся карточки
    • Профиль — редактируемое имя, статистика, ранги, плейлист
  • Дизайн: тёплый минимализм (cream/beige + chocolate-brown + gold), Cormorant Garamond + Montserrat, glass-morphism, скруглённые углы

Этап 2: Рефакторинг по AGENTS.md

Проблемы (ДО)

Проблема Где
Компоненты > 150 строк Planner (164), Workout (161), Profile (151)
Дублирование логики привычек Home, Planner — одинаковый код чекбоксов
Дублирование календаря Planner — вся логика в компоненте
Дублирование карточек статистики Profile — 4 одинаковых блока
Прямой импорт storage в UI Все страницы импортировали lib/storage напрямую
Дублирование фильтров Recipes — встроенные кнопки-табы
Дублирование выбора настроения Diary — встроенный селектор
Дублирование выбора длительности Workout — встроенные кнопки

Что исправлено (ПОСЛЕ)

Новые переиспользуемые компоненты

Компонент Назначение Заменяет
GlassCard.tsx Базовый контейнер с glass-эффектом и опциональным onClick Дубли glass-card rounded-4xl p-5 во всех страницах
StatCard.tsx Карточка статистики (иконка + значение + подпись) 4 одинаковых блока в Profile
HabitItem.tsx Чекбокс привычки с иконкой и лейблом Дублирование в Planner
FilterTabs.tsx Горизонтальный фильтр-табы с активным состоянием Дублирование в Recipes
DurationPicker.tsx Выбор длительности тренировки (10/20/30 мин) Встроенные кнопки в Workout
MoodSelector.tsx 5-уровневый селектор настроения Встроенный селектор в Diary
CalendarGrid.tsx Месячный календарь с тепловой картой Вся логика календаря в Planner
RankSection.tsx Прогресс ранга + чеклист достижений Дублирование в Profile

Новые кастомные хуки

Хук Ответственность Вынесено из
useHabits.ts Состояние привычек, toggle, подсчёт Home, Planner
useCalendar.ts Дни месяца, навигация по месяцам Planner
useStreak.ts Серия, кол-во тренировок, ранг Home, Workout, Profile

Изменение размеров страниц

Страница ДО (строк) ПОСЛЕ (строк) Вынесено
Home.tsx 129 76 TodayProgress, TodayWorkout, QuickLinks
Planner.tsx 164 38 CalendarGrid, HabitItem, useHabits, useCalendar
Workout.tsx 161 105 DaySelector, VideoArea, ProgressGrid, DurationPicker
Profile.tsx 151 80 ProfileHeader, RankSection, StatCard, useStreak
Diary.tsx 139 72 MoodSelector, GlassCard
Recipes.tsx 133 88 RecipeCard, FilterTabs

Соответствие правилам AGENTS.md

Правило ДО ПОСЛЕ
Компонент <= 150 строк 3 нарушения 0 нарушений
Один useEffect = одна ответственность Хуки с единственной ответственностью
Запрет прямого импорта storage в UI Все страницы импортировали storage UI использует хуки и пропсы
Максимум 5 пропсов Композиция через children и подкомпоненты
Дублирование логики в 2+ компонентах 6 дублирований 0 дублирований
Функции <= 20 строк Нарушения в календаре, фильтрах Разбиты на мелкие функции

Этап 3: Углублённый рефакторинг по AGENTS.md

Проблемы (ДО)

Проблема Где
Workout.tsx превышал 150 строк 155 строк — лимит нарушен
Прямой импорт storage в UI-компонентах Workout, Diary, Profile, Home
Дублирование MILESTONES Определены отдельно в RankSection.tsx и storage.ts
getRank дублировала milestones внутри себя storage.ts — те же пороги, что в RankSection.tsx
getWorkoutLogs() вызывался независимо в 4 местах Workout, Home, Profile, useStreak
Подкомпоненты DaySelector, VideoArea, ProgressGrid жили внутри Workout.tsx Нарушение принципа 1 файл = 1 компонент

Что исправлено (ПОСЛЕ)

Новый модуль рангов

Файл Назначение
src/lib/ranks.ts Единый источник MILESTONES, типа Rank и функции getRank

storage.ts и RankSection.tsx больше не дублируют список рангов — оба импортируют из ranks.ts.

Новые кастомные хуки

Хук Ответственность Убраны прямые импорты из
useWorkoutLogs.ts Чтение и запись логов тренировок, реактивное состояние Workout.tsx, Home.tsx
useDiary.ts Чтение записей, сохранение, список последних 7 записей Diary.tsx
useProfileStats.ts Подсчёт ритуалов и записей дневника Profile.tsx

Новые компоненты (выделены из Workout.tsx)

Компонент Строк Назначение
src/components/DaySelector.tsx 22 Навигация по дням программы (← День N →)
src/components/VideoArea.tsx 32 Кнопка старта и демо-плеер тренировки
src/components/ProgressGrid.tsx 42 Сетка 30 дней с отметками выполнения

Изменение размеров

Файл ДО (строк) ПОСЛЕ (строк)
Workout.tsx 155 80
Diary.tsx 96 75
Profile.tsx 99 80
Home.tsx 123 111
storage.ts 115 111
RankSection.tsx 55 48

Соответствие правилам AGENTS.md после этапа 3

Правило Статус
Компонент <= 150 строк Все компоненты в норме
Запрет прямого импорта storage в UI Выполнено — все страницы используют хуки
Не дублировать логику в 2+ компонентах Выполнено — MILESTONES и getRank в одном месте
Один хук = одна ответственность Выполнено — useWorkoutLogs, useDiary, useProfileStats