import { NavigationProp, useNavigation } from "@react-navigation/native"; import { format } from "date-fns"; import { useCallback, useEffect, useMemo, useState } from "react"; import { useForm } from "react-hook-form"; import { FlatList, NativeModules } from "react-native"; import DocumentPicker from "react-native-document-picker"; import { Dirs, FileSystem } from "react-native-file-access"; import { Button } from "react-native-paper"; import { PERMISSIONS, RESULTS, check, request } from "react-native-permissions"; import AppInput from "./AppInput"; import ConfirmDialog from "./ConfirmDialog"; import DrawerHeader from "./DrawerHeader"; import Page from "./Page"; import Select from "./Select"; import Switch from "./Switch"; import { PADDING } from "./constants"; import { AppDataSource } from "./data-source"; import { setRepo, settingsRepo } from "./db"; import { DrawerParams } from "./drawer-param-list"; import { darkOptions, lightOptions, themeOptions } from "./options"; import Settings from "./settings"; import { toast } from "./toast"; import { useTheme } from "./use-theme"; const twelveHours = [ "dd/LL/yyyy", "dd/LL/yyyy, p", "ccc p", "p", "yyyy-MM-d", "yyyy-MM-d, p", "yyyy.MM.d", ]; const twentyFours = [ "dd/LL/yyyy", "dd/LL/yyyy, k:m", "ccc k:m", "k:m", "yyyy-MM-d", "yyyy-MM-d, k:m", "yyyy.MM.d", ]; interface Item { name: string; renderItem: (name: string) => React.JSX.Element; } export default function SettingsPage() { const [ignoring, setIgnoring] = useState(false); const [term, setTerm] = useState(""); const [formatOptions, setFormatOptions] = useState(twelveHours); const [importing, setImporting] = useState(false); const [deleting, setDeleting] = useState(false); const { reset } = useNavigation>(); const { watch, setValue } = useForm({ defaultValues: () => settingsRepo.findOne({ where: {} }), }); const settings = watch(); const { theme, setTheme, lightColor, setLightColor, darkColor, setDarkColor, } = useTheme(); useEffect(() => { NativeModules.SettingsModule.ignoringBattery(setIgnoring); NativeModules.SettingsModule.is24().then((is24: boolean) => { console.log(`${SettingsPage.name}.focus:`, { is24 }); if (is24) setFormatOptions(twentyFours); else setFormatOptions(twelveHours); }); }, []); const update = useCallback(async (key: keyof Settings, value: unknown) => { await settingsRepo .createQueryBuilder() .update() .set({ [key]: value }) .printSql() .execute(); }, []); const backupString = useMemo(() => { if (!settings.backupDir) return null; console.log(settings.backupDir); const split = decodeURIComponent(settings.backupDir).split(":"); return split.pop(); }, [settings.backupDir]); const soundString = useMemo(() => { if (!settings.sound) return null; const split = settings.sound.split("/"); return split.pop(); }, [settings.sound]); const confirmDelete = useCallback(async () => { setDeleting(false); await AppDataSource.dropDatabase(); await AppDataSource.destroy(); await AppDataSource.initialize(); toast("Database deleted."); }, []); const confirmImport = useCallback(async () => { setImporting(false); await AppDataSource.destroy(); const file = await DocumentPicker.pickSingle(); await FileSystem.cp(file.uri, Dirs.DatabaseDir + "/massive.db"); await AppDataSource.initialize(); await setRepo.createQueryBuilder().update().set({ image: null }).execute(); await update("sound", null); await update("backup", false); reset({ index: 0, routes: [{ name: "Settings" }] }); }, [reset, update]); const today = new Date(); const data: Item[] = [ { name: "Start up page", renderItem: (name: string) => ( { setValue("theme", value); setTheme(value); await update("theme", value); if (value === "dark") toast("Theme will always be dark."); else if (value === "light") toast("Theme will always be light."); else if (value === "system") toast("Theme will follow system."); }} /> ), }, { name: "Dark color", renderItem: (name: string) => ( { setValue("lightColor", value); setLightColor(value); await update("lightColor", value); toast("Set primary color for light mode."); }} /> ), }, { name: "Date format", renderItem: (name: string) => (