Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2510,7 +2510,17 @@ const CONST = {
},
},
NETSUITE_ADD_CUSTOM_LIST_STEP_NAMES: ['1', '2,', '3', '4'],
NETSUITE_ADD_CUSTOM_SEGMENT_STEP_NAMES: ['1', '2,', '3', '4', '5', '6,'],
NETSUITE_ADD_CUSTOM_SEGMENT: {
STEP_INDEX_LIST: ['1', '2', '3', '4', '5', '6'],
PAGE_NAME: {
TYPE: 'type',
NAME: 'name',
INTERNAL_ID: 'internal-id',
SCRIPT_ID: 'script-id',
MAPPING_TITLE: 'mapping-title',
CONFIRM: 'confirm',
},
},
},

NETSUITE_CUSTOM_FIELD_SUBSTEP_INDEXES: {
Expand Down
12 changes: 10 additions & 2 deletions src/ROUTES.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3336,8 +3336,16 @@ const ROUTES = {
getRoute: (policyID: string) => `workspaces/${policyID}/accounting/netsuite/import/custom-list/new` as const,
},
POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_SEGMENT_ADD: {
route: 'workspaces/:policyID/accounting/netsuite/import/custom-segment/new',
getRoute: (policyID: string) => `workspaces/${policyID}/accounting/netsuite/import/custom-segment/new` as const,
route: 'workspaces/:policyID/accounting/netsuite/import/custom-segment/new/:subPage?/:action?',
getRoute: (policyID: string | undefined, subPage?: string, action?: 'edit') => {
if (!policyID) {
Log.warn('Invalid policyID is used to build the POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_SEGMENT_ADD route');
}
if (!subPage) {
return `workspaces/${policyID}/accounting/netsuite/import/custom-segment/new` as const;
}
return `workspaces/${policyID}/accounting/netsuite/import/custom-segment/new/${subPage}${action ? `/${action}` : ''}` as const;
},
},
POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOMERS_OR_PROJECTS: {
route: 'workspaces/:policyID/accounting/netsuite/import/customer-projects',
Expand Down
2 changes: 2 additions & 0 deletions src/libs/Navigation/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -966,6 +966,8 @@ type SettingsNavigatorParamList = {
};
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_IMPORT_CUSTOM_SEGMENT_ADD]: {
policyID: string;
subPage?: string;
action?: 'edit';
};
[SCREENS.WORKSPACE.ACCOUNTING.NETSUITE_EXPORT]: {
policyID: string;
Expand Down
6 changes: 5 additions & 1 deletion src/libs/actions/connections/NetSuiteCommands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -583,12 +583,16 @@ function updateNetSuiteCrossSubsidiaryCustomersConfiguration(policyID: string, i
}

function updateNetSuiteCustomSegments(
policyID: string,
policyID: string | undefined,
records: NetSuiteCustomSegment[],
oldRecords: NetSuiteCustomSegment[],
modifiedSegmentID: string,
pendingAction: OnyxCommon.PendingAction,
) {
if (!policyID) {
return;
}

const onyxData = updateNetSuiteSyncOptionsOnyxData(policyID, CONST.NETSUITE_CONFIG.IMPORT_CUSTOM_FIELDS.CUSTOM_SEGMENTS, records, oldRecords, modifiedSegmentID, pendingAction);

API.write(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import React, {useCallback, useMemo, useRef, useState} from 'react';
import type {ForwardedRef} from 'react';
import {InteractionManager, View} from 'react-native';
import type {OnyxEntry} from 'react-native-onyx';
import type {ValueOf} from 'type-fest';
import ConnectionLayout from '@components/ConnectionLayout';
import type {FormRef} from '@components/Form/types';
import InteractiveStepSubHeader from '@components/InteractiveStepSubHeader';
import type {InteractiveStepSubHeaderHandle} from '@components/InteractiveStepSubHeader';
import useSubStep from '@hooks/useSubStep';
import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator';
import InteractiveStepSubPageHeader from '@components/InteractiveStepSubPageHeader';
import useSubPage from '@hooks/useSubPage';
import useThemeStyles from '@hooks/useThemeStyles';
import Navigation from '@libs/Navigation/Navigation';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {WithPolicyConnectionsProps} from '@pages/workspace/withPolicyConnections';
import {updateNetSuiteCustomSegments} from '@userActions/connections/NetSuiteCommands';
import {clearDraftValues} from '@userActions/FormActions';
import CONST from '@src/CONST';
Expand All @@ -19,7 +19,6 @@
import ROUTES from '@src/ROUTES';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';
import type {NetSuiteCustomFieldForm} from '@src/types/form/NetSuiteCustomFieldForm';
import type {Policy} from '@src/types/onyx';
import {getCustomSegmentInitialSubstep, getSubstepValues} from './customUtils';
import ChooseSegmentTypeStep from './substeps/ChooseSegmentTypeStep';
import ConfirmCustomSegmentStep from './substeps/ConfirmCustomSegmentList';
Expand All @@ -29,16 +28,23 @@
import CustomSegmentScriptIdStep from './substeps/CustomSegmentScriptIdStep';

type NetSuiteImportAddCustomSegmentContentProps = {
policy: OnyxEntry<Policy>;
policy: WithPolicyConnectionsProps['policy'];
route: WithPolicyConnectionsProps['route'];
draftValues: OnyxEntry<NetSuiteCustomFieldForm>;
};

const formSteps = [ChooseSegmentTypeStep, CustomSegmentNameStep, CustomSegmentInternalIdStep, CustomSegmentScriptIdStep, CustomSegmentMappingStep, ConfirmCustomSegmentStep];
const pages = [
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.TYPE, component: ChooseSegmentTypeStep},
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.NAME, component: CustomSegmentNameStep},
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.INTERNAL_ID, component: CustomSegmentInternalIdStep},
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.SCRIPT_ID, component: CustomSegmentScriptIdStep},
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.MAPPING_TITLE, component: CustomSegmentMappingStep},
{pageName: CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.CONFIRM, component: ConfirmCustomSegmentStep},
];

