import type React from "react"; import { useEffect, useState } from "react"; import { type ZodType, z } from "zod"; import { useSettingsStore } from "@/models/settings"; import type { LauncherConfig } from "@/types"; import { Button } from "./ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "./ui/dialog"; import { FieldError } from "./ui/field"; import { Spinner } from "./ui/spinner"; import { Textarea } from "./ui/textarea"; const launcherConfigSchema: ZodType = z.object({ minMemory: z.number(), maxMemory: z.number(), javaPath: z.string(), width: z.number(), height: z.number(), downloadThreads: z.number(), customBackgroundPath: z.string().nullable(), enableGpuAcceleration: z.boolean(), enableVisualEffects: z.boolean(), activeEffect: z.string(), theme: z.string(), logUploadService: z.string(), pastebinApiKey: z.string().nullable(), assistant: z.any(), // TODO: AssistantConfig schema useSharedCaches: z.boolean(), keepLegacyPerInstanceStorage: z.boolean(), featureFlags: z.any(), // TODO: FeatureFlags schema }); export interface ConfigEditorProps extends Omit, "onOpenChange"> { open: boolean; onOpenChange: (open: boolean) => void; } export function ConfigEditor({ onOpenChange, ...props }: ConfigEditorProps) { const settings = useSettingsStore(); const [errorMessage, setErrorMessage] = useState(null); const [rawConfigContent, setRawConfigContent] = useState( JSON.stringify(settings.config, null, 2), ); const [isSaving, setIsSaving] = useState(false); useEffect(() => { setRawConfigContent(JSON.stringify(settings.config, null, 2)); }, [settings.config]); const handleSave = async () => { setIsSaving(true); setErrorMessage(null); try { const validatedConfig = launcherConfigSchema.parse( JSON.parse(rawConfigContent), ); settings.config = validatedConfig; await settings.save(); onOpenChange?.(false); } catch (error) { setErrorMessage(error instanceof Error ? error.message : String(error)); } finally { setIsSaving(false); } }; return ( Edit Configuration Edit the raw JSON configuration file.