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 (
{error ? : null}
); } 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."; }