Skip to content

Commit 58650e8

Browse files
committed
conflicts solved
2 parents 1d59c90 + 01fc63d commit 58650e8

File tree

10 files changed

+156
-35
lines changed

10 files changed

+156
-35
lines changed

apps/learner-web-app/src/app/enroll-profile-completion/page.tsx

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -166,19 +166,25 @@ const EnrollProfileCompletionInner = () => {
166166
// const program = JSON.parse(enrolledProgramData || '{}');
167167

168168

169-
if (window.ReactNativeWebView) {
170-
window.ReactNativeWebView.postMessage(JSON.stringify({
171-
type: 'ENROLL_PROGRAM_EVENT', // Event type identifier
172-
data: {
173-
userId: localStorage.getItem('userId'),
174-
tenantId: localStorage.getItem('tenantId'),
175-
token: localStorage.getItem('token'),
176-
refreshToken: localStorage.getItem('refreshTokenForAndroid'),
177-
178-
// Add any data you want to send
179-
}
180-
}));
181-
}
169+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
170+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
171+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
172+
if (!refreshToken || refreshToken === '') {
173+
refreshToken = localStorage.getItem('refreshToken');
174+
}
175+
if (window.ReactNativeWebView) {
176+
window.ReactNativeWebView.postMessage(JSON.stringify({
177+
type: 'ENROLL_PROGRAM_EVENT', // Event type identifier
178+
data: {
179+
userId: localStorage.getItem('userId'),
180+
tenantId: localStorage.getItem('tenantId'),
181+
token: localStorage.getItem('token'),
182+
refreshToken: refreshToken,
183+
184+
// Add any data you want to send
185+
}
186+
}));
187+
}
182188
setSignupSuccessModal(false);
183189
}
184190
else{

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,21 @@ const LoginPage = () => {
182182
setLoading(true);
183183

184184
const token = response.access_token;
185-
const refreshToken = response?.refresh_token ?? '';
185+
const refreshToken = response?.refresh_token;
186+
// Only store refreshToken if it has a valid value
187+
if (refreshToken) {
188+
localStorage.setItem('refreshTokenForAndroid', refreshToken);
189+
if (data?.remember) {
190+
localStorage.setItem('refreshToken', refreshToken);
191+
} else {
192+
localStorage.removeItem('refreshToken');
193+
}
194+
} else {
195+
// Clear refreshTokenForAndroid if no refresh token is provided
196+
localStorage.removeItem('refreshTokenForAndroid');
197+
localStorage.removeItem('refreshToken');
198+
}
186199
localStorage.setItem('token', token);
187-
data?.remember
188-
? localStorage.setItem('refreshToken', refreshToken)
189-
: localStorage.removeItem('refreshToken');
190200

191201
const userResponse = await getUserId();
192202

@@ -324,14 +334,20 @@ const LoginPage = () => {
324334
if(localStorage.getItem('isAndroidApp') == 'yes')
325335
{
326336
// Send message to React Native WebView
337+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
338+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
339+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
340+
if (!refreshToken || refreshToken === '') {
341+
refreshToken = localStorage.getItem('refreshToken');
342+
}
327343
if (window.ReactNativeWebView) {
328344
window.ReactNativeWebView.postMessage(JSON.stringify({
329345
type: 'LOGIN_INTO_ONLY_ONE_PROGRAM_EVENT', // Event type identifier
330346
data: {
331347
userId: userResponse?.userId,
332348
tenantId:selectedTenantId,
333349
token: localStorage.getItem('token'),
334-
refreshToken: localStorage.getItem('refreshTokenForAndroid'),
350+
refreshToken: refreshToken,
335351

336352
// Add any data you want to send
337353
}

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ function ProgramsContent() {
2929
const [userId, setUserId] = useState<string | null>(null);
3030
const [isAndroidApp, setIsAndroidApp] = useState(true);
3131
const [isCheckingEnrollTenantId, setIsCheckingEnrollTenantId] = useState(false);
32-
3332
useEffect(() => {
3433
const processData = async () => {
3534
// Safely access localStorage only on client side
@@ -65,9 +64,16 @@ function ProgramsContent() {
6564
setIsCheckingEnrollTenantId(false);
6665
return;
6766
}
68-
6967
// Handle Android app case
7068
if (localStorage.getItem('isAndroidApp') === 'yes') {
69+
console.log('refreshTokenForAndroid');
70+
71+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
72+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
73+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
74+
if (!refreshToken || refreshToken === '') {
75+
refreshToken = localStorage.getItem('refreshToken');
76+
}
7177
// Send message to React Native WebView
7278
if (window.ReactNativeWebView) {
7379
window.ReactNativeWebView.postMessage(JSON.stringify({
@@ -76,7 +82,7 @@ function ProgramsContent() {
7682
userId: storedUserId,
7783
tenantId: enrollTenantId,
7884
token: token,
79-
refreshToken: localStorage.getItem('refreshTokenForAndroid'),
85+
refreshToken: refreshToken,
8086
}
8187
}));
8288
}

apps/learner-web-app/src/app/registration/RegisterationFlow.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,12 @@ const RegisterationFlow = () => {
699699
if (typeof window !== 'undefined' && window.localStorage) {
700700
const token = response.result.access_token;
701701
const refreshToken = response?.result?.refresh_token;
702-
localStorage.setItem('refreshTokenForAndroid', refreshToken);
702+
// Only store refreshToken if it has a valid value
703+
if (refreshToken) {
704+
localStorage.setItem('refreshTokenForAndroid', refreshToken);
705+
} else {
706+
localStorage.removeItem('refreshTokenForAndroid');
707+
}
703708

704709
localStorage.setItem('token', token);
705710

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

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,21 @@ const SSOContent = () => {
182182
if (typeof window !== 'undefined' && window.localStorage) {
183183
const token = response.access_token;
184184
const refreshToken = response?.refresh_token;
185-
localStorage.setItem('refreshTokenForAndroid', refreshToken);
185+
console.log('refreshToken', refreshToken);
186+
// Only store refreshToken if it has a valid value
187+
if (refreshToken) {
188+
localStorage.setItem('refreshTokenForAndroid', refreshToken);
189+
if (data?.remember) {
190+
localStorage.setItem('refreshToken', refreshToken);
191+
} else {
192+
localStorage.removeItem('refreshToken');
193+
}
194+
} else {
195+
// Clear refreshTokenForAndroid if no refresh token is provided
196+
localStorage.removeItem('refreshTokenForAndroid');
197+
localStorage.removeItem('refreshToken');
198+
}
186199
localStorage.setItem('token', token);
187-
data?.remember
188-
? localStorage.setItem('refreshToken', refreshToken)
189-
: localStorage.removeItem('refreshToken');
190200

191201
const userResponse = await getUserId();
192202
console.log('userResponse', userResponse);

apps/learner-web-app/src/components/EnrollProgramCarousel/EnrollProgramCarousel.tsx

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,15 +182,23 @@ const EnrollProgramCarousel = ({
182182
}
183183
if(localStorage.getItem('isAndroidApp') == 'yes')
184184
{
185+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
186+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
187+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
188+
if (!refreshToken || refreshToken === '') {
189+
refreshToken = localStorage.getItem('refreshToken');
190+
}
191+
185192
// Send message to React Native WebView
186193
if (window.ReactNativeWebView) {
194+
187195
window.ReactNativeWebView.postMessage(JSON.stringify({
188196
type: 'ACCESS_PROGRAM_EVENT', // Event type identifier
189197
data: {
190198
userId: userId,
191199
tenantId: program.tenantId,
192200
token: localStorage.getItem('token'),
193-
refreshToken: localStorage.getItem('refreshTokenForAndroid'),
201+
refreshToken: refreshToken,
194202

195203
// Add any data you want to send
196204
}
@@ -304,6 +312,13 @@ const EnrollProgramCarousel = ({
304312
}
305313
if(localStorage.getItem('isAndroidApp') == 'yes')
306314
{
315+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
316+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
317+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
318+
if (!refreshToken || refreshToken === '') {
319+
refreshToken = localStorage.getItem('refreshToken');
320+
}
321+
307322
// Send message to React Native WebView
308323
if (window.ReactNativeWebView) {
309324
window.ReactNativeWebView.postMessage(JSON.stringify({
@@ -312,7 +327,7 @@ const EnrollProgramCarousel = ({
312327
userId: userId,
313328
tenantId: program.tenantId,
314329
token: localStorage.getItem('token'),
315-
refreshToken: localStorage.getItem('refreshToken'),
330+
refreshToken: refreshToken,
316331

317332
// Add any data you want to send
318333
}
@@ -461,6 +476,15 @@ const EnrollProgramCarousel = ({
461476
if (enrolledProgram) {
462477
if(localStorage.getItem('isAndroidApp') == 'yes')
463478
{
479+
// Get refreshToken with fallback - check refreshTokenForAndroid first, then refreshToken
480+
let refreshToken = localStorage.getItem('refreshTokenForAndroid');
481+
// Fallback to refreshToken if refreshTokenForAndroid is null or empty
482+
if (!refreshToken || refreshToken === '') {
483+
refreshToken = localStorage.getItem('refreshToken');
484+
}
485+
console.log('onSigin - refreshTokenForAndroid', localStorage.getItem('refreshTokenForAndroid'));
486+
console.log('onSigin - refreshToken (fallback)', localStorage.getItem('refreshToken'));
487+
console.log('onSigin - Using refreshToken:', refreshToken);
464488
// Send message to React Native WebView
465489

466490
// const enrolledProgramData = localStorage.getItem('enrolledProgramData');
@@ -475,7 +499,7 @@ const EnrollProgramCarousel = ({
475499
userId: localStorage.getItem('userId'),
476500
tenantId: enrolledProgram?.tenantId,
477501
token: localStorage.getItem('token'),
478-
refreshToken: localStorage.getItem('refreshToken'),
502+
refreshToken: refreshToken,
479503

480504
// Add any data you want to send
481505
}

apps/learner-web-app/src/components/GoogleAnalyticsTracker/GoogleAnalyticsTracker.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ const GoogleAnalyticsTracker = () => {
2323
console.log('Initializing GA for Themantic');
2424
initGA(`${process.env.NEXT_PUBLIC_MEASUREMENT_ID_THEMATIC}`);
2525
}
26+
else if(window.location.href.includes('plp') )
27+
{
28+
console.log('Initializing GA for PLP or PDP');
29+
initGA(`${process.env.NEXT_PUBLIC_MEASUREMENT_ID_PLP}`);
30+
}
2631
else
2732
initGA(`${process.env.NEXT_PUBLIC_MEASUREMENT_ID_POS}`);
2833
window.GA_INITIALIZED = true;

apps/learner-web-app/src/utils/API/Interceptor.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ const refreshToken = async () => {
1414
const newRefreshToken = response?.result?.refresh_token;
1515
localStorage.setItem('token', accessToken);
1616
localStorage.setItem('refreshToken', newRefreshToken);
17+
// Also update refreshTokenForAndroid if it exists (for Android app)
18+
if (localStorage.getItem('isAndroidApp') === 'yes' && newRefreshToken) {
19+
localStorage.setItem('refreshTokenForAndroid', newRefreshToken);
20+
}
1721
return accessToken;
1822
}
1923
} catch (error) {

apps/learner-web-app/src/utils/googleAnalytics.ts

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,24 @@
11
import ReactGA from "react-ga4";
22

3+
declare global {
4+
interface Window {
5+
gtag?: (...args: unknown[]) => void;
6+
dataLayer?: unknown[];
7+
}
8+
}
9+
310
export const initGA = (measurementId: string) => {
411
ReactGA.initialize(measurementId);
512
};
613

714
export const logPageView = (url: string) => {
15+
if(localStorage.getItem('userProgram'))
16+
{
17+
ReactGA.send({ hitType: "pageview", page: url , program: localStorage.getItem('userProgram')});
18+
return;
19+
20+
}
21+
else
822
ReactGA.send({ hitType: "pageview", page: url });
923
};
1024

@@ -19,10 +33,40 @@ export const logEvent = ({
1933
label?: string;
2034
value?: number;
2135
}) => {
22-
ReactGA.event({
23-
action,
24-
category,
25-
label,
26-
value,
27-
});
36+
if (typeof window === "undefined") return;
37+
38+
const userProgram = localStorage.getItem('userProgram');
39+
40+
// Build event parameters for GA4
41+
const eventParams: Record<string, string | number> = {
42+
event_category: category,
43+
};
44+
45+
// Add optional fields
46+
if (label) {
47+
eventParams.event_label = label;
48+
}
49+
if (value !== undefined) {
50+
eventParams.value = value;
51+
}
52+
53+
// Add program name if available (custom parameter)
54+
if (userProgram) {
55+
console.log('userProgram', userProgram);
56+
eventParams.program = userProgram;
57+
}
58+
59+
// Use gtag directly to send event with custom parameters
60+
// This ensures custom parameters like 'program' are sent to GA4
61+
if (window.gtag && typeof window.gtag === 'function') {
62+
window.gtag('event', action, eventParams);
63+
} else {
64+
// Fallback to ReactGA.event if gtag is not available
65+
ReactGA.event({
66+
action,
67+
category,
68+
label,
69+
value,
70+
});
71+
}
2872
};

mfes/content/src/components/Card/UnitCard.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const UnitCard = ({
3030
_card={_card}
3131
handleCardClick={handleCardClick}
3232
trackData={trackData}
33+
englishTitle={item?.englishName}
3334
/>
3435
</CardWrap>
3536
);

0 commit comments

Comments
 (0)