import { FunctionComponent, useState } from "react"; import Link from "next/link"; import { useRouter } from "next/router"; import { ErrorMessage, Field, FieldArray, Formik } from "formik"; import { useMutation } from "react-query"; import { fetch, FetchError, FetchResponse } from "../../utils/dataAccess"; import { Review } from "../../types/Review"; interface Props { review?: Review; } interface SaveParams { values: Review; } interface DeleteParams { id: string; } const saveReview = async ({ values }: SaveParams) => await fetch(!values["@id"] ? "/reviews" : values["@id"], { method: !values["@id"] ? "POST" : "PUT", body: JSON.stringify(values), }); const deleteReview = async (id: string) => await fetch(id, { method: "DELETE" }); export const Form: FunctionComponent = ({ review }) => { const [, setError] = useState(null); const router = useRouter(); const saveMutation = useMutation< FetchResponse | undefined, Error | FetchError, SaveParams >((saveParams) => saveReview(saveParams)); const deleteMutation = useMutation< FetchResponse | undefined, Error | FetchError, DeleteParams >(({ id }) => deleteReview(id), { onSuccess: () => { router.push("/reviews"); }, onError: (error) => { setError(`Error when deleting the resource: ${error}`); console.error(error); }, }); const handleDelete = () => { if (!review || !review["@id"]) return; if (!window.confirm("Are you sure you want to delete this item?")) return; deleteMutation.mutate({ id: review["@id"] }); }; return (
{`< Back to list`}

{review ? `Edit Review ${review["@id"]}` : `Create Review`}

{ const errors = {}; // add your validation logic here return errors; }} onSubmit={(values, { setSubmitting, setStatus, setErrors }) => { const isCreation = !values["@id"]; saveMutation.mutate( { values }, { onSuccess: () => { setStatus({ isValid: true, msg: `Element ${isCreation ? "created" : "updated"}.`, }); router.push("/reviews"); }, onError: (error) => { setStatus({ isValid: false, msg: `${error.message}`, }); if ("fields" in error) { setErrors(error.fields); } }, onSettled: () => { setSubmitting(false); }, } ); }} > {({ values, status, errors, touched, handleChange, handleBlur, handleSubmit, isSubmitting, }) => (
book
(
{values.book && values.book.length > 0 ? ( values.book.map((item: any, index: number) => (
)) ) : ( )}
)} />
{status && status.msg && (
{status.msg}
)}
)}
{review && ( )}
); };