11'use client' ;
22
3- import { Box , Container , Grid , Typography , Tabs , Tab } from '@mui/material' ;
3+ import { Box , Container , Grid , Typography , Tabs , Tab , CircularProgress } from '@mui/material' ;
44import Image from 'next/image' ;
55import { useRouter , useSearchParams } from 'next/navigation' ;
66import { Suspense , useState , useEffect } from 'react' ;
77import { useTranslation } from '@shared-lib' ;
88import Header from '@learner/components/Header/Header' ;
99import EnrollProgramCarousel from '@learner/components/EnrollProgramCarousel/EnrollProgramCarousel' ;
1010import { getUserDetails } from '@learner/utils/API/userService' ;
11+ import { getTenantInfo } from '@learner/utils/API/ProgramService' ;
12+ import { profileComplitionCheck } from '@learner/utils/API/userService' ;
13+ import { getAcademicYear } from '@learner/utils/API/AcademicYearService' ;
14+ import { TenantName } from '@learner/utils/app.constant' ;
15+
16+ declare global {
17+ interface Window {
18+ ReactNativeWebView ?: {
19+ postMessage : ( message : string ) => void ;
20+ } ;
21+ }
22+ }
1123
1224function ProgramsContent ( ) {
1325 const router = useRouter ( ) ;
@@ -16,6 +28,7 @@ function ProgramsContent() {
1628 const [ currentTab , setCurrentTab ] = useState ( 0 ) ;
1729 const [ userId , setUserId ] = useState < string | null > ( null ) ;
1830 const [ isAndroidApp , setIsAndroidApp ] = useState ( true ) ;
31+ const [ isCheckingEnrollTenantId , setIsCheckingEnrollTenantId ] = useState ( false ) ;
1932
2033 useEffect ( ( ) => {
2134 const processData = async ( ) => {
@@ -27,6 +40,167 @@ function ProgramsContent() {
2740 const isAndroid = localStorage . getItem ( 'isAndroidApp' ) === 'yes' ;
2841 setIsAndroidApp ( isAndroid ) ;
2942
43+ // Check if enrollTenantId exists in localStorage
44+ const enrollTenantId = localStorage . getItem ( 'enrollTenantId' ) ;
45+ if ( enrollTenantId && storedUserId ) {
46+ setIsCheckingEnrollTenantId ( true ) ;
47+ try {
48+ // Get user details to check if tenantId is already enrolled
49+ const userData = await getUserDetails ( storedUserId , true ) ;
50+ const tenantData = userData ?. result ?. userData ?. tenantData || [ ] ;
51+
52+ // Check if tenantId exists in enrolled programs (My Programs)
53+ const enrolledTenant = tenantData . find (
54+ ( item : any ) =>
55+ item . tenantId === enrollTenantId &&
56+ item ?. roles ?. some ( ( role : any ) => role ?. roleName === 'Learner' )
57+ ) ;
58+
59+ if ( enrolledTenant ) {
60+ // User is already enrolled - redirect to program page
61+ const token = localStorage . getItem ( 'token' ) ;
62+ if ( ! token ) {
63+ console . error ( 'Token not found in localStorage' ) ;
64+ localStorage . removeItem ( 'enrollTenantId' ) ;
65+ setIsCheckingEnrollTenantId ( false ) ;
66+ return ;
67+ }
68+
69+ // Handle Android app case
70+ if ( localStorage . getItem ( 'isAndroidApp' ) === 'yes' ) {
71+ // Send message to React Native WebView
72+ if ( window . ReactNativeWebView ) {
73+ window . ReactNativeWebView . postMessage ( JSON . stringify ( {
74+ type : 'ACCESS_PROGRAM_EVENT' ,
75+ data : {
76+ userId : storedUserId ,
77+ tenantId : enrollTenantId ,
78+ token : token ,
79+ refreshToken : localStorage . getItem ( 'refreshTokenForAndroid' ) ,
80+ }
81+ } ) ) ;
82+ }
83+ // Remove enrollTenantId from localStorage
84+ localStorage . removeItem ( 'enrollTenantId' ) ;
85+ // Keep loading state true during redirect
86+ return ;
87+ }
88+
89+ // Set localStorage values for the program
90+ localStorage . setItem ( 'userId' , storedUserId ) ;
91+ localStorage . setItem ( 'templtateId' , enrolledTenant ?. templateId ) ;
92+ localStorage . setItem (
93+ 'userIdName' ,
94+ userData ?. result ?. userData ?. username
95+ ) ;
96+ localStorage . setItem (
97+ 'firstName' ,
98+ userData ?. result ?. userData ?. firstName || ''
99+ ) ;
100+
101+ const tenantId = enrolledTenant ?. tenantId ;
102+ const tenantName = enrolledTenant ?. tenantName ;
103+ const uiConfig = enrolledTenant ?. params ?. uiConfig ;
104+ const landingPage = enrolledTenant ?. params ?. uiConfig ?. landingPage ;
105+
106+ localStorage . setItem ( 'landingPage' , landingPage ) ;
107+ localStorage . setItem ( 'uiConfig' , JSON . stringify ( uiConfig || { } ) ) ;
108+ localStorage . setItem ( 'tenantId' , tenantId ) ;
109+ localStorage . setItem ( 'userProgram' , tenantName ) ;
110+
111+ // Set channel and collection framework
112+ const channelId = enrolledTenant ?. channelId ;
113+ if ( channelId ) {
114+ localStorage . setItem ( 'channelId' , channelId ) ;
115+ }
116+
117+ const collectionFramework = enrolledTenant ?. collectionFramework ;
118+ if ( collectionFramework ) {
119+ localStorage . setItem ( 'collectionFramework' , collectionFramework ) ;
120+ }
121+
122+ // Set cookie
123+ document . cookie = `token=${ token } ; path=/; secure; SameSite=Strict` ;
124+
125+ // Check profile completion
126+ await profileComplitionCheck ( ) ;
127+
128+ // Handle academic year for YOUTHNET
129+ if ( tenantName === TenantName . YOUTHNET ) {
130+ const academicYearResponse = await getAcademicYear ( ) ;
131+ if ( academicYearResponse ?. [ 0 ] ?. id ) {
132+ localStorage . setItem ( 'academicYearId' , academicYearResponse [ 0 ] . id ) ;
133+ }
134+ }
135+
136+ // Remove enrollTenantId from localStorage
137+ localStorage . removeItem ( 'enrollTenantId' ) ;
138+
139+ // Redirect to landing page (keep loading state true during redirect)
140+ router . push ( landingPage || '/home' ) ;
141+ return ;
142+ } else {
143+ // User is not enrolled - get program details and redirect to enroll-profile-completion
144+ const tenantInfoResponse = await getTenantInfo ( ) ;
145+ const programsData = tenantInfoResponse ?. result || [ ] ;
146+ const program = programsData . find (
147+ ( p : any ) => p . tenantId === enrollTenantId
148+ ) ;
149+
150+ if ( program ) {
151+ // Store program information similar to handleEnroll function
152+ const currentTenantId = localStorage . getItem ( 'tenantId' ) ;
153+ localStorage . setItem ( 'previousTenantId' , currentTenantId || '' ) ;
154+ localStorage . setItem ( 'tenantId' , program . tenantId ) ;
155+ localStorage . setItem ( 'userProgram' , program ?. name ) ;
156+
157+ // Store uiConfig if available
158+ if ( program ?. params ?. uiConfig ) {
159+ localStorage . setItem (
160+ 'uiConfig' ,
161+ JSON . stringify ( program . params . uiConfig )
162+ ) ;
163+ }
164+
165+ // Store landing page if available
166+ if ( program ?. params ?. uiConfig ?. landingPage ) {
167+ localStorage . setItem (
168+ 'landingPage' ,
169+ program . params . uiConfig . landingPage
170+ ) ;
171+ }
172+
173+ // Store enrolled program data for the profile completion page
174+ localStorage . setItem (
175+ 'enrolledProgramData' ,
176+ JSON . stringify ( {
177+ tenantId : program . tenantId ,
178+ name : program . name ,
179+ params : program . params ,
180+ } )
181+ ) ;
182+
183+ // Remove enrollTenantId from localStorage
184+ // localStorage.removeItem('enrollTenantId');
185+
186+ // Navigate to enrollment profile completion page (keep loading state true during redirect)
187+ router . push ( '/enroll-profile-completion?directEnroll=true' ) ;
188+ return ;
189+ } else {
190+ console . error ( 'Program not found for enrollTenantId:' , enrollTenantId ) ;
191+ localStorage . removeItem ( 'enrollTenantId' ) ;
192+ setIsCheckingEnrollTenantId ( false ) ;
193+ }
194+ }
195+ } catch ( error ) {
196+ console . error ( 'Failed to process enrollTenantId:' , error ) ;
197+ localStorage . removeItem ( 'enrollTenantId' ) ;
198+ setIsCheckingEnrollTenantId ( false ) ;
199+ }
200+ } else {
201+ setIsCheckingEnrollTenantId ( false ) ;
202+ }
203+
30204 // Read tab from query params on mount
31205 const tabParam = searchParams . get ( 'tab' ) ;
32206 if ( tabParam === 'my-programs' ) {
@@ -58,7 +232,7 @@ function ProgramsContent() {
58232 }
59233 } ;
60234 processData ( ) ;
61- } , [ searchParams ] ) ;
235+ } , [ searchParams , router ] ) ;
62236
63237 const handleTabChange = ( event : React . SyntheticEvent , newValue : number ) => {
64238 setCurrentTab ( newValue ) ;
@@ -70,6 +244,25 @@ function ProgramsContent() {
70244 router . push ( `/programs?${ params . toString ( ) } ` , { scroll : false } ) ;
71245 } ;
72246
247+ // Show loader while checking enrollTenantId
248+ if ( isCheckingEnrollTenantId ) {
249+ return (
250+ < >
251+ < Header isShowLogout = { true } />
252+ < Box
253+ sx = { {
254+ display : 'flex' ,
255+ justifyContent : 'center' ,
256+ alignItems : 'center' ,
257+ minHeight : '60vh' ,
258+ } }
259+ >
260+ < CircularProgress />
261+ </ Box >
262+ </ >
263+ ) ;
264+ }
265+
73266 return (
74267 < >
75268 < Header isShowLogout = { true } />
0 commit comments