function NetSuiteImportAddCustomSegmentContent({policy, draftValues}: NetSuiteImportAddCustomSegmentContentProps) {
const policyID = policy?.id ?? '-1';
function NetSuiteImportAddCustomSegmentContent({policy, route, draftValues}: NetSuiteImportAddCustomSegmentContentProps) {
const policyID = policy?.id;
const styles = useThemeStyles();
const ref: ForwardedRef<InteractiveStepSubHeaderHandle> = useRef(null);
const formRef = useRef<FormRef | null>(null);

const config = policy?.connections?.netsuite?.options?.config;
Expand Down Expand Up @@ -70,41 +76,44 @@
});
}, [values, customSegments, policyID]);

const {
componentToRender: SubStep,
isEditing,
nextScreen,
prevScreen,
screenIndex,
moveTo,
goToTheLastStep,
} = useSubStep<CustomFieldSubStepWithPolicy>({bodyContent: formSteps, startFrom, onFinished: handleFinishStep});
const {CurrentPage, isEditing, nextPage, prevPage, pageIndex, moveTo, isRedirecting} = useSubPage<CustomFieldSubPageWithPolicy>({
pages,
startFrom,
onFinished: handleFinishStep,
buildRoute: (pageName, action) => ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_SEGMENT_ADD.getRoute(route.params.policyID, pageName, action),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can we use policyID from policy.id? then we don't need to pass route to NetSuiteImportAddCustomSegmentContent

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

policy.id can be undefined when the onyx is loading

});

const goBackToConfirmStep = () => {

Check warning on line 86 in src/pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteImportAddCustomSegmentContent.tsx

View workflow job for this annotation

GitHub Actions / Changed files ESLint check

The 'goBackToConfirmStep' function makes the dependencies of useCallback Hook (at line 112) change on every render. To fix this, wrap the definition of 'goBackToConfirmStep' in its own useCallback() Hook
Navigation.goBack(ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_SEGMENT_ADD.getRoute(route.params.policyID, CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.PAGE_NAME.CONFIRM));
};

