@gusto/embedded-react-sdk 0.12.0 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Base/Base.js +18 -19
- package/dist/components/Base/Base.js.map +1 -1
- package/dist/components/Common/SignatureForm/SignatureForm.js +4 -6
- package/dist/components/Common/SignatureForm/SignatureForm.js.map +1 -1
- package/dist/components/Common/SignatureForm/SignatureFormActions.js +10 -12
- package/dist/components/Common/SignatureForm/SignatureFormActions.js.map +1 -1
- package/dist/components/Common/SignatureForm/SignatureFormFields.js +6 -8
- package/dist/components/Common/SignatureForm/SignatureFormFields.js.map +1 -1
- package/dist/components/Common/UI/ProgressBar/ProgressBar.d.ts +1 -1
- package/dist/components/Common/UI/ProgressBar/ProgressBar.js +19 -9
- package/dist/components/Common/UI/ProgressBar/ProgressBar.js.map +1 -1
- package/dist/components/Common/UI/ProgressBar/ProgressBarTypes.d.ts +4 -0
- package/dist/components/Company/AssignSignatory/AssignSignatory.js +6 -8
- package/dist/components/Company/AssignSignatory/AssignSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/AssignSignatorySelection.js +6 -7
- package/dist/components/Company/AssignSignatory/AssignSignatorySelection.js.map +1 -1
- package/dist/components/Company/AssignSignatory/CreateSignatory/Actions.js +8 -9
- package/dist/components/Company/AssignSignatory/CreateSignatory/Actions.js.map +1 -1
- package/dist/components/Company/AssignSignatory/CreateSignatory/CreateSignatory.js +2 -3
- package/dist/components/Company/AssignSignatory/CreateSignatory/CreateSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/CreateSignatory/CreateSignatoryForm.js +2 -3
- package/dist/components/Company/AssignSignatory/CreateSignatory/CreateSignatoryForm.js.map +1 -1
- package/dist/components/Company/AssignSignatory/CreateSignatory/useCreateSignatory.js +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/Actions.js +6 -7
- package/dist/components/Company/AssignSignatory/InviteSignatory/Actions.js.map +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/InviteSignatory.js +5 -6
- package/dist/components/Company/AssignSignatory/InviteSignatory/InviteSignatory.js.map +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/InviteSignatoryForm.js +9 -10
- package/dist/components/Company/AssignSignatory/InviteSignatory/InviteSignatoryForm.js.map +1 -1
- package/dist/components/Company/AssignSignatory/InviteSignatory/useInviteSignatory.js +1 -1
- package/dist/components/Company/AssignSignatory/TitleSelect.js +7 -8
- package/dist/components/Company/AssignSignatory/TitleSelect.js.map +1 -1
- package/dist/components/Company/AssignSignatory/useAssignSignatory.js +1 -1
- package/dist/components/Company/BankAccount/BankAccount.js +6 -6
- package/dist/components/Company/BankAccount/BankAccount.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/Actions.js +2 -3
- package/dist/components/Company/BankAccount/BankAccountForm/Actions.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/BankAccountForm.js +7 -7
- package/dist/components/Company/BankAccount/BankAccountForm/BankAccountForm.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/Form.js +7 -8
- package/dist/components/Company/BankAccount/BankAccountForm/Form.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountForm/context.js +1 -1
- package/dist/components/Company/BankAccount/BankAccountList/Actions.js +6 -7
- package/dist/components/Company/BankAccount/BankAccountList/Actions.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountList/BankAccountList.js +3 -3
- package/dist/components/Company/BankAccount/BankAccountList/BankAccountList.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountVerify/Actions.js +7 -8
- package/dist/components/Company/BankAccount/BankAccountVerify/Actions.js.map +1 -1
- package/dist/components/Company/BankAccount/BankAccountVerify/Form.js +4 -5
- package/dist/components/Company/BankAccount/BankAccountVerify/Form.js.map +1 -1
- package/dist/components/Company/DocumentSigner/DocumentList/Actions.js +5 -6
- package/dist/components/Company/DocumentSigner/DocumentList/Actions.js.map +1 -1
- package/dist/components/Company/DocumentSigner/DocumentList/DocumentList.js +10 -12
- package/dist/components/Company/DocumentSigner/DocumentList/DocumentList.js.map +1 -1
- package/dist/components/Company/DocumentSigner/DocumentList/useDocumentList.js +1 -1
- package/dist/components/Company/DocumentSigner/SignatureForm/SignatureForm.js +6 -8
- package/dist/components/Company/DocumentSigner/SignatureForm/SignatureForm.js.map +1 -1
- package/dist/components/Company/DocumentSigner/SignatureForm/useSignatureForm.js +1 -1
- package/dist/components/Company/FederalTaxes/Actions.js +6 -7
- package/dist/components/Company/FederalTaxes/Actions.js.map +1 -1
- package/dist/components/Company/FederalTaxes/FederalTaxes.js +15 -17
- package/dist/components/Company/FederalTaxes/FederalTaxes.js.map +1 -1
- package/dist/components/Company/FederalTaxes/Form.js +2 -3
- package/dist/components/Company/FederalTaxes/Form.js.map +1 -1
- package/dist/components/Company/FederalTaxes/useFederalTaxes.js +1 -1
- package/dist/components/Company/Industry/Actions.js +5 -6
- package/dist/components/Company/Industry/Actions.js.map +1 -1
- package/dist/components/Company/Industry/Context.js +1 -1
- package/dist/components/Company/Industry/Edit.js +10 -11
- package/dist/components/Company/Industry/Edit.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/Actions.js +2 -3
- package/dist/components/Company/Locations/LocationForm/Actions.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/Form.js +4 -5
- package/dist/components/Company/Locations/LocationForm/Form.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/LocationForm.js +9 -11
- package/dist/components/Company/Locations/LocationForm/LocationForm.js.map +1 -1
- package/dist/components/Company/Locations/LocationForm/useLocationForm.js +1 -1
- package/dist/components/Company/Locations/LocationsList/Actions.js +2 -3
- package/dist/components/Company/Locations/LocationsList/Actions.js.map +1 -1
- package/dist/components/Company/Locations/LocationsList/List.js +2 -3
- package/dist/components/Company/Locations/LocationsList/List.js.map +1 -1
- package/dist/components/Company/Locations/LocationsList/LocationsList.js +12 -14
- package/dist/components/Company/Locations/LocationsList/LocationsList.js.map +1 -1
- package/dist/components/Company/Locations/LocationsList/useLocationsList.js +1 -1
- package/dist/components/Company/OnboardingOverview/Completed.js +5 -6
- package/dist/components/Company/OnboardingOverview/Completed.js.map +1 -1
- package/dist/components/Company/OnboardingOverview/MissingRequirements.js +2 -3
- package/dist/components/Company/OnboardingOverview/MissingRequirements.js.map +1 -1
- package/dist/components/Company/OnboardingOverview/OnboardingOverview.js +2 -4
- package/dist/components/Company/OnboardingOverview/OnboardingOverview.js.map +1 -1
- package/dist/components/Company/OnboardingOverview/context.js +1 -1
- package/dist/components/Company/PaySchedule/PaySchedule.js +32 -34
- package/dist/components/Company/PaySchedule/PaySchedule.js.map +1 -1
- package/dist/components/Company/PaySchedule/_parts/Actions.js +10 -11
- package/dist/components/Company/PaySchedule/_parts/Actions.js.map +1 -1
- package/dist/components/Company/PaySchedule/_parts/Edit.js +2 -3
- package/dist/components/Company/PaySchedule/_parts/Edit.js.map +1 -1
- package/dist/components/Company/PaySchedule/_parts/Head.js +2 -3
- package/dist/components/Company/PaySchedule/_parts/Head.js.map +1 -1
- package/dist/components/Company/PaySchedule/_parts/List.js +5 -6
- package/dist/components/Company/PaySchedule/_parts/List.js.map +1 -1
- package/dist/components/Company/PaySchedule/usePaySchedule.js +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesForm/Actions.js +5 -6
- package/dist/components/Company/StateTaxes/StateTaxesForm/Actions.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesForm/context.js +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesList/Actions.js +6 -7
- package/dist/components/Company/StateTaxes/StateTaxesList/Actions.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesList/List.js +5 -6
- package/dist/components/Company/StateTaxes/StateTaxesList/List.js.map +1 -1
- package/dist/components/Company/StateTaxes/StateTaxesList/context.js +1 -1
- package/dist/components/Contractor/Address/Address.js +3 -5
- package/dist/components/Contractor/Address/Address.js.map +1 -1
- package/dist/components/Contractor/Address/Form.js +2 -3
- package/dist/components/Contractor/Address/Form.js.map +1 -1
- package/dist/components/Contractor/Address/useAddress.js +1 -1
- package/dist/components/Contractor/ContractorList/index.js +8 -9
- package/dist/components/Contractor/ContractorList/index.js.map +1 -1
- package/dist/components/Contractor/NewHireReport/NewHireReport.js +16 -17
- package/dist/components/Contractor/NewHireReport/NewHireReport.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlow.js +12 -11
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlow.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlowComponents.d.ts +1 -0
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlowComponents.js +42 -22
- package/dist/components/Contractor/OnboardingFlow/OnboardingFlowComponents.js.map +1 -1
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.d.ts +5 -5
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.js +34 -16
- package/dist/components/Contractor/OnboardingFlow/onboardingStateMachine.js.map +1 -1
- package/dist/components/Contractor/PaymentMethod/BankAccountForm.js +2 -3
- package/dist/components/Contractor/PaymentMethod/BankAccountForm.js.map +1 -1
- package/dist/components/Contractor/PaymentMethod/PaymentMethod.js +2 -3
- package/dist/components/Contractor/PaymentMethod/PaymentMethod.js.map +1 -1
- package/dist/components/Contractor/PaymentMethod/PaymentTypeForm.js +2 -3
- package/dist/components/Contractor/PaymentMethod/PaymentTypeForm.js.map +1 -1
- package/dist/components/Contractor/Profile/ContractorProfile.js +22 -15
- package/dist/components/Contractor/Profile/ContractorProfile.js.map +1 -1
- package/dist/components/Contractor/Profile/ContractorProfileForm.d.ts +3 -1
- package/dist/components/Contractor/Profile/ContractorProfileForm.js +68 -65
- package/dist/components/Contractor/Profile/ContractorProfileForm.js.map +1 -1
- package/dist/components/Contractor/Profile/useContractorProfile.d.ts +16 -16
- package/dist/components/Contractor/Profile/useContractorProfile.js +101 -94
- package/dist/components/Contractor/Profile/useContractorProfile.js.map +1 -1
- package/dist/components/Contractor/Submit/Submit.js +36 -37
- package/dist/components/Contractor/Submit/Submit.js.map +1 -1
- package/dist/components/Employee/Compensation/Actions.js +4 -5
- package/dist/components/Employee/Compensation/Actions.js.map +1 -1
- package/dist/components/Employee/Compensation/Edit.js +2 -3
- package/dist/components/Employee/Compensation/Edit.js.map +1 -1
- package/dist/components/Employee/Compensation/List.js +5 -6
- package/dist/components/Employee/Compensation/List.js.map +1 -1
- package/dist/components/Employee/Deductions/DeductionsForm/DeductionsForm.js +2 -3
- package/dist/components/Employee/Deductions/DeductionsForm/DeductionsForm.js.map +1 -1
- package/dist/components/Employee/Deductions/DeductionsList/DeductionsList.js +6 -7
- package/dist/components/Employee/Deductions/DeductionsList/DeductionsList.js.map +1 -1
- package/dist/components/Employee/Deductions/IncludeDeductionsForm/IncludeDeductionsForm.js +2 -3
- package/dist/components/Employee/Deductions/IncludeDeductionsForm/IncludeDeductionsForm.js.map +1 -1
- package/dist/components/Employee/DocumentSigner/DocumentList/Actions.js +4 -5
- package/dist/components/Employee/DocumentSigner/DocumentList/Actions.js.map +1 -1
- package/dist/components/Employee/DocumentSigner/DocumentList/DocumentList.js +9 -11
- package/dist/components/Employee/DocumentSigner/DocumentList/DocumentList.js.map +1 -1
- package/dist/components/Employee/DocumentSigner/DocumentList/List.js +2 -3
- package/dist/components/Employee/DocumentSigner/DocumentList/List.js.map +1 -1
- package/dist/components/Employee/DocumentSigner/DocumentList/useDocumentList.js +1 -1
- package/dist/components/Employee/DocumentSigner/SignatureForm/SignatureForm.js +11 -13
- package/dist/components/Employee/DocumentSigner/SignatureForm/SignatureForm.js.map +1 -1
- package/dist/components/Employee/DocumentSigner/SignatureForm/useSignatureForm.js +1 -1
- package/dist/components/Employee/EmployeeList/Actions.js +4 -5
- package/dist/components/Employee/EmployeeList/Actions.js.map +1 -1
- package/dist/components/Employee/EmployeeList/EmployeeList.js +2 -4
- package/dist/components/Employee/EmployeeList/EmployeeList.js.map +1 -1
- package/dist/components/Employee/EmployeeList/Head.js +2 -3
- package/dist/components/Employee/EmployeeList/Head.js.map +1 -1
- package/dist/components/Employee/EmployeeList/List.js +2 -3
- package/dist/components/Employee/EmployeeList/List.js.map +1 -1
- package/dist/components/Employee/EmployeeList/useEmployeeList.js +1 -1
- package/dist/components/Employee/Landing/Landing.js +6 -7
- package/dist/components/Employee/Landing/Landing.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/Actions.js +5 -6
- package/dist/components/Employee/PaymentMethod/Actions.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/BankAccountEdit.js +4 -5
- package/dist/components/Employee/PaymentMethod/BankAccountEdit.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/BankAccountsList.js +2 -3
- package/dist/components/Employee/PaymentMethod/BankAccountsList.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/PaymentTypeForm.js +2 -3
- package/dist/components/Employee/PaymentMethod/PaymentTypeForm.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/Split.js +2 -3
- package/dist/components/Employee/PaymentMethod/Split.js.map +1 -1
- package/dist/components/Employee/PaymentMethod/usePaymentMethod.js +1 -1
- package/dist/components/Employee/Profile/Actions.js +6 -7
- package/dist/components/Employee/Profile/Actions.js.map +1 -1
- package/dist/components/Employee/Profile/AdminPersonalDetails.d.ts +6 -6
- package/dist/components/Employee/Profile/AdminPersonalDetails.js +9 -10
- package/dist/components/Employee/Profile/AdminPersonalDetails.js.map +1 -1
- package/dist/components/Employee/Profile/HomeAddress.js +4 -5
- package/dist/components/Employee/Profile/HomeAddress.js.map +1 -1
- package/dist/components/Employee/Profile/PersonalDetailsInputs.d.ts +2 -2
- package/dist/components/Employee/Profile/PersonalDetailsInputs.js +20 -21
- package/dist/components/Employee/Profile/PersonalDetailsInputs.js.map +1 -1
- package/dist/components/Employee/Profile/useProfile.js +1 -1
- package/dist/components/Employee/Taxes/Actions.js +7 -8
- package/dist/components/Employee/Taxes/Actions.js.map +1 -1
- package/dist/components/Employee/Taxes/FederalForm.js +4 -5
- package/dist/components/Employee/Taxes/FederalForm.js.map +1 -1
- package/dist/components/Employee/Taxes/useTaxes.js +1 -1
- package/dist/components/Flow/Flow.js +15 -13
- package/dist/components/Flow/Flow.js.map +1 -1
- package/dist/components/Flow/useFlow.d.ts +1 -0
- package/dist/components/Flow/useFlow.js.map +1 -1
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.d.ts +6 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js +41 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfiguration.js.map +1 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.d.ts +11 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js +78 -0
- package/dist/components/Payroll/PayrollConfiguration/PayrollConfigurationPresentation.js.map +1 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployee.d.ts +6 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployee.js +19 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployee.js.map +1 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.d.ts +5 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js +21 -0
- package/dist/components/Payroll/PayrollEditEmployee/PayrollEditEmployeePresentation.js.map +1 -0
- package/dist/components/Payroll/PayrollList/PayrollList.d.ts +6 -0
- package/dist/components/Payroll/PayrollList/PayrollList.js +17 -0
- package/dist/components/Payroll/PayrollList/PayrollList.js.map +1 -0
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.d.ts +9 -0
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.js +49 -0
- package/dist/components/Payroll/PayrollList/PayrollListPresentation.js.map +1 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.d.ts +7 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js +32 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverview.js.map +1 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.d.ts +6 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js +68 -0
- package/dist/components/Payroll/PayrollOverview/PayrollOverviewPresentation.js.map +1 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayroll.d.ts +16 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayroll.js +55 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayroll.js.map +1 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayrollFlow.d.ts +6 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayrollFlow.js +20 -0
- package/dist/components/Payroll/RunPayrollFlow/RunPayrollFlow.js.map +1 -0
- package/dist/components/Payroll/index.d.ts +6 -0
- package/dist/components/Payroll/index.js +13 -0
- package/dist/components/Payroll/index.js.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.js +5 -6
- package/dist/contexts/GustoProvider/GustoProviderCustomUIAdapter.js.map +1 -1
- package/dist/i18n/en/Contractor.ContractorList.json.js +13 -11
- package/dist/i18n/en/Contractor.ContractorList.json.js.map +1 -1
- package/dist/i18n/en/Contractor.Profile.json.js +1 -1
- package/dist/index.js +11 -9
- package/dist/index.js.map +1 -1
- package/dist/shared/constants.d.ts +26 -0
- package/dist/shared/constants.js +72 -45
- package/dist/shared/constants.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/i18next.d.ts +2 -3
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContractorProfileForm.js","sources":["../../../../src/components/Contractor/Profile/ContractorProfileForm.tsx"],"sourcesContent":["import { FormProvider } from 'react-hook-form'\nimport { useTranslation } from 'react-i18next'\nimport type { useContractorProfile } from './useContractorProfile'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { Grid } from '@/components/Common/Grid/Grid'\nimport { Flex } from '@/components/Common/Flex'\nimport { TextInputField } from '@/components/Common/Fields/TextInputField'\nimport { NumberInputField } from '@/components/Common/Fields/NumberInputField'\nimport { RadioGroupField } from '@/components/Common/Fields/RadioGroupField'\nimport { SwitchField } from '@/components/Common/Fields/SwitchField'\nimport { DatePickerField } from '@/components/Common/Fields/DatePickerField'\nimport { normalizeSSN } from '@/helpers/ssn'\nimport { normalizeEin } from '@/helpers/federalEin'\n\n// Pure presentation component - takes all data as props\nexport type ContractorProfileFormProps = ReturnType<typeof useContractorProfile> & {\n className?: string\n}\n\nexport function ContractorProfileForm({\n formMethods,\n handleSubmit,\n formState,\n shouldShowEmailField,\n shouldShowBusinessFields,\n shouldShowIndividualFields,\n shouldShowHourlyRate,\n contractorTypeOptions,\n wageTypeOptions,\n isEditing,\n className,\n}: ContractorProfileFormProps) {\n const Components = useComponentContext()\n useI18n('Contractor.Profile')\n const { t } = useTranslation('Contractor.Profile')\n\n return (\n <section className={className}>\n <FormProvider {...formMethods}>\n <Form onSubmit={handleSubmit}>\n <Grid gridTemplateColumns=\"1fr\" gap={24} className=\"mb-8\">\n <header>\n <Components.Heading as=\"h2\">{t('title')}</Components.Heading>\n <Components.Text>{t('subtitle')}</Components.Text>\n </header>\n\n {/* Invite Contractor Card */}\n <Components.Card>\n <Grid gap={16}>\n {/* Invite Contractor Toggle */}\n <SwitchField\n name=\"inviteContractor\"\n label={t('fields.inviteContractor.label')}\n description={t('fields.inviteContractor.description')}\n />\n\n {/* Email Field - shown when inviting contractor */}\n {shouldShowEmailField && (\n <TextInputField\n name=\"email\"\n label={t('fields.email.label')}\n isRequired\n type=\"email\"\n />\n )}\n </Grid>\n </Components.Card>\n\n {/* Contractor Type */}\n <RadioGroupField\n name=\"contractorType\"\n isRequired\n label={t('fields.contractorType.label')}\n options={contractorTypeOptions}\n />\n\n {/* Individual Contractor Fields */}\n {shouldShowIndividualFields && (\n <>\n <Grid gridTemplateColumns={{ base: '1fr', medium: '1fr 1fr' }} gap={16}>\n <TextInputField name=\"firstName\" label={t('fields.firstName.label')} isRequired />\n <TextInputField name=\"middleInitial\" label={t('fields.middleInitial.label')} />\n </Grid>\n <TextInputField name=\"lastName\" label={t('fields.lastName.label')} isRequired />\n <TextInputField\n name=\"ssn\"\n label={t('fields.ssn.label')}\n placeholder={t('fields.ssn.placeholder')}\n transform={normalizeSSN}\n isRequired\n />\n </>\n )}\n\n {/* Business Contractor Fields */}\n {shouldShowBusinessFields && (\n <>\n <TextInputField\n name=\"businessName\"\n label={t('fields.businessName.label')}\n isRequired\n />\n <TextInputField\n name=\"ein\"\n label={t('fields.ein.label')}\n placeholder={t('fields.ein.placeholder')}\n transform={normalizeEin}\n isRequired\n />\n </>\n )}\n\n {/* Wage Type */}\n <RadioGroupField\n name=\"wageType\"\n isRequired\n label={t('fields.wageType.label')}\n options={wageTypeOptions}\n />\n\n {/* Hourly Rate - shown for hourly contractors */}\n {shouldShowHourlyRate && (\n <NumberInputField\n name=\"hourlyRate\"\n label={t('fields.hourlyRate.label')}\n min={0}\n isRequired\n format=\"currency\"\n />\n )}\n\n {/* Start Date */}\n <DatePickerField\n name=\"startDate\"\n label={t('fields.startDate.label')}\n description={t('fields.startDate.description')}\n isRequired\n />\n </Grid>\n\n {/* Actions */}\n <Flex gap={12} justifyContent=\"flex-end\">\n <Components.Button type=\"submit\" variant=\"primary\" isDisabled={formState.isSubmitting}>\n {formState.isSubmitting\n ? isEditing\n ? t('buttons.updating')\n : t('buttons.creating')\n : isEditing\n ? t('buttons.update')\n : t('buttons.create')}\n </Components.Button>\n </Flex>\n </Form>\n </FormProvider>\n </section>\n )\n}\n"],"names":["ContractorProfileForm","formMethods","handleSubmit","formState","shouldShowEmailField","shouldShowBusinessFields","shouldShowIndividualFields","shouldShowHourlyRate","contractorTypeOptions","wageTypeOptions","isEditing","className","Components","useComponentContext","useI18n","t","useTranslation","jsx","FormProvider","jsxs","Form","Grid","SwitchField","TextInputField","RadioGroupField","Fragment","normalizeSSN","normalizeEin","NumberInputField","DatePickerField","Flex"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContractorProfileForm.js","sources":["../../../../src/components/Contractor/Profile/ContractorProfileForm.tsx"],"sourcesContent":["import { FormProvider } from 'react-hook-form'\nimport { useTranslation } from 'react-i18next'\nimport { type Contractor } from '@gusto/embedded-api/models/components/contractor'\nimport type { useContractorProfile } from './useContractorProfile'\nimport { useComponentContext } from '@/contexts/ComponentAdapter/useComponentContext'\nimport { useI18n } from '@/i18n'\nimport { Form } from '@/components/Common/Form'\nimport { Grid } from '@/components/Common/Grid/Grid'\nimport { Flex } from '@/components/Common/Flex'\nimport { TextInputField } from '@/components/Common/Fields/TextInputField'\nimport { NumberInputField } from '@/components/Common/Fields/NumberInputField'\nimport { RadioGroupField } from '@/components/Common/Fields/RadioGroupField'\nimport { SwitchField } from '@/components/Common/Fields/SwitchField'\nimport { DatePickerField } from '@/components/Common/Fields/DatePickerField'\nimport { normalizeSSN, usePlaceholderSSN } from '@/helpers/ssn'\nimport { normalizeEin, usePlaceholderEin } from '@/helpers/federalEin'\nimport { ContractorOnboardingStatus } from '@/shared/constants'\n\n// Pure presentation component - takes all data as props\nexport type ContractorProfileFormProps = ReturnType<typeof useContractorProfile> & {\n className?: string\n existingContractor?: Contractor\n}\n\nexport function ContractorProfileForm({\n formMethods,\n handleSubmit,\n formState,\n shouldShowEmailField,\n shouldShowBusinessFields,\n shouldShowIndividualFields,\n shouldShowHourlyRate,\n contractorTypeOptions,\n wageTypeOptions,\n isEditing,\n className,\n existingContractor,\n}: ContractorProfileFormProps) {\n const Components = useComponentContext()\n useI18n('Contractor.Profile')\n const { t } = useTranslation('Contractor.Profile')\n const ssnPlaceholder = usePlaceholderSSN(existingContractor?.hasSsn ?? false)\n const einPlaceholder = usePlaceholderEin(existingContractor?.hasEin ?? false)\n\n return (\n <section className={className}>\n <FormProvider {...formMethods}>\n <Form onSubmit={handleSubmit}>\n <Grid gridTemplateColumns=\"1fr\" gap={24} className=\"mb-8\">\n <header>\n <Components.Heading as=\"h2\">{t('title')}</Components.Heading>\n <Components.Text>{t('subtitle')}</Components.Text>\n </header>\n\n {/* Invite Contractor Card */}\n <Components.Card>\n <Grid gap={16}>\n {/* Invite Contractor Toggle */}\n <SwitchField\n name=\"selfOnboarding\"\n label={t('fields.selfOnboarding.label')}\n description={t('fields.selfOnboarding.description')}\n isDisabled={\n existingContractor &&\n existingContractor.onboardingStatus !==\n ContractorOnboardingStatus.ADMIN_ONBOARDING_INCOMPLETE\n }\n />\n\n {/* Email Field - shown when inviting contractor */}\n {shouldShowEmailField && (\n <TextInputField\n name=\"email\"\n label={t('fields.email.label')}\n isRequired\n type=\"email\"\n />\n )}\n </Grid>\n </Components.Card>\n\n {/* Contractor Type */}\n <RadioGroupField\n name=\"contractorType\"\n isRequired\n label={t('fields.contractorType.label')}\n options={contractorTypeOptions}\n />\n\n {/* Individual Contractor Fields */}\n {shouldShowIndividualFields && (\n <>\n <Grid gridTemplateColumns={{ base: '1fr', medium: '1fr 1fr' }} gap={16}>\n <TextInputField name=\"firstName\" label={t('fields.firstName.label')} isRequired />\n <TextInputField name=\"middleInitial\" label={t('fields.middleInitial.label')} />\n </Grid>\n <TextInputField name=\"lastName\" label={t('fields.lastName.label')} isRequired />\n <TextInputField\n name=\"ssn\"\n label={t('fields.ssn.label')}\n placeholder={ssnPlaceholder}\n transform={normalizeSSN}\n isRequired\n />\n </>\n )}\n\n {/* Business Contractor Fields */}\n {shouldShowBusinessFields && (\n <>\n <TextInputField\n name=\"businessName\"\n label={t('fields.businessName.label')}\n isRequired\n />\n <TextInputField\n name=\"ein\"\n label={t('fields.ein.label')}\n placeholder={einPlaceholder}\n transform={normalizeEin}\n isRequired\n />\n </>\n )}\n\n {/* Wage Type */}\n <RadioGroupField\n name=\"wageType\"\n isRequired\n label={t('fields.wageType.label')}\n options={wageTypeOptions}\n />\n\n {/* Hourly Rate - shown for hourly contractors */}\n {shouldShowHourlyRate && (\n <NumberInputField\n name=\"hourlyRate\"\n label={t('fields.hourlyRate.label')}\n min={0}\n isRequired\n format=\"currency\"\n />\n )}\n\n {/* Start Date */}\n <DatePickerField\n name=\"startDate\"\n label={t('fields.startDate.label')}\n description={t('fields.startDate.description')}\n isRequired\n />\n </Grid>\n\n {/* Actions */}\n <Flex gap={12} justifyContent=\"flex-end\">\n <Components.Button type=\"submit\" variant=\"primary\" isDisabled={formState.isSubmitting}>\n {formState.isSubmitting\n ? isEditing\n ? t('buttons.updating')\n : t('buttons.creating')\n : isEditing\n ? t('buttons.update')\n : t('buttons.create')}\n </Components.Button>\n </Flex>\n </Form>\n </FormProvider>\n </section>\n )\n}\n"],"names":["ContractorProfileForm","formMethods","handleSubmit","formState","shouldShowEmailField","shouldShowBusinessFields","shouldShowIndividualFields","shouldShowHourlyRate","contractorTypeOptions","wageTypeOptions","isEditing","className","existingContractor","Components","useComponentContext","useI18n","t","useTranslation","ssnPlaceholder","usePlaceholderSSN","einPlaceholder","usePlaceholderEin","jsx","FormProvider","jsxs","Form","Grid","SwitchField","ContractorOnboardingStatus","TextInputField","RadioGroupField","Fragment","normalizeSSN","normalizeEin","NumberInputField","DatePickerField","Flex"],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@ export declare const ContractorType: {
|
|
|
9
9
|
readonly Business: "Business";
|
|
10
10
|
};
|
|
11
11
|
declare const ContractorProfileSchema: z.ZodObject<{
|
|
12
|
-
|
|
12
|
+
selfOnboarding: z.ZodDefault<z.ZodBoolean>;
|
|
13
13
|
email: z.ZodOptional<z.ZodString>;
|
|
14
14
|
contractorType: z.ZodEnum<["Individual", "Business"]>;
|
|
15
15
|
wageType: z.ZodEnum<["Hourly", "Fixed"]>;
|
|
@@ -22,7 +22,7 @@ declare const ContractorProfileSchema: z.ZodObject<{
|
|
|
22
22
|
ein: z.ZodOptional<z.ZodString>;
|
|
23
23
|
hourlyRate: z.ZodOptional<z.ZodNumber>;
|
|
24
24
|
}, "strip", z.ZodTypeAny, {
|
|
25
|
-
|
|
25
|
+
selfOnboarding: boolean;
|
|
26
26
|
contractorType: "Business" | "Individual";
|
|
27
27
|
startDate: Date;
|
|
28
28
|
wageType: "Hourly" | "Fixed";
|
|
@@ -45,12 +45,12 @@ declare const ContractorProfileSchema: z.ZodObject<{
|
|
|
45
45
|
lastName?: string | undefined;
|
|
46
46
|
businessName?: string | undefined;
|
|
47
47
|
hourlyRate?: number | undefined;
|
|
48
|
-
|
|
48
|
+
selfOnboarding?: boolean | undefined;
|
|
49
49
|
middleInitial?: string | undefined;
|
|
50
50
|
}>;
|
|
51
51
|
export type ContractorProfileFormData = z.infer<typeof ContractorProfileSchema>;
|
|
52
|
-
export declare const createContractorProfileValidationSchema: (t: (key: string) => string) => z.ZodEffects<z.ZodObject<{
|
|
53
|
-
|
|
52
|
+
export declare const createContractorProfileValidationSchema: (t: (key: string) => string, hasSsn: boolean, hasEin: boolean) => z.ZodEffects<z.ZodObject<{
|
|
53
|
+
selfOnboarding: z.ZodDefault<z.ZodBoolean>;
|
|
54
54
|
email: z.ZodOptional<z.ZodString>;
|
|
55
55
|
contractorType: z.ZodEnum<["Individual", "Business"]>;
|
|
56
56
|
wageType: z.ZodEnum<["Hourly", "Fixed"]>;
|
|
@@ -63,7 +63,7 @@ export declare const createContractorProfileValidationSchema: (t: (key: string)
|
|
|
63
63
|
ein: z.ZodOptional<z.ZodString>;
|
|
64
64
|
hourlyRate: z.ZodOptional<z.ZodNumber>;
|
|
65
65
|
}, "strip", z.ZodTypeAny, {
|
|
66
|
-
|
|
66
|
+
selfOnboarding: boolean;
|
|
67
67
|
contractorType: "Business" | "Individual";
|
|
68
68
|
startDate: Date;
|
|
69
69
|
wageType: "Hourly" | "Fixed";
|
|
@@ -86,10 +86,10 @@ export declare const createContractorProfileValidationSchema: (t: (key: string)
|
|
|
86
86
|
lastName?: string | undefined;
|
|
87
87
|
businessName?: string | undefined;
|
|
88
88
|
hourlyRate?: number | undefined;
|
|
89
|
-
|
|
89
|
+
selfOnboarding?: boolean | undefined;
|
|
90
90
|
middleInitial?: string | undefined;
|
|
91
91
|
}>, {
|
|
92
|
-
|
|
92
|
+
selfOnboarding: boolean;
|
|
93
93
|
contractorType: "Business" | "Individual";
|
|
94
94
|
startDate: Date;
|
|
95
95
|
wageType: "Hourly" | "Fixed";
|
|
@@ -112,7 +112,7 @@ export declare const createContractorProfileValidationSchema: (t: (key: string)
|
|
|
112
112
|
lastName?: string | undefined;
|
|
113
113
|
businessName?: string | undefined;
|
|
114
114
|
hourlyRate?: number | undefined;
|
|
115
|
-
|
|
115
|
+
selfOnboarding?: boolean | undefined;
|
|
116
116
|
middleInitial?: string | undefined;
|
|
117
117
|
}>;
|
|
118
118
|
export interface UseContractorProfileProps {
|
|
@@ -123,7 +123,7 @@ export interface UseContractorProfileProps {
|
|
|
123
123
|
}
|
|
124
124
|
export declare function useContractorProfile({ companyId, contractorId, defaultValues, existingContractor, }: UseContractorProfileProps): {
|
|
125
125
|
formMethods: import('react-hook-form').UseFormReturn<{
|
|
126
|
-
|
|
126
|
+
selfOnboarding: boolean;
|
|
127
127
|
contractorType: "Business" | "Individual";
|
|
128
128
|
startDate: Date;
|
|
129
129
|
wageType: "Hourly" | "Fixed";
|
|
@@ -136,7 +136,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
136
136
|
hourlyRate?: number | undefined;
|
|
137
137
|
middleInitial?: string | undefined;
|
|
138
138
|
}, any, {
|
|
139
|
-
|
|
139
|
+
selfOnboarding: boolean;
|
|
140
140
|
contractorType: "Business" | "Individual";
|
|
141
141
|
startDate: Date;
|
|
142
142
|
wageType: "Hourly" | "Fixed";
|
|
@@ -161,7 +161,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
161
161
|
disabled: boolean;
|
|
162
162
|
submitCount: number;
|
|
163
163
|
defaultValues?: Readonly<{
|
|
164
|
-
|
|
164
|
+
selfOnboarding?: boolean | undefined;
|
|
165
165
|
contractorType?: "Business" | "Individual" | undefined;
|
|
166
166
|
startDate?: Date | undefined;
|
|
167
167
|
wageType?: "Hourly" | "Fixed" | undefined;
|
|
@@ -175,7 +175,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
175
175
|
middleInitial?: string | undefined;
|
|
176
176
|
}> | undefined;
|
|
177
177
|
dirtyFields: Partial<Readonly<{
|
|
178
|
-
|
|
178
|
+
selfOnboarding?: boolean | undefined;
|
|
179
179
|
contractorType?: boolean | undefined;
|
|
180
180
|
startDate?: boolean | undefined;
|
|
181
181
|
wageType?: boolean | undefined;
|
|
@@ -189,7 +189,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
189
189
|
middleInitial?: boolean | undefined;
|
|
190
190
|
}>>;
|
|
191
191
|
touchedFields: Partial<Readonly<{
|
|
192
|
-
|
|
192
|
+
selfOnboarding?: boolean | undefined;
|
|
193
193
|
contractorType?: boolean | undefined;
|
|
194
194
|
startDate?: boolean | undefined;
|
|
195
195
|
wageType?: boolean | undefined;
|
|
@@ -203,7 +203,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
203
203
|
middleInitial?: boolean | undefined;
|
|
204
204
|
}>>;
|
|
205
205
|
validatingFields: Partial<Readonly<{
|
|
206
|
-
|
|
206
|
+
selfOnboarding?: boolean | undefined;
|
|
207
207
|
contractorType?: boolean | undefined;
|
|
208
208
|
startDate?: boolean | undefined;
|
|
209
209
|
wageType?: boolean | undefined;
|
|
@@ -217,7 +217,7 @@ export declare function useContractorProfile({ companyId, contractorId, defaultV
|
|
|
217
217
|
middleInitial?: boolean | undefined;
|
|
218
218
|
}>>;
|
|
219
219
|
errors: import('react-hook-form').FieldErrors<{
|
|
220
|
-
|
|
220
|
+
selfOnboarding: boolean;
|
|
221
221
|
contractorType: "Business" | "Individual";
|
|
222
222
|
startDate: Date;
|
|
223
223
|
wageType: "Hourly" | "Fixed";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useMemo as z } from "react";
|
|
2
|
-
import { useTranslation as
|
|
3
|
-
import { zodResolver as
|
|
4
|
-
import { useForm as
|
|
2
|
+
import { useTranslation as G } from "react-i18next";
|
|
3
|
+
import { zodResolver as V } from "@hookform/resolvers/zod";
|
|
4
|
+
import { useForm as $, useWatch as y } from "react-hook-form";
|
|
5
5
|
import { z as s } from "zod";
|
|
6
6
|
import { useContractorsCreateMutation as X } from "@gusto/embedded-api/react-query/contractorsCreate";
|
|
7
7
|
import { useContractorsUpdateMutation as j } from "@gusto/embedded-api/react-query/contractorsUpdate";
|
|
@@ -13,111 +13,118 @@ import "@gusto/embedded-api/models/errors/sdkvalidationerror";
|
|
|
13
13
|
import "@gusto/embedded-api/models/errors/unprocessableentityerrorobject";
|
|
14
14
|
import "@tanstack/react-query";
|
|
15
15
|
import { useBase as J } from "../../Base/useBase.js";
|
|
16
|
-
import { componentEvents as
|
|
17
|
-
import "
|
|
18
|
-
import { removeNonDigits as K } from "../../../helpers/formattedStrings.js";
|
|
16
|
+
import { ContractorSelfOnboardingStatuses as K, componentEvents as v, ContractorOnboardingStatus as Q } from "../../../shared/constants.js";
|
|
17
|
+
import { removeNonDigits as Y } from "../../../helpers/formattedStrings.js";
|
|
19
18
|
import "../../../contexts/ComponentAdapter/useComponentContext.js";
|
|
20
|
-
import
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
|
|
19
|
+
import "../../../contexts/LoadingIndicatorProvider/useLoadingIndicator.js";
|
|
20
|
+
import { useI18n as x } from "../../../i18n/I18n.js";
|
|
21
|
+
import { SSN_REGEX as ee, NAME_REGEX as T } from "../../../helpers/validations.js";
|
|
22
|
+
import { formatDateToStringDate as oe } from "../../../helpers/dateFormatting.js";
|
|
23
|
+
import { normalizeEin as se } from "../../../helpers/federalEin.js";
|
|
24
|
+
const n = L, i = k, ae = s.object({
|
|
25
25
|
// Self-onboarding toggle
|
|
26
|
-
|
|
26
|
+
selfOnboarding: s.boolean().default(!1),
|
|
27
27
|
email: s.string().email().optional(),
|
|
28
28
|
// Required contractor fields
|
|
29
|
-
contractorType: s.enum([
|
|
29
|
+
contractorType: s.enum([i.Individual, i.Business]),
|
|
30
30
|
wageType: s.enum([n.Hourly, n.Fixed]),
|
|
31
31
|
startDate: s.date(),
|
|
32
32
|
// Individual contractor fields
|
|
33
|
-
firstName: s.string().min(1).regex(
|
|
33
|
+
firstName: s.string().min(1).regex(T).optional(),
|
|
34
34
|
middleInitial: s.string().optional(),
|
|
35
|
-
lastName: s.string().min(1).regex(
|
|
35
|
+
lastName: s.string().min(1).regex(T).optional(),
|
|
36
36
|
ssn: s.string().optional(),
|
|
37
37
|
// Business contractor fields
|
|
38
38
|
businessName: s.string().optional(),
|
|
39
39
|
ein: s.string().optional(),
|
|
40
40
|
// Wage fields
|
|
41
41
|
hourlyRate: s.number().min(0).optional()
|
|
42
|
-
}),
|
|
43
|
-
(
|
|
44
|
-
if (
|
|
42
|
+
}), te = (a, p, d) => ae.superRefine(
|
|
43
|
+
(e, t) => {
|
|
44
|
+
if (e.selfOnboarding && !e.email && t.addIssue({
|
|
45
45
|
code: s.ZodIssueCode.custom,
|
|
46
46
|
path: ["email"],
|
|
47
|
-
message:
|
|
48
|
-
}),
|
|
49
|
-
if (
|
|
47
|
+
message: a("validations.email")
|
|
48
|
+
}), e.contractorType === i.Individual)
|
|
49
|
+
if (e.firstName || t.addIssue({
|
|
50
50
|
code: s.ZodIssueCode.custom,
|
|
51
51
|
path: ["firstName"],
|
|
52
|
-
message:
|
|
53
|
-
}),
|
|
52
|
+
message: a("validations.firstName")
|
|
53
|
+
}), e.lastName || t.addIssue({
|
|
54
54
|
code: s.ZodIssueCode.custom,
|
|
55
55
|
path: ["lastName"],
|
|
56
|
-
message:
|
|
57
|
-
}), !
|
|
58
|
-
|
|
56
|
+
message: a("validations.lastName")
|
|
57
|
+
}), !e.ssn)
|
|
58
|
+
p || t.addIssue({
|
|
59
59
|
code: s.ZodIssueCode.custom,
|
|
60
60
|
path: ["ssn"],
|
|
61
|
-
message:
|
|
61
|
+
message: a("validations.ssn")
|
|
62
62
|
});
|
|
63
63
|
else {
|
|
64
|
-
const
|
|
65
|
-
|
|
64
|
+
const l = Y(e.ssn);
|
|
65
|
+
ee.test(l) || t.addIssue({
|
|
66
66
|
code: s.ZodIssueCode.custom,
|
|
67
67
|
path: ["ssn"],
|
|
68
|
-
message:
|
|
68
|
+
message: a("validations.ssnFormat")
|
|
69
69
|
});
|
|
70
70
|
}
|
|
71
|
-
if (
|
|
72
|
-
if (
|
|
71
|
+
if (e.contractorType === i.Business)
|
|
72
|
+
if (e.businessName || t.addIssue({
|
|
73
73
|
code: s.ZodIssueCode.custom,
|
|
74
74
|
path: ["businessName"],
|
|
75
|
-
message:
|
|
76
|
-
}), !
|
|
77
|
-
|
|
75
|
+
message: a("validations.businessName")
|
|
76
|
+
}), !e.ein)
|
|
77
|
+
d || t.addIssue({
|
|
78
78
|
code: s.ZodIssueCode.custom,
|
|
79
79
|
path: ["ein"],
|
|
80
|
-
message:
|
|
80
|
+
message: a("validations.ein")
|
|
81
81
|
});
|
|
82
82
|
else {
|
|
83
|
-
const
|
|
84
|
-
/^\d{2}-\d{7}$/.test(
|
|
83
|
+
const l = se(e.ein);
|
|
84
|
+
/^\d{2}-\d{7}$/.test(l) || t.addIssue({
|
|
85
85
|
code: s.ZodIssueCode.custom,
|
|
86
86
|
path: ["ein"],
|
|
87
|
-
message:
|
|
87
|
+
message: a("validations.einFormat")
|
|
88
88
|
});
|
|
89
89
|
}
|
|
90
|
-
|
|
90
|
+
e.wageType === n.Hourly && (e.hourlyRate === void 0 || e.hourlyRate < 0) && t.addIssue({
|
|
91
91
|
code: s.ZodIssueCode.custom,
|
|
92
92
|
path: ["hourlyRate"],
|
|
93
|
-
message:
|
|
93
|
+
message: a("validations.hourlyRate")
|
|
94
94
|
});
|
|
95
95
|
}
|
|
96
96
|
);
|
|
97
|
-
function
|
|
98
|
-
companyId:
|
|
99
|
-
contractorId:
|
|
100
|
-
defaultValues:
|
|
97
|
+
function Ee({
|
|
98
|
+
companyId: a,
|
|
99
|
+
contractorId: p,
|
|
100
|
+
defaultValues: d,
|
|
101
101
|
existingContractor: e
|
|
102
102
|
}) {
|
|
103
|
-
|
|
104
|
-
const { t
|
|
103
|
+
x("Contractor.Profile");
|
|
104
|
+
const { t } = G("Contractor.Profile"), { onEvent: l, baseSubmitHandler: b } = J(), g = te(
|
|
105
|
+
t,
|
|
106
|
+
e?.hasSsn ?? !1,
|
|
107
|
+
e?.hasEin ?? !1
|
|
108
|
+
), { mutateAsync: I, isPending: R } = X(), { mutateAsync: S, isPending: w } = j(), O = z(
|
|
105
109
|
() => ({
|
|
106
|
-
|
|
107
|
-
contractorType:
|
|
110
|
+
selfOnboarding: !1,
|
|
111
|
+
contractorType: i.Business,
|
|
108
112
|
wageType: n.Fixed,
|
|
109
113
|
startDate: /* @__PURE__ */ new Date(),
|
|
110
|
-
...
|
|
114
|
+
...d,
|
|
111
115
|
// Override with existing contractor data if available
|
|
112
116
|
...e && {
|
|
113
|
-
|
|
117
|
+
selfOnboarding: e.onboardingStatus ? (
|
|
118
|
+
// @ts-expect-error: onboarding_status during runtime can be one of self onboarding statuses
|
|
119
|
+
K.has(e.onboardingStatus)
|
|
120
|
+
) : !1,
|
|
121
|
+
contractorType: e.type || i.Business,
|
|
114
122
|
wageType: e.wageType || n.Fixed,
|
|
115
123
|
startDate: e.startDate ? new Date(e.startDate) : /* @__PURE__ */ new Date(),
|
|
116
124
|
firstName: e.firstName || void 0,
|
|
117
125
|
middleInitial: e.middleInitial || void 0,
|
|
118
126
|
lastName: e.lastName || void 0,
|
|
119
127
|
businessName: e.businessName || void 0,
|
|
120
|
-
ein: e.ein || void 0,
|
|
121
128
|
email: e.email || void 0,
|
|
122
129
|
hourlyRate: e.hourlyRate ? (() => {
|
|
123
130
|
const o = parseFloat(e.hourlyRate);
|
|
@@ -125,25 +132,25 @@ function Se({
|
|
|
125
132
|
})() : void 0
|
|
126
133
|
}
|
|
127
134
|
}),
|
|
128
|
-
[e,
|
|
129
|
-
), m =
|
|
130
|
-
resolver:
|
|
131
|
-
defaultValues:
|
|
132
|
-
}), { handleSubmit: D, formState: E } = m,
|
|
135
|
+
[e, d]
|
|
136
|
+
), m = $({
|
|
137
|
+
resolver: V(g),
|
|
138
|
+
defaultValues: O
|
|
139
|
+
}), { handleSubmit: D, formState: E } = m, h = y({ control: m.control, name: "contractorType" }), P = y({ control: m.control, name: "wageType" }), F = y({
|
|
133
140
|
control: m.control,
|
|
134
|
-
name: "
|
|
135
|
-
}),
|
|
136
|
-
const
|
|
141
|
+
name: "selfOnboarding"
|
|
142
|
+
}), N = (o) => {
|
|
143
|
+
const r = {
|
|
137
144
|
type: o.contractorType,
|
|
138
145
|
wageType: o.wageType,
|
|
139
|
-
startDate:
|
|
140
|
-
selfOnboarding: o.
|
|
141
|
-
email: o.
|
|
146
|
+
startDate: oe(o.startDate) || "",
|
|
147
|
+
selfOnboarding: o.selfOnboarding,
|
|
148
|
+
email: o.selfOnboarding ? o.email : void 0,
|
|
142
149
|
hourlyRate: o.wageType === n.Hourly ? String(o.hourlyRate) : void 0,
|
|
143
150
|
isActive: !0
|
|
144
151
|
};
|
|
145
|
-
return o.contractorType ===
|
|
146
|
-
...
|
|
152
|
+
return o.contractorType === i.Individual ? {
|
|
153
|
+
...r,
|
|
147
154
|
firstName: o.firstName,
|
|
148
155
|
middleInitial: o.middleInitial || void 0,
|
|
149
156
|
lastName: o.lastName,
|
|
@@ -151,73 +158,73 @@ function Se({
|
|
|
151
158
|
fileNewHireReport: !1
|
|
152
159
|
// Default value
|
|
153
160
|
} : {
|
|
154
|
-
...
|
|
161
|
+
...r,
|
|
155
162
|
fileNewHireReport: !1,
|
|
156
163
|
// Default value
|
|
157
164
|
businessName: o.businessName,
|
|
158
165
|
ein: o.ein?.replace(/-/g, "")
|
|
159
166
|
};
|
|
160
|
-
},
|
|
161
|
-
...
|
|
162
|
-
version:
|
|
167
|
+
}, C = (o, r) => ({
|
|
168
|
+
...N(o),
|
|
169
|
+
version: r
|
|
163
170
|
}), B = async (o) => {
|
|
164
|
-
await
|
|
171
|
+
await b(o, async (r) => {
|
|
165
172
|
let u = e?.uuid;
|
|
166
173
|
if (e) {
|
|
167
174
|
if (!e.version)
|
|
168
175
|
throw new Error("Contractor version is required for updates");
|
|
169
|
-
const
|
|
176
|
+
const f = String(e.version), c = C(r, f), q = await S({
|
|
170
177
|
request: {
|
|
171
178
|
contractorUuid: u,
|
|
172
|
-
requestBody:
|
|
179
|
+
requestBody: c
|
|
173
180
|
}
|
|
174
181
|
});
|
|
175
|
-
|
|
182
|
+
l(v.CONTRACTOR_UPDATED, q.contractor);
|
|
176
183
|
} else {
|
|
177
|
-
const
|
|
184
|
+
const f = N(r), c = await I({
|
|
178
185
|
request: {
|
|
179
|
-
companyUuid:
|
|
180
|
-
requestBody:
|
|
186
|
+
companyUuid: a,
|
|
187
|
+
requestBody: f
|
|
181
188
|
}
|
|
182
189
|
});
|
|
183
|
-
u =
|
|
190
|
+
u = c.contractor?.uuid, l(v.CONTRACTOR_CREATED, c.contractor);
|
|
184
191
|
}
|
|
185
|
-
|
|
186
|
-
selfOnboarding:
|
|
192
|
+
l(v.CONTRACTOR_PROFILE_DONE, {
|
|
193
|
+
selfOnboarding: r.selfOnboarding && e?.onboardingStatus !== Q.ADMIN_ONBOARDING_REVIEW,
|
|
187
194
|
contractorId: u
|
|
188
195
|
});
|
|
189
196
|
});
|
|
190
|
-
},
|
|
191
|
-
{ label: "Individual", value:
|
|
192
|
-
{ label: "Business", value:
|
|
193
|
-
],
|
|
197
|
+
}, A = F, H = h === i.Business, Z = h === i.Individual, _ = P === n.Hourly, M = [
|
|
198
|
+
{ label: "Individual", value: i.Individual },
|
|
199
|
+
{ label: "Business", value: i.Business }
|
|
200
|
+
], U = [
|
|
194
201
|
{ label: "Hourly", value: n.Hourly },
|
|
195
202
|
{ label: "Fixed", value: n.Fixed }
|
|
196
|
-
],
|
|
203
|
+
], W = R || w;
|
|
197
204
|
return {
|
|
198
205
|
// Form methods and submission
|
|
199
206
|
formMethods: m,
|
|
200
207
|
handleSubmit: D(B),
|
|
201
208
|
formState: {
|
|
202
209
|
...E,
|
|
203
|
-
isSubmitting:
|
|
210
|
+
isSubmitting: W
|
|
204
211
|
},
|
|
205
212
|
// Conditional rendering flags
|
|
206
|
-
shouldShowEmailField:
|
|
207
|
-
shouldShowBusinessFields:
|
|
213
|
+
shouldShowEmailField: A,
|
|
214
|
+
shouldShowBusinessFields: H,
|
|
208
215
|
shouldShowIndividualFields: Z,
|
|
209
|
-
shouldShowHourlyRate:
|
|
216
|
+
shouldShowHourlyRate: _,
|
|
210
217
|
// Form options
|
|
211
|
-
contractorTypeOptions:
|
|
212
|
-
wageTypeOptions:
|
|
218
|
+
contractorTypeOptions: M,
|
|
219
|
+
wageTypeOptions: U,
|
|
213
220
|
// Component state
|
|
214
|
-
isEditing: !!
|
|
221
|
+
isEditing: !!p
|
|
215
222
|
};
|
|
216
223
|
}
|
|
217
224
|
export {
|
|
218
|
-
|
|
225
|
+
i as ContractorType,
|
|
219
226
|
n as WageType,
|
|
220
|
-
|
|
221
|
-
|
|
227
|
+
te as createContractorProfileValidationSchema,
|
|
228
|
+
Ee as useContractorProfile
|
|
222
229
|
};
|
|
223
230
|
//# sourceMappingURL=useContractorProfile.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useContractorProfile.js","sources":["../../../../src/components/Contractor/Profile/useContractorProfile.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport type { SubmitHandler } from 'react-hook-form'\nimport { useForm, useWatch } from 'react-hook-form'\nimport { z } from 'zod'\nimport { useContractorsCreateMutation } from '@gusto/embedded-api/react-query/contractorsCreate'\nimport { useContractorsUpdateMutation } from '@gusto/embedded-api/react-query/contractorsUpdate'\nimport type { PostV1CompaniesCompanyUuidContractorsRequestBody } from '@gusto/embedded-api/models/operations/postv1companiescompanyuuidcontractors'\nimport type { PutV1ContractorsContractorUuidRequestBody } from '@gusto/embedded-api/models/operations/putv1contractorscontractoruuid'\nimport {\n WageType as ApiWageType,\n ContractorType as ApiContractorType,\n type Contractor,\n} from '@gusto/embedded-api/models/components/contractor'\nimport { useBase } from '@/components/Base'\nimport { useI18n } from '@/i18n'\nimport { componentEvents } from '@/shared/constants'\nimport { SSN_REGEX, NAME_REGEX } from '@/helpers/validations'\nimport { removeNonDigits } from '@/helpers/formattedStrings'\nimport { formatDateToStringDate } from '@/helpers/dateFormatting'\nimport { normalizeEin } from '@/helpers/federalEin'\n\n// Re-export the API types for convenience\nexport const WageType = ApiWageType\nexport const ContractorType = ApiContractorType\n\n// Form schema definition - exported for use in stories and tests\nconst ContractorProfileSchema = z.object({\n // Self-onboarding toggle\n inviteContractor: z.boolean().default(false),\n email: z.string().email().optional(),\n\n // Required contractor fields\n contractorType: z.enum([ContractorType.Individual, ContractorType.Business]),\n wageType: z.enum([WageType.Hourly, WageType.Fixed]),\n startDate: z.date(),\n\n // Individual contractor fields\n firstName: z.string().min(1).regex(NAME_REGEX).optional(),\n middleInitial: z.string().optional(),\n lastName: z.string().min(1).regex(NAME_REGEX).optional(),\n ssn: z.string().optional(),\n\n // Business contractor fields\n businessName: z.string().optional(),\n ein: z.string().optional(),\n\n // Wage fields\n hourlyRate: z.number().min(0).optional(),\n})\n\nexport type ContractorProfileFormData = z.infer<typeof ContractorProfileSchema>\n\n// Create validation schema - exported for stories\nexport const createContractorProfileValidationSchema = (t: (key: string) => string) => {\n return ContractorProfileSchema.superRefine(\n (data: ContractorProfileFormData, ctx: z.RefinementCtx) => {\n // Email validation for contractor invitation\n if (data.inviteContractor && !data.email) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['email'],\n message: t('validations.email'),\n })\n }\n\n // Individual contractor validations\n if (data.contractorType === ContractorType.Individual) {\n if (!data.firstName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['firstName'],\n message: t('validations.firstName'),\n })\n }\n\n if (!data.lastName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['lastName'],\n message: t('validations.lastName'),\n })\n }\n\n if (!data.ssn) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ssn'],\n message: t('validations.ssn'),\n })\n } else {\n // Validate SSN format\n const cleanSSN = removeNonDigits(data.ssn)\n if (!SSN_REGEX.test(cleanSSN)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ssn'],\n message: t('validations.ssnFormat'),\n })\n }\n }\n }\n\n // Business contractor validations\n if (data.contractorType === ContractorType.Business) {\n if (!data.businessName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['businessName'],\n message: t('validations.businessName'),\n })\n }\n\n if (!data.ein) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ein'],\n message: t('validations.ein'),\n })\n } else {\n // Validate EIN format after normalization (XX-XXXXXXX)\n const normalizedEin = normalizeEin(data.ein)\n if (!/^\\d{2}-\\d{7}$/.test(normalizedEin)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ein'],\n message: t('validations.einFormat'),\n })\n }\n }\n }\n\n // Hourly rate validation for hourly contractors\n if (data.wageType === WageType.Hourly) {\n if (data.hourlyRate === undefined || data.hourlyRate < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['hourlyRate'],\n message: t('validations.hourlyRate'),\n })\n }\n }\n },\n )\n}\n\nexport interface UseContractorProfileProps {\n companyId: string\n contractorId?: string\n defaultValues?: Partial<ContractorProfileFormData>\n existingContractor?: Contractor\n}\n\nexport function useContractorProfile({\n companyId,\n contractorId,\n defaultValues,\n existingContractor,\n}: UseContractorProfileProps) {\n useI18n('Contractor.Profile')\n const { t } = useTranslation('Contractor.Profile')\n const { onEvent, baseSubmitHandler } = useBase()\n\n // Create validation schema with translations\n const validationSchema = createContractorProfileValidationSchema(t as (key: string) => string)\n\n // API mutations\n const { mutateAsync: createContractor, isPending: isCreating } = useContractorsCreateMutation()\n const { mutateAsync: updateContractor, isPending: isUpdating } = useContractorsUpdateMutation()\n\n // Prepare default values from existing contractor or provided defaults\n const formDefaultValues = useMemo(\n () => ({\n inviteContractor: false,\n contractorType: ContractorType.Business,\n wageType: WageType.Fixed,\n startDate: new Date(),\n ...defaultValues,\n // Override with existing contractor data if available\n ...(existingContractor && {\n contractorType: existingContractor.type || ContractorType.Business,\n wageType: existingContractor.wageType || WageType.Fixed,\n startDate: existingContractor.startDate\n ? new Date(existingContractor.startDate)\n : new Date(),\n firstName: existingContractor.firstName || undefined,\n middleInitial: existingContractor.middleInitial || undefined,\n lastName: existingContractor.lastName || undefined,\n businessName: existingContractor.businessName || undefined,\n ein: existingContractor.ein || undefined,\n email: existingContractor.email || undefined,\n hourlyRate: existingContractor.hourlyRate\n ? (() => {\n const parsed = parseFloat(existingContractor.hourlyRate)\n return isNaN(parsed) ? undefined : parsed\n })()\n : undefined,\n }),\n }),\n [existingContractor, defaultValues],\n )\n\n // Form setup\n const formMethods = useForm<ContractorProfileFormData>({\n resolver: zodResolver(validationSchema),\n defaultValues: formDefaultValues,\n })\n\n const { handleSubmit, formState } = formMethods\n\n // Watch form values for conditional rendering\n const watchedType = useWatch({ control: formMethods.control, name: 'contractorType' })\n const watchedWageType = useWatch({ control: formMethods.control, name: 'wageType' })\n const watchedInviteContractor = useWatch({\n control: formMethods.control,\n name: 'inviteContractor',\n })\n\n // Helper function to transform form data to API payload\n const transformFormDataToCreatePayload = (\n data: ContractorProfileFormData,\n ): PostV1CompaniesCompanyUuidContractorsRequestBody => {\n const basePayload = {\n type: data.contractorType,\n wageType: data.wageType,\n startDate: formatDateToStringDate(data.startDate) || '',\n selfOnboarding: data.inviteContractor,\n email: data.inviteContractor ? data.email : undefined,\n hourlyRate: data.wageType === WageType.Hourly ? String(data.hourlyRate) : undefined,\n isActive: true,\n }\n\n if (data.contractorType === ContractorType.Individual) {\n return {\n ...basePayload,\n firstName: data.firstName,\n middleInitial: data.middleInitial || undefined,\n lastName: data.lastName,\n ssn: data.ssn,\n fileNewHireReport: false, // Default value\n }\n } else {\n return {\n ...basePayload,\n fileNewHireReport: false, // Default value\n businessName: data.businessName,\n ein: data.ein?.replace(/-/g, ''),\n }\n }\n }\n\n const transformFormDataToUpdatePayload = (\n data: ContractorProfileFormData,\n version: string,\n ): PutV1ContractorsContractorUuidRequestBody => {\n const createPayload = transformFormDataToCreatePayload(data)\n return {\n ...createPayload,\n version,\n }\n }\n\n // Event handlers\n const onSubmit: SubmitHandler<ContractorProfileFormData> = async data => {\n await baseSubmitHandler(data, async payload => {\n let contractorId = existingContractor?.uuid\n if (existingContractor) {\n // Update existing contractor\n if (!existingContractor.version) {\n throw new Error('Contractor version is required for updates')\n }\n const version = String(existingContractor.version)\n const apiPayload = transformFormDataToUpdatePayload(payload, version)\n\n const updateResponse = await updateContractor({\n request: {\n contractorUuid: contractorId!,\n requestBody: apiPayload,\n },\n })\n\n onEvent(componentEvents.CONTRACTOR_UPDATED, updateResponse.contractor)\n } else {\n // Create new contractor\n const apiPayload = transformFormDataToCreatePayload(payload)\n\n const createResponse = await createContractor({\n request: {\n companyUuid: companyId,\n requestBody: apiPayload,\n },\n })\n\n contractorId = createResponse.contractor?.uuid\n onEvent(componentEvents.CONTRACTOR_CREATED, createResponse.contractor)\n }\n\n onEvent(componentEvents.CONTRACTOR_PROFILE_DONE, {\n selfOnboarding: payload.inviteContractor,\n contractorId,\n })\n })\n }\n\n // Conditional rendering helpers\n const shouldShowEmailField = watchedInviteContractor\n const shouldShowBusinessFields = watchedType === ContractorType.Business\n const shouldShowIndividualFields = watchedType === ContractorType.Individual\n const shouldShowHourlyRate = watchedWageType === WageType.Hourly\n\n // Form field options\n const contractorTypeOptions = [\n { label: 'Individual', value: ContractorType.Individual },\n { label: 'Business', value: ContractorType.Business },\n ]\n\n const wageTypeOptions = [\n { label: 'Hourly', value: WageType.Hourly },\n { label: 'Fixed', value: WageType.Fixed },\n ]\n\n // Determine if we're currently submitting (creating or updating)\n const isSubmitting = isCreating || isUpdating\n // Return only what the component actually needs\n return {\n // Form methods and submission\n formMethods,\n handleSubmit: handleSubmit(onSubmit),\n formState: {\n ...formState,\n isSubmitting,\n },\n\n // Conditional rendering flags\n shouldShowEmailField,\n shouldShowBusinessFields,\n shouldShowIndividualFields,\n shouldShowHourlyRate,\n\n // Form options\n contractorTypeOptions,\n wageTypeOptions,\n\n // Component state\n isEditing: !!contractorId,\n }\n}\n"],"names":["WageType","ApiWageType","ContractorType","ApiContractorType","ContractorProfileSchema","z","NAME_REGEX","createContractorProfileValidationSchema","t","data","ctx","cleanSSN","removeNonDigits","SSN_REGEX","normalizedEin","normalizeEin","useContractorProfile","companyId","contractorId","defaultValues","existingContractor","useI18n","useTranslation","onEvent","baseSubmitHandler","useBase","validationSchema","createContractor","isCreating","useContractorsCreateMutation","updateContractor","isUpdating","useContractorsUpdateMutation","formDefaultValues","useMemo","parsed","formMethods","useForm","zodResolver","handleSubmit","formState","watchedType","useWatch","watchedWageType","watchedInviteContractor","transformFormDataToCreatePayload","basePayload","formatDateToStringDate","transformFormDataToUpdatePayload","version","onSubmit","payload","apiPayload","updateResponse","componentEvents","createResponse","shouldShowEmailField","shouldShowBusinessFields","shouldShowIndividualFields","shouldShowHourlyRate","contractorTypeOptions","wageTypeOptions","isSubmitting"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useContractorProfile.js","sources":["../../../../src/components/Contractor/Profile/useContractorProfile.ts"],"sourcesContent":["import { useMemo } from 'react'\nimport { useTranslation } from 'react-i18next'\nimport { zodResolver } from '@hookform/resolvers/zod'\nimport type { SubmitHandler } from 'react-hook-form'\nimport { useForm, useWatch } from 'react-hook-form'\nimport { z } from 'zod'\nimport { useContractorsCreateMutation } from '@gusto/embedded-api/react-query/contractorsCreate'\nimport { useContractorsUpdateMutation } from '@gusto/embedded-api/react-query/contractorsUpdate'\nimport type { PostV1CompaniesCompanyUuidContractorsRequestBody } from '@gusto/embedded-api/models/operations/postv1companiescompanyuuidcontractors'\nimport type { PutV1ContractorsContractorUuidRequestBody } from '@gusto/embedded-api/models/operations/putv1contractorscontractoruuid'\nimport {\n WageType as ApiWageType,\n ContractorType as ApiContractorType,\n type Contractor,\n} from '@gusto/embedded-api/models/components/contractor'\nimport { useBase } from '@/components/Base'\nimport { useI18n } from '@/i18n'\nimport {\n componentEvents,\n ContractorOnboardingStatus,\n ContractorSelfOnboardingStatuses,\n} from '@/shared/constants'\nimport { SSN_REGEX, NAME_REGEX } from '@/helpers/validations'\nimport { removeNonDigits } from '@/helpers/formattedStrings'\nimport { formatDateToStringDate } from '@/helpers/dateFormatting'\nimport { normalizeEin } from '@/helpers/federalEin'\n\n// Re-export the API types for convenience\nexport const WageType = ApiWageType\nexport const ContractorType = ApiContractorType\n\n// Form schema definition - exported for use in stories and tests\nconst ContractorProfileSchema = z.object({\n // Self-onboarding toggle\n selfOnboarding: z.boolean().default(false),\n email: z.string().email().optional(),\n\n // Required contractor fields\n contractorType: z.enum([ContractorType.Individual, ContractorType.Business]),\n wageType: z.enum([WageType.Hourly, WageType.Fixed]),\n startDate: z.date(),\n\n // Individual contractor fields\n firstName: z.string().min(1).regex(NAME_REGEX).optional(),\n middleInitial: z.string().optional(),\n lastName: z.string().min(1).regex(NAME_REGEX).optional(),\n ssn: z.string().optional(),\n\n // Business contractor fields\n businessName: z.string().optional(),\n ein: z.string().optional(),\n\n // Wage fields\n hourlyRate: z.number().min(0).optional(),\n})\n\nexport type ContractorProfileFormData = z.infer<typeof ContractorProfileSchema>\n\n// Create validation schema - exported for stories\nexport const createContractorProfileValidationSchema = (\n t: (key: string) => string,\n hasSsn: boolean,\n hasEin: boolean,\n) => {\n return ContractorProfileSchema.superRefine(\n (data: ContractorProfileFormData, ctx: z.RefinementCtx) => {\n // Email validation for contractor invitation\n if (data.selfOnboarding && !data.email) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['email'],\n message: t('validations.email'),\n })\n }\n\n // Individual contractor validations\n if (data.contractorType === ContractorType.Individual) {\n if (!data.firstName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['firstName'],\n message: t('validations.firstName'),\n })\n }\n\n if (!data.lastName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['lastName'],\n message: t('validations.lastName'),\n })\n }\n\n if (!data.ssn) {\n if (!hasSsn) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ssn'],\n message: t('validations.ssn'),\n })\n }\n } else {\n // Validate SSN format\n const cleanSSN = removeNonDigits(data.ssn)\n if (!SSN_REGEX.test(cleanSSN)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ssn'],\n message: t('validations.ssnFormat'),\n })\n }\n }\n }\n\n // Business contractor validations\n if (data.contractorType === ContractorType.Business) {\n if (!data.businessName) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['businessName'],\n message: t('validations.businessName'),\n })\n }\n\n if (!data.ein) {\n if (!hasEin) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ein'],\n message: t('validations.ein'),\n })\n }\n } else {\n // Validate EIN format after normalization (XX-XXXXXXX)\n const normalizedEin = normalizeEin(data.ein)\n if (!/^\\d{2}-\\d{7}$/.test(normalizedEin)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['ein'],\n message: t('validations.einFormat'),\n })\n }\n }\n }\n\n // Hourly rate validation for hourly contractors\n if (data.wageType === WageType.Hourly) {\n if (data.hourlyRate === undefined || data.hourlyRate < 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n path: ['hourlyRate'],\n message: t('validations.hourlyRate'),\n })\n }\n }\n },\n )\n}\n\nexport interface UseContractorProfileProps {\n companyId: string\n contractorId?: string\n defaultValues?: Partial<ContractorProfileFormData>\n existingContractor?: Contractor\n}\n\nexport function useContractorProfile({\n companyId,\n contractorId,\n defaultValues,\n existingContractor,\n}: UseContractorProfileProps) {\n useI18n('Contractor.Profile')\n const { t } = useTranslation('Contractor.Profile')\n const { onEvent, baseSubmitHandler } = useBase()\n\n // Create validation schema with translations\n const validationSchema = createContractorProfileValidationSchema(\n t as (key: string) => string,\n existingContractor?.hasSsn ?? false,\n existingContractor?.hasEin ?? false,\n )\n\n // API mutations\n const { mutateAsync: createContractor, isPending: isCreating } = useContractorsCreateMutation()\n const { mutateAsync: updateContractor, isPending: isUpdating } = useContractorsUpdateMutation()\n\n // Prepare default values from existing contractor or provided defaults\n const formDefaultValues = useMemo(\n () => ({\n selfOnboarding: false,\n contractorType: ContractorType.Business,\n wageType: WageType.Fixed,\n startDate: new Date(),\n ...defaultValues,\n // Override with existing contractor data if available\n ...(existingContractor && {\n selfOnboarding: existingContractor.onboardingStatus\n ? // @ts-expect-error: onboarding_status during runtime can be one of self onboarding statuses\n ContractorSelfOnboardingStatuses.has(existingContractor.onboardingStatus)\n : false,\n contractorType: existingContractor.type || ContractorType.Business,\n wageType: existingContractor.wageType || WageType.Fixed,\n startDate: existingContractor.startDate\n ? new Date(existingContractor.startDate)\n : new Date(),\n firstName: existingContractor.firstName || undefined,\n middleInitial: existingContractor.middleInitial || undefined,\n lastName: existingContractor.lastName || undefined,\n businessName: existingContractor.businessName || undefined,\n email: existingContractor.email || undefined,\n hourlyRate: existingContractor.hourlyRate\n ? (() => {\n const parsed = parseFloat(existingContractor.hourlyRate)\n return isNaN(parsed) ? undefined : parsed\n })()\n : undefined,\n }),\n }),\n [existingContractor, defaultValues],\n )\n\n // Form setup\n const formMethods = useForm<ContractorProfileFormData>({\n resolver: zodResolver(validationSchema),\n defaultValues: formDefaultValues,\n })\n\n const { handleSubmit, formState } = formMethods\n\n // Watch form values for conditional rendering\n const watchedType = useWatch({ control: formMethods.control, name: 'contractorType' })\n const watchedWageType = useWatch({ control: formMethods.control, name: 'wageType' })\n const watchedSelfOnboarding = useWatch({\n control: formMethods.control,\n name: 'selfOnboarding',\n })\n\n // Helper function to transform form data to API payload\n const transformFormDataToCreatePayload = (\n data: ContractorProfileFormData,\n ): PostV1CompaniesCompanyUuidContractorsRequestBody => {\n const basePayload = {\n type: data.contractorType,\n wageType: data.wageType,\n startDate: formatDateToStringDate(data.startDate) || '',\n selfOnboarding: data.selfOnboarding,\n email: data.selfOnboarding ? data.email : undefined,\n hourlyRate: data.wageType === WageType.Hourly ? String(data.hourlyRate) : undefined,\n isActive: true,\n }\n\n if (data.contractorType === ContractorType.Individual) {\n return {\n ...basePayload,\n firstName: data.firstName,\n middleInitial: data.middleInitial || undefined,\n lastName: data.lastName,\n ssn: data.ssn,\n fileNewHireReport: false, // Default value\n }\n } else {\n return {\n ...basePayload,\n fileNewHireReport: false, // Default value\n businessName: data.businessName,\n ein: data.ein?.replace(/-/g, ''),\n }\n }\n }\n\n const transformFormDataToUpdatePayload = (\n data: ContractorProfileFormData,\n version: string,\n ): PutV1ContractorsContractorUuidRequestBody => {\n const createPayload = transformFormDataToCreatePayload(data)\n return {\n ...createPayload,\n version,\n }\n }\n\n // Event handlers\n const onSubmit: SubmitHandler<ContractorProfileFormData> = async data => {\n await baseSubmitHandler(data, async payload => {\n let contractorId = existingContractor?.uuid\n if (existingContractor) {\n // Update existing contractor\n if (!existingContractor.version) {\n throw new Error('Contractor version is required for updates')\n }\n const version = String(existingContractor.version)\n const apiPayload = transformFormDataToUpdatePayload(payload, version)\n\n const updateResponse = await updateContractor({\n request: {\n contractorUuid: contractorId!,\n requestBody: apiPayload,\n },\n })\n\n onEvent(componentEvents.CONTRACTOR_UPDATED, updateResponse.contractor)\n } else {\n // Create new contractor\n const apiPayload = transformFormDataToCreatePayload(payload)\n\n const createResponse = await createContractor({\n request: {\n companyUuid: companyId,\n requestBody: apiPayload,\n },\n })\n\n contractorId = createResponse.contractor?.uuid\n onEvent(componentEvents.CONTRACTOR_CREATED, createResponse.contractor)\n }\n\n onEvent(componentEvents.CONTRACTOR_PROFILE_DONE, {\n selfOnboarding:\n payload.selfOnboarding &&\n existingContractor?.onboardingStatus !==\n ContractorOnboardingStatus.ADMIN_ONBOARDING_REVIEW,\n contractorId,\n })\n })\n }\n\n // Conditional rendering helpers\n const shouldShowEmailField = watchedSelfOnboarding\n const shouldShowBusinessFields = watchedType === ContractorType.Business\n const shouldShowIndividualFields = watchedType === ContractorType.Individual\n const shouldShowHourlyRate = watchedWageType === WageType.Hourly\n\n // Form field options\n const contractorTypeOptions = [\n { label: 'Individual', value: ContractorType.Individual },\n { label: 'Business', value: ContractorType.Business },\n ]\n\n const wageTypeOptions = [\n { label: 'Hourly', value: WageType.Hourly },\n { label: 'Fixed', value: WageType.Fixed },\n ]\n\n // Determine if we're currently submitting (creating or updating)\n const isSubmitting = isCreating || isUpdating\n // Return only what the component actually needs\n return {\n // Form methods and submission\n formMethods,\n handleSubmit: handleSubmit(onSubmit),\n formState: {\n ...formState,\n isSubmitting,\n },\n\n // Conditional rendering flags\n shouldShowEmailField,\n shouldShowBusinessFields,\n shouldShowIndividualFields,\n shouldShowHourlyRate,\n\n // Form options\n contractorTypeOptions,\n wageTypeOptions,\n\n // Component state\n isEditing: !!contractorId,\n }\n}\n"],"names":["WageType","ApiWageType","ContractorType","ApiContractorType","ContractorProfileSchema","z","NAME_REGEX","createContractorProfileValidationSchema","t","hasSsn","hasEin","data","ctx","cleanSSN","removeNonDigits","SSN_REGEX","normalizedEin","normalizeEin","useContractorProfile","companyId","contractorId","defaultValues","existingContractor","useI18n","useTranslation","onEvent","baseSubmitHandler","useBase","validationSchema","createContractor","isCreating","useContractorsCreateMutation","updateContractor","isUpdating","useContractorsUpdateMutation","formDefaultValues","useMemo","ContractorSelfOnboardingStatuses","parsed","formMethods","useForm","zodResolver","handleSubmit","formState","watchedType","useWatch","watchedWageType","watchedSelfOnboarding","transformFormDataToCreatePayload","basePayload","formatDateToStringDate","transformFormDataToUpdatePayload","version","onSubmit","payload","apiPayload","updateResponse","componentEvents","createResponse","ContractorOnboardingStatus","shouldShowEmailField","shouldShowBusinessFields","shouldShowIndividualFields","shouldShowHourlyRate","contractorTypeOptions","wageTypeOptions","isSubmitting"],"mappings":"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"}
|