import { useState } from "react";
import { Link, useNavigate, useParams } from "react-router";
import { useSWRConfig } from "swr";
import { ChevronRightIcon } from "@heroicons/react/20/solid";
import type { Environment } from "@qltysh/fabro-api-client";
import { ApiError, apiData, environmentsApi } from "../lib/api-client";
import { queryKeys } from "../lib/query-keys";
import { useEnvironment } from "../lib/queries";
import {
EnvironmentFormFields,
environmentToFormValues,
isEnvironmentFormValid,
replaceRequestFromForm,
type EnvironmentFormValues,
} from "../components/environment-form";
import { Panel, PanelSkeleton } from "../components/settings-panel";
import {
ErrorMessage,
PRIMARY_BUTTON_CLASS,
SECONDARY_BUTTON_CLASS,
} from "../components/ui";
import { useToast } from "../components/toast";
export function meta() {
return [{ title: "Edit environment — Fabro" }];
}
export default function SettingsEnvironmentsEdit() {
const { id } = useParams<{ id: string }>();
const query = useEnvironment(id);
return (
{query.data ? (
) : query.error ? (
Couldn't load this environment. It may have been deleted.
) : (
)}
);
}
function PageHeader({ id }: { id: string }) {
return (
);
}
function EditEnvironmentForm({ environment }: { environment: Environment }) {
const navigate = useNavigate();
const { mutate } = useSWRConfig();
const toast = useToast();
const [values, setValues] = useState(() =>
environmentToFormValues(environment),
);
const [submitting, setSubmitting] = useState(false);
const [error, setError] = useState(null);
const canSubmit = isEnvironmentFormValid(values) && !submitting;
async function onSubmit(event: React.FormEvent) {
event.preventDefault();
if (!canSubmit) return;
setSubmitting(true);
setError(null);
try {
await apiData(() =>
environmentsApi.replaceEnvironment(
environment.id,
environment.revision,
replaceRequestFromForm(values),
),
);
await mutate(queryKeys.environments.list());
await mutate(queryKeys.environments.detail(environment.id));
toast.push({ message: `Environment “${environment.id}” updated.` });
navigate("/settings/environments");
} catch (cause) {
setError(staleAwareMessage(cause));
setSubmitting(false);
}
}
return (
);
}
function staleAwareMessage(cause: unknown): string {
if (cause instanceof ApiError && cause.status === 409) {
return "This environment changed since you opened it. Reload the page to get the latest version, then reapply your edits.";
}
if (cause instanceof ApiError && cause.message) {
return cause.message;
}
return "Couldn't update the environment. Please try again.";
}