const handleBackButtonPress = () => {
if (isEditing) {
goToTheLastStep();
goBackToConfirmStep();
return;
}

// Clicking back on the first screen should go back to listing
if (screenIndex === CONST.NETSUITE_CUSTOM_FIELD_SUBSTEP_INDEXES.CUSTOM_SEGMENTS.SEGMENT_TYPE) {
if (pageIndex === CONST.NETSUITE_CUSTOM_FIELD_SUBSTEP_INDEXES.CUSTOM_SEGMENTS.SEGMENT_TYPE) {
clearDraftValues(ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM);
Navigation.goBack(ROUTES.POLICY_ACCOUNTING_NETSUITE_IMPORT_CUSTOM_FIELD_MAPPING.getRoute(policyID, CONST.NETSUITE_CONFIG.IMPORT_CUSTOM_FIELDS.CUSTOM_SEGMENTS));
return;
}
ref.current?.movePrevious();
formRef.current?.resetErrors();
prevScreen();
prevPage();
};

const handleNextScreen = useCallback(() => {
if (isEditing) {
goToTheLastStep();
goBackToConfirmStep();
return;
}
ref.current?.moveNext();
nextScreen();
}, [goToTheLastStep, isEditing, nextScreen]);
nextPage();
}, [goBackToConfirmStep, isEditing, nextPage]);

if (isRedirecting) {
return <FullScreenLoadingIndicator />;
}

