Skip to content

Commit 2b43c43

Browse files
committed
registration merge in prod with conflicts solved
2 parents e988614 + 6c827cc commit 2b43c43

File tree

11 files changed

+2784
-150
lines changed

11 files changed

+2784
-150
lines changed

apps/learner-web-app/src/app/login/page.tsx

Lines changed: 117 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
'use client';
22

3-
import React, { Suspense, useEffect, useState } from 'react';
3+
import React, { Suspense, useCallback, useEffect, useState } from 'react';
44
import { Box, Grid, Typography } from '@mui/material';
55
import dynamic from 'next/dynamic';
66
import WelcomeScreen from '@learner/components/WelcomeComponent/WelcomeScreen';
77
import Header from '@learner/components/Header/Header';
88
import { getUserId, login } from '@learner/utils/API/LoginService';
99
import { showToastMessage } from '@learner/components/ToastComponent/Toastify';
1010
import { useRouter } from 'next/navigation';
11-
import { useMediaQuery, useTheme } from '@mui/material';
1211
import { useTranslation } from '@shared-lib';
1312
import { getAcademicYear } from '@learner/utils/API/AcademicYearService';
1413
import { preserveLocalStorage } from '@learner/utils/helper';
@@ -23,8 +22,6 @@ import welcomeGIF from '../../../public/images/welcome.gif';
2322
import { logEvent } from '@learner/utils/googleAnalytics';
2423
import { TenantName } from '../../utils/app.constant';
2524

