Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export interface SalaryCalculatorContextType {

hcmUser: HcmQuery['hcm'][number] | null;
hcmSpouse: HcmQuery['hcm'][number] | null;
hasSpouse: boolean;
calculation: SalaryCalculationQuery['salaryRequest'] | null;

/** Whether any mutations are currently in progress */
Expand Down Expand Up @@ -108,6 +109,7 @@ export const SalaryCalculatorProvider: React.FC<

const contextValue: SalaryCalculatorContextType = useMemo(() => {
const hcmSpouse = hcmData?.hcm[1] ?? null;
const eligibleSpouse = hcmSpouse?.salaryRequestEligible ? hcmSpouse : null;
return {
steps,
currentIndex,
Expand All @@ -119,7 +121,8 @@ export const SalaryCalculatorProvider: React.FC<
toggleDrawer,
hcmUser: hcmData?.hcm[0] ?? null,
// Ignore spouses that aren't eligible to make a salary request
hcmSpouse: hcmSpouse?.salaryRequestEligible ? hcmSpouse : null,
hcmSpouse: eligibleSpouse,
hasSpouse: !!eligibleSpouse,
calculation,
isMutating,
trackMutation,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,4 +220,39 @@ describe('useMhaRequestData', () => {
expect(result.current.showSpouseFields).toBe(false);
expect(result.current.spousePreferredName).toBe('');
});

it('does not show spouse ineligible message when spouse does not exist', async () => {
const { result } = renderHook(() => useMhaRequestData(), {
wrapper: createWrapper({ hasSpouse: false }),
});

await waitFor(() => {
expect(result.current.showUserFields).toBe(true);
});

expect(result.current.showIneligibleMessage).toBe(false);
expect(result.current.isIneligiblePlural).toBe(false);
expect(result.current.ineligibleNames).toBe('');
expect(result.current.ineligibleName).toBeNull();
});

it('shows only user ineligible message when user is ineligible and no spouse exists', async () => {
const { result } = renderHook(() => useMhaRequestData(), {
wrapper: createWrapper({
hcmUser: { mhaEit: { mhaEligibility: false } },
hasSpouse: false,
}),
});

await waitFor(() => {
expect(result.current.userPreferredName).toBe('John');
});

expect(result.current.showIneligibleMessage).toBe(true);
expect(result.current.isIneligiblePlural).toBe(false);
expect(result.current.ineligibleNames).toBe('John');
expect(result.current.ineligibleName).toBeNull();
expect(result.current.showUserFields).toBe(false);
expect(result.current.showSpouseFields).toBe(false);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -9,67 +9,67 @@
export const useMhaRequestData = () => {
const { t } = useTranslation();
const locale = useLocale();
const { calculation, hcmUser, hcmSpouse } = useSalaryCalculator();
const { calculation, hcmUser, hcmSpouse, hasSpouse } = useSalaryCalculator();

// User MHA eligibility and request status
const userEligible = hcmUser?.mhaEit.mhaEligibility ?? false;
const userHasApprovedMha = !!hcmUser?.mhaRequest.currentApprovedOverallAmount;

// Spouse MHA eligibility and request status
const spouseEligible = hcmSpouse?.mhaEit.mhaEligibility ?? false;
const spouseEligible =
hasSpouse && (hcmSpouse?.mhaEit.mhaEligibility ?? false);
const spouseHasApprovedMha =
!!hcmSpouse?.mhaRequest.currentApprovedOverallAmount;
// Show "no MHA" message for eligible people who don't have an MHA
const showUserNoMhaMessage = userEligible && !userHasApprovedMha;
const showSpouseNoMhaMessage = spouseEligible && !spouseHasApprovedMha;

// Show "not eligible" message when one person is not eligible but the other has MHA
const showUserIneligibleSpouseApprovedMessage =
!userEligible && spouseEligible && spouseHasApprovedMha;
const showSpouseIneligibleUserApprovedMessage =
!spouseEligible && userEligible && userHasApprovedMha;
hasSpouse && !spouseEligible && userEligible && userHasApprovedMha;
// Determine which fields should be shown
const showUserFields = userEligible && userHasApprovedMha;
const showSpouseFields = spouseEligible && spouseHasApprovedMha;

const userPreferredName = hcmUser?.staffInfo.preferredName ?? '';
const spousePreferredName = hcmSpouse?.staffInfo.preferredName ?? '';

// Computed text values for the component
const showNoMhaMessage = showUserNoMhaMessage || showSpouseNoMhaMessage;
const isNoMhaPlural = showUserNoMhaMessage && showSpouseNoMhaMessage;

const getNoMhaNames = () => {
if (isNoMhaPlural) {
return t('{{userPreferredName}} and {{spousePreferredName}}', {
userPreferredName,
spousePreferredName,
});
}
if (showUserNoMhaMessage) {
return userPreferredName;
}
if (showSpouseNoMhaMessage) {
return spousePreferredName;
}
return '';
};
const noMhaNames = getNoMhaNames();

const getIneligibleName = () => {
if (showUserIneligibleSpouseApprovedMessage) {
return userPreferredName;
}
if (showSpouseIneligibleUserApprovedMessage) {
return spousePreferredName;
}
return null;
};
const ineligibleName = getIneligibleName();

// Ineligibility messages (for NoMhaSubmitMessage)
const showUserIneligibleMessage = !userEligible;
const showSpouseIneligibleMessage = !spouseEligible;
const showSpouseIneligibleMessage = hasSpouse && !spouseEligible;

Check warning on line 72 in src/components/Reports/SalaryCalculator/YourInformation/MhaRequestSection/useMhaRequestData.ts

View check run for this annotation

CodeScene Delta Analysis / CodeScene Code Health Review (main)

❌ Getting worse: Complex Method

useMhaRequestData increases in cyclomatic complexity from 48 to 51, threshold = 9. This function has many conditional statements (e.g. if, for, while), leading to lower code health. Avoid adding more conditionals and code to it without refactoring.
const showIneligibleMessage =
showUserIneligibleMessage || showSpouseIneligibleMessage;
const isIneligiblePlural =
Expand Down
Loading