117 lines
3.3 KiB
TypeScript
117 lines
3.3 KiB
TypeScript
import { XCircleIcon } from "@heroicons/react/20/solid";
|
|
import { AdminBarLayout } from "~/components/admin/ControlBar";
|
|
import { AdminActionButton, AdminActionLink } from "~/components/admin/common";
|
|
import Image from "next/image";
|
|
import {
|
|
ResourceForm,
|
|
type ResourceUpdateInput,
|
|
} from "~/components/admin/resources/form";
|
|
import { useState } from "react";
|
|
import { useForm, type SubmitHandler } from "react-hook-form";
|
|
import { api } from "~/utils/api";
|
|
import { useRouter } from "next/router";
|
|
import { HeaderFooterLayout } from "~/layouts/HeaderFooterLayout";
|
|
import { QueryWaitWrapper } from "~/components/LoadingWrapper";
|
|
import { type AuditoryResource } from "@prisma/client";
|
|
import { parseTRPCErrorMessage } from "~/utils/parseTRPCError";
|
|
|
|
const EditResourcePage = () => {
|
|
const router = useRouter();
|
|
const id = router.query["id"]?.toString() ?? "";
|
|
|
|
const resourceQuery = api.auditoryResource.byId.useQuery(
|
|
{ id },
|
|
{
|
|
enabled: router.isReady,
|
|
retry(_failureCount, error) {
|
|
return error.data?.httpStatus !== 404;
|
|
},
|
|
refetchOnWindowFocus: false,
|
|
refetchOnMount: false,
|
|
refetchInterval: false,
|
|
}
|
|
);
|
|
|
|
const ConditionalView = (data: AuditoryResource) => {
|
|
const [serverError, setServerError] = useState<string | undefined>(
|
|
undefined
|
|
);
|
|
const formMethods = useForm<ResourceUpdateInput>({
|
|
defaultValues: data as ResourceUpdateInput,
|
|
});
|
|
|
|
const { mutate } = api.auditoryResource.update.useMutation({
|
|
onSuccess: async (resData) => {
|
|
if (!resData) {
|
|
setServerError("An unexpected error has occured");
|
|
return;
|
|
}
|
|
|
|
setServerError(undefined);
|
|
await router.push(`/resources/${data.id}`);
|
|
},
|
|
onError: (error) => {
|
|
setServerError(parseTRPCErrorMessage(error.message));
|
|
},
|
|
});
|
|
|
|
const onSubmit: SubmitHandler<ResourceUpdateInput> = (data) => {
|
|
mutate(data);
|
|
};
|
|
|
|
return (
|
|
<AdminBarLayout
|
|
actions={[
|
|
<AdminActionButton
|
|
key="save"
|
|
symbol={
|
|
<span className="flex">
|
|
<Image
|
|
className="inline-block group-hover:hidden"
|
|
alt="save"
|
|
src="/save-disk-white.svg"
|
|
width={14}
|
|
height={14}
|
|
/>
|
|
<Image
|
|
className="hidden group-hover:inline-block"
|
|
alt="save"
|
|
src="/save-disk-black.svg"
|
|
width={14}
|
|
height={14}
|
|
/>
|
|
</span>
|
|
}
|
|
label="Save"
|
|
onClick={() => {
|
|
onSubmit(formMethods.getValues());
|
|
}}
|
|
/>,
|
|
<AdminActionLink
|
|
key="cancel"
|
|
symbol={<XCircleIcon className="w-4" />}
|
|
label="Cancel"
|
|
href={`/resources/${data.id}`}
|
|
/>,
|
|
]}
|
|
>
|
|
<div className="mb-12">
|
|
<ResourceForm
|
|
methods={formMethods}
|
|
error={serverError}
|
|
resource={data as ResourceUpdateInput}
|
|
/>
|
|
</div>
|
|
</AdminBarLayout>
|
|
);
|
|
};
|
|
|
|
return (
|
|
<HeaderFooterLayout>
|
|
<QueryWaitWrapper query={resourceQuery} Render={ConditionalView} />
|
|
</HeaderFooterLayout>
|
|
);
|
|
};
|
|
|
|
export default EditResourcePage;
|