import React, {FC, useState} from 'react' import {FieldValue, FieldValues, useForm} from 'react-hook-form'; import {ExclamationCircleIcon} from '@heroicons/react/outline'; import {useHistory} from "react-router-dom"; import {useDispatch, useSelector} from "react-redux"; import {gql} from '@apollo/client'; import {Question, QuestionCreateInput, QuestionStatus} from '../../../__generated__/graphql-schema'; import {formatInput} from '../formatInputs'; import {validateQuestionInputs} from '../../../utils/questions/questionValidations'; import {RootState} from '../../../services/store'; import {FormProvider} from './FormContext' import {SteppedForm, Step} from './SteppedForm' import { EnunciationFormStep, EnunciationFragment, AnswerFormStep, AnswerFragment, DistractorsFormStep, DistractorsFragment, FeaturesFormStep, FeaturesFragment, } from './steps' import { Button, Dialog, AlertV2Props, AlertV2, List, ListItem, } from '../../../components'; import {QuestionRoutePaths} from "../../../routes"; import {turnOff, turnOn} from "../../../services/store/unsavedChanges"; export const FormFragments = gql` ${EnunciationFragment} ${AnswerFragment} ${DistractorsFragment} ${FeaturesFragment} fragment FormFields on Question { ...EnunciationFields ...AnswerFields ...DistractorsFields ...FeaturesFields status } ` type Props = { question?: Question onSubmit?: (inputs: any) => void onDraftSubmit?: (inputs: any) => void alert?: AlertV2Props } export const Form: FC = ({question, onSubmit, onDraftSubmit, alert}) => { const [validationErrors, setValidationErrors] = useState([]) const [confirmSaveDialogIsOpen, setConfirmFinishDialogIsOpen] = useState(false) const [leaveDialogIsOpen, setLeaveDialogIsOpen] = useState(false) const formHooks = useForm({ defaultValues: { authorship: 'UNIFESO', authorshipYear: new Date().getFullYear().toString(), } }) const {register, control, setValue, getValues, reset, formState, resetField} = formHooks const [currentStep, setCurrentStep] = useState(0) const unsavedChanges = useSelector((state: RootState) => state.unsavedChanges) const history = useHistory() const dispatch = useDispatch() const minStep = 0 const maxStep = 3 const onFirstStep = currentStep === minStep const onLastStep = currentStep === maxStep if (formState.isDirty) { dispatch(turnOn()) } const handleNextStep = () => { if (onLastStep) return setCurrentStep(currentStep + 1) } const handlePreviousStep = () => { if (onFirstStep) return setCurrentStep(currentStep - 1) } const getFormattedInputValues = () => formatInput(getValues()) const handleCancel = () => { if (unsavedChanges && !leaveDialogIsOpen) { setLeaveDialogIsOpen(true) } else { history.push(QuestionRoutePaths.index) } } const handleDraftSave = () => { if (onDraftSubmit) { onDraftSubmit({...getFormattedInputValues(), status: QuestionStatus.Draft} as QuestionCreateInput) reset(getValues()) dispatch(turnOff()) } } const handleSave = () => { const inputs = {...getFormattedInputValues(), status: QuestionStatus.WaitingReview} as QuestionCreateInput const errors = validateQuestionInputs(inputs) setConfirmFinishDialogIsOpen(false) if (onSubmit && !errors.length) { dispatch(turnOff()) onSubmit(inputs) } else { setValidationErrors(errors) } reset(getValues()) } return ( {alert && ( )} setValidationErrors([])} onConfirmation={() => setValidationErrors([])} title="Falha de Validação" type="notice" text={ <> {validationErrors?.map((errorMessage) => ( } text={errorMessage} /> ))} } />
{(question?.status === QuestionStatus.Draft || question?.status === undefined) && } {onLastStep && }
) }