import { Button } from "@/components/Button"; import { Text } from "@/components/common/Text"; import { ListItem } from "@/components/ListItem"; import ProgressCircle from "@/components/ProgressCircle"; import { apiAtom, useJellyfin, userAtom } from "@/providers/JellyfinProvider"; import { runningProcesses } from "@/utils/atoms/downloads"; import { readFromLog } from "@/utils/log"; import { Ionicons } from "@expo/vector-icons"; import { BaseItemDto } from "@jellyfin/sdk/lib/generated-client/models"; import AsyncStorage from "@react-native-async-storage/async-storage"; import { useQuery } from "@tanstack/react-query"; import * as FileSystem from "expo-file-system"; import { useRouter } from "expo-router"; import { FFmpegKit } from "ffmpeg-kit-react-native"; import { useAtom } from "jotai"; import { useEffect, useState } from "react"; import { ScrollView, TouchableOpacity, View } from "react-native"; const deleteAllFiles = async () => { const directoryUri = FileSystem.documentDirectory; try { const fileNames = await FileSystem.readDirectoryAsync(directoryUri!); for (let item of fileNames) { await FileSystem.deleteAsync(`${directoryUri}/${item}`); } AsyncStorage.removeItem("downloaded_files"); } catch (error) { console.error("Failed to delete the directory:", error); } }; const deleteFile = async (id: string | null | undefined) => { if (!id) return; try { FileSystem.deleteAsync(`${FileSystem.documentDirectory}/${id}.mp4`).catch( (err) => console.error(err) ); const currentFiles = JSON.parse( (await AsyncStorage.getItem("downloaded_files")) ?? "[]" ) as BaseItemDto[]; const updatedFiles = currentFiles.filter((f) => f.Id !== id); await AsyncStorage.setItem( "downloaded_files", JSON.stringify(updatedFiles) ); } catch (error) { console.error(error); } }; const listDownloadedFiles = async () => { const directoryUri = FileSystem.documentDirectory; // Directory where files are stored try { const fileNames = await FileSystem.readDirectoryAsync(directoryUri!); return fileNames; // This will be an array of file names in the directory } catch (error) { console.error("Failed to read the directory:", error); return []; } }; export default function settings() { const { logout } = useJellyfin(); const [api] = useAtom(apiAtom); const [user] = useAtom(userAtom); const [files, setFiles] = useState([]); const [key, setKey] = useState(0); const [session, setSession] = useAtom(runningProcesses); const router = useRouter(); const [activeProcess] = useAtom(runningProcesses); useEffect(() => { (async () => { const data = JSON.parse( (await AsyncStorage.getItem("downloaded_files")) || "[]" ) as BaseItemDto[]; console.log( "Files", data.map((i) => i.Name) ); setFiles(data); })(); }, [key]); const { data: logs } = useQuery({ queryKey: ["logs"], queryFn: async () => readFromLog(), }); return ( Information Downloads {files.length > 0 ? ( {files.map((file) => ( { router.back(); router.push( `/(auth)/player/offline/page?url=${file.Id}.mp4&itemId=${file.Id}` ); }} > { await deleteFile(file.Id); setKey((prevKey) => prevKey + 1); }} > } /> ))} ) : activeProcess ? ( } /> ) : ( No downloaded files )} {session?.item.Id && ( )} Logs {logs?.map((l) => ( {l.level} {l.message} ))} ); }