return (
<ConnectionLayout
Expand All @@ -120,19 +129,16 @@
shouldUseScrollView={false}
>
<View style={[styles.ph5, styles.mb3, styles.mt3, {height: CONST.NETSUITE_FORM_STEPS_HEADER_HEIGHT}]}>
<InteractiveStepSubHeader
ref={ref}
startStepIndex={startFrom}
stepNames={CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT_STEP_NAMES}
<InteractiveStepSubPageHeader
currentStepIndex={pageIndex}
stepNames={CONST.NETSUITE_CONFIG.NETSUITE_ADD_CUSTOM_SEGMENT.STEP_INDEX_LIST}
/>
</View>
<View style={[styles.flex1, styles.mt3]}>
<SubStep
<CurrentPage
isEditing={isEditing}
onNext={handleNextScreen}
onMove={moveTo}
screenIndex={screenIndex}
policyID={policyID}
policy={policy}
importCustomField={CONST.NETSUITE_CONFIG.IMPORT_CUSTOM_FIELDS.CUSTOM_SEGMENTS}
customSegmentType={customSegmentType}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import ONYXKEYS from '@src/ONYXKEYS';
import isLoadingOnyxValue from '@src/types/utils/isLoadingOnyxValue';
import NetSuiteImportAddCustomSegmentContent from './NetSuiteImportAddCustomSegmentContent';

function NetSuiteImportAddCustomSegmentPage({policy}: WithPolicyConnectionsProps) {
const [draftValues, draftValuesMetadata] = useOnyx(ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM_DRAFT);
function NetSuiteImportAddCustomSegmentPage({policy, route}: WithPolicyConnectionsProps) {
const [draftValues, draftValuesMetadata] = useOnyx(ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM_DRAFT, {canBeMissing: true});
const isLoading = isLoadingOnyxValue(draftValuesMetadata);

if (isLoading) {
Expand All @@ -18,6 +18,7 @@ function NetSuiteImportAddCustomSegmentPage({policy}: WithPolicyConnectionsProps
return (
<NetSuiteImportAddCustomSegmentContent
policy={policy}
route={route}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we pass the policyID only?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

draftValues={draftValues}
/>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,24 @@ import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import useNetSuiteImportAddCustomSegmentFormSubmit from '@hooks/useNetSuiteImportAddCustomSegmentForm';
import useThemeStyles from '@hooks/useThemeStyles';
import * as ValidationUtils from '@libs/ValidationUtils';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import NetSuiteCustomSegmentMappingPicker from '@pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteCustomSegmentMappingPicker';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

const STEP_FIELDS = [INPUT_IDS.SEGMENT_TYPE];

function ChooseSegmentTypeStep({onNext, setCustomSegmentType, isEditing, netSuiteCustomFieldFormValues}: CustomFieldSubStepWithPolicy) {
function ChooseSegmentTypeStep({onNext, setCustomSegmentType, isEditing, netSuiteCustomFieldFormValues}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();

const validate = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM> => {
const errors: FormInputErrors<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM> = {};

if (!ValidationUtils.isRequiredFulfilled(values[INPUT_IDS.SEGMENT_TYPE])) {
if (!isRequiredFulfilled(values[INPUT_IDS.SEGMENT_TYPE])) {
errors[INPUT_IDS.SEGMENT_TYPE] = translate('common.error.pleaseSelectOne');
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import useBottomSafeSafeAreaPaddingStyle from '@hooks/useBottomSafeSafeAreaPaddi
import useLocalize from '@hooks/useLocalize';
import useNetwork from '@hooks/useNetwork';
import useThemeStyles from '@hooks/useThemeStyles';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

function ConfirmCustomSegmentStep({onMove, customSegmentType, netSuiteCustomFieldFormValues: values, onNext}: CustomFieldSubStepWithPolicy) {
function ConfirmCustomSegmentStep({onMove, customSegmentType, netSuiteCustomFieldFormValues: values, onNext}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ import useNetSuiteImportAddCustomSegmentFormSubmit from '@hooks/useNetSuiteImpor
import useThemeStyles from '@hooks/useThemeStyles';
import Parser from '@libs/Parser';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

const STEP_FIELDS = [INPUT_IDS.INTERNAL_ID];

function CustomSegmentInternalIdStep({customSegmentType, onNext, isEditing, netSuiteCustomFieldFormValues, customSegments}: CustomFieldSubStepWithPolicy) {
function CustomSegmentInternalIdStep({customSegmentType, onNext, isEditing, netSuiteCustomFieldFormValues, customSegments}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {inputCallbackRef} = useAutoFocusInput();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,25 @@ import Text from '@components/Text';
import useLocalize from '@hooks/useLocalize';
import useNetSuiteImportAddCustomSegmentFormSubmit from '@hooks/useNetSuiteImportAddCustomSegmentForm';
import useThemeStyles from '@hooks/useThemeStyles';
import * as ValidationUtils from '@libs/ValidationUtils';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import NetSuiteCustomFieldMappingPicker from '@pages/workspace/accounting/netsuite/import/NetSuiteImportCustomFieldNew/NetSuiteCustomFieldMappingPicker';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

const STEP_FIELDS = [INPUT_IDS.MAPPING];

function CustomSegmentMappingStep({importCustomField, customSegmentType, onNext, isEditing, netSuiteCustomFieldFormValues}: CustomFieldSubStepWithPolicy) {
function CustomSegmentMappingStep({importCustomField, customSegmentType, onNext, isEditing, netSuiteCustomFieldFormValues}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();
// reminder to change the validation logic at the last phase of PR

const validate = useCallback(
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM> => {
const errors: FormInputErrors<typeof ONYXKEYS.FORMS.NETSUITE_CUSTOM_SEGMENT_ADD_FORM> = {};
if (!ValidationUtils.isRequiredFulfilled(values[INPUT_IDS.MAPPING])) {
if (!isRequiredFulfilled(values[INPUT_IDS.MAPPING])) {
errors[INPUT_IDS.MAPPING] = translate('common.error.pleaseSelectOne');
}
return errors;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ import useNetSuiteImportAddCustomSegmentFormSubmit from '@hooks/useNetSuiteImpor
import useThemeStyles from '@hooks/useThemeStyles';
import Parser from '@libs/Parser';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import CONST from '@src/CONST';
import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

const STEP_FIELDS = [INPUT_IDS.SEGMENT_NAME];
function CustomSegmentNameStep({customSegmentType, onNext, isEditing, customSegments}: CustomFieldSubStepWithPolicy) {
function CustomSegmentNameStep({customSegmentType, onNext, isEditing, customSegments}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {inputCallbackRef} = useAutoFocusInput();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ import useNetSuiteImportAddCustomSegmentFormSubmit from '@hooks/useNetSuiteImpor
import useThemeStyles from '@hooks/useThemeStyles';
import Parser from '@libs/Parser';
import {isRequiredFulfilled} from '@libs/ValidationUtils';
import type {CustomFieldSubStepWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import type {CustomFieldSubPageWithPolicy} from '@pages/workspace/accounting/netsuite/types';
import CONST from '@src/CONST';
import type {TranslationPaths} from '@src/languages/types';
import ONYXKEYS from '@src/ONYXKEYS';
import INPUT_IDS from '@src/types/form/NetSuiteCustomFieldForm';

const STEP_FIELDS = [INPUT_IDS.SCRIPT_ID];
function CustomSegmentScriptIdStep({customSegmentType, onNext, isEditing, customSegments}: CustomFieldSubStepWithPolicy) {
function CustomSegmentScriptIdStep({customSegmentType, onNext, isEditing, customSegments}: CustomFieldSubPageWithPolicy) {
const styles = useThemeStyles();
const {translate} = useLocalize();
const {inputCallbackRef} = useAutoFocusInput();
Expand Down
Loading
Loading