/** ************************************************************************* * The contents of this file were generated with Amplify Studio. * * Please refrain from making any modifications to this file. * * Any changes to this file will be overwritten when running amplify pull. * ************************************************************************* */ /* eslint-disable */ import * as React from 'react'; import { fetchByPath, validateField } from './utils'; import { Book, Author } from '../models'; import { getOverrideProps, useDataStoreBinding } from '@aws-amplify/ui-react/internal'; import { Badge, Button, Divider, Flex, Grid, Icon, ScrollView, Text, TextField, useTheme, Autocomplete, } from '@aws-amplify/ui-react'; import { DataStore } from 'aws-amplify'; function ArrayField({ items = [], onChange, label, inputFieldRef, children, hasError, setFieldValue, currentFieldValue, defaultFieldValue, lengthLimit, getBadgeText, }) { const { tokens } = useTheme(); const [selectedBadgeIndex, setSelectedBadgeIndex] = React.useState(); const [isEditing, setIsEditing] = React.useState(); React.useEffect(() => { if (isEditing) { inputFieldRef?.current?.focus(); } }, [isEditing]); const removeItem = async (removeIndex) => { const newItems = items.filter((value, index) => index !== removeIndex); await onChange(newItems); setSelectedBadgeIndex(undefined); }; const addItem = async () => { if ((currentFieldValue !== undefined || currentFieldValue !== '') && !hasError) { const newItems = [...items]; if (selectedBadgeIndex !== undefined) { newItems[selectedBadgeIndex] = currentFieldValue; setSelectedBadgeIndex(undefined); } else { newItems.push(currentFieldValue); } await onChange(newItems); setIsEditing(false); } }; const arraySection = ( {!!items?.length && ( {items.map((value, index) => { return ( { setSelectedBadgeIndex(index); // populate display value setFieldValue(getBadgeText ? getBadgeText(items[index]) : items[index]); setIsEditing(true); }} > { // custom badge text getBadgeText ? getBadgeText(value) : value.toString() } { event.stopPropagation(); removeItem(index); }} /> ); })} )} ); // should not render input if limit reached & not editing if (lengthLimit !== undefined && items.length >= lengthLimit && !isEditing) { return arraySection; } return ( {isEditing && children} {!isEditing ? ( <> {label} ) : ( {(currentFieldValue || isEditing) && ( )} )} {arraySection} ); } export default function BookCreateForm(props) { const { clearOnSuccess = true, onSuccess, onError, onSubmit, onCancel, onValidate, onChange, overrides, ...rest } = props; const initialValues = { name: undefined, primaryAuthor: undefined, }; const [name, setName] = React.useState(initialValues.name); const [primaryAuthor, setPrimaryAuthor] = React.useState(initialValues.primaryAuthor); // grab records for suggestion const authorRecords = useDataStoreBinding({ type: 'collection', model: Author, }).items; // generated from valueMappings config const getDisplayValue = { primaryAuthor: (record) => record?.name, }; const [errors, setErrors] = React.useState({}); const resetStateValues = () => { setName(initialValues.name); setPrimaryAuthor(initialValues.primaryAuthor); setCurrentPrimaryAuthorValue(undefined); setCurrentPrimaryAuthorDisplayValue(undefined); }; // displayValue (string) and value (Model) must be set separately const [currentPrimaryAuthorValue, setCurrentPrimaryAuthorValue] = React.useState(undefined); const [currentPrimaryAuthorDisplayValue, setCurrentPrimaryAuthorDisplayValue] = React.useState(undefined); const primaryAuthorRef = React.createRef(); const validations = { name: [], primaryAuthor: [], }; // new arg so we're validating string, not Model const runValidationTasks = async (fieldName, currentValue, getDisplayValue) => { const value = getDisplayValue ? getDisplayValue(currentValue) : currentValue; let validationResponse = validateField(value, validations[fieldName]); const customValidator = fetchByPath(onValidate, fieldName); if (customValidator) { validationResponse = await customValidator(value, validationResponse); } setErrors((errors) => ({ ...errors, [fieldName]: validationResponse })); return validationResponse; }; return ( { event.preventDefault(); let modelFields = { name, primaryAuthor, }; const validationResponses = await Promise.all( Object.keys(validations).reduce((promises, fieldName) => { if (Array.isArray(modelFields[fieldName])) { promises.push( ...modelFields[fieldName].map((item) => // pass in getDisplayValue callback to validate string, not Model runValidationTasks(fieldName, item, getDisplayValue[fieldName]), ), ); return promises; } promises.push(runValidationTasks(fieldName, modelFields[fieldName], getDisplayValue[fieldName])); return promises; }, []), ); if (validationResponses.some((r) => r.hasError)) { return; } if (onSubmit) { modelFields = onSubmit(modelFields); } try { await DataStore.save(new Book(modelFields)); if (onSuccess) { onSuccess(modelFields); } if (clearOnSuccess) { resetStateValues(); } } catch (err) { if (onError) { onError(modelFields, err.message); } } }} {...rest} {...getOverrideProps(overrides, 'BookCreateForm')} > { let { value } = e.target; if (onChange) { const modelFields = { name: value, primaryAuthor, }; const result = onChange(modelFields); value = result?.name ?? value; } if (errors.name?.hasError) { runValidationTasks('name', value); } setName(value); }} onBlur={() => runValidationTasks('name', name)} errorMessage={errors.name?.errorMessage} hasError={errors.name?.hasError} {...getOverrideProps(overrides, 'name')} > { let value = items[0]; // function changed for single value if (onChange) { const modelFields = { name, primaryAuthor: value, }; const result = onChange(modelFields); value = result?.primaryAuthor ?? value; } setPrimaryAuthor(value); setCurrentPrimaryAuthorValue(undefined); // both value and displayValue emptied setCurrentPrimaryAuthorDisplayValue(undefined); }} currentFieldValue={currentPrimaryAuthorValue} label={'Primary author'} items={[primaryAuthor]} // passed in as array hasError={errors.primaryAuthor?.hasError} setFieldValue={setCurrentPrimaryAuthorDisplayValue} // display value must be set on edit inputFieldRef={primaryAuthorRef} defaultFieldValue={undefined} > { // called when user is typing let { value } = e.target; if (errors.primaryAuthor?.hasError) { runValidationTasks('primaryAuthor', value); } setCurrentPrimaryAuthorDisplayValue(value); setCurrentPrimaryAuthorValue(undefined); // empty out prev selected option }} suggestions={authorRecords.map((r) => ({ id: r.id, label: getDisplayValue['primaryAuthor']?.(record) ?? r.id, }))} onSuggestionSelect={({ id, label }) => { setCurrentPrimaryAuthorValue(authorRecords.find((r) => r.id === id)); setCurrentPrimaryAuthorDisplayValue(label); }} value={currentPrimaryAuthorDisplayValue} onBlur={() => runValidationTasks('primaryAuthor', currentPrimaryAuthorDisplayValue)} errorMessage={errors.primaryAuthor?.errorMessage} hasError={errors.primaryAuthor?.hasError} ref={primaryAuthorRef} {...getOverrideProps(overrides, 'primaryAuthor')} > ); }