import { useRouter } from 'next/router' import { useQueryClient } from 'react-query' import type { TrainingMaterialCore, TrainingMaterialDto } from '@/api/sshoc' import { useCreateTrainingMaterial } from '@/api/sshoc' import type { ItemCategory } from '@/api/sshoc/types' import { ActorsFormSection } from '@/components/item/ActorsFormSection/ActorsFormSection' import { MainFormSection } from '@/components/item/MainFormSection/MainFormSection' import { PropertiesFormSection } from '@/components/item/PropertiesFormSection/PropertiesFormSection' import { RelatedItemsFormSection } from '@/components/item/RelatedItemsFormSection/RelatedItemsFormSection' import { SourceFormSection } from '@/components/item/SourceFormSection/SourceFormSection' import { Button } from '@/elements/Button/Button' import { useToast } from '@/elements/Toast/useToast' import { validateCommonFormFields } from '@/lib/sshoc/validateCommonFormFields' import { useAuth } from '@/modules/auth/AuthContext' import { Form } from '@/modules/form/Form' import { getSingularItemCategoryLabel } from '@/utils/getSingularItemCategoryLabel' export type ItemFormValues = TrainingMaterialCore export interface ItemFormProps { category: ItemCategory initialValues?: Partial } /** * Item edit form. */ export function ItemForm(props: ItemFormProps): JSX.Element { const { category, initialValues } = props const categoryLabel = getSingularItemCategoryLabel(category) const useItemMutation = useCreateTrainingMaterial const toast = useToast() const router = useRouter() const auth = useAuth() const queryClient = useQueryClient() const create = useItemMutation({ onSuccess(data: TrainingMaterialDto) { toast.success(`Successfully submitted ${categoryLabel}.`) queryClient.invalidateQueries({ queryKey: ['itemSearch'], }) queryClient.invalidateQueries({ queryKey: ['getTrainingMaterials'], }) // queryClient.invalidateQueries({ // queryKey: ['getTrainingMaterial', { id: data.persistentId }], // }) router.push({ pathname: `/${data.category}/${data.persistentId}` }) }, onError() { toast.error(`Failed to submit ${categoryLabel}.`) }, }) function onSubmit(values: ItemFormValues) { if (auth.session?.accessToken == null) { toast.error('Authentication required.') return Promise.reject() } /** * Backend crashes with `source: {}`. */ if (values.source && values.source.id === undefined) { delete values.source } return create.mutateAsync([{}, values, { token: auth.session.accessToken }]) } function onValidate(values: Partial) { const errors: Partial> = {} validateCommonFormFields(values, errors) return errors } function onCancel() { router.push('/') } return (
{({ handleSubmit, pristine, invalid, submitting }) => { return (
) }} ) }