import { useCallback, useEffect, useMemo, useState } from 'react' import { FlatList, Pressable, RefreshControl, ScrollView, StyleSheet, Text, View, useWindowDimensions, } from 'react-native' import { useRouter } from 'expo-router' import Ionicons from '@expo/vector-icons/Ionicons' import { useSafeAreaInsets } from 'react-native-safe-area-context' import type { CollectionType, Release } from '../../src/lib/types' import { api } from '../../src/lib/api' import { useAuth } from '../../src/lib/AuthContext' import { colors, spacing } from '../../src/lib/theme' import AnimeCard from '../../src/components/AnimeCard' import Loader from '../../src/components/Loader' import Chip from '../../src/components/Chip' type TabKey = CollectionType | 'FAVORITES' const TABS: Array<{ key: TabKey; label: string }> = [ { key: 'WATCHING', label: 'Смотрю' }, { key: 'PLANNED', label: 'Запланировано' }, { key: 'WATCHED', label: 'Просмотрено' }, { key: 'POSTPONED', label: 'Отложено' }, { key: 'ABANDONED', label: 'Брошено' }, { key: 'FAVORITES', label: 'Избранное' }, ] export default function MyListsScreen() { const router = useRouter() const insets = useSafeAreaInsets() const { width } = useWindowDimensions() const { user, loading: authLoading } = useAuth() const [tab, setTab] = useState('WATCHING') const [releases, setReleases] = useState(null) const [refreshing, setRefreshing] = useState(false) const load = useCallback((currentTab: TabKey) => { const req = currentTab === 'FAVORITES' ? api.favoritesList(1, 48) : api.collectionList(currentTab, 1, 48) return req.then((res) => setReleases(res.data)).catch(() => setReleases([])) }, []) useEffect(() => { if (!user) return setReleases(null) load(tab) }, [tab, user, load]) async function onRefresh() { setRefreshing(true) await load(tab) setRefreshing(false) } const numColumns = Math.max(3, Math.floor((width - spacing(4) * 2) / 120)) const paddedReleases = useMemo(() => { if (!releases) return [] const remainder = releases.length % numColumns if (remainder === 0) return releases return [...releases, ...Array(numColumns - remainder).fill(null)] }, [releases, numColumns]) return ( router.back()} hitSlop={10} style={styles.backButton}> Мои списки {authLoading && } {!authLoading && !user && ( Войдите, чтобы видеть свои списки router.push('/login')}> Войти )} {!authLoading && user && ( <> {TABS.map((t) => ( setTab(t.key)}> {t.label} ))} {!releases && } {releases && releases.length === 0 && ( Список пуст )} {releases && releases.length > 0 && ( (item ? String(item.id) : `empty-${index}`)} columnWrapperStyle={styles.row} contentContainerStyle={[styles.grid, { paddingBottom: insets.bottom + spacing(6) }]} refreshControl={ } renderItem={({ item }) => item ? ( router.push(`/title/${item.alias || item.id}`)} /> ) : ( ) } /> )} )} ) } const styles = StyleSheet.create({ container: { flex: 1, backgroundColor: colors.background, }, header: { flexDirection: 'row', alignItems: 'center', gap: spacing(3), paddingHorizontal: spacing(4), paddingBottom: spacing(3), }, backButton: { width: 36, height: 36, borderRadius: 18, alignItems: 'center', justifyContent: 'center', backgroundColor: colors.surfaceRaised, }, headerTitle: { color: colors.text, fontSize: 19, fontWeight: '700', }, tabs: { gap: spacing(2), paddingHorizontal: spacing(4), paddingBottom: spacing(3), }, empty: { flex: 1, alignItems: 'center', justifyContent: 'center', paddingHorizontal: spacing(8), gap: spacing(4), }, emptyText: { color: colors.textFaint, fontSize: 14, textAlign: 'center', lineHeight: 20, }, loginButton: { backgroundColor: colors.accent, paddingHorizontal: spacing(6), paddingVertical: spacing(3), borderRadius: 999, }, loginButtonText: { color: colors.text, fontSize: 14, fontWeight: '700', }, grid: { padding: spacing(4), gap: spacing(3), }, row: { gap: spacing(3), }, gridItem: { flex: 1, }, })