import { type Settings, commands } from "@/commands.gen"; import { Spinner } from "@/components"; import * as Switch from "@radix-ui/react-switch"; import { useSuspenseQuery } from "@tanstack/react-query"; import { createLazyFileRoute } from "@tanstack/react-router"; import { invoke } from "@tauri-apps/api/core"; import { message } from "@tauri-apps/plugin-dialog"; import { type Dispatch, type SetStateAction, useCallback, useEffect, useState, useTransition, } from "react"; import { settingsQueryOptions } from "../__root"; type Theme = "auto" | "light" | "dark"; export const Route = createLazyFileRoute("/settings/general")({ component: Screen, }); function Screen() { const settings = useSuspenseQuery(settingsQueryOptions); const { queryClient } = Route.useRouteContext(); const [theme, setTheme] = useState("auto"); const [newSettings, setNewSettings] = useState(); const [isPending, startTransition] = useTransition(); const changeTheme = useCallback(async (theme: string) => { if (theme === "auto" || theme === "light" || theme === "dark") { invoke("plugin:theme|set_theme", { theme: theme, }).then(() => setTheme(theme)); } }, []); const updateSettings = () => { startTransition(async () => { const res = await commands.setAppSettings(JSON.stringify(newSettings)); if (res.status === "ok") { await queryClient.invalidateQueries({ queryKey: ["settings"] }); return; } else { await message(res.error, { kind: "error" }); return; } }); }; useEffect(() => { invoke("plugin:theme|get_theme").then((data) => setTheme(data as Theme)); }, []); useEffect(() => { if (settings.status === "success") { setNewSettings(settings.data); } }, [settings]); if (!newSettings) { return null; } return (

General

{/* */}

Appearance

Appearance

Change app theme

Privacy & Performance

); } function Setting({ label, name, description, checked, setNewSettings, }: { label: string; name: string; description: string; checked: boolean; setNewSettings: Dispatch>; }) { const toggle = useCallback(() => { setNewSettings((state) => { if (state) { return { ...state, [label]: !state[label], }; } }); }, []); return (

{name}

{description}

toggle()} className="relative h-7 w-12 shrink-0 cursor-default rounded-full bg-black/10 outline-none data-[state=checked]:bg-blue-500 dark:bg-white/10" >
); }