import { unwrap, type Track } from '@pipu/core'; import { useRouter } from 'expo-router'; import { useInfiniteQuery } from '@tanstack/react-query'; import { useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { FlatList, Text, View } from 'react-native'; import { useSession } from '../../lib/session'; import { downloads } from '../../offline/downloads'; import { player } from '../../player/controller'; import { usePlayerState } from '../../player/hooks'; import { useColors } from '../../theme'; import { DownloadButton, useDownloads } from '../../ui/downloads'; import { Button, H1, Muted, Screen, Segmented, TrackRow } from '../../ui/kit'; type Tab = 'history' | 'likes' | 'dislikes' | 'downloads'; export default function CollectionScreen() { const colors = useColors(); const { t, i18n } = useTranslation(); const session = useSession(); const current = usePlayerState().track; const [tab, setTab] = useState('likes'); const router = useRouter(); const list = useInfiniteQuery({ queryKey: ['m-collection', tab], enabled: tab !== 'downloads', initialPageParam: undefined as string | undefined, queryFn: async ({ pageParam }) => { const query = { query: { cursor: pageParam, limit: 100 } }; if (tab === 'history') { const page = unwrap(await session.client.GET('/api/v1/me/history', { params: query })); return { items: page.items.map((i) => ({ track: i.track, at: i.played_at })), next: page.next_cursor }; } const path = tab === 'likes' ? '/api/v1/me/likes' : '/api/v1/me/dislikes'; const page = unwrap(await session.client.GET(path, { params: query })); return { items: page.items.map((i) => ({ track: i.track, at: i.created_at })), next: page.next_cursor }; }, getNextPageParam: (p) => p.next ?? undefined, }); const items = list.data?.pages.flatMap((p) => p.items) ?? []; /** Все лайки целиком, а не только загруженные страницы списка. */ const downloadAllLikes = async () => { let cursor: string | undefined; do { const page = unwrap(await session.client.GET('/api/v1/me/likes', { params: { query: { cursor, limit: 100 } } })); await downloads.enqueue(page.items.map((i) => i.track)); cursor = page.next_cursor ?? undefined; } while (cursor); }; const tracks: Track[] = items.map((i) => i.track); const time = new Intl.DateTimeFormat(i18n.language, { day: 'numeric', month: 'short', hour: '2-digit', minute: '2-digit' }); const context = tab === 'history' ? ({ type: 'history' } as const) : ({ type: 'collection', id: tab } as const); const empty = { history: 'collection.empty_history', likes: 'collection.empty_likes', dislikes: 'collection.empty_dislikes' } as const; const tabs = (