import { toNumber } from "es-toolkit/compat"; import { FileJsonIcon } from "lucide-react"; import { useEffect, useState } from "react"; import { toast } from "sonner"; import { migrateSharedCaches } from "@/client"; import { ConfigEditor } from "@/components/config-editor"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Field, FieldContent, FieldDescription, FieldGroup, FieldLabel, FieldLegend, FieldSet, FieldTitle, } from "@/components/ui/field"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Spinner } from "@/components/ui/spinner"; import { Switch } from "@/components/ui/switch"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useJavaStore } from "@/models/java"; import { useSettingsStore } from "@/models/settings"; export type SettingsTab = "general" | "appearance" | "advanced"; export function SettingsPage() { const { config, ...settings } = useSettingsStore(); const javaStore = useJavaStore(); const [showConfigEditor, setShowConfigEditor] = useState(false); const [activeTab, setActiveTab] = useState("general"); useEffect(() => { const refresh = async () => { try { await settings.refresh(); } catch (error) { console.error(error); toast.error(`Failed to refresh settings: ${error}`); } try { await javaStore.refreshInstallations(); if (!javaStore.catalog) await javaStore.refresh(); } catch (error) { console.error(error); toast.error(`Failed to refresh java catalogs: ${error}`); } }; refresh(); }, [ settings.refresh, javaStore.refresh, javaStore.refreshInstallations, javaStore.catalog, ]); const renderScrollArea = () => { if (!config) { return (
); } return ( General
Window Options May not work on some platforms like Linux Niri.
Window Default Width { settings.merge({ width: toNumber(e.target.value), }); }} onBlur={() => { settings.save(); }} min={800} max={3840} /> Window Default Height { settings.merge({ height: toNumber(e.target.value), }); }} onBlur={() => { settings.save(); }} min={600} max={2160} />
GPU Acceleration Enable GPU acceleration for the interface. { settings.merge({ enableGpuAcceleration: checked, }); settings.save(); }} />
Network Options { settings.merge({ downloadThreads: toNumber(e.target.value), }); }} onBlur={() => { settings.save(); }} min={1} max={64} />
Java Installations Java Path { settings.merge({ javaPath: e.target.value, }); }} onBlur={() => { settings.save(); }} />
Java Installations {javaStore.installations ? ( { settings.merge({ javaPath: value, }); settings.save(); }} > {javaStore.installations?.map((installation) => ( {installation.vendor} ({installation.version}) {installation.path} ))} ) : (
)}
Appearance Theme Select your prefered theme. Advanced
Advanced Options Use Shared Caches Share downloaded assets between instances. { checked && (await migrateSharedCaches()); settings.merge({ useSharedCaches: checked, }); settings.save(); }} /> Keep Legacy Per-Instance Storage Maintain separate cache folders for compatibility. { settings.merge({ keepLegacyPerInstanceStorage: checked, }); settings.save(); }} />
); }; return (

Settings

General Java Appearance Advanced {renderScrollArea()} setShowConfigEditor(false)} />
); }