import type { SelectProps } from "tamagui"; import React, { useState } from "react"; import { Platform } from "react-native"; import Markdown from "react-native-markdown-display"; import * as Application from "expo-application"; import * as Brightness from "expo-brightness"; import * as FileSystem from "expo-file-system"; import * as WebBrowser from "expo-web-browser"; import { FontAwesome, MaterialCommunityIcons, MaterialIcons, } from "@expo/vector-icons"; import { useMutation } from "@tanstack/react-query"; import { Adapt, ScrollView, Select, Sheet, Spinner, Text, useTheme, View, XStack, YStack, } from "tamagui"; import type { ThemeStoreOption } from "~/stores/theme"; import ScreenLayout from "~/components/layout/ScreenLayout"; import { MWButton } from "~/components/ui/Button"; import { MWSelect } from "~/components/ui/Select"; import { MWSeparator } from "~/components/ui/Separator"; import { MWSwitch } from "~/components/ui/Switch"; import { useToast } from "~/hooks/useToast"; import { checkForUpdate } from "~/lib/update"; import { useNetworkSettingsStore, usePlayerSettingsStore, } from "~/stores/settings"; import { useThemeStore } from "~/stores/theme"; const themeOptions: ThemeStoreOption[] = [ "main", "blue", "gray", "red", "teal", ]; const defaultQualityOptions = ["Highest", "Lowest"]; export default function SettingsScreen() { const theme = useTheme(); const { gestureControls, setGestureControls, autoPlay, setAutoPlay } = usePlayerSettingsStore(); const { allowMobileData, setAllowMobileData } = useNetworkSettingsStore(); const [showUpdateSheet, setShowUpdateSheet] = useState(false); const [updateMarkdownContent, setUpdateMarkdownContent] = useState(""); const [downloadUrl, setDownloadUrl] = useState(""); const { showToast } = useToast(); const mutation = useMutation({ mutationKey: ["checkForUpdate"], mutationFn: checkForUpdate, onSuccess: (res) => { if (res) { setUpdateMarkdownContent(res.data.body!); setDownloadUrl( res.data.assets.find( (asset) => asset.name === `movie-web.${Platform.select({ ios: "ipa", android: "apk" })}`, )?.browser_download_url ?? "", ); setShowUpdateSheet(true); } else { showToast("No updates available"); } }, }); const handleGestureControlsToggle = async (isEnabled: boolean) => { if (isEnabled) { const { status } = await Brightness.requestPermissionsAsync(); if (status === Brightness.PermissionStatus.GRANTED) { setGestureControls(isEnabled); } } else { setGestureControls(isEnabled); } }; const clearCacheDirectory = async () => { const cacheDirectory = FileSystem.cacheDirectory + "movie-web"; if (!cacheDirectory) return; try { await FileSystem.deleteAsync(cacheDirectory, { idempotent: true }); showToast("Cache cleared", { burntOptions: { preset: "done" }, }); } catch (error) { console.error("Error clearing cache directory:", error); showToast("Error clearing cache", { burntOptions: { preset: "error" }, }); } }; return ( Appearance Theme Player Gesture controls Autoplay Network Default quality (Wi-Fi) Default quality (Data) Allow downloads on mobile data App Version {Application.nativeApplicationVersion} } iconAfter={ <>{mutation.isPending && } } disabled={mutation.isPending} onPress={() => mutation.mutate()} > Update Storage } onPress={() => clearCacheDirectory()} > Clear Cache ); } export function UpdateSheet({ markdownContent, open, setShowUpdateSheet, downloadUrl, }: { markdownContent: string; open: boolean; setShowUpdateSheet: (value: boolean) => void; downloadUrl: string; }) { const theme = useTheme(); return ( {markdownContent} } onPress={() => WebBrowser.openBrowserAsync(downloadUrl)} > Download ); } export function ThemeSelector(props: SelectProps) { const theme = useTheme(); const themeStore = useThemeStore((s) => s.theme); const setTheme = useThemeStore((s) => s.setTheme); return ( } > {themeOptions.map((item, i) => ( {item} ))} ); } interface DefaultQualitySelectorProps extends SelectProps { qualityType: "wifi" | "data"; } export function DefaultQualitySelector(props: DefaultQualitySelectorProps) { const theme = useTheme(); const { wifiDefaultQuality, mobileDataDefaultQuality, setWifiDefaultQuality, setMobileDataDefaultQuality, } = useNetworkSettingsStore(); return ( } > {defaultQualityOptions.map((item, i) => ( {item} ))} ); }