26-
import SwitchAccountDialog from '@shared-lib-v2/SwitchAccount/SwitchAccount';
27-
2825
const Login = dynamic(
2926
() => import('@login/Components/LoginComponent/LoginComponent'),
3027
{
@@ -162,13 +159,119 @@ const WelcomeMessage = () => {
162159
const LoginPage = () => {
163160
const [loading, setLoading] = useState(false);
164161
const router = useRouter();
165-
const theme = useTheme();
166-
const isMobile = useMediaQuery(theme.breakpoints.down('sm'));
167162
const handleAddAccount = () => {
168163
router.push('/');
169164
};
170165
const { t } = useTranslation();
171166

167+
const [tenantId, setTenantId] = useState<string>('');
168+
const [tenantName, setTenantName] = useState<string>('');
169+
const [roleId, setRoleId] = useState<string>('');
170+
const [roleName, setRoleName] = useState<string>('');
171+
172+
const handleSuccessfulLogin = useCallback(
173+
async (
174+
response: { access_token: string; refresh_token?: string | null },
175+
data: { remember: boolean }
176+
) => {
177+
if (typeof window === 'undefined' || !window.localStorage) {
178+
return;
179+
}
180+
181+
setLoading(true);
182+
183+
const token = response.access_token;
184+
const refreshToken = response?.refresh_token ?? '';
185+
localStorage.setItem('token', token);
186+
data?.remember
187+
? localStorage.setItem('refreshToken', refreshToken)
188+
: localStorage.removeItem('refreshToken');
189+
190+
const userResponse = await getUserId();
191+
192+
// Prefer the first tenant/role combination returned from the API.
193+
const tenantData = userResponse?.tenantData?.[0];
194+
const selectedTenantId = tenantData?.tenantId;
195+
const selectedTenantName = tenantData?.tenantName;
196+
const selectedRoleId = tenantData?.roleId || '';
197+
const selectedRoleName = tenantData?.roleName || 'Learner';
198+
199+
setTenantId(selectedTenantId || '');
200+
setTenantName(selectedTenantName || '');
201+
setRoleId(selectedRoleId);
202+
setRoleName(selectedRoleName);
203+
204+
if (tenantData && selectedRoleName === 'Learner') {
205+
localStorage.setItem('userId', userResponse?.userId);
206+
localStorage.setItem('roleId', selectedRoleId);
207+
localStorage.setItem('templtateId', tenantData?.templateId);
208+
localStorage.setItem('userIdName', userResponse?.username);
209+
localStorage.setItem('firstName', userResponse?.firstName || '');
210+
211+
const uiConfig = tenantData?.params?.uiConfig;
212+
const landingPage = tenantData?.params?.uiConfig?.landingPage;
213+
localStorage.setItem('landingPage', landingPage);
214+
localStorage.setItem('uiConfig', JSON.stringify(uiConfig || {}));
215+
216+
localStorage.setItem('tenantId', selectedTenantId || '');
217+
localStorage.setItem('userProgram', selectedTenantName || '');
218+
await profileComplitionCheck();
219+
if (selectedTenantName === TenantName.YOUTHNET) {
220+
const academicYearResponse = await getAcademicYear();
221+
if (academicYearResponse[0]?.id) {
222+
localStorage.setItem('academicYearId', academicYearResponse[0]?.id);
223+
}
224+
}
225+
const telemetryInteract = {
226+
context: { env: 'sign-in', cdata: [] },
227+
edata: {
228+
id: 'login-success',
229+
type: 'CLICK',
230+
pageid: 'sign-in',
231+
uid: userResponse?.userId || 'Anonymous',
232+
},
233+
};
234+
telemetryFactory.interact(telemetryInteract);
235+
236+
const channelId = tenantData?.channelId;
237+
localStorage.setItem('channelId', channelId);
238+
239+
const collectionFramework = tenantData?.collectionFramework;
240+
localStorage.setItem('collectionFramework', collectionFramework);
241+
242+
document.cookie = `token=${token}; path=/; secure; SameSite=Strict`;
243+
const query = new URLSearchParams(window.location.search);
244+
const redirectUrl = query.get('redirectUrl');
245+
const activeLink = query.get('activeLink');
246+
logEvent({
247+
action: 'successfully-login-in-learner-app',
248+
category: 'Login Page',
249+
label: 'Login Button Clicked',
250+
});
251+
if (redirectUrl && redirectUrl.startsWith('/')) {
252+
router.push(
253+
`${redirectUrl}${activeLink ? `?activeLink=${activeLink}` : ''}`
254+
);
255+
} else {
256+
router.push('/programs');
257+
}
258+
} else {
259+
showToastMessage('Username or password not correct', 'error');
260+
const telemetryInteract = {
261+
context: { env: 'sign-in', cdata: [] },
262+
edata: {
263+
id: 'login-failed',
264+
type: 'CLICK',
265+
pageid: 'sign-in',
266+
},
267+
};
268+
telemetryFactory.interact(telemetryInteract);
269+
}
270+
setLoading(false);
271+
},
272+
[router]
273+
);
274+
172275
useEffect(() => {
173276
const init = async () => {
174277
try {
@@ -181,10 +284,10 @@ const LoginPage = () => {
181284
const response = {
182285
result: {
183286
access_token,
184-
refresh_token,
287+
refresh_token: refresh_token || undefined,
185288
},
186289
};
187-
handleSuccessfulLogin(response?.result, { remember: false }, router);
290+
handleSuccessfulLogin(response?.result, { remember: false });
188291
}
189292
if (!localStorage.getItem('did')) {
190293
const visitorId = await getDeviceId();
@@ -199,7 +302,7 @@ const LoginPage = () => {
199302
}
200303
};
201304
init();
202-
}, []);
305+
}, [handleSuccessfulLogin]);
203306

204307
const handleForgotPassword = () => {
205308
localStorage.setItem('redirectionRoute', '/login');
@@ -217,7 +320,7 @@ const LoginPage = () => {
217320
try {
218321
const response = await login({ username, password });
219322
if (response?.result?.access_token) {
220-
handleSuccessfulLogin(response?.result, data, router);
323+
handleSuccessfulLogin(response?.result, data);
221324
} else {
222325
showToastMessage(
223326
t('LOGIN_PAGE.USERNAME_PASSWORD_NOT_CORRECT'),
@@ -234,7 +337,7 @@ const LoginPage = () => {
234337
telemetryFactory.interact(telemetryInteract);
235338
}
236339
// setLoading(false);
237-
} catch (error: any) {
340+
} catch {
238341
// setLoading(false);
239342
const errorMessage = t('LOGIN_PAGE.USERNAME_PASSWORD_NOT_CORRECT');
240343
showToastMessage(errorMessage, 'error');
@@ -250,138 +353,6 @@ const LoginPage = () => {
250353
}
251354
};
252355

253-
const [switchDialogOpen, setSwitchDialogOpen] = useState(false);
254-
const [userResponse, setUserResponse] = useState<any>(null);
255-
const [tenantId, setTenantId] = useState<string>('');
256-
const [tenantName, setTenantName] = useState<string>('');
257-
const [roleId, setRoleId] = useState<string>('');
258-
const [roleName, setRoleName] = useState<string>('');
259-
260-
const handleSuccessfulLogin = async (
261-
response: any,
262-
data: { remember: boolean },
263-
router: any
264-
) => {
265-
if (typeof window !== 'undefined' && window.localStorage) {
266-
const token = response.access_token;
267-
const refreshToken = response?.refresh_token;
268-
localStorage.setItem('token', token);
269-
data?.remember
270-
? localStorage.setItem('refreshToken', refreshToken)
271-
: localStorage.removeItem('refreshToken');
272-
273-
const userResponse = await getUserId();
274-
275-
setUserResponse(userResponse);
276-
277-
setSwitchDialogOpen(true);
278-
}
279-
};
280-
const callBackSwitchDialog = async (
281-
tenantId: string,
282-
tenantName: string,
283-
roleId: string,
284-
roleName: string
285-
) => {
286-
setSwitchDialogOpen(false);
287-
setLoading(true);
288-
289-
// Set the state values
290-
setTenantId(tenantId);
291-
setTenantName(tenantName);
292-
setRoleId(roleId);
293-
setRoleName(roleName);
294-
295-
const token =
296-
typeof window !== 'undefined' && window.localStorage
297-
? localStorage.getItem('token')
298-
: '';
299-
300-
if (userResponse) {
301-
const tenantData = userResponse?.tenantData?.find(
302-
(tenant: any) => tenant.tenantId === tenantId
303-
);
304-
305-
if (roleName === 'Learner') {
306-
localStorage.setItem('userId', userResponse?.userId);
307-
localStorage.setItem('templtateId', tenantData?.templateId);
308-
localStorage.setItem('userIdName', userResponse?.username);
309-
localStorage.setItem('firstName', userResponse?.firstName || '');
310-
311-
const tenantId = tenantData?.tenantId;
312-
const tenantName = tenantData?.tenantName;
313-
const uiConfig = tenantData?.params?.uiConfig;
314-
console.log('uiConfig', uiConfig);
315-
const landingPage = tenantData?.params?.uiConfig?.landingPage;
316-
localStorage.setItem('landingPage', landingPage);
317-
318-
localStorage.setItem('uiConfig', JSON.stringify(uiConfig || {}));
319-
320-
localStorage.setItem('tenantId', tenantId);
321-
localStorage.setItem('userProgram', tenantName);
322-
await profileComplitionCheck();
323-
if (tenantName === TenantName.YOUTHNET) {
324-
const academicYearResponse = await getAcademicYear();
325-
if (academicYearResponse[0]?.id) {
326-
localStorage.setItem('academicYearId', academicYearResponse[0]?.id);
327-
}
328-
}
329-
const telemetryInteract = {
330-
context: { env: 'sign-in', cdata: [] },
331-
edata: {
332-
id: 'login-success',
333-
type: 'CLICK',
334-
pageid: 'sign-in',
335-
uid: userResponse?.userId || 'Anonymous',
336-
},
337-
};
338-
telemetryFactory.interact(telemetryInteract);
339-
340-
const channelId = tenantData?.channelId;
341-
localStorage.setItem('channelId', channelId);
342-
343-
const collectionFramework = tenantData?.collectionFramework;
344-
localStorage.setItem('collectionFramework', collectionFramework);
345-
346-
document.cookie = `token=${token}; path=/; secure; SameSite=Strict`;
347-
const query = new URLSearchParams(window.location.search);
348-
const redirectUrl = query.get('redirectUrl');
349-
const activeLink = query.get('activeLink');
350-
logEvent({
351-
action: 'successfully-login-in-learner-app',
352-
category: 'Login Page',
353-
label: 'Login Button Clicked',
354-
});
355-
if (redirectUrl && redirectUrl.startsWith('/')) {
356-
router.push(
357-
`${redirectUrl}${activeLink ? `?activeLink=${activeLink}` : ''}`
358-
);
359-
} else {
360-
// if (tenantName === TenantName.YOUTHNET) {
361-
// router.push('/content');
362-
// } else if (tenantName === TenantName.CAMP_TO_CLUB) {
363-
// router.push('/courses-contents');
364-
// } else if (tenantName === TenantName.PRAGYANPATH) {
365-
// router.push('/courses-contents');
366-
// }
367-
router.push(landingPage);
368-
}
369-
} else {
370-
showToastMessage('Username or password not correct', 'error');
371-
const telemetryInteract = {
372-
context: { env: 'sign-in', cdata: [] },
373-
edata: {
374-
id: 'login-failed',
375-
type: 'CLICK',
376-
pageid: 'sign-in',
377-
},
378-
};
379-
telemetryFactory.interact(telemetryInteract);
380-
}
381-
}
382-
setLoading(false);
383-
};
384-
385356
return (
386357
<Suspense fallback={<div>Loading...</div>}>
387358
<Box
@@ -463,17 +434,17 @@ const LoginPage = () => {
463434
</Box>
464435
</Box>
465436
</Box>
466-
<SwitchAccountDialog
437+
{/* <SwitchAccountDialog
467438
open={switchDialogOpen}
468439
onClose={() => setSwitchDialogOpen(false)}
469440
callbackFunction={callBackSwitchDialog}
470441
authResponse={userResponse?.tenantData}
471-
/>
442+
/> */}
472443
{loading && (
473444
<Loader showBackdrop={true} loadingText={t('COMMON.LOADING')} />
474445
)}
475446
</Suspense>
476447
);
477448
};
478449

479-
export default LoginPage;
450+
export default LoginPage;

apps/learner-web-app/src/app/pos/program/page.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default function PosPage() {
6262
"Second Chance": `The ${TenantName.SECOND_CHANCE_PROGRAM} by Pratham is a powerful initiative that helps young girls and women who dropped out of school complete their Grade 10 education. By bringing learning closer to home and offering the support they need, the program breaks barriers like early marriage, household responsibilities, and lack of access. It opens doors to higher education, skills training, and better job opportunities, giving women a real shot at a brighter future.`,
6363
'Vocational Training':
6464
'Pratham\'s Vocational Skilling Program, launched in 2005, empowers youth from underprivileged backgrounds by equipping them with practical, job-ready skills. With a presence across India, it opens doors to employment in over 10 key sectors, supported by affiliations like NSDC. In response to changing times, the program evolved into a Hybrid Skilling model, blending digital tools with training to help young people thrive in a post-pandemic world.',
65-
"Creativity Club": `Pratham’s Creativity Club Program engages children (ages 10-14) and youth (ages 14+) across diverse domains such as STEM, visual and performing arts, environment, and sports. The program fosters essential 21st-century skills such as creativity, problem-solving, communication, and collaboration. Through its 'all-some-few' approach, the program provides tailored opportunities that match individual interests, supported by digital and social infrastructure.'`,
65+
"Creativity Club": `The ${TenantName.CREATIVITY_CLUB}`,
6666

6767
},
6868
},

0 commit comments

Comments
 (0)