import { RotateCcw, Sparkles } from "lucide-react"; import { type ReactNode, useRef, useState } from "react"; import { Controller } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle } from "@/components/ui/alert-dialog"; import { Button } from "@/components/ui/button"; import { Badge } from "@/components/ui/badge"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, 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 { Textarea } from "@/components/ui/textarea"; import { EgressNodes } from "@/features/settings/egress-nodes"; import { VersionUpdateSection } from "@/features/system/version-update"; import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip"; import { isByteSizeUnit, isDurationUnit, MAX_ROUTING_ATTEMPTS, type ByteSizeValue, type DurationValue, UNLIMITED_ROUTING_ATTEMPTS } from "@/features/settings/settings-model"; import { useSettings } from "@/features/settings/use-settings"; import { ErrorState } from "@/shared/components/data-state"; import { cn } from "@/shared/lib/cn"; export function SettingsPage() { const { t } = useTranslation(); const { form, settingsQuery, updateMutation, reset } = useSettings(); const [autoCleanConfirm, setAutoCleanConfirm] = useState<"enabled" | "includeDisabled" | null>(null); const [unlimitedAttemptsConfirm, setUnlimitedAttemptsConfirm] = useState(false); const limitedRoutingAttemptsRef = useRef(3); const autoCleanEnabled = form.watch("accounts.autoCleanReauthEnabled") === true; const buildForbiddenReauthEnabled = form.watch("accounts.markBuildForbiddenReauth") === true; const segmentedSelectorEnabled = form.watch("routing.segmentedSelector.enabled") === true; if (settingsQuery.isError) { return void settingsQuery.refetch()} />; } const snapshot = settingsQuery.data; const loading = settingsQuery.isPending; const statsigMode = form.watch("providerWeb.statsigMode"); const draftClearanceMode = form.watch("providerWeb.clearanceMode"); const activeClearanceMode = snapshot?.config.providerWeb.clearanceMode ?? draftClearanceMode; const statsigManualConfigured = form.watch("providerWeb.statsigManualConfigured"); const buildClientVersion = form.watch("providerBuild.clientVersion"); const buildUserAgent = form.watch("providerBuild.userAgent"); const recommendedBuild = snapshot?.recommendedProviderBuild; const recommendedBuildApplied = recommendedBuild != null && buildClientVersion === recommendedBuild.clientVersion && buildUserAgent === recommendedBuild.userAgent; const syncRecommendedBuild = () => { if (!recommendedBuild) return; form.setValue("providerBuild.clientVersion", recommendedBuild.clientVersion, { shouldDirty: true, shouldTouch: true, shouldValidate: true }); form.setValue("providerBuild.userAgent", recommendedBuild.userAgent, { shouldDirty: true, shouldTouch: true, shouldValidate: true }); }; return (
updateMutation.mutate(values))}>

{t("settings.title")}

{t("settings.description")}

{t("common.reset")}
{loading ?
: null} {snapshot ? ( {t("models.providerGrokBuild")} {t("settings.web.title")} {t("console.name")} {t("settings.groups.delivery")} {t("settings.groups.policies")} {t("settings.accounts.title")} {t("updates.title")}
{t("settings.provider.syncRecommendedVersionDescription")} ) : undefined} >
} />
( {t("settings.web.statsigManual")} {t("settings.web.statsigURL")} )} /> {statsigMode === "manual" ? ( ) : ( )} } /> } /> } /> } /> } /> } />
} />
} />
} /> } />
%
} />
( {t("settings.web.clearanceManual")} {t("settings.web.clearanceFlareSolverr")} )} /> {draftClearanceMode === "flaresolverr" ? <> } /> } /> : null}
} /> } /> } /> } /> { const unlimited = field.value === UNLIMITED_ROUTING_ATTEMPTS; return (
field.onChange(event.currentTarget.valueAsNumber)} />
{t("settingsRoutingAttempts.unlimited")} { if (checked) { if (field.value > 0) limitedRoutingAttemptsRef.current = field.value; setUnlimitedAttemptsConfirm(true); return; } field.onChange(limitedRoutingAttemptsRef.current); }} />
); }} />
} />
} />
{t("settingsRoutingAttempts.unlimitedTitle")} {t("settingsRoutingAttempts.unlimitedDescription")} {t("common.cancel")} { form.setValue("routing.maxAttempts", UNLIMITED_ROUTING_ATTEMPTS, { shouldDirty: true, shouldTouch: true, shouldValidate: true }); setUnlimitedAttemptsConfirm(false); }} > {t("settingsRoutingAttempts.unlimitedConfirm")}
} />
(
)} />