import
{
FocusContext,
useFocusable,
} from "@noriginmedia/norigin-spatial-navigation";
import { useIsMutating, useMutation, useQuery } from "@tanstack/react-query";
import { createFileRoute } from "@tanstack/react-router";
import classNames from "classnames";
import { Key, Link, Lock, Save, Trash, User, X } from "lucide-react";
import
{
useEffect,
} from "react";
import { RPC_URL } from "../../../shared/constants";
import
{
getCurrentUserApiUsersMeGetOptions,
statsApiStatsGetOptions,
} from "../../../clients/romm/@tanstack/react-query.gen";
import toast from "react-hot-toast";
import z from "zod";
import { OptionSpace } from "../../components/options/OptionSpace";
import { useSettingsForm, useSettingsFormContext } from "../../components/options/SettingsAppForm";
import { rommApi, settingsApi } from "../../scripts/clientApi";
import { Button } from "../../components/options/Button";
export const Route = createFileRoute("/settings/accounts")({
component: RouteComponent,
});
function LoginControls (data: { hasPassword: boolean; })
{
const user = useQuery({
...getCurrentUserApiUsersMeGetOptions(),
queryKey: ['romm', 'auth', "login"],
refetchOnWindowFocus: false,
retry: 0
});
const context = useSettingsFormContext({});
context.state.canSubmit;
const isMutatingRomm = useIsMutating({ mutationKey: ["romm", "auth"] }) > 0;
const logoutMutation = useMutation({
mutationKey: ["romm", "auth", "logout"], mutationFn: () => rommApi.api.romm.logout.post(),
onSuccess: async (d, v, r, c) =>
{
c.client.invalidateQueries({ queryKey: ["romm", "auth"] });
}
});
return
{user.isError &&
}
{user.isSuccess && <>
Logged In As:
{user.data?.username}
>}
{data.hasPassword &&
}
;
}
const dataSchema = z.object({ hostname: z.url(), username: z.string(), password: z.string() });
function RouteComponent ()
{
const { focus } = Route.useSearch();
const { ref, focusKey, focusSelf } = useFocusable({
preferredChildFocusKey: focus
});
const { data: hasPassword } = useQuery({ queryKey: ['romm', 'auth', 'passLength'], queryFn: () => rommApi.api.romm.login.get().then(d => d.data?.hasPassword as boolean) });
const { data: hostname } = useQuery({ queryKey: ['romm', 'auth', 'hostname'], queryFn: () => settingsApi.api.settings({ id: 'rommAddress' }).get().then(d => d.data?.value as string) });
const { data: username } = useQuery({ queryKey: ['romm', 'auth', 'username'], queryFn: () => settingsApi.api.settings({ id: 'rommUser' }).get().then(d => d.data?.value as string) });
const loginForm = useSettingsForm({
defaultValues: {
hostname: hostname ?? '',
username: username ?? '',
password: ''
},
onSubmit: async ({ value }) =>
{
await toast.promise(loginMutation.mutateAsync(value), {
loading: "Logging In",
success: "Logged In",
error: e => e?.detail ?? "Error Logging In",
});
loginForm.reset();
},
validators: {
onChange: dataSchema
}
});
const rommOnline = useQuery({
...statsApiStatsGetOptions(),
refetchInterval: 30000,
retry: false,
});
useEffect(() =>
{
if (focus)
{
focusSelf();
}
}, [focus]);
const loginMutation = useMutation({
mutationKey: ["romm", "login"],
mutationFn: (data: z.infer) =>
{
return rommApi.api.romm.login.post({ username: data.username, password: data.password, host: data.hostname });
},
onSuccess: (d, v, r, c) =>
{
c.client.invalidateQueries({ queryKey: ['romm', 'auth'] });
},
onError: (e) =>
{
console.error(e);
},
});
let indicator = "";
if (rommOnline.isError)
{
indicator = "status-error";
} else if (rommOnline.isSuccess)
{
indicator = "status-success";
}
return (
);
}