import { AddressTypeInput } from "@saleor/customers/types"; import { AccountErrorCode, AccountErrorFragment, AddressInput, AddressTypeEnum } from "@saleor/graphql"; import { transformFormToAddressInput } from "@saleor/misc"; import { add, remove } from "@saleor/utils/lists"; import { useState } from "react"; interface UseAddressValidation { errors: AccountErrorFragment[]; submit: ( data: TInput & AddressTypeInput ) => TOutput | Promise; } function useAddressValidation( onSubmit: (address: TInput & AddressInput) => TOutput, addressType?: AddressTypeEnum ): UseAddressValidation { const [validationErrors, setValidationErrors] = useState< AccountErrorFragment[] >([]); const countryRequiredError: AccountErrorFragment = { __typename: "AccountError", code: AccountErrorCode.REQUIRED, field: "country", addressType, message: "Country required" }; return { errors: validationErrors, submit: (data: TInput & AddressTypeInput) => { try { setValidationErrors( remove( countryRequiredError, validationErrors, (a, b) => a.field === b.field ) ); return onSubmit(transformFormToAddressInput(data)); } catch { const errors = add(countryRequiredError, validationErrors); setValidationErrors(errors); // since every onSubmit must return Promise return Promise.resolve(errors); } } }; } export default useAddressValidation;