import React, { Fragment, useState } from 'react'; import { Button } from '../Button'; import { Checkbox } from '../Checkbox'; import { CreditCardProps } from '../CreditCard'; import { DatePicker } from '../DatePicker'; import { Input } from '../Input'; import { Radios } from '../Radios'; import { Select } from '../Select'; import { TextArea } from '../TextArea'; import styles from './Form.styles'; const { H3Styled, H4Styled, FormStyled } = styles; import { FormProps, DataInput } from './types'; const Form: React.FC = ({ buttonConfig, customFooter, data, id, isDisabled = false, onSubmit, title, ...props }) => { const [isSubmitted, setIsSubmitted] = useState(false); const formSubmitted = (event: React.SyntheticEvent) => { event.preventDefault(); event.stopPropagation(); const form = event.target as typeof event.target & HTMLFormElement; if (form.checkValidity()) { const dataReturned = data.map((item) => ({ inputName: item.name, inputResult: item.selectedCard || item.selected || item.value, key: item.key, })); onSubmit && onSubmit({ id: id, data: dataReturned, }); data.map((input) => (input.value = '')); setIsSubmitted(true); } else { form.reportValidity(); } }; const optionAdded = ( elementIndex: number, opt: string | number, isRadio: boolean, ) => { if (isRadio) { // @ts-ignore:next-line const selectRadioValue = data[elementIndex].options[Number(opt)]; if (typeof selectRadioValue === 'string') { data[elementIndex].selected = [selectRadioValue]; } else { data[elementIndex].selectedCard = selectRadioValue; } return; } if (!data[elementIndex].selected) { data[elementIndex].selected = [String(opt)]; } else { data[elementIndex]?.selected?.push(String(opt)); } }; const optionToggled = ( event: React.ChangeEvent, elementIndex: number, opt: string, ) => { const isRadio = Boolean(event.target.type === 'radio'); if (event.target.checked) { optionAdded(elementIndex, opt, isRadio); } else { const filtered = data[elementIndex]?.selected?.filter( (item) => item !== opt, ); data[elementIndex].selected = filtered; } }; const renderDatePicker = ( input: DataInput, type: 'date', index: number, ) => ( (data[index].selected = [String(e.date)])} validation={{ required: input.validation?.required }} disabled={isDisabled} /> ); const renderInput = ( input: DataInput, type: 'text' | 'number' | 'tel' | 'email' | 'password', index: number, ) => ( (data[index].value = e.target.value)} type={type} width={input.inputWidth} disabled={isDisabled} validation={{ characterMaxLength: input.validation?.characterMaxLength, characterMinLength: input.validation?.characterMinLength, numberMax: input.validation?.numberMax, numberMin: input.validation?.numberMin, regExp: input.validation?.regExp, regExpInvalidMessage: input.validation?.regExpInvalidMessage, required: input.validation?.required, }} /> ); const renderCheckbox = ( input: DataInput, layout: 'box' | 'switch', index: number, ) => ( {input.value} {(input.options || ([] as Array)).map( (opt, i) => ( optionToggled(e, index, String(opt))} validation={{ required: input.validation?.required }} disabled={isDisabled} /> ), )} ); const renderRadioGroup = (input: DataInput, index: number) => ( {input.value} optionToggled(e, index, e.target.value)} validation={{ required: input.validation?.required }} disabled={isDisabled} /> ); const renderTextArea = (input: DataInput, index: number) => ( {input.value}