import type { components } from '@pipu/api-client'; import { unwrap } from '@pipu/core'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Alert, FlatList, Modal, ScrollView, View } from 'react-native'; import { useSession, useUser } from '../lib/session'; import { player } from '../player/controller'; import { Button, ErrorBox, Field, H1, Muted, Screen, TrackRow, formatDuration, useErrorText } from '../ui/kit'; type Playlist = components['schemas']['Playlist']; const input = (p: Playlist) => ({ name: p.name, description: p.description, revision: p.revision, track_ids: p.tracks.map(t => t.id) }); export default function PlaylistsScreen() { const { id, track } = useLocalSearchParams<{ id?: string; track?: string }>(); return id ? : ; } function List({ track }: { track?: string }) { const session = useSession(); const user = useUser(); const router = useRouter(); const { t } = useTranslation(); const cache = useQueryClient(); const errorText = useErrorText(); const [create, setCreate] = useState(false); const [search, setSearch] = useState(''); const list = useQuery({ queryKey: ['m-playlists', user.id], queryFn: async () => unwrap(await session.client.GET('/api/v1/me/playlists')) }); const add = useMutation({ mutationFn: async (id: string) => { const p = unwrap(await session.client.GET('/api/v1/me/playlists/{id}', { params: { path: { id } } })); const body = input(p); body.track_ids = [...new Set([...body.track_ids, track!])]; return unwrap(await session.client.PUT('/api/v1/me/playlists/{id}', { params: { path: { id } }, body })); }, onSuccess: () => { void cache.invalidateQueries({ queryKey: ['m-playlists'] }); router.back(); } }); return p.name.toLocaleLowerCase().includes(search.toLocaleLowerCase())) ?? []} keyExtractor={p => p.id} onRefresh={() => void list.refetch()} refreshing={list.isRefetching} contentContainerStyle={{ padding: 16, gap: 12 }} ListHeaderComponent={