import { CheckIcon, LockIcon, MonitorIcon, MoonIcon, StarsIcon, SunIcon, } from "lucide-react"; import React from "react"; import { toast } from "sonner"; import Loading from "src/components/Loading"; import SettingsHeader from "src/components/SettingsHeader"; import { ThemePreview } from "src/components/ThemePreview"; import { UpgradeDialog } from "src/components/UpgradeDialog"; import { Badge } from "src/components/ui/badge"; import { Label } from "src/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "src/components/ui/select"; import { Separator } from "src/components/ui/separator"; import { Tabs, TabsList, TabsTrigger } from "src/components/ui/tabs"; import { DarkMode, Themes, useTheme } from "src/components/ui/theme-provider"; import { BITCOIN_DISPLAY_FORMAT_BIP177, BITCOIN_DISPLAY_FORMAT_SATS, } from "src/constants"; import { useAlbyMe } from "src/hooks/useAlbyMe"; import { useCurrencies } from "src/hooks/useCurrencies"; import { useInfo } from "src/hooks/useInfo"; import { cn } from "src/lib/utils"; import { handleRequestError } from "src/utils/handleRequestError"; import { request } from "src/utils/request"; function Settings() { const { data: albyMe } = useAlbyMe(); const { theme, darkMode, setTheme, setDarkMode } = useTheme(); const { currencies, isLoading: isCurrenciesLoading } = useCurrencies(); const [showUpgradeDialog, setShowUpgradeDialog] = React.useState(false); const { data: info, mutate: reloadInfo } = useInfo(); async function updateSettings( payload: Record, successMessage: string, errorMessage: string ) { try { await request("/api/settings", { method: "PATCH", headers: { "Content-Type": "application/json", }, body: JSON.stringify(payload), }); await reloadInfo(); toast(successMessage); } catch (error) { console.error(error); handleRequestError(errorMessage, error); } } async function updateCurrency(currency: string) { await updateSettings( { currency }, `Currency set to ${currency}`, "Failed to update currencies" ); } async function updateBitcoinDisplayFormat(bitcoinDisplayFormat: string) { await updateSettings( { bitcoinDisplayFormat }, "Bitcoin display format updated", "Failed to update bitcoin display format" ); } if (!info) { return ; } const paidThemes = ["matrix", "ghibli", "claymorphism"]; const hasPlan = !!albyMe?.subscription.plan_code; const darkModeOptions: { value: DarkMode; icon: React.ReactNode; label: string; }[] = [ { value: "light", icon: , label: "Light" }, { value: "dark", icon: , label: "Dark" }, { value: "system", icon: , label: "System", }, ]; return ( <>

Appearance

Choose a theme and light/dark mode.

{Themes.map((t) => { const isPaidTheme = paidThemes.includes(t); const isDisabled = isPaidTheme && !hasPlan; const isSelected = theme === t; return ( ); })}
{darkModeOptions.map((option) => ( { setDarkMode(option.value); toast("Appearance updated."); }} className="px-3" > {option.icon} {option.label} ))}

Units & Currency

Choose how amounts are displayed.

); } export default Settings;