refactor: code quality cleanup — remove any types, add logger, rename Kine to Tabata

- Phase 0: Rename all Kine references to Tabata (types, files, imports, i18n, analytics events)
- Phase 1: Add test coverage for tabataProgramStore, workoutProgramStore, and color utils (47 tests)
- Phase 2: Remove all `any` types from production code with proper typed replacements
- Phase 3: Replace ~60 raw console.* calls with __DEV__-gated logger utility
- Phase 4: Verify .DS_Store housekeeping (already clean)

0 TypeScript errors, 583/583 tests passing.
This commit is contained in:
Millian Lamiaux
2026-04-17 18:56:24 +02:00
parent e0e02c4550
commit 791f432334
176 changed files with 16508 additions and 2305 deletions

11
app/collection/CLAUDE.md Normal file
View File

@@ -0,0 +1,11 @@
<claude-mem-context>
# Recent Activity
<!-- This section is auto-generated by claude-mem. Edit content outside the tags. -->
### Apr 13, 2026
| ID | Time | T | Title | Read |
|----|------|---|-------|------|
| #6159 | 10:02 PM | 🔵 | Examined Collection Screen Explore Reference | ~150 |
</claude-mem-context>

View File

@@ -7,7 +7,6 @@ import { useMemo } from 'react'
import { View, StyleSheet, ScrollView, Pressable } from 'react-native'
import { useRouter, useLocalSearchParams } from 'expo-router'
import { useSafeAreaInsets } from 'react-native-safe-area-context'
import { LinearGradient } from 'expo-linear-gradient'
import { Icon } from '@/src/shared/components/Icon'
import { useTranslation } from 'react-i18next'
@@ -18,10 +17,11 @@ import { useTranslatedWorkouts } from '@/src/shared/data/useTranslatedData'
import { StyledText } from '@/src/shared/components/StyledText'
import { track } from '@/src/shared/services/analytics'
import { useThemeColors, BRAND, GRADIENTS } from '@/src/shared/theme'
import { useThemeColors, BRAND } from '@/src/shared/theme'
import type { ThemeColors } from '@/src/shared/theme/types'
import { SPACING, LAYOUT } from '@/src/shared/constants/spacing'
import { RADIUS } from '@/src/shared/constants/borderRadius'
import { TEXT, NAVY } from '@/src/shared/constants/colors'
export default function CollectionDetailScreen() {
const insets = useSafeAreaInsets()
@@ -98,23 +98,18 @@ export default function CollectionDetailScreen() {
>
{/* Hero Card */}
<View testID="collection-hero" style={styles.heroCard}>
<LinearGradient
colors={collection.gradient ?? [BRAND.PRIMARY, '#FF3B30']}
start={{ x: 0, y: 0 }}
end={{ x: 1, y: 1 }}
style={StyleSheet.absoluteFill}
/>
<View style={StyleSheet.absoluteFill} />
<View style={styles.heroContent}>
<StyledText size={48} color="#FFFFFF" style={styles.heroIcon}>
<StyledText size={48} color={TEXT.PRIMARY} style={styles.heroIcon}>
{collection.icon}
</StyledText>
<StyledText size={28} weight="bold" color="#FFFFFF">
<StyledText size={28} weight="bold" color={TEXT.PRIMARY}>
{collection.title}
</StyledText>
<StyledText size={15} color="rgba(255,255,255,0.8)" style={{ marginTop: SPACING[1] }}>
<StyledText size={15} color={TEXT.SECONDARY} style={{ marginTop: SPACING[1] }}>
{collection.description}
</StyledText>
<StyledText size={13} weight="semibold" color="rgba(255,255,255,0.6)" style={{ marginTop: SPACING[2] }}>
<StyledText size={13} weight="semibold" color={TEXT.TERTIARY} style={{ marginTop: SPACING[2] }}>
{t('plurals.workout', { count: workouts.length })}
</StyledText>
</View>
@@ -138,7 +133,7 @@ export default function CollectionDetailScreen() {
onPress={() => handleWorkoutPress(workout.id)}
>
<View style={[styles.workoutAvatar, { backgroundColor: BRAND.PRIMARY }]}>
<Icon name="flame.fill" size={20} color="#FFFFFF" />
<Icon name="flame.fill" size={20} color={TEXT.PRIMARY} />
</View>
<View style={styles.workoutInfo}>
<StyledText size={17} weight="semibold" color={colors.text.primary}>
@@ -200,7 +195,7 @@ function createStyles(colors: ThemeColors) {
height: 200,
borderRadius: RADIUS.XL,
overflow: 'hidden',
...colors.shadow.lg,
backgroundColor: NAVY[700],
},
heroContent: {
flex: 1,
@@ -229,7 +224,7 @@ function createStyles(colors: ThemeColors) {
workoutAvatar: {
width: 44,
height: 44,
borderRadius: 22,
borderRadius: RADIUS.FULL,
alignItems: 'center',
justifyContent: 'center',
},