From 6a675b5e603866965fdf1db9cc9e14e0b81c30c5 Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Thu, 12 Feb 2026 17:59:47 +0100 Subject: [PATCH 01/12] fix employment_id --- src/flows/ContractorOnboarding/api.ts | 5 ++++- src/flows/ContractorOnboarding/hooks.tsx | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/flows/ContractorOnboarding/api.ts b/src/flows/ContractorOnboarding/api.ts index 31607ede..58bf21d4 100644 --- a/src/flows/ContractorOnboarding/api.ts +++ b/src/flows/ContractorOnboarding/api.ts @@ -231,11 +231,13 @@ export const useCreateContractorContractDocument = () => { */ export const useContractorOnboardingDetailsSchema = ({ countryCode, + employmentId, fieldValues, options, }: { countryCode: string; fieldValues: FieldValues; + employmentId: string; options?: FlowOptions & { queryOptions?: { enabled?: boolean } }; query?: Record; }): UseQueryResult => { @@ -249,7 +251,8 @@ export const useContractorOnboardingDetailsSchema = ({ path: { country_code: countryCode }, query: { json_schema_version: 1, - }, + employment_id: employmentId, + } as $TSFixMe, // TODO: fix this type when we can generate types from the API }); }, enabled: options?.queryOptions?.enabled, diff --git a/src/flows/ContractorOnboarding/hooks.tsx b/src/flows/ContractorOnboarding/hooks.tsx index fd6bd552..0160bd11 100644 --- a/src/flows/ContractorOnboarding/hooks.tsx +++ b/src/flows/ContractorOnboarding/hooks.tsx @@ -463,6 +463,7 @@ export const useContractorOnboarding = ({ } = useContractorOnboardingDetailsSchema({ countryCode: internalCountryCode as string, fieldValues: fieldValues, + employmentId: internalEmploymentId as string, options: { queryOptions: { enabled: isContractorOnboardingDetailsEnabled, From 21223567007638469fe9100c36e5eff7a12fe5b6 Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 08:58:53 +0100 Subject: [PATCH 02/12] feat(contractor-onboarding) - make sure invite button & review works correctly --- .../src/ReviewContractorOnboardingStep.tsx | 14 ++++++---- src/flows/ContractorOnboarding/hooks.tsx | 28 +++++++++---------- src/flows/ContractorOnboarding/utils.ts | 17 +++++++++++ 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/example/src/ReviewContractorOnboardingStep.tsx b/example/src/ReviewContractorOnboardingStep.tsx index 73ed107e..9269cf7d 100644 --- a/example/src/ReviewContractorOnboardingStep.tsx +++ b/example/src/ReviewContractorOnboardingStep.tsx @@ -107,12 +107,14 @@ export const ReviewContractorOnboardingStep = ({ Edit Contract Preview - {invitedStatus === 'not_invited' && ( - - )} + {invitedStatus === 'not_invited' && + typeof onboardingBag.employment?.basic_information?.name === + 'string' && ( + + )} {invitedStatus === 'invited' && (
diff --git a/src/flows/ContractorOnboarding/hooks.tsx b/src/flows/ContractorOnboarding/hooks.tsx index fd6bd552..fe1d5bcd 100644 --- a/src/flows/ContractorOnboarding/hooks.tsx +++ b/src/flows/ContractorOnboarding/hooks.tsx @@ -32,6 +32,8 @@ import { ContractorOnboardingFlowProps } from '@/src/flows/ContractorOnboarding/ import { buildSteps, calculateProvisionalStartDateDescription, + reviewStepAllowedEmploymentStatus, + disabledInviteButtonEmploymentStatus, StepKeys, } from '@/src/flows/ContractorOnboarding/utils'; import { @@ -40,10 +42,6 @@ import { useJSONSchemaForm, useUpdateEmployment, } from '@/src/flows/Onboarding/api'; -import { - disabledInviteButtonEmploymentStatus, - reviewStepAllowedEmploymentStatus, -} from '@/src/flows/Onboarding/utils'; import { FlowOptions, JSFModify, JSONSchemaFormType } from '@/src/flows/types'; import { useStepState } from '@/src/flows/useStepState'; import { mutationToPromise } from '@/src/lib/mutations'; @@ -445,17 +443,18 @@ export const useContractorOnboarding = ({ fieldValues, ]); - const { data: eligibilityQuestionnaireForm } = useGetEligibilityQuestionnaire( - { - options: { - queryOptions: { - enabled: selectedPricingPlan === corProductIdentifier, - }, - jsfModify: options?.jsfModify?.eligibility_questionnaire, + const { + data: eligibilityQuestionnaireForm, + isLoading: isLoadingEligibilityQuestionnaire, + } = useGetEligibilityQuestionnaire({ + options: { + queryOptions: { + enabled: selectedPricingPlan === corProductIdentifier, }, - fieldValues: eligibilityFields, + jsfModify: options?.jsfModify?.eligibility_questionnaire, }, - ); + fieldValues: eligibilityFields, + }); const { data: contractorOnboardingDetailsForm, @@ -677,7 +676,8 @@ export const useContractorOnboarding = ({ isLoadingContractorSubscriptions || isLoadingDocumentPreviewForm || isLoadingIR35File || - isLoadingContractDocuments; + isLoadingContractDocuments || + isLoadingEligibilityQuestionnaire; const isNavigatingToReview = useMemo(() => { return Boolean( diff --git a/src/flows/ContractorOnboarding/utils.ts b/src/flows/ContractorOnboarding/utils.ts index 13f41023..b389ad0a 100644 --- a/src/flows/ContractorOnboarding/utils.ts +++ b/src/flows/ContractorOnboarding/utils.ts @@ -3,6 +3,7 @@ import { contractorStandardProductIdentifier, contractorPlusProductIdentifier, } from '@/src/flows/ContractorOnboarding/constants'; +import { Employment } from '@/src/flows/Onboarding/types'; export type StepKeys = | 'select_country' @@ -111,3 +112,19 @@ export const isCMOrCMPlus = (subscription: string | undefined): boolean => { subscription === contractorPlusProductIdentifier ); }; + +/** + * Array of employment statuses that are allowed to proceed to the review step. + * These statuses indicate that the employment is in a final state and the employment cannot be modified further. + * @type {Employment['status'][]} + * @constant + */ +export const reviewStepAllowedEmploymentStatus: Employment['status'][] = [ + 'invited', + 'initiated', +]; + +export const disabledInviteButtonEmploymentStatus: Employment['status'][] = [ + 'initiated', + 'invited', +]; From 2852c2c74d812fc06d485b38b01e1ff6a62ea27b Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 09:46:56 +0100 Subject: [PATCH 03/12] add stale time --- src/flows/ContractorOnboarding/api.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/flows/ContractorOnboarding/api.ts b/src/flows/ContractorOnboarding/api.ts index 31607ede..9bb379a8 100644 --- a/src/flows/ContractorOnboarding/api.ts +++ b/src/flows/ContractorOnboarding/api.ts @@ -472,6 +472,7 @@ export const useGetEligibilityQuestionnaire = ({ }); }, enabled: options?.queryOptions?.enabled, + staleTime: 3600, }); }; From b5a4d618b4853af6273e14e8fe7a8c8ce224102b Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 09:56:36 +0100 Subject: [PATCH 04/12] make review work --- .../src/ReviewContractorOnboardingStep.tsx | 25 ++++++++++++------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/example/src/ReviewContractorOnboardingStep.tsx b/example/src/ReviewContractorOnboardingStep.tsx index 9269cf7d..0ea9af02 100644 --- a/example/src/ReviewContractorOnboardingStep.tsx +++ b/example/src/ReviewContractorOnboardingStep.tsx @@ -80,6 +80,22 @@ export const ReviewContractorOnboardingStep = ({ > Edit Basic Information +

Pricing plan

+ + +

Eligibility Questionnaire

+ +

Contract Details

-

Pricing plan

- - - {invitedStatus === 'not_invited' && typeof onboardingBag.employment?.basic_information?.name === From 1fc8faf392f3b4d5b97cd46025654fdba9f8441a Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 09:59:34 +0100 Subject: [PATCH 05/12] fix stepValues --- src/flows/ContractorOnboarding/hooks.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/flows/ContractorOnboarding/hooks.tsx b/src/flows/ContractorOnboarding/hooks.tsx index e064cb72..101576ab 100644 --- a/src/flows/ContractorOnboarding/hooks.tsx +++ b/src/flows/ContractorOnboarding/hooks.tsx @@ -721,7 +721,6 @@ export const useContractorOnboarding = ({ pricingPlanInitialValues, stepFields.pricing_plan, ), - // TODO: we have to check if this works well or not eligibility_questionnaire: prettifyFormValues( eligibilityQuestionnaireInitialValues, stepFields.eligibility_questionnaire, @@ -732,11 +731,9 @@ export const useContractorOnboarding = ({ select_country: selectCountryInitialValues, basic_information: basicInformationInitialValues, contract_details: contractDetailsInitialValues, - // TODO: we need to retrieve the contract preview data somehow from the BE, who signed the document - contract_preview: {}, + contract_preview: contractPreviewInitialValues, pricing_plan: pricingPlanInitialValues, - // TODO: we need to retrieve information somehow only for COR though - eligibility_questionnaire: {}, + eligibility_questionnaire: eligibilityQuestionnaireInitialValues, review: {}, }); goToStep('review'); From 42a91a55bf356fae31e9e5af03131539f50db4e0 Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 11:16:09 +0100 Subject: [PATCH 06/12] fix tests --- src/common/api/fixtures/contractors-subscriptions.ts | 3 ++- src/flows/ContractorOnboarding/hooks.tsx | 4 +++- .../ContractorOnboarding/tests/ContractorOnboarding.test.tsx | 2 ++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/common/api/fixtures/contractors-subscriptions.ts b/src/common/api/fixtures/contractors-subscriptions.ts index 1366eda5..41252638 100644 --- a/src/common/api/fixtures/contractors-subscriptions.ts +++ b/src/common/api/fixtures/contractors-subscriptions.ts @@ -57,7 +57,6 @@ export const mockContractorSubscriptionResponse = { ], }; -export const mockManageSubscriptionResponse = mockBaseResponse; export const mockContractorSubscriptionWithEligibilityResponse = { data: [ { @@ -123,3 +122,5 @@ export const mockContractorSubscriptionWithEligibilityResponse = { }, ], }; + +export const mockManageSubscriptionResponse = mockBaseResponse; diff --git a/src/flows/ContractorOnboarding/hooks.tsx b/src/flows/ContractorOnboarding/hooks.tsx index 101576ab..d0d4b307 100644 --- a/src/flows/ContractorOnboarding/hooks.tsx +++ b/src/flows/ContractorOnboarding/hooks.tsx @@ -449,7 +449,9 @@ export const useContractorOnboarding = ({ } = useGetEligibilityQuestionnaire({ options: { queryOptions: { - enabled: selectedPricingPlan === corProductIdentifier, + enabled: + selectedPricingPlan === corProductIdentifier && + stepState.currentStep.name === 'eligibility_questionnaire', }, jsfModify: options?.jsfModify?.eligibility_questionnaire, }, diff --git a/src/flows/ContractorOnboarding/tests/ContractorOnboarding.test.tsx b/src/flows/ContractorOnboarding/tests/ContractorOnboarding.test.tsx index 6ab5cd1e..dd7d5db9 100644 --- a/src/flows/ContractorOnboarding/tests/ContractorOnboarding.test.tsx +++ b/src/flows/ContractorOnboarding/tests/ContractorOnboarding.test.tsx @@ -2255,6 +2255,8 @@ describe('ContractorOnboardingFlow', () => { await screen.findByText(/Step: Pricing Plan/i); + await waitForElementToBeRemoved(() => screen.getByTestId('spinner')); + await fillContractorSubscription('Contractor of Record'); nextButton = screen.getByText(/Next Step/i); From 4ec84be3da9f6c0fd100390d12ac09410981f41d Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 11:20:20 +0100 Subject: [PATCH 07/12] fix types --- src/client/sdk.gen.ts | 6 ++++-- src/client/types.gen.ts | 5 +++++ src/flows/ContractorOnboarding/api.ts | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/client/sdk.gen.ts b/src/client/sdk.gen.ts index 845aa1aa..0cdc8a94 100644 --- a/src/client/sdk.gen.ts +++ b/src/client/sdk.gen.ts @@ -2569,8 +2569,9 @@ export const postCancelEmployeeTimeoff = ( * * ``` * - * This endpoint requires a company access token, as forms are dependent on certain - * properties of companies and their current employments. + * Most forms require a company access token, as they are dependent on certain + * properties of companies and their current employments. However, the `address_details` + * form can be accessed using client_credentials authentication (without a company). * * */ @@ -2585,6 +2586,7 @@ export const getShowFormCountry = ( security: [ { scheme: 'bearer', type: 'http' }, { scheme: 'bearer', type: 'http' }, + { scheme: 'bearer', type: 'http' }, ], url: '/v1/countries/{country_code}/{form}', ...options, diff --git a/src/client/types.gen.ts b/src/client/types.gen.ts index e50da160..8ce73948 100644 --- a/src/client/types.gen.ts +++ b/src/client/types.gen.ts @@ -3820,6 +3820,7 @@ export type MinimalEmployment = { work_address_details: { [key: string]: unknown; }; + work_email: string | null; }; /** @@ -8914,6 +8915,10 @@ export type GetShowContractorContractDetailsCountryData = { country_code: string; }; query?: { + /** + * Employment ID + */ + employment_id?: string; /** * Version of the form schema */ diff --git a/src/flows/ContractorOnboarding/api.ts b/src/flows/ContractorOnboarding/api.ts index 58bf21d4..92d69161 100644 --- a/src/flows/ContractorOnboarding/api.ts +++ b/src/flows/ContractorOnboarding/api.ts @@ -252,7 +252,7 @@ export const useContractorOnboardingDetailsSchema = ({ query: { json_schema_version: 1, employment_id: employmentId, - } as $TSFixMe, // TODO: fix this type when we can generate types from the API + }, }); }, enabled: options?.queryOptions?.enabled, From 95f73c07351f35058f8429e2ef45e5f8845b55ad Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 11:25:35 +0100 Subject: [PATCH 08/12] fix param --- src/flows/ContractorOnboarding/api.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/flows/ContractorOnboarding/api.ts b/src/flows/ContractorOnboarding/api.ts index 92d69161..37f44157 100644 --- a/src/flows/ContractorOnboarding/api.ts +++ b/src/flows/ContractorOnboarding/api.ts @@ -243,7 +243,11 @@ export const useContractorOnboardingDetailsSchema = ({ }): UseQueryResult => { const { client } = useClient(); return useQuery({ - queryKey: ['contractor-onboarding-details-schema', countryCode], + queryKey: [ + 'contractor-onboarding-details-schema', + countryCode, + employmentId, + ], retry: false, queryFn: async () => { return getShowContractorContractDetailsCountry({ From 6e31432933ab9d5cd5dc02fe844e4efa8b9c0112 Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Fri, 13 Feb 2026 11:35:58 +0100 Subject: [PATCH 09/12] fix hooks --- .../src/ReviewContractorOnboardingStep.tsx | 24 ++++++++++++------- src/flows/ContractorOnboarding/hooks.tsx | 17 ++++++++++--- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/example/src/ReviewContractorOnboardingStep.tsx b/example/src/ReviewContractorOnboardingStep.tsx index 0ea9af02..e8d8390a 100644 --- a/example/src/ReviewContractorOnboardingStep.tsx +++ b/example/src/ReviewContractorOnboardingStep.tsx @@ -1,5 +1,6 @@ import { ContractorOnboardingRenderProps, + corProductIdentifier, NormalizedFieldError, useMagicLink, } from '@remoteoss/remote-flows'; @@ -88,14 +89,21 @@ export const ReviewContractorOnboardingStep = ({ > Edit Pricing Plan -

Eligibility Questionnaire

- - + {onboardingBag.stepState.values?.pricing_plan?.subscription === + corProductIdentifier && ( + <> +

Eligibility Questionnaire

+ + + + )}

Contract Details