Skip to content

Commit ff81ecb

Browse files
committed
Refactor to useSelectedBenefit[s]Store
Drop /onboarding-welcome/:benefitMode in the process
1 parent 45e3618 commit ff81ecb

11 files changed

Lines changed: 66 additions & 60 deletions

File tree

src/AppRoutes.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ const AppRoutes = () => (
2525
<Route path="/onboarding-choice" element={<OnboardingChoice/>}/>
2626
<Route path="/onboarding-welcome-topics" element={<OnboardingWelcomeTopicsContainer/>}/>
2727
<Route path="/onboarding-welcome" element={<OnboardingWelcomeOverviewContainer/>}/>
28-
<Route path="/onboarding-welcome/:benefitMode" element={<OnboardingWelcomeOverviewContainer/>}/>
2928
<Route path="/eligibility-overview" element={<EligibilityOverviewScreenContainer/>}/>
3029
<Route path="/benefit-page/:id" element={<BenefitPageScreenContainer/>}/>
3130
<Route path="/profile-overview" element={<ProfileScreen/>}/>

src/ui/screens/benefit-page/components/BenefitPageHeader.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ import { Link } from "react-router-dom";
33
import { Button, IconButton, Typography, Box } from "@mui/material";
44
import InfoOutlinedIcon from "@mui/icons-material/InfoOutlined";
55
import { HBox, VBox } from "@/ui/shared-components/LayoutBoxes";
6-
import { useSelectedBenefitStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
6+
import { useSelectedBenefitsStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
77
import useTranslation from "@/ui/language/useTranslation";
88
import theme from "@/theme";
99

1010
const BenefitPageHeader = ({ id, benefit, validatedStatus, categoryTitles }) => {
1111
const { t } = useTranslation();
1212
const [leiKaInfo, setLeiKaInfo] = useState(false);
1313

14-
const setSelectedBenefit = useSelectedBenefitStore((state) => state.setSelectedBenefit);
14+
const setSelectedBenefits = useSelectedBenefitsStore((state) => state.setSelectedBenefits);
1515
const clearSelectedTopics = useSelectedTopicsStore((state) => state.clear);
1616

1717
return (
@@ -92,9 +92,9 @@ const BenefitPageHeader = ({ id, benefit, validatedStatus, categoryTitles }) =>
9292
}
9393
}}
9494
component={Link}
95-
to={`/onboarding-welcome/${id}`}
95+
to={'/onboarding-welcome/'}
9696
onClick={() => {
97-
setSelectedBenefit(id);
97+
setSelectedBenefits([id]);
9898
clearSelectedTopics()
9999
}}
100100
>

src/ui/screens/eligibilty-overview/components/EligibilityOverviewItem.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Divider, Typography } from '@mui/material';
33
import { HBox, VBox } from '@/ui/shared-components/LayoutBoxes';
44
import theme from '@/theme';
55
import RegularButton from '@/ui/shared-components/buttons/RegularButton';
6-
import { useSelectedBenefitStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
6+
import { useSelectedBenefitsStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
77
import EligibilityOverviewTag from './EligibilityOverviewTag';
88
import EligibilityOverviewBanner from './EligibilityOverviewBanner';
99
import ChevronRightIcon from '@mui/icons-material/ChevronRight';
@@ -21,7 +21,7 @@ const filterKeys = [
2121
const EligibilityOverviewItem = ({ t, item, eligible }) => {
2222
const [isVisible, setIsVisible] = useState(false);
2323
const color = eligible === 'indeterminate' ? 'black.light' : 'black.main';
24-
const setSelectedBenefit = useSelectedBenefitStore((state) => state.setSelectedBenefit);
24+
const setSelectedBenefits = useSelectedBenefitsStore((state) => state.setSelectedBenefits);
2525
const clearSelectedTopics = useSelectedTopicsStore((state) => state.clear);
2626

2727
return (
@@ -112,10 +112,10 @@ const EligibilityOverviewItem = ({ t, item, eligible }) => {
112112
variant={'blueHollow'}
113113
onClick={() => {
114114
clearSelectedTopics()
115-
setSelectedBenefit(item.id);
115+
setSelectedBenefits([item.id]);
116116
}}
117117
text={'app.browseAll.checkElBtn'}
118-
link={`/onboarding-welcome/${item.id}`}
118+
link={`/onboarding-welcome/`}
119119
size='small'
120120
endIcon={<ChevronRightIcon sx={{ fontSize: '16px' }} />}
121121
/>

src/ui/screens/eligibilty-overview/components/EligibilityOverviewItemDetails.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import React from 'react';
22
import { Typography } from '@mui/material';
33
import { HBox, VBox } from '@/ui/shared-components/LayoutBoxes';
4-
import { useSelectedBenefitStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
4+
import { useSelectedBenefitsStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
55
import RegularButton from '@/ui/shared-components/buttons/RegularButton';
66

77
const EligibilityOverviewItemDetails = ({ item, eligible }) => {
8-
const setSelectedBenefit = useSelectedBenefitStore((state) => state.setSelectedBenefit);
8+
const setSelectedBenefits = useSelectedBenefitsStore((state) => state.setSelectedBenefits);
99
const clearSelectedTopics = useSelectedTopicsStore((state) => state.clear);
1010

1111
return (
@@ -27,10 +27,10 @@ const EligibilityOverviewItemDetails = ({ item, eligible }) => {
2727
variant={'blueHollow'}
2828
onClick={() => {
2929
clearSelectedTopics()
30-
setSelectedBenefit(item.id);
30+
setSelectedBenefits([item.id]);
3131
}}
3232
text={'app.browseAll.checkElBtn'}
33-
link={`/onboarding-welcome/${item.id}`}
33+
link={`/onboarding-welcome/`}
3434
size='small'
3535
/>
3636
}

src/ui/screens/info-pages/hooks/useResetUserProfile.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useApplicationLoadingState } from '@/ui/storage/updates';
77
import {
88
useUserStore,
99
questionsStackStore,
10-
useSelectedBenefitStore,
10+
useSelectedBenefitsStore,
1111
useSelectedTopicsStore,
1212
useValidationReportStore,
1313
} from "@/ui/storage/zustand";
@@ -44,7 +44,7 @@ const useResetUserProfile = () => {
4444

4545
// 2) Clear selected topics/benefits
4646
useSelectedTopicsStore.getState().clear();
47-
useSelectedBenefitStore.getState().clear();
47+
useSelectedBenefitsStore.getState().clear();
4848
questionsStackStore.getState().resetQuestionsStack();
4949

5050
// 3) Fetch & update validation report

src/ui/screens/onboarding-pages/hooks/useBuildBenefitTitle.js

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { useMemo } from "react";
2+
3+
const useBuildBenefitsTitles = (selectedBenefits, metadata) => {
4+
return useMemo(() => {
5+
if (!metadata?.['ff:hasRP'] || !Array.isArray(selectedBenefits) || selectedBenefits.length === 0) {
6+
return [];
7+
}
8+
return selectedBenefits
9+
.map(benefitId => {
10+
const match = metadata['ff:hasRP']?.find(rp => rp['@id'] === benefitId);
11+
return match?.['ff:title']?.["@value"] || "";
12+
})
13+
.filter(title => title); // remove empty strings
14+
}, [metadata, selectedBenefits]);
15+
};
16+
17+
export default useBuildBenefitsTitles;

src/ui/screens/onboarding-pages/overview/OnboardingWelcomeOverview.js

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ import AppScreenWrapperContainer from '@/ui/shared-components/app-screen-wrapper
1010

1111
const OnboardingWelcomeOverviewView = ({
1212
t,
13-
benefitMode,
1413
language,
1514
isLoading,
1615
numberOfBenefits,
17-
benefitTitle,
16+
benefitTitles,
1817
topicRps,
1918
}) => {
2019

20+
const isBenefitMode = () => { // true = by benefits, false = by topic
21+
return benefitTitles && benefitTitles.length > 0;
22+
}
2123

2224
return (
2325
<Layout isApp={true} logo={false}>
@@ -29,36 +31,38 @@ const OnboardingWelcomeOverviewView = ({
2931
</Typography>
3032
<HBox sx={{ gap: 4, alignItems: 'center', flexWrap: 'wrap' }}>
3133
<TimeIcon />
32-
{!benefitMode && numberOfBenefits > 0 && <BenefitsIcon numberOfBenefits={numberOfBenefits} />}
34+
{!isBenefitMode() && numberOfBenefits > 0 && <BenefitsIcon numberOfBenefits={numberOfBenefits} />}
3335
</HBox>
3436
</VBox>
3537
<VBox sx={{ maxWidth: '800px' }}>
3638
{
37-
!benefitMode && numberOfBenefits === 0 ? (
39+
!isBenefitMode() && numberOfBenefits === 0 ? (
3840
<Typography variant="h2" sx={{ color: 'pink.main', fontWeight: '500' }}>
3941
{t('app.topicsChosen.noChoiceTitle')}
4042
</Typography>)
4143
: (
4244
<>
4345
<Typography variant="h2" sx={{ color: 'pink.main', fontWeight: '500' }}>
44-
{benefitMode ? t('app.topicsChosen.benefitTitle') : t('app.topicsChosen.topicsTitle')}
46+
{isBenefitMode() ? t('app.topicsChosen.benefitTitle') : t('app.topicsChosen.topicsTitle')}
4547
</Typography>
4648
<Typography variant="body1">
47-
{benefitMode ? t('app.topicsChosen.benefitText') : t('app.topicsChosen.topicsText')}
49+
{isBenefitMode() ? t('app.topicsChosen.benefitText') : t('app.topicsChosen.topicsText')}
4850
</Typography>
4951
</>)}
5052
</VBox>
5153
<VBox sx={{ gap: 4 }}>
52-
{benefitMode ? (
54+
{isBenefitMode() ? (
5355
<VBox alignItems={'flex-start'}>
5456
<HBox sx={{
5557
padding: { xs: '20px', md: 4 },
5658
borderRadius: theme.shape.borderRadius,
5759
backgroundColor: 'white.main',
5860
}}>
59-
<Typography variant="h2" sx={{ fontWeight: '400' }}>
60-
{benefitTitle}
61-
</Typography>
61+
{benefitTitles.map((title, idx) => (
62+
<Typography key={idx} variant="h2" sx={{ fontWeight: '400' }}>
63+
{title}
64+
</Typography>
65+
))}
6266
</HBox>
6367
</VBox>
6468
) : (

src/ui/screens/onboarding-pages/overview/OnboardingWelcomeOverviewContainer.js

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,28 @@
11
import React from 'react';
2-
import { useParams } from "react-router-dom";
32
import useTranslation from "@/ui/language/useTranslation";
4-
import { useMetadataStore, useSelectedBenefitStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
3+
import { useMetadataStore, useSelectedBenefitsStore, useSelectedTopicsStore } from "@/ui/storage/zustand";
54
import { useLanguageStore } from "@/ui/storage/useLanguageStore";
65
import OnboardingWelcomeOverview from './OnboardingWelcomeOverview';
76
import useBuildTopicsList from "../hooks/useBuildTopicsList";
8-
import useBuildBenefitTitle from "../hooks/useBuildBenefitTitle";
7+
import useBuildBenefitsTitles from "../hooks/useBuildBenefitsTitles";
98

109
const OnboardingWelcomeOverviewContainer = () => {
11-
const { benefitMode } = useParams();
1210
const { t } = useTranslation();
1311
const language = useLanguageStore((state) => state.language);
1412

15-
const selectedBenefit = useSelectedBenefitStore((state) => state.selectedBenefit);
13+
const selectedBenefits = useSelectedBenefitsStore((state) => state.selectedBenefits);
1614
const selectedTopics = useSelectedTopicsStore((state) => state.selectedTopics);
1715
const metadata = useMetadataStore((state) => state.metadata);
1816
const topicWithBenefits = useBuildTopicsList(selectedTopics, metadata);
19-
const benefitTitle = useBuildBenefitTitle(selectedBenefit, metadata);
17+
const benefitTitles = useBuildBenefitsTitles(selectedBenefits, metadata);
2018

2119
return (
2220
<OnboardingWelcomeOverview
2321
t={t}
24-
benefitMode={benefitMode}
2522
language={language}
2623
selectedTopics={selectedTopics}
2724
numberOfBenefits={topicWithBenefits?.uniqueRpCount}
28-
benefitTitle={benefitTitle}
25+
benefitTitles={benefitTitles}
2926
topicRps={topicWithBenefits?.topicRps}
3027
/>
3128
);

src/ui/screens/question-pages/hooks/useFetchQuizReport.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import {
44
useUserStore,
55
useQuizReportStore,
66
useSelectedTopicsStore,
7-
useSelectedBenefitStore,
7+
useSelectedBenefitsStore,
88
useMetadataStore
99
} from "@/ui/storage/zustand";
1010
import { useQuestionsUpdate } from "@/ui/storage/updates";
@@ -23,7 +23,7 @@ const useFetchQuizReport = () => {
2323
const userId = useUserStore((state) => state.activeUserId);
2424
const metadata = useMetadataStore((state) => state.metadata);
2525
const selectedTopics = useSelectedTopicsStore((state) => state.selectedTopics);
26-
const selectedBenefit = useSelectedBenefitStore((state) => state.selectedBenefit);
26+
const selectedBenefits = useSelectedBenefitsStore((state) => state.selectedBenefits);
2727
const updateCounter = useQuestionsUpdate((state) => state.updateCounter);
2828
const updateQuizReport = useQuizReportStore((state) => state.updateQuizReport);
2929
const language = useLanguageStore((state) => state.language);
@@ -37,7 +37,7 @@ const useFetchQuizReport = () => {
3737
const uniqueRpIds = new Set();
3838

3939
const hasSelectedTopics = Array.isArray(selectedTopics) && selectedTopics.length > 0;
40-
const hasSelectedBenefit = Boolean(selectedBenefit);
40+
const hasSelectedBenefits = Array.isArray(selectedBenefits) && selectedBenefits.length > 0;
4141

4242
// Add RP IDs based on selected topics
4343
if (hasSelectedTopics) {
@@ -53,13 +53,13 @@ const useFetchQuizReport = () => {
5353
}
5454
}
5555

56-
// Add selected benefit if it's defined
57-
if (hasSelectedBenefit) {
58-
uniqueRpIds.add(selectedBenefit);
56+
// Add selected benefits if they are defined
57+
if (hasSelectedBenefits) {
58+
selectedBenefits.forEach(id => uniqueRpIds.add(id));
5959
}
6060

61-
// If both selectedTopics and selectedBenefit are empty/null, add all RPs
62-
if (!hasSelectedTopics && !hasSelectedBenefit) {
61+
// If both selectedTopics and selectedBenefits are empty/null, add all RPs
62+
if (!hasSelectedTopics && !hasSelectedBenefits) {
6363
for (const rp of rps) {
6464
if (rp?.["@id"]) {
6565
uniqueRpIds.add(rp["@id"]);
@@ -94,7 +94,7 @@ const useFetchQuizReport = () => {
9494
userId,
9595
metadata,
9696
selectedTopics,
97-
selectedBenefit,
97+
selectedBenefits,
9898
updateCounter,
9999
updateQuizReport,
100100
language,

0 commit comments

Comments
 (0)