import { useEffect, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { SlidersHorizontal } from "lucide-react"; import { instanceSettingsApi } from "@/api/instanceSettings"; import { useBreadcrumbs } from "../context/BreadcrumbContext"; import { useTheme, THEME_META, type Theme } from "../context/ThemeContext"; import { queryKeys } from "../lib/queryKeys"; import { cn } from "../lib/utils"; const ORDERED_THEMES: Theme[] = ["catppuccin-mocha", "tokyo-night", "catppuccin-latte"]; export function InstanceGeneralSettings() { const { setBreadcrumbs } = useBreadcrumbs(); const queryClient = useQueryClient(); const [actionError, setActionError] = useState(null); const { theme, setTheme } = useTheme(); useEffect(() => { setBreadcrumbs([ { label: "Instance Settings" }, { label: "General" }, ]); }, [setBreadcrumbs]); const generalQuery = useQuery({ queryKey: queryKeys.instance.generalSettings, queryFn: () => instanceSettingsApi.getGeneral(), }); const toggleMutation = useMutation({ mutationFn: async (enabled: boolean) => instanceSettingsApi.updateGeneral({ censorUsernameInLogs: enabled }), onSuccess: async () => { setActionError(null); await queryClient.invalidateQueries({ queryKey: queryKeys.instance.generalSettings }); }, onError: (error) => { setActionError(error instanceof Error ? error.message : "Failed to update general settings."); }, }); if (generalQuery.isLoading) { return
Loading general settings...
; } if (generalQuery.error) { return (
{generalQuery.error instanceof Error ? generalQuery.error.message : "Failed to load general settings."}
); } const censorUsernameInLogs = generalQuery.data?.censorUsernameInLogs === true; return (

General

Configure instance-wide defaults that affect how operator-visible logs are displayed.

{actionError && (
{actionError}
)}

Theme

Choose the visual theme for Nexus.

{ORDERED_THEMES.map((id) => { const meta = THEME_META[id]; return ( ); })}

Censor username in logs

Hide the username segment in home-directory paths and similar operator-visible log output. Standalone username mentions outside of paths are not yet masked in the live transcript view. This is off by default.

); }