import { NostrQuery, type Settings } from "@lume/system"; import * as Switch from "@radix-ui/react-switch"; import { createFileRoute } from "@tanstack/react-router"; import { invoke } from "@tauri-apps/api/core"; import { useEffect, useState } from "react"; import { useDebouncedCallback } from "use-debounce"; type Theme = "auto" | "light" | "dark"; export const Route = createFileRoute("/settings/general")({ beforeLoad: async () => { const initialSettings = await NostrQuery.getUserSettings(); return { initialSettings }; }, component: Screen, }); function Screen() { const { initialSettings } = Route.useRouteContext(); const [theme, setTheme] = useState(null); const [settings, setSettings] = useState(null); const changeTheme = async (theme: string) => { if (theme === "auto" || theme === "light" || theme === "dark") { invoke("plugin:theme|set_theme", { theme: theme, }).then(() => setTheme(theme)); } }; const updateSettings = useDebouncedCallback(async () => { const newSettings = JSON.stringify(settings); await NostrQuery.setUserSettings(newSettings); }, 200); useEffect(() => { updateSettings(); }, [settings]); useEffect(() => { invoke("plugin:theme|get_theme").then((data: Theme) => setTheme(data)); }, []); useEffect(() => { setSettings(initialSettings); }, [initialSettings]); if (!settings) return null; return (
* Setting changes require restarting the app to take effect.

General

Relay Hint

Use the relay hint if necessary.

setSettings((prev) => ({ ...prev, use_relay_hint: !prev.use_relay_hint, })) } 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" >

Content Warning

Shows a warning for notes that have a content warning.

setSettings((prev) => ({ ...prev, content_warning: !prev.content_warning, })) } 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" >

Appearance

Appearance

Require restarting the app to take effect.

Zap Button

Shows the Zap button when viewing a note.

setSettings((prev) => ({ ...prev, display_zap_button: !prev.display_zap_button, })) } 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" >

Repost Button

Shows the Repost button when viewing a note.

setSettings((prev) => ({ ...prev, display_zap_button: !prev.display_zap_button, })) } 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" >

Privacy & Performance

Proxy

Set proxy address.

setSettings((prev) => ({ ...prev, proxy: e.target.value, })) } className="py-1 bg-transparent rounded-lg shadow-none outline-none w-44 border-1 border-black/10 dark:border-white/10" />

Image Resize Service

Use weserv/images for resize image on-the-fly.

setSettings((prev) => ({ ...prev, image_resize_service: e.target.value, })) } className="py-1 bg-transparent rounded-lg shadow-none outline-none w-44 border-1 border-black/10 dark:border-white/10" />

Load Remote Media

View the remote media directly.

setSettings((prev) => ({ ...prev, display_image_link: !prev.display_media, })) } 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" >
); }