@phygitallabs/tapquest-core 2.9.0 → 2.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs DELETED
@@ -1,1809 +0,0 @@
1
- "use strict";
2
- var __create = Object.create;
3
- var __defProp = Object.defineProperty;
4
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
- var __getOwnPropNames = Object.getOwnPropertyNames;
6
- var __getProtoOf = Object.getPrototypeOf;
7
- var __hasOwnProp = Object.prototype.hasOwnProperty;
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
21
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
22
- // If the importer is in node compatibility mode or this is not an ESM
23
- // file that has been converted to a CommonJS file using a Babel-
24
- // compatible transform (i.e. "__esModule" has not been set), then set
25
- // "default" to the CommonJS "module.exports" for node compatibility.
26
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
27
- mod
28
- ));
29
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
30
-
31
- // src/index.ts
32
- var index_exports = {};
33
- __export(index_exports, {
34
- ALLOWED_ORIGINS: () => ALLOWED_ORIGINS,
35
- AchievementRuleActionType: () => import_achievement3.AchievementRuleActionType,
36
- AchievementServiceProvider: () => import_achievement3.AchievementServiceProvider,
37
- AchievementType: () => AchievementType,
38
- AuthProvider: () => AuthProvider,
39
- CALLBACK_URL: () => CALLBACK_URL,
40
- CampaignState: () => import_api_core10.CampaignState,
41
- CmentityRewardType: () => import_reward2.CmentityRewardType,
42
- NotificationProvider: () => NotificationProvider,
43
- RewardClaimStatus: () => RewardClaimStatus,
44
- TapquestCoreProvider: () => TapquestCoreProvider,
45
- TaskType: () => TaskType,
46
- UserSourceType: () => import_api_core6.UserSourceType,
47
- accessTokenKey: () => accessTokenKey,
48
- checkDeviceUid: () => checkDeviceUid,
49
- chipAuthTokenKey: () => chipAuthTokenKey,
50
- cn: () => import_helpers5.cn,
51
- convertSnakeToCamel: () => convertSnakeToCamel,
52
- deviceUIDKey: () => deviceUIDKey,
53
- fileToBase64: () => import_helpers5.fileToBase64,
54
- filterLocationsByProperty: () => filterLocationsByProperty,
55
- generateDeviceId: () => generateDeviceId,
56
- getAccessToken: () => getAccessToken,
57
- getActionsFromAchievementRule: () => getActionsFromAchievementRule,
58
- getChipAuthToken: () => getChipAuthToken,
59
- getDeviceUid: () => getDeviceUid,
60
- getLocationIdsFromAchievementRule: () => getLocationIdsFromAchievementRule,
61
- getRefreshToken: () => getRefreshToken,
62
- getRetryAttemptsRefreshToken: () => getRetryAttemptsRefreshToken,
63
- getUserInfo: () => getUserInfo,
64
- httpMaxRetries: () => httpMaxRetries,
65
- isAchievementCompleted: () => isAchievementCompleted,
66
- locationQueryKeys: () => import_api_core11.locationQueryKeys,
67
- memoriesKey: () => import_api_core2.memoriesKey,
68
- parse: () => import_helpers5.parse,
69
- refreshTokenKey: () => refreshTokenKey,
70
- removeAccessToken: () => removeAccessToken,
71
- removeChipAuthToken: () => removeChipAuthToken,
72
- removeDeviceUid: () => removeDeviceUid,
73
- removeRefreshToken: () => removeRefreshToken,
74
- removeUserInfo: () => removeUserInfo,
75
- resetMemoriesQuery: () => import_api_core2.resetMemoriesQuery,
76
- retryAttemptsRefreshToken: () => retryAttemptsRefreshToken,
77
- setAccessToken: () => setAccessToken,
78
- setChipAuthToken: () => setChipAuthToken,
79
- setDeviceUid: () => setDeviceUid,
80
- setRefreshToken: () => setRefreshToken,
81
- setRetryAttemptsRefreshToken: () => setRetryAttemptsRefreshToken,
82
- setUserInfo: () => setUserInfo,
83
- sortLocationsByIndex: () => sortLocationsByIndex,
84
- useAchievementProgress: () => import_achievement2.useAchievementProgress,
85
- useAchivementPlusRewardModel: () => achivementPlusRewardModel_default,
86
- useAuth: () => useAuth,
87
- useCampaignDetail: () => import_api_core9.useOneCampaign,
88
- useCancelUserRewardsRequest: () => import_api_core5.useCancelUserRewardsRequest,
89
- useChipScanStory: () => import_api_core7.useChipScanStory,
90
- useClaimUserReward: () => import_reward.useClaimUserReward,
91
- useClearUserRewardCache: () => import_reward.useClearUserRewardCache,
92
- useCreateCertificate: () => import_generate_certificate2.useCreateCertificate,
93
- useCreateCertificateAnonymous: () => import_generate_certificate2.useCreateCertificateAnonymous,
94
- useCreateCertificateWithMask: () => import_generate_certificate2.useCreateCertificateWithMask,
95
- useCreateMemory: () => import_api_core2.useCreateMemory,
96
- useCreateModelGroupReward: () => import_reward.useCreateModelGroupReward,
97
- useCreateRewardModel: () => import_reward.useCreateRewardModel,
98
- useDataTracking: () => useDataTracking,
99
- useDeleteRewardModel: () => import_reward.useDeleteRewardModel,
100
- useGenerateFansipanCertificate: () => import_generate_certificate2.useGenerateFansipanCertificate,
101
- useGenerateTemplateCertificate: () => import_generate_certificate2.useGenerateTemplateCertificate,
102
- useGenerateThaocamvienCertificate: () => import_generate_certificate2.useGenerateThaocamvienCertificate,
103
- useGetRewardModel: () => import_reward.useGetRewardModel,
104
- useGetUserRewards: () => import_reward.useGetUserRewards,
105
- useGoogleLogin: () => useGoogleLogin,
106
- useInfiniteMemories: () => import_api_core2.useInfiniteMemories,
107
- useListRewardModels: () => import_reward.useListRewardModels,
108
- useLocationDetail: () => import_api_core11.useOneLocation,
109
- useLocationProgress: () => import_api_core11.useUserCampaignsCompletedLocation,
110
- useLocationsList: () => import_api_core11.useManyLocations,
111
- useManyAchievementProgress: () => useManyAchievementProgress,
112
- useManyAchievements: () => import_achievement2.useManyAchievements,
113
- useManyAchievementsRewardModels: () => import_achievement2.useManyAchievementsRewardModels,
114
- useManyChildrenAchievements: () => import_achievement2.useManyChildrenAchievements,
115
- useManyMemory: () => import_api_core2.useManyMemory,
116
- useManyUserActionLocations: () => import_api_core11.useManyUserActionLocations,
117
- useManyUserRewards: () => import_reward.useManyUserRewards,
118
- useMyProfile: () => import_api_core5.useMyProfile,
119
- useOneAchievement: () => import_achievement2.useOneAchievement,
120
- useOneMemory: () => import_api_core2.useOneMemory,
121
- useOneUserCampaign: () => import_api_core9.useOneUserCampaign,
122
- usePGLCoreService: () => import_api_core8.usePGLCoreService,
123
- useScanChip: () => useScanChip,
124
- useSendEmail: () => import_api_core13.useSendEmail,
125
- useSyncCheckin: () => import_api_core5.useSyncCheckin,
126
- useUpdateMyProfile: () => import_api_core5.useUpdateMyProfile,
127
- useUpdateRewardModel: () => import_reward.useUpdateRewardModel,
128
- useUploadMedia: () => import_api_core2.useUploadMedia,
129
- useUserAchievementAction: () => import_achievement2.useUserAchievementAction,
130
- useUserCampaignAction: () => import_api_core9.useUserCampaignAction,
131
- useV1ListRewards: () => import_reward.useV1ListRewards,
132
- userInfoKey: () => userInfoKey,
133
- wrapTextWithFont: () => import_generate_certificate3.wrapTextWithFont
134
- });
135
- module.exports = __toCommonJS(index_exports);
136
-
137
- // src/modules/achievement/hooks/index.ts
138
- var import_achievement = require("@phygitallabs/achievement");
139
- var import_api_core = require("@phygitallabs/api-core");
140
- var import_achievement2 = require("@phygitallabs/achievement");
141
-
142
- // src/modules/achievement/helpers/index.ts
143
- var getLocationIdsFromAchievementRule = (achievement) => {
144
- if (!achievement.rule) return [];
145
- const locationIds = [];
146
- Object.values(achievement.rule).forEach((ruleList) => {
147
- if (!ruleList.rules) return;
148
- ruleList.rules.forEach((rule) => {
149
- if (!rule.filter) return;
150
- Object.values(rule.filter).forEach((filterList) => {
151
- if (!filterList.filters) return;
152
- filterList.filters.forEach((filter) => {
153
- if (filter.label === "location_id" && filter.value) {
154
- if (Array.isArray(filter.value)) {
155
- locationIds.push(...filter.value);
156
- } else {
157
- locationIds.push(filter.value);
158
- }
159
- }
160
- });
161
- });
162
- });
163
- });
164
- return Array.from(new Set(locationIds));
165
- };
166
- var getActionsFromAchievementRule = (achievement) => {
167
- if (!achievement.rule) return [];
168
- const actions = [];
169
- Object.values(achievement.rule).forEach((ruleList) => {
170
- if (!ruleList.rules) return;
171
- ruleList.rules.forEach((rule) => {
172
- if (rule.action) {
173
- actions.push(rule.action);
174
- }
175
- });
176
- });
177
- return Array.from(new Set(actions));
178
- };
179
- var isAchievementCompleted = (achievement) => {
180
- return achievement.isCompleted || achievement.overallPercentage === 100;
181
- };
182
- function convertSnakeToCamel(obj) {
183
- if (obj === null || obj === void 0) {
184
- return obj;
185
- }
186
- if (Array.isArray(obj)) {
187
- return obj.map(
188
- (item) => convertSnakeToCamel(item)
189
- );
190
- }
191
- if (typeof obj === "object" && obj.constructor === Object) {
192
- const converted = {};
193
- for (const key in obj) {
194
- if (obj.hasOwnProperty(key)) {
195
- const camelKey = key.replace(
196
- /_([a-z])/g,
197
- (_, letter) => letter.toUpperCase()
198
- );
199
- converted[camelKey] = convertSnakeToCamel(
200
- obj[key]
201
- );
202
- }
203
- }
204
- return converted;
205
- }
206
- return obj;
207
- }
208
-
209
- // src/modules/achievement/hooks/index.ts
210
- var useManyAchievementProgress = (params, options) => {
211
- const isLoggedIn = !!params.userId;
212
- const queryParams = isLoggedIn ? {
213
- achievementIds: params.achievementIds,
214
- userId: params.userId,
215
- applicationId: params.applicationId
216
- } : {
217
- achievement_ids: params.achievementIds,
218
- device_uid: params.deviceUid,
219
- applicationId: params.applicationId
220
- };
221
- if (isLoggedIn) {
222
- return (0, import_achievement.useManyAchievementProgress)(
223
- queryParams,
224
- {
225
- ...options,
226
- select: (data) => data.map((item) => ({
227
- ...item,
228
- isCompleted: isAchievementCompleted(item)
229
- }))
230
- }
231
- );
232
- }
233
- return (0, import_api_core.useManyAchievementProgressByDevice)(
234
- queryParams,
235
- {
236
- ...options,
237
- select: (data) => {
238
- const camelCaseData = convertSnakeToCamel(data);
239
- return camelCaseData.map((item) => ({
240
- ...item,
241
- isCompleted: isAchievementCompleted(item)
242
- }));
243
- }
244
- }
245
- );
246
- };
247
-
248
- // src/modules/achievement/types/index.ts
249
- var import_achievement3 = require("@phygitallabs/achievement");
250
- var AchievementType = /* @__PURE__ */ ((AchievementType2) => {
251
- AchievementType2["DEFAULT"] = "default";
252
- AchievementType2["MULTIPLE_CHECK_INS"] = "multiple_check_ins";
253
- AchievementType2["RANDOM_CHECK_INS"] = "random_check_ins";
254
- AchievementType2["GROUP_MISSION"] = "group_mission";
255
- return AchievementType2;
256
- })(AchievementType || {});
257
-
258
- // src/modules/reward/hooks/useRewardService.ts
259
- var import_reward = require("@phygitallabs/reward");
260
-
261
- // src/modules/reward/types/enums.ts
262
- var import_reward2 = require("@phygitallabs/reward");
263
- var RewardClaimStatus = /* @__PURE__ */ ((RewardClaimStatus2) => {
264
- RewardClaimStatus2["NOT_CLAIMED"] = "not_claimed";
265
- RewardClaimStatus2["CLAIMED"] = "claimed";
266
- RewardClaimStatus2["IN_PROGRESS"] = "in_progress";
267
- RewardClaimStatus2["FAILED"] = "failed";
268
- return RewardClaimStatus2;
269
- })(RewardClaimStatus || {});
270
-
271
- // src/modules/notification/index.ts
272
- var notification_exports = {};
273
- __export(notification_exports, {
274
- NotificationProvider: () => NotificationProvider
275
- });
276
- __reExport(notification_exports, require("@phygitallabs/notification-api"));
277
-
278
- // src/modules/notification/providers/index.tsx
279
- var import_notification_api = require("@phygitallabs/notification-api");
280
-
281
- // src/constants/service.ts
282
- var serviceApiUrl = {
283
- dev: {
284
- API_BASE_URL: "https://backend-dev.nomion.io",
285
- API_BASE_CORE_URL: "https://backend-dev.nomion.io/core",
286
- API_ACHIEVEMENT_URL: "https://backend-dev.nomion.io/achievement",
287
- API_REWARD_URL: "https://backend-dev.nomion.io/reward",
288
- API_GENERATE_CERTIFICATE_URL: "https://media-prc-dev.nomion.io/api",
289
- API_NOTIFICATION_SOCKET_URL: "https://backend-dev.nomion.io/notification-ws/ws"
290
- },
291
- staging: {
292
- API_BASE_URL: "https://backend-staging.nomion.io",
293
- API_BASE_CORE_URL: "https://backend-staging.nomion.io/core",
294
- API_ACHIEVEMENT_URL: "https://backend-staging.nomion.io/achievement",
295
- API_REWARD_URL: "https://backend-staging.nomion.io/reward",
296
- API_GENERATE_CERTIFICATE_URL: "https://media-prc-staging.nomion.io/api",
297
- API_NOTIFICATION_SOCKET_URL: "https://backend-staging.nomion.io/notification-ws/ws"
298
- },
299
- production: {
300
- API_BASE_URL: "https://backend.nomion.io",
301
- API_BASE_CORE_URL: "https://backend.nomion.io/core",
302
- API_ACHIEVEMENT_URL: "https://backend.nomion.io/achievement",
303
- API_REWARD_URL: "https://backend.nomion.io/reward",
304
- API_GENERATE_CERTIFICATE_URL: "https://media-prc.nomion.io/api",
305
- API_NOTIFICATION_SOCKET_URL: "https://backend.nomion.io/notification-ws/ws"
306
- }
307
- };
308
- var service_default = serviceApiUrl;
309
-
310
- // src/modules/notification/providers/index.tsx
311
- var import_jsx_runtime = require("react/jsx-runtime");
312
- var NotificationProvider = ({
313
- children,
314
- autoConnect = true,
315
- environment = "dev",
316
- user,
317
- onWebSocketOpen,
318
- onWebSocketClose,
319
- onWebSocketMessage
320
- }) => {
321
- const webSocketUrl = service_default[environment]?.API_NOTIFICATION_SOCKET_URL;
322
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
323
- import_notification_api.NotificationProvider,
324
- {
325
- userUid: user?.id,
326
- accessToken: user?.accessToken ?? null,
327
- webSocketUrl,
328
- autoConnect,
329
- onWebSocketOpen,
330
- onWebSocketClose,
331
- onWebSocketMessage,
332
- children
333
- }
334
- );
335
- };
336
-
337
- // src/index.ts
338
- __reExport(index_exports, notification_exports, module.exports);
339
-
340
- // src/modules/memory/hooks/index.ts
341
- var import_api_core2 = require("@phygitallabs/api-core");
342
-
343
- // src/modules/auth/providers/AuthProvider.tsx
344
- var import_authentication3 = require("@phygitallabs/authentication");
345
- var import_react = require("react");
346
-
347
- // src/modules/auth/store/authStore.ts
348
- var import_zustand = require("zustand");
349
- var import_immer = require("zustand/middleware/immer");
350
- var import_middleware = require("zustand/middleware");
351
- var import_authentication = require("@phygitallabs/authentication");
352
-
353
- // src/modules/auth/constants/index.ts
354
- var userInfoKey = "phygital-user-info";
355
- var accessTokenKey = "accessToken";
356
- var refreshTokenKey = "refreshToken";
357
- var httpMaxRetries = 3;
358
- var retryAttemptsRefreshToken = "retryAttemptsRefreshToken";
359
- var deviceUIDKey = "Device-UID";
360
- var chipAuthTokenKey = "chip-auth-token";
361
- var CALLBACK_URL = "https://s3-sgn10.fptcloud.com/nomion-assets/platform/callback.html";
362
- var ALLOWED_ORIGINS = [
363
- "https://s3-sgn10.fptcloud.com",
364
- "https://accounts.google.com/"
365
- ];
366
-
367
- // src/modules/auth/store/authStore.ts
368
- var initialState = {
369
- user: null,
370
- isSignedIn: false,
371
- isInitialized: false,
372
- isLoading: false,
373
- error: null,
374
- cleanupFunctions: {},
375
- eventCallbacks: {}
376
- };
377
- var useAuthStore = (0, import_zustand.create)()(
378
- (0, import_middleware.devtools)(
379
- (0, import_middleware.persist)(
380
- (0, import_middleware.subscribeWithSelector)(
381
- (0, import_immer.immer)((set, get) => ({
382
- ...initialState,
383
- actions: {
384
- setIsLoading: (isLoading) => set((state) => {
385
- state.isLoading = isLoading;
386
- }),
387
- setCleanupFunctions: (newCleanupFunctions) => set((state) => {
388
- state.cleanupFunctions = {
389
- ...state.cleanupFunctions,
390
- ...newCleanupFunctions
391
- };
392
- }),
393
- // Event management
394
- addEventCallbacks: (callbacks) => {
395
- set((state) => {
396
- state.eventCallbacks = {
397
- ...state.eventCallbacks,
398
- ...callbacks
399
- };
400
- });
401
- return () => {
402
- set((state) => {
403
- state.eventCallbacks = {
404
- ...state.eventCallbacks,
405
- ...callbacks
406
- };
407
- });
408
- };
409
- },
410
- // Sign in with email and password
411
- signInWithEmail: async (email, password) => {
412
- const { eventCallbacks } = get();
413
- set((state) => {
414
- state.isLoading = true;
415
- state.error = null;
416
- });
417
- try {
418
- const response = await import_authentication.authService.signIn({
419
- email,
420
- password
421
- });
422
- if (response?.data?.idToken && response?.data?.refreshToken) {
423
- import_authentication.tokenStorage.setTokens({
424
- idToken: response.data.idToken,
425
- refreshToken: response.data.refreshToken
426
- });
427
- set((state) => {
428
- state.isSignedIn = true;
429
- });
430
- eventCallbacks.onLoginSuccess?.(response.data.idToken);
431
- }
432
- return response;
433
- } catch (error) {
434
- if (error?.response?.data?.code === 7) {
435
- return {
436
- data: void 0,
437
- message: "Email verification required",
438
- code: 7
439
- };
440
- }
441
- const errorMessage = error instanceof Error ? error.message : "Login failed";
442
- set((state) => {
443
- state.error = errorMessage;
444
- });
445
- eventCallbacks.onLoginError?.(new Error(errorMessage));
446
- throw error;
447
- } finally {
448
- set((state) => {
449
- state.isLoading = false;
450
- });
451
- }
452
- },
453
- // Sign in with Google
454
- signInWithGoogle: async () => {
455
- const { eventCallbacks } = get();
456
- try {
457
- const currentDomain = CALLBACK_URL;
458
- const userData = await import_authentication.authService.getOAuthSignInUrl(currentDomain);
459
- return userData;
460
- } catch (error) {
461
- const errorMessage = error instanceof Error ? error.message : "Google sign in failed";
462
- set((state) => {
463
- state.error = errorMessage;
464
- });
465
- eventCallbacks.onLoginError?.(new Error(errorMessage));
466
- throw error;
467
- }
468
- },
469
- // Sign up with email and password
470
- signUpWithEmail: async (email, password) => {
471
- const { eventCallbacks } = get();
472
- set((state) => {
473
- state.isLoading = true;
474
- state.error = null;
475
- });
476
- try {
477
- const response = await import_authentication.authService.signUp({
478
- email,
479
- password
480
- });
481
- if (response.data) {
482
- eventCallbacks.onSignupSuccess?.();
483
- }
484
- return response;
485
- } catch (error) {
486
- const errorMessage = error instanceof Error ? error.message : "Signup failed";
487
- set((state) => {
488
- state.error = errorMessage;
489
- });
490
- eventCallbacks.onSignupError?.(new Error(errorMessage));
491
- throw error;
492
- } finally {
493
- set((state) => {
494
- state.isLoading = false;
495
- state.user = null;
496
- state.isSignedIn = false;
497
- });
498
- }
499
- },
500
- // Sign out
501
- signOut: async () => {
502
- const { eventCallbacks, cleanupFunctions } = get();
503
- set((state) => {
504
- state.isLoading = true;
505
- state.error = null;
506
- });
507
- try {
508
- set((state) => {
509
- state.user = null;
510
- state.isSignedIn = false;
511
- state.error = null;
512
- });
513
- const isTokenExpired = import_authentication.tokenStorage.isTokenExpired();
514
- if (isTokenExpired) {
515
- import_authentication.tokenStorage.clearTokens();
516
- localStorage.clear();
517
- return;
518
- }
519
- await import_authentication.authService.logout();
520
- localStorage.clear();
521
- import_authentication.tokenStorage.clearTokens();
522
- try {
523
- cleanupFunctions.clearQueryCache?.();
524
- cleanupFunctions.clearOrganization?.();
525
- cleanupFunctions.clearCustomData?.();
526
- cleanupFunctions.clearHeaders?.();
527
- } catch (cleanupError) {
528
- console.warn("Error during logout cleanup:", cleanupError);
529
- }
530
- eventCallbacks.onLogoutSuccess?.();
531
- } catch (error) {
532
- console.log(error);
533
- const errorMessage = error instanceof Error ? error.message : "Logout failed";
534
- set((state) => {
535
- state.error = errorMessage;
536
- });
537
- eventCallbacks.onLogoutError?.(new Error(errorMessage));
538
- throw error;
539
- } finally {
540
- set((state) => {
541
- state.isLoading = false;
542
- });
543
- }
544
- },
545
- // Send password reset email
546
- sendPasswordResetEmail: async (email) => {
547
- set((state) => {
548
- state.isLoading = true;
549
- state.error = null;
550
- });
551
- try {
552
- await import_authentication.verifyCodeService.forgotPassword({
553
- email
554
- });
555
- } catch (error) {
556
- const errorMessage = error instanceof Error ? error.message : "Failed to send reset email";
557
- set((state) => {
558
- state.error = errorMessage;
559
- });
560
- throw error;
561
- } finally {
562
- set((state) => {
563
- state.isLoading = false;
564
- });
565
- }
566
- },
567
- resetPassword: async (data) => {
568
- set((state) => {
569
- state.isLoading = true;
570
- state.error = null;
571
- });
572
- try {
573
- const resetPasswordResponse = await import_authentication.verifyCodeService.resetPassword(data);
574
- return resetPasswordResponse;
575
- } catch (error) {
576
- const errorMessage = error instanceof Error ? error.message : "Failed to reset password";
577
- set((state) => {
578
- state.error = errorMessage;
579
- });
580
- throw error;
581
- } finally {
582
- set((state) => {
583
- state.isLoading = false;
584
- });
585
- }
586
- },
587
- changePassword: async (data) => {
588
- set((state) => {
589
- state.isLoading = true;
590
- state.error = null;
591
- });
592
- try {
593
- const changePasswordResponse = await import_authentication.verifyCodeService.changePassword(data);
594
- return changePasswordResponse;
595
- } catch (error) {
596
- throw error;
597
- } finally {
598
- set((state) => {
599
- state.isLoading = false;
600
- });
601
- }
602
- },
603
- verifyEmailCode: async (data) => {
604
- set((state) => {
605
- state.isLoading = true;
606
- state.error = null;
607
- });
608
- try {
609
- const verifyEmailResponse = await import_authentication.verifyCodeService.verifyEmail(data);
610
- return verifyEmailResponse;
611
- } catch (error) {
612
- const errorMessage = error instanceof Error ? error.message : "Failed to send reset email";
613
- set((state) => {
614
- state.error = errorMessage;
615
- });
616
- throw error;
617
- } finally {
618
- set((state) => {
619
- state.isLoading = false;
620
- });
621
- }
622
- },
623
- sendVerifyCode: async (data) => {
624
- set((state) => {
625
- state.isLoading = true;
626
- state.error = null;
627
- });
628
- try {
629
- const sendVerifyCodeResponse = await import_authentication.verifyCodeService.sendVerifyCode(data);
630
- return sendVerifyCodeResponse;
631
- } catch (error) {
632
- const errorMessage = error instanceof Error ? error.message : "Failed to send verify code";
633
- set((state) => {
634
- state.error = errorMessage;
635
- });
636
- throw error;
637
- } finally {
638
- set((state) => {
639
- state.isLoading = false;
640
- });
641
- }
642
- },
643
- refreshToken: async (refreshToken) => {
644
- const refreshTokenResponse = await import_authentication.authService.refreshToken({
645
- refreshToken: refreshToken ?? import_authentication.tokenStorage.getRefreshToken() ?? ""
646
- });
647
- return refreshTokenResponse;
648
- },
649
- // Clear error
650
- clearError: () => set((state) => {
651
- state.error = null;
652
- }),
653
- setUser: (user) => set((state) => {
654
- state.user = user;
655
- }),
656
- setIsSignedIn: (isSignedIn) => set((state) => {
657
- state.isSignedIn = isSignedIn;
658
- }),
659
- setIsInitialized: (isInitialized) => set((state) => {
660
- state.isInitialized = isInitialized;
661
- }),
662
- patchUser: (user) => set((state) => {
663
- if (state.user) {
664
- state.user = { ...state.user, ...user };
665
- } else {
666
- state.user = user;
667
- }
668
- }),
669
- // Initialize the store - check if user is already authenticated from tokenStorage
670
- initialize: () => {
671
- set((state) => {
672
- const token = import_authentication.tokenStorage.getAuthToken();
673
- state.isSignedIn = !!token;
674
- state.isInitialized = true;
675
- });
676
- },
677
- // Sync auth state from tokenStorage (called when axios interceptor updates tokens)
678
- syncAuthState: () => {
679
- set((state) => {
680
- const token = import_authentication.tokenStorage.getAuthToken();
681
- const wasSignedIn = state.isSignedIn;
682
- state.isSignedIn = !!token;
683
- if (wasSignedIn !== state.isSignedIn) {
684
- if (state.isSignedIn) {
685
- state.eventCallbacks?.onAuthStateChange?.(state.user, true);
686
- } else {
687
- state.eventCallbacks?.onAuthStateChange?.(null, false);
688
- }
689
- }
690
- });
691
- }
692
- }
693
- }))
694
- ),
695
- {
696
- version: 1,
697
- name: "auth-store",
698
- storage: (0, import_middleware.createJSONStorage)(() => localStorage),
699
- partialize: (state) => ({
700
- isSignedIn: state.isSignedIn,
701
- user: state.user
702
- })
703
- }
704
- )
705
- )
706
- );
707
- var useAuth = () => {
708
- const user = useAuthStore((state) => state.user);
709
- const isSignedIn = useAuthStore((state) => state.isSignedIn);
710
- const isInitialized = useAuthStore((state) => state.isInitialized);
711
- const isLoading = useAuthStore((state) => state.isLoading);
712
- const error = useAuthStore((state) => state.error);
713
- const actions = useAuthStore((state) => state.actions);
714
- return {
715
- user,
716
- isSignedIn,
717
- isInitialized,
718
- isLoading,
719
- error,
720
- ...actions
721
- };
722
- };
723
-
724
- // src/modules/auth/utils/user.ts
725
- var import_jwt_decode = __toESM(require("jwt-decode"), 1);
726
- var transformProtoUserData = (user, accessToken) => {
727
- const userData = { ...user };
728
- let tokenDecoded = {};
729
- try {
730
- tokenDecoded = (0, import_jwt_decode.default)(accessToken);
731
- } catch (error) {
732
- console.warn("Failed to decode token in transformUserData:", error);
733
- }
734
- userData.exp = tokenDecoded.exp || 0;
735
- userData.accessToken = accessToken || "";
736
- userData.roles = tokenDecoded?.roles || ["USER" /* USER */];
737
- userData.account_type = tokenDecoded?.account_type || 0 /* C */;
738
- userData.picture = user.picture || "";
739
- return userData;
740
- };
741
-
742
- // src/modules/auth/providers/AuthProvider.tsx
743
- var import_api_core3 = require("@phygitallabs/api-core");
744
- var import_api_core4 = require("@phygitallabs/api-core");
745
- var import_achievement4 = require("@phygitallabs/achievement");
746
- var import_reward3 = require("@phygitallabs/reward");
747
- var import_generate_certificate = require("@phygitallabs/generate-certificate");
748
-
749
- // src/modules/auth/hooks/useTokenRefresher.ts
750
- var import_react_query = require("@tanstack/react-query");
751
- var import_authentication2 = require("@phygitallabs/authentication");
752
- function useTokenRefresher() {
753
- const { refreshToken, signOut } = useAuth();
754
- const handleRefreshToken = async () => {
755
- try {
756
- const isTokenExpired = import_authentication2.tokenStorage.isTokenExpired();
757
- if (!isTokenExpired) {
758
- return;
759
- }
760
- const newToken = await refreshToken();
761
- if (newToken.data?.idToken && newToken.data?.refreshToken) {
762
- import_authentication2.tokenStorage.setTokens({
763
- idToken: newToken.data?.idToken,
764
- refreshToken: newToken.data?.refreshToken
765
- });
766
- }
767
- } catch (error) {
768
- console.error("Failed to refresh token:", error);
769
- signOut();
770
- }
771
- };
772
- (0, import_react_query.useQuery)({
773
- queryKey: ["refresh-token"],
774
- queryFn: () => handleRefreshToken(),
775
- refetchInterval: 30 * 60 * 1e3,
776
- // every 30 minutes
777
- refetchIntervalInBackground: false,
778
- // even when tab is hidden
779
- refetchOnWindowFocus: true,
780
- // also refresh when user returns to tab
781
- retry: false,
782
- // don't retry repeatedly if refresh fails
783
- enabled: !!import_authentication2.tokenStorage.getAuthToken()
784
- // only run if logged in
785
- });
786
- }
787
-
788
- // src/modules/auth/providers/AuthProvider.tsx
789
- var import_jsx_runtime2 = require("react/jsx-runtime");
790
- var AuthStateManager = () => {
791
- const { updateHeaders } = (0, import_authentication3.useAuthenticationHeaders)();
792
- const { updateHeaders: updateHeadersPGL, coreApi } = (0, import_api_core4.usePGLCoreService)();
793
- const { updateHeaders: updateHeadersAchievement } = (0, import_achievement4.useAchievementService)();
794
- const { updateHeaders: updateHeadersReward } = (0, import_reward3.useRewardService)();
795
- const { updateHeaders: updateHeadersGenerateCertificate } = (0, import_generate_certificate.useGenerateCertificateService)();
796
- (0, import_react.useEffect)(() => {
797
- useAuthStore.getState().actions.initialize();
798
- const token = import_authentication3.tokenStorage.getAuthToken();
799
- if (token) {
800
- updateHeaders({
801
- Authorization: `Bearer ${token}`
802
- });
803
- updateHeadersPGL({
804
- Authorization: `Bearer ${token}`
805
- });
806
- updateHeadersAchievement({
807
- Authorization: `Bearer ${token}`
808
- });
809
- updateHeadersReward({
810
- Authorization: `Bearer ${token}`
811
- });
812
- updateHeadersGenerateCertificate({
813
- Authorization: `Bearer ${token}`
814
- });
815
- const { user } = useAuthStore.getState();
816
- if (user && user.accessToken !== token) {
817
- useAuthStore.getState().actions.setUser({
818
- ...user,
819
- accessToken: token
820
- });
821
- }
822
- }
823
- let previousIsSignedIn = useAuthStore.getState().isSignedIn;
824
- const unsub = useAuthStore.subscribe(
825
- (state) => [state.isSignedIn, state.user],
826
- async ([isSignedIn]) => {
827
- if (isSignedIn === previousIsSignedIn) {
828
- return;
829
- }
830
- previousIsSignedIn = isSignedIn;
831
- if (isSignedIn) {
832
- const token2 = import_authentication3.tokenStorage.getAuthToken();
833
- if (token2) {
834
- updateHeaders({
835
- Authorization: `Bearer ${token2}`
836
- });
837
- updateHeadersPGL({
838
- Authorization: `Bearer ${token2}`
839
- });
840
- updateHeadersAchievement({
841
- Authorization: `Bearer ${token2}`
842
- });
843
- updateHeadersReward({
844
- Authorization: `Bearer ${token2}`
845
- });
846
- updateHeadersGenerateCertificate({
847
- Authorization: `Bearer ${token2}`
848
- });
849
- try {
850
- const userApi = (0, import_api_core3.userService)(coreApi);
851
- const userProfile = await userApi.getMyProfile();
852
- const transformedUserData = transformProtoUserData(
853
- userProfile,
854
- token2
855
- );
856
- useAuthStore.getState().actions.setUser(transformedUserData);
857
- } catch (error) {
858
- useAuthStore.getState().actions.signOut();
859
- }
860
- }
861
- const { eventCallbacks, user } = useAuthStore.getState();
862
- eventCallbacks?.onAuthStateChange?.(user, true);
863
- } else {
864
- updateHeaders({});
865
- updateHeadersPGL({});
866
- updateHeadersAchievement({
867
- Authorization: ``
868
- });
869
- updateHeadersReward({
870
- Authorization: ``
871
- });
872
- updateHeadersGenerateCertificate({
873
- Authorization: ``
874
- });
875
- const { eventCallbacks } = useAuthStore.getState();
876
- eventCallbacks?.onAuthStateChange?.(null, false);
877
- }
878
- }
879
- );
880
- const unsubTokenChange = import_authentication3.tokenStorage.addTokenChangeListener(async () => {
881
- const { isSignedIn, user } = useAuthStore.getState();
882
- if (isSignedIn) {
883
- const token2 = import_authentication3.tokenStorage.getAuthToken();
884
- if (token2) {
885
- updateHeaders({
886
- Authorization: `Bearer ${token2}`
887
- });
888
- updateHeadersPGL({
889
- Authorization: `Bearer ${token2}`
890
- });
891
- updateHeadersAchievement({
892
- Authorization: `Bearer ${token2}`
893
- });
894
- updateHeadersReward({
895
- Authorization: `Bearer ${token2}`
896
- });
897
- updateHeadersGenerateCertificate({
898
- Authorization: `Bearer ${token2}`
899
- });
900
- if (user && user.accessToken !== token2) {
901
- useAuthStore.getState().actions.setUser({
902
- ...user,
903
- accessToken: token2
904
- });
905
- }
906
- } else {
907
- useAuthStore.getState().actions.signOut();
908
- updateHeaders({});
909
- updateHeadersPGL({});
910
- updateHeadersAchievement({
911
- Authorization: ``
912
- });
913
- updateHeadersReward({
914
- Authorization: ``
915
- });
916
- updateHeadersGenerateCertificate({
917
- Authorization: ``
918
- });
919
- }
920
- }
921
- });
922
- return () => {
923
- unsub();
924
- unsubTokenChange();
925
- };
926
- }, [
927
- updateHeaders,
928
- updateHeadersPGL,
929
- updateHeadersAchievement,
930
- updateHeadersReward,
931
- updateHeadersGenerateCertificate,
932
- coreApi
933
- ]);
934
- return null;
935
- };
936
- var TokenRefresher = () => {
937
- useTokenRefresher();
938
- return null;
939
- };
940
- var AuthProvider = ({
941
- children,
942
- baseURL,
943
- queryClient
944
- }) => {
945
- const axiosConfig = {
946
- headers: {
947
- "Content-Type": "application/json"
948
- }
949
- };
950
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
951
- import_authentication3.AuthenticationProvider,
952
- {
953
- axiosConfig,
954
- baseURL,
955
- queryClient,
956
- children: [
957
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(AuthStateManager, {}),
958
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(TokenRefresher, {}),
959
- children
960
- ]
961
- }
962
- );
963
- };
964
-
965
- // src/modules/auth/hooks/useGoogleLogin.ts
966
- var import_react2 = require("react");
967
- var import_authentication4 = require("@phygitallabs/authentication");
968
- function useGoogleLogin(options = {}) {
969
- const { onSuccess, onError, onPopupBlocked, onPopupClosed } = options;
970
- const { signInWithGoogle, refreshToken, setIsSignedIn, setIsLoading, isLoading } = useAuth();
971
- const popupRef = (0, import_react2.useRef)(null);
972
- const gotDataRef = (0, import_react2.useRef)(false);
973
- const timerRef = (0, import_react2.useRef)(null);
974
- const errorRef = (0, import_react2.useRef)(null);
975
- const handleTokenRefresh = (0, import_react2.useCallback)(
976
- async (refresh) => {
977
- if (refresh) {
978
- try {
979
- const newToken = await refreshToken(refresh);
980
- if (newToken.data?.idToken && newToken.data?.refreshToken) {
981
- import_authentication4.tokenStorage.setTokens({
982
- idToken: newToken.data.idToken,
983
- refreshToken: newToken.data.refreshToken
984
- });
985
- setIsSignedIn(true);
986
- setIsLoading(false);
987
- onSuccess?.();
988
- }
989
- } catch (error) {
990
- const errorMessage = error instanceof Error ? error.message : "Token refresh failed";
991
- errorRef.current = errorMessage;
992
- onError?.(errorMessage);
993
- setIsLoading(false);
994
- }
995
- }
996
- },
997
- [refreshToken, setIsSignedIn, setIsLoading, onSuccess, onError]
998
- );
999
- const cleanup = (0, import_react2.useCallback)(() => {
1000
- if (timerRef.current) {
1001
- clearInterval(timerRef.current);
1002
- timerRef.current = null;
1003
- }
1004
- gotDataRef.current = false;
1005
- }, []);
1006
- const handleMessage = (0, import_react2.useCallback)(
1007
- (event) => {
1008
- const allowedOrigins = ALLOWED_ORIGINS.concat(window?.location?.origin);
1009
- if (event.origin !== "*" && !allowedOrigins.includes(event.origin)) {
1010
- console.warn("Rejected message from untrusted origin:", event.origin);
1011
- return;
1012
- }
1013
- if (!event.data || typeof event.data !== "object") {
1014
- console.warn("Invalid message data received");
1015
- return;
1016
- }
1017
- if (event.data.type === "LOGIN_SUCCESS") {
1018
- const { refreshToken: refresh } = event.data;
1019
- if (refresh) {
1020
- handleTokenRefresh(refresh);
1021
- }
1022
- gotDataRef.current = true;
1023
- cleanup();
1024
- } else if (event.data.type === "LOGIN_ERROR") {
1025
- const errorMessage = event.data.error || "Login failed";
1026
- errorRef.current = errorMessage;
1027
- onError?.(errorMessage);
1028
- setIsLoading(false);
1029
- gotDataRef.current = true;
1030
- cleanup();
1031
- }
1032
- },
1033
- [handleTokenRefresh, setIsLoading, cleanup, onError]
1034
- );
1035
- const signIn = (0, import_react2.useCallback)(async () => {
1036
- const width = 500;
1037
- const height = 600;
1038
- const left = window.screenX + (window.outerWidth - width) / 2;
1039
- const top = window.screenY + (window.outerHeight - height) / 2;
1040
- try {
1041
- errorRef.current = null;
1042
- setIsLoading(true);
1043
- const response = await signInWithGoogle();
1044
- popupRef.current = window.open(
1045
- `${response.statusMessage}`,
1046
- "oauthPopup",
1047
- `width=${width},height=${height},left=${left},top=${top},resizable,scrollbars`
1048
- );
1049
- if (!popupRef.current) {
1050
- setIsLoading(false);
1051
- const error = "Popup blocked. Please allow popups for this site.";
1052
- errorRef.current = error;
1053
- onPopupBlocked?.();
1054
- onError?.(error);
1055
- return;
1056
- }
1057
- timerRef.current = setInterval(() => {
1058
- if (popupRef.current && popupRef.current.closed) {
1059
- if (timerRef.current) {
1060
- clearInterval(timerRef.current);
1061
- timerRef.current = null;
1062
- }
1063
- if (!gotDataRef.current) {
1064
- const error = "Authentication popup was closed";
1065
- errorRef.current = error;
1066
- onPopupClosed?.();
1067
- onError?.(error);
1068
- setIsLoading(false);
1069
- }
1070
- }
1071
- }, 500);
1072
- } catch (error) {
1073
- const errorMessage = error instanceof Error ? error.message : "Google sign in failed";
1074
- errorRef.current = errorMessage;
1075
- onError?.(errorMessage);
1076
- setIsLoading(false);
1077
- }
1078
- }, [signInWithGoogle, setIsLoading, handleMessage, onError, onPopupBlocked, onPopupClosed]);
1079
- (0, import_react2.useEffect)(() => {
1080
- window.addEventListener("message", handleMessage);
1081
- return () => {
1082
- window.removeEventListener("message", handleMessage);
1083
- };
1084
- }, [handleMessage]);
1085
- (0, import_react2.useEffect)(() => {
1086
- return () => {
1087
- cleanup();
1088
- };
1089
- }, [cleanup, handleMessage]);
1090
- return {
1091
- signIn,
1092
- isLoading,
1093
- error: errorRef.current
1094
- };
1095
- }
1096
-
1097
- // src/modules/auth/helpers/index.ts
1098
- var import_uuid = require("uuid");
1099
- var generateDeviceId = async () => {
1100
- try {
1101
- const deviceFingerprint = await generateDeviceFingerprint();
1102
- return deviceFingerprint;
1103
- } catch (error) {
1104
- console.error("Error generating device fingerprint:", error);
1105
- return (0, import_uuid.v4)();
1106
- }
1107
- };
1108
- var generateDeviceFingerprint = async () => {
1109
- const timestamp = (/* @__PURE__ */ new Date()).toISOString();
1110
- const fingerprintRaw = [
1111
- navigator.userAgent,
1112
- navigator.language,
1113
- screen.width,
1114
- screen.height,
1115
- screen.colorDepth,
1116
- Intl.DateTimeFormat().resolvedOptions().timeZone,
1117
- navigator.platform,
1118
- navigator.hardwareConcurrency,
1119
- timestamp
1120
- // Include timestamp
1121
- ].join("::");
1122
- const encoder = new TextEncoder();
1123
- const data = encoder.encode(fingerprintRaw);
1124
- const hashBuffer = await crypto.subtle.digest("SHA-256", data);
1125
- const hashArray = Array.from(new Uint8Array(hashBuffer));
1126
- const fingerprint = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
1127
- return fingerprint;
1128
- };
1129
- var getDeviceUid = () => {
1130
- if (typeof window === "undefined") return null;
1131
- return localStorage.getItem(deviceUIDKey);
1132
- };
1133
- var setDeviceUid = (deviceId) => {
1134
- if (typeof window === "undefined") return;
1135
- localStorage.setItem(deviceUIDKey, deviceId);
1136
- };
1137
- var removeDeviceUid = () => {
1138
- if (typeof window === "undefined") return;
1139
- localStorage.removeItem(deviceUIDKey);
1140
- };
1141
- var checkDeviceUid = async () => {
1142
- let deviceUID = getDeviceUid();
1143
- if (!deviceUID) {
1144
- deviceUID = await generateDeviceId();
1145
- setDeviceUid(deviceUID);
1146
- }
1147
- return deviceUID;
1148
- };
1149
- var getChipAuthToken = () => {
1150
- if (typeof window === "undefined") return null;
1151
- return localStorage.getItem(chipAuthTokenKey);
1152
- };
1153
- var setChipAuthToken = (value) => {
1154
- if (typeof window === "undefined") return;
1155
- localStorage.setItem(chipAuthTokenKey, value);
1156
- };
1157
- var removeChipAuthToken = () => {
1158
- if (typeof window === "undefined") return;
1159
- localStorage.removeItem(chipAuthTokenKey);
1160
- };
1161
- var getRetryAttemptsRefreshToken = () => {
1162
- if (typeof window === "undefined") return null;
1163
- return localStorage.getItem(retryAttemptsRefreshToken);
1164
- };
1165
- var setRetryAttemptsRefreshToken = (value) => {
1166
- if (typeof window === "undefined") return;
1167
- localStorage.setItem(retryAttemptsRefreshToken, value);
1168
- };
1169
- var getAccessToken = () => {
1170
- if (typeof window === "undefined") return null;
1171
- return localStorage.getItem(accessTokenKey);
1172
- };
1173
- var setAccessToken = (value) => {
1174
- if (typeof window === "undefined") return;
1175
- localStorage.setItem(accessTokenKey, value);
1176
- };
1177
- var removeAccessToken = () => {
1178
- if (typeof window === "undefined") return;
1179
- localStorage.removeItem(accessTokenKey);
1180
- };
1181
- var getRefreshToken = () => {
1182
- if (typeof window === "undefined") return null;
1183
- return localStorage.getItem(refreshTokenKey);
1184
- };
1185
- var setRefreshToken = (value) => {
1186
- if (typeof window === "undefined") return;
1187
- localStorage.setItem(refreshTokenKey, value);
1188
- };
1189
- var removeRefreshToken = () => {
1190
- if (typeof window === "undefined") return;
1191
- localStorage.removeItem(refreshTokenKey);
1192
- };
1193
- var getUserInfo = () => {
1194
- if (typeof window === "undefined") return null;
1195
- const userInfo = localStorage.getItem(userInfoKey);
1196
- if (!userInfo) return null;
1197
- try {
1198
- return JSON.parse(userInfo);
1199
- } catch (error) {
1200
- console.error("Failed to parse stored user data:", error);
1201
- return null;
1202
- }
1203
- };
1204
- var setUserInfo = (userData) => {
1205
- if (typeof window === "undefined") return;
1206
- localStorage.setItem(userInfoKey, JSON.stringify(userData));
1207
- };
1208
- var removeUserInfo = () => {
1209
- if (typeof window === "undefined") return;
1210
- localStorage.removeItem(userInfoKey);
1211
- };
1212
-
1213
- // src/modules/user-profile/hooks/index.ts
1214
- var import_api_core5 = require("@phygitallabs/api-core");
1215
-
1216
- // src/modules/user-profile/types/index.ts
1217
- var import_api_core6 = require("@phygitallabs/api-core");
1218
-
1219
- // src/modules/scan-chip/hooks/index.tsx
1220
- var import_react3 = require("react");
1221
- var import_api_core7 = require("@phygitallabs/api-core");
1222
- var import_api_core8 = require("@phygitallabs/api-core");
1223
- function useScanChip({ token, id, onScanChipError }) {
1224
- const { updateHeaders } = (0, import_api_core8.usePGLCoreService)();
1225
- (0, import_react3.useEffect)(() => {
1226
- if (!!token) {
1227
- const header = {
1228
- "Chip-Authorization": token
1229
- };
1230
- setChipAuthToken(token);
1231
- updateHeaders(header);
1232
- }
1233
- }, [token, updateHeaders]);
1234
- const { data, isLoading, isError, isSuccess } = (0, import_api_core7.useChipScanStory)({
1235
- token,
1236
- id
1237
- });
1238
- (0, import_react3.useEffect)(() => {
1239
- if (isError) {
1240
- onScanChipError?.();
1241
- }
1242
- }, [isError, onScanChipError]);
1243
- if (!data)
1244
- return {
1245
- data: null,
1246
- isLoading,
1247
- isError,
1248
- isSuccess
1249
- };
1250
- return {
1251
- data: {
1252
- externalUrl: data?.external_url,
1253
- campaignDetail: data?.project,
1254
- locationDetail: data?.location,
1255
- scanCounter: data?.scan_counter,
1256
- campaignId: data?.campaign_id,
1257
- chipModelId: data?.chip_model_id,
1258
- organizationId: data?.organization_id,
1259
- projectId: data?.project_id,
1260
- locationId: data?.location_id,
1261
- chipUid: data?.uid
1262
- },
1263
- isLoading,
1264
- isError,
1265
- isSuccess
1266
- };
1267
- }
1268
-
1269
- // src/modules/campaign/hooks/useCampaignService.ts
1270
- var import_api_core9 = require("@phygitallabs/api-core");
1271
-
1272
- // src/modules/campaign/types/enums.ts
1273
- var import_api_core10 = require("@phygitallabs/api-core");
1274
-
1275
- // src/modules/campaign/types/campaign.ts
1276
- var TaskType = /* @__PURE__ */ ((TaskType2) => {
1277
- TaskType2["CHECK_IN"] = "check_in";
1278
- TaskType2["CREATE_MEMORY"] = "create_memory";
1279
- TaskType2["FILL_FORM"] = "fill_form";
1280
- TaskType2["SHARE"] = "share";
1281
- return TaskType2;
1282
- })(TaskType || {});
1283
-
1284
- // src/modules/location/hooks/useLocationService.ts
1285
- var import_api_core11 = require("@phygitallabs/api-core");
1286
-
1287
- // src/modules/location/utils/locationHelpers.ts
1288
- var sortLocationsByIndex = (locations) => {
1289
- return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
1290
- };
1291
- var filterLocationsByProperty = (locations, propertyName, value) => {
1292
- return locations.filter((location) => location[propertyName] === value);
1293
- };
1294
-
1295
- // src/modules/generate-certificate/hooks/index.ts
1296
- var import_generate_certificate2 = require("@phygitallabs/generate-certificate");
1297
-
1298
- // src/modules/generate-certificate/helpers/index.ts
1299
- var import_generate_certificate3 = require("@phygitallabs/generate-certificate");
1300
-
1301
- // src/modules/data-tracking/hooks/index.ts
1302
- var import_posthog_js = __toESM(require("posthog-js"), 1);
1303
-
1304
- // src/modules/session-replay/providers/SessionReplayProvider.tsx
1305
- var import_react4 = require("react");
1306
- var import_uuid2 = require("uuid");
1307
-
1308
- // src/modules/session-replay/utils/index.ts
1309
- var isBrowser = () => {
1310
- return typeof window !== "undefined";
1311
- };
1312
-
1313
- // src/modules/session-replay/providers/SessionReplayProvider.tsx
1314
- var import_jsx_runtime3 = require("react/jsx-runtime");
1315
- var TrackerContext = (0, import_react4.createContext)(null);
1316
- function defaultGetUserId() {
1317
- return (0, import_uuid2.v4)();
1318
- }
1319
- async function newTracker(config) {
1320
- try {
1321
- const OpenReplay = (await import("@openreplay/tracker")).default;
1322
- const getUserId = config?.userIdEnabled && config?.getUserId ? config.getUserId : defaultGetUserId;
1323
- const trackerConfig = {
1324
- projectKey: config?.projectKey || process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY,
1325
- ingestPoint: config?.ingestPoint,
1326
- // Capture options
1327
- captureExceptions: config.captureExceptions ?? true,
1328
- capturePerformance: config.capturePerformance ?? true,
1329
- // Network tracking
1330
- network: config.network || {
1331
- capturePayload: true,
1332
- sanitizer: (data) => data
1333
- },
1334
- // Console tracking
1335
- console: config.console || {
1336
- levels: ["error", "warn", "log"]
1337
- },
1338
- // Privacy settings
1339
- obscureTextEmails: config.obscureTextEmails ?? true,
1340
- obscureTextNumbers: config.obscureTextNumbers ?? false,
1341
- obscureInputEmails: config.obscureInputEmails ?? true,
1342
- // Development mode
1343
- __DISABLE_SECURE_MODE: config.__DISABLE_SECURE_MODE ?? (typeof process !== "undefined" && process.env?.NODE_ENV === "development")
1344
- };
1345
- const tracker = new OpenReplay(trackerConfig);
1346
- if (config?.userIdEnabled) {
1347
- const userId = getUserId();
1348
- tracker.setUserID(userId);
1349
- console.log("User ID set:", userId);
1350
- }
1351
- console.log("OpenReplay tracker initialized");
1352
- console.log("Project Key:", trackerConfig.projectKey);
1353
- console.log("Ingest Point:", trackerConfig.ingestPoint);
1354
- return tracker;
1355
- } catch (error) {
1356
- console.error("Failed to create tracker:", error);
1357
- throw error;
1358
- }
1359
- }
1360
- function reducer(state, action) {
1361
- const { debug = false } = state.config;
1362
- switch (action.type) {
1363
- case "init":
1364
- if (!state.tracker && isBrowser()) {
1365
- if (!state.config.projectKey && !process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY) {
1366
- console.warn(
1367
- debug,
1368
- "Project key not found. Skipping session replay initialization."
1369
- );
1370
- return state;
1371
- }
1372
- return {
1373
- ...state,
1374
- tracker: newTracker(state.config)
1375
- };
1376
- }
1377
- return state;
1378
- case "start":
1379
- if (state.tracker) {
1380
- Promise.resolve(state.tracker).then((tracker) => {
1381
- tracker.start();
1382
- console.log(debug, "Session replay tracker started");
1383
- }).catch((error) => {
1384
- console.error("Failed to start tracker:", error);
1385
- });
1386
- } else {
1387
- console.warn(debug, "Tracker not initialized. Call initTracker() first.");
1388
- }
1389
- return state;
1390
- case "setUserId":
1391
- if (state.tracker) {
1392
- Promise.resolve(state.tracker).then((tracker) => {
1393
- tracker.setUserID(action.payload);
1394
- console.log(debug, "User ID updated:", action.payload);
1395
- }).catch((error) => {
1396
- console.error("Failed to set user ID:", error);
1397
- });
1398
- } else {
1399
- console.warn(debug, "Tracker not initialized. Call initTracker() first.");
1400
- }
1401
- return state;
1402
- // Set metadata
1403
- case "setMetadata":
1404
- if (state.tracker) {
1405
- Promise.resolve(state.tracker).then((tracker) => {
1406
- Object.entries(action.payload || {})?.forEach(([key, value]) => {
1407
- tracker.setMetadata(key, value);
1408
- });
1409
- console.log(debug, "Metadata updated:", action.payload.metadata);
1410
- }).catch((error) => {
1411
- console.error("Failed to set metadata:", error);
1412
- });
1413
- } else {
1414
- console.warn(debug, "Tracker not initialized. Call initTracker() first.");
1415
- }
1416
- return state;
1417
- default:
1418
- return state;
1419
- }
1420
- }
1421
- var SessionReplayProvider = ({
1422
- children,
1423
- config = {}
1424
- }) => {
1425
- const [, dispatch] = (0, import_react4.useReducer)(reducer, {
1426
- tracker: null,
1427
- config
1428
- });
1429
- const initTracker = () => dispatch({ type: "init" });
1430
- const startTracking = () => dispatch({ type: "start" });
1431
- const setUserId = (userId) => dispatch({ type: "setUserId", payload: userId });
1432
- const setMetadata = (metadata) => dispatch({ type: "setMetadata", payload: metadata });
1433
- (0, import_react4.useEffect)(() => {
1434
- initTracker();
1435
- startTracking();
1436
- }, []);
1437
- return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(TrackerContext.Provider, { value: {
1438
- initTracker,
1439
- startTracking,
1440
- setUserId,
1441
- setMetadata
1442
- }, children });
1443
- };
1444
-
1445
- // src/modules/session-replay/hooks/useSessionReplay.ts
1446
- var import_react5 = require("react");
1447
- function useSessionReplay() {
1448
- const context = (0, import_react5.useContext)(TrackerContext);
1449
- if (!context) {
1450
- throw new Error(
1451
- "useSessionReplay must be used within a SessionReplayProvider. Make sure your component is wrapped with <SessionReplayProvider>."
1452
- );
1453
- }
1454
- return context;
1455
- }
1456
-
1457
- // src/modules/data-tracking/hooks/index.ts
1458
- var pushEventToDataLayer = (event, data) => {
1459
- try {
1460
- window.dataLayer = window.dataLayer || [];
1461
- window.dataLayer.push({
1462
- event,
1463
- ...data
1464
- });
1465
- } catch (error) {
1466
- console.error(error);
1467
- }
1468
- };
1469
- var pushEventToGA = (eventName, eventData) => {
1470
- if (typeof gtag != "function") {
1471
- console.error("gtag is not a function");
1472
- return;
1473
- }
1474
- gtag("event", eventName, eventData);
1475
- };
1476
- var pushEventToPosthog = (eventName, eventData) => {
1477
- import_posthog_js.default.capture(eventName, eventData);
1478
- };
1479
- function useDataTracking() {
1480
- const { setUserId, setMetadata } = useSessionReplay();
1481
- const trackEvent = (eventName, eventData, useTools) => {
1482
- useTools = useTools || ["gtm"];
1483
- if (useTools.includes("gtm") && typeof window !== "undefined") {
1484
- pushEventToDataLayer(eventName, eventData);
1485
- }
1486
- if (useTools.includes("ga") && typeof gtag == "function") {
1487
- pushEventToGA(eventName, eventData);
1488
- }
1489
- if (useTools.includes("posthog") && typeof import_posthog_js.default == "function") {
1490
- pushEventToPosthog(eventName, eventData);
1491
- }
1492
- };
1493
- const trackUserIdentify = (userInfo) => {
1494
- import_posthog_js.default.identify(userInfo.email, {
1495
- email: userInfo.email,
1496
- name: userInfo.name,
1497
- avatar: userInfo.avatar,
1498
- uid: userInfo.uid
1499
- });
1500
- setUserId(userInfo.id);
1501
- setMetadata({
1502
- user_email: userInfo.email
1503
- });
1504
- };
1505
- const trackLogoutEvent = () => {
1506
- import_posthog_js.default.capture("user_signed_out");
1507
- };
1508
- return {
1509
- trackEvent,
1510
- trackUserIdentify,
1511
- trackLogoutEvent
1512
- };
1513
- }
1514
-
1515
- // src/providers/TapquestCoreProvider.tsx
1516
- var import_react7 = require("react");
1517
-
1518
- // src/providers/ServicesProvider.tsx
1519
- var import_react6 = require("react");
1520
- var import_api_core12 = require("@phygitallabs/api-core");
1521
- var import_reward4 = require("@phygitallabs/reward");
1522
- var import_achievement5 = require("@phygitallabs/achievement");
1523
- var import_generate_certificate4 = require("@phygitallabs/generate-certificate");
1524
- var import_jsx_runtime4 = require("react/jsx-runtime");
1525
- var ServicesProvider = ({
1526
- children,
1527
- queryClient,
1528
- apiConfig = {
1529
- environment: "dev",
1530
- version: "v1"
1531
- }
1532
- }) => {
1533
- const { environment, version } = apiConfig;
1534
- const [commonServiceConfig, setCommonServiceConfig] = (0, import_react6.useState)(null);
1535
- (0, import_react6.useEffect)(() => {
1536
- const initClient = async () => {
1537
- try {
1538
- const deviceUid = await checkDeviceUid();
1539
- const responseInterceptors = {
1540
- onFulfilled: (response) => response,
1541
- onRejected: async (error) => Promise.reject(error)
1542
- };
1543
- const requestInterceptors = {
1544
- onFulfilled: (config2) => config2,
1545
- onRejected: (error) => Promise.reject(error)
1546
- };
1547
- const axiosConfig = {
1548
- headers: {
1549
- "Content-Type": "application/json",
1550
- "Device-UID": deviceUid
1551
- }
1552
- };
1553
- const config = {
1554
- queryClient,
1555
- axiosConfig,
1556
- responseInterceptors,
1557
- requestInterceptors,
1558
- useDevTool: true
1559
- };
1560
- setCommonServiceConfig(config);
1561
- } catch (error) {
1562
- console.error(error);
1563
- }
1564
- };
1565
- initClient();
1566
- }, [queryClient]);
1567
- if (!commonServiceConfig) {
1568
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_jsx_runtime4.Fragment, {});
1569
- }
1570
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1571
- import_api_core12.PGLCoreServiceProvider,
1572
- {
1573
- ...commonServiceConfig,
1574
- baseURL: `${service_default[environment].API_BASE_URL}/${version}`,
1575
- baseCoreURL: `${service_default[environment].API_BASE_CORE_URL}/${version}`,
1576
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1577
- import_reward4.RewardServiceProvider,
1578
- {
1579
- ...commonServiceConfig,
1580
- baseURL: `${service_default[environment].API_REWARD_URL}/v1`,
1581
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1582
- import_achievement5.AchievementServiceProvider,
1583
- {
1584
- ...commonServiceConfig,
1585
- baseURL: `${service_default[environment].API_ACHIEVEMENT_URL}/${version}`,
1586
- children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1587
- import_generate_certificate4.GenerateCertificateServiceProvider,
1588
- {
1589
- ...commonServiceConfig,
1590
- baseURL: `${service_default[environment].API_GENERATE_CERTIFICATE_URL}/v1`,
1591
- children
1592
- }
1593
- )
1594
- }
1595
- )
1596
- }
1597
- )
1598
- }
1599
- );
1600
- };
1601
-
1602
- // src/providers/TapquestCoreProvider.tsx
1603
- var import_jsx_runtime5 = require("react/jsx-runtime");
1604
- var TapquestCoreProvider = ({
1605
- children,
1606
- queryClient,
1607
- apiConfig
1608
- // authCallbacks
1609
- }) => {
1610
- const { environment } = apiConfig;
1611
- const sessionReplayConfig = (0, import_react7.useMemo)(() => {
1612
- const projectKey = process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY;
1613
- if (!projectKey) {
1614
- return void 0;
1615
- }
1616
- return {
1617
- projectKey,
1618
- ingestPoint: process.env.NEXT_PUBLIC_OPENREPLAY_INGEST_POINT,
1619
- debug: process.env.NODE_ENV === "development",
1620
- captureExceptions: true,
1621
- capturePerformance: true,
1622
- obscureTextEmails: true,
1623
- obscureInputEmails: true
1624
- };
1625
- }, []);
1626
- return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(SessionReplayProvider, { config: sessionReplayConfig, children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1627
- ServicesProvider,
1628
- {
1629
- queryClient,
1630
- apiConfig,
1631
- children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(
1632
- AuthProvider,
1633
- {
1634
- baseURL: `${service_default[environment].API_BASE_URL}`,
1635
- queryClient,
1636
- children
1637
- }
1638
- )
1639
- }
1640
- ) });
1641
- };
1642
-
1643
- // src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts
1644
- var import_achievement6 = require("@phygitallabs/achievement");
1645
- var import_useGroupReward = require("@phygitallabs/reward/src/hooks/useGroupReward");
1646
- var import_react8 = require("react");
1647
- function buildMappedAchievements(achievements, groupRewardData) {
1648
- if (!groupRewardData?.reward_models) return [];
1649
- const rewardModels = groupRewardData.reward_models;
1650
- return achievements.map((achievement, achievementIndex) => {
1651
- const parentReward = rewardModels[achievementIndex]?.[0] || null;
1652
- const subAchievements = achievement.subAchievementIds?.map((subId, subIndex) => {
1653
- const reward = rewardModels[achievementIndex * (achievement.subAchievementIds?.length || 0) + subIndex + 1]?.[0] || null;
1654
- return {
1655
- id: subId,
1656
- reward_model: reward
1657
- };
1658
- }) || [];
1659
- return {
1660
- id: achievement.id,
1661
- name: achievement.name,
1662
- reward_model: parentReward,
1663
- subAchievements
1664
- };
1665
- });
1666
- }
1667
- var useAchivementPlusRewardModel = ({ campaignId }) => {
1668
- const { data: achievements, isLoading: isLoadingAchievements } = (0, import_achievement6.useManyAchievements)(
1669
- {
1670
- "filter.labels": { campaign_id: campaignId },
1671
- "filter.type": "group_mission",
1672
- "pagination.limit": 200
1673
- },
1674
- { enabled: !!campaignId }
1675
- );
1676
- const groupRewardIds = (0, import_react8.useMemo)(() => {
1677
- if (!achievements?.data) return [];
1678
- return achievements.data.map((achievement) => achievement.groupRewardId).filter((id) => id !== void 0);
1679
- }, [achievements?.data]);
1680
- const {
1681
- mutate: fetchGroupRewardModels,
1682
- data: groupRewardModelsData,
1683
- isPending: isPendingGroupRewardModels
1684
- } = (0, import_useGroupReward.useCreateModelGroupReward)();
1685
- (0, import_react8.useEffect)(() => {
1686
- if (groupRewardIds.length > 0) {
1687
- fetchGroupRewardModels({ group_reward_ids: groupRewardIds });
1688
- }
1689
- }, [groupRewardIds, fetchGroupRewardModels]);
1690
- const mappedAchievements = (0, import_react8.useMemo)(() => {
1691
- if (!groupRewardModelsData?.data || !achievements?.data) return [];
1692
- return buildMappedAchievements(achievements.data, groupRewardModelsData.data);
1693
- }, [groupRewardModelsData, achievements?.data]);
1694
- return {
1695
- mappedAchievements,
1696
- isLoading: isLoadingAchievements || isPendingGroupRewardModels
1697
- };
1698
- };
1699
- var achivementPlusRewardModel_default = useAchivementPlusRewardModel;
1700
-
1701
- // src/modules/send-email/hooks/index.ts
1702
- var import_api_core13 = require("@phygitallabs/api-core");
1703
-
1704
- // src/helper/helpers.ts
1705
- var import_helpers5 = require("@phygitallabs/helpers");
1706
- // Annotate the CommonJS export names for ESM import in node:
1707
- 0 && (module.exports = {
1708
- ALLOWED_ORIGINS,
1709
- AchievementRuleActionType,
1710
- AchievementServiceProvider,
1711
- AchievementType,
1712
- AuthProvider,
1713
- CALLBACK_URL,
1714
- CampaignState,
1715
- CmentityRewardType,
1716
- NotificationProvider,
1717
- RewardClaimStatus,
1718
- TapquestCoreProvider,
1719
- TaskType,
1720
- UserSourceType,
1721
- accessTokenKey,
1722
- checkDeviceUid,
1723
- chipAuthTokenKey,
1724
- cn,
1725
- convertSnakeToCamel,
1726
- deviceUIDKey,
1727
- fileToBase64,
1728
- filterLocationsByProperty,
1729
- generateDeviceId,
1730
- getAccessToken,
1731
- getActionsFromAchievementRule,
1732
- getChipAuthToken,
1733
- getDeviceUid,
1734
- getLocationIdsFromAchievementRule,
1735
- getRefreshToken,
1736
- getRetryAttemptsRefreshToken,
1737
- getUserInfo,
1738
- httpMaxRetries,
1739
- isAchievementCompleted,
1740
- locationQueryKeys,
1741
- memoriesKey,
1742
- parse,
1743
- refreshTokenKey,
1744
- removeAccessToken,
1745
- removeChipAuthToken,
1746
- removeDeviceUid,
1747
- removeRefreshToken,
1748
- removeUserInfo,
1749
- resetMemoriesQuery,
1750
- retryAttemptsRefreshToken,
1751
- setAccessToken,
1752
- setChipAuthToken,
1753
- setDeviceUid,
1754
- setRefreshToken,
1755
- setRetryAttemptsRefreshToken,
1756
- setUserInfo,
1757
- sortLocationsByIndex,
1758
- useAchievementProgress,
1759
- useAchivementPlusRewardModel,
1760
- useAuth,
1761
- useCampaignDetail,
1762
- useCancelUserRewardsRequest,
1763
- useChipScanStory,
1764
- useClaimUserReward,
1765
- useClearUserRewardCache,
1766
- useCreateCertificate,
1767
- useCreateCertificateAnonymous,
1768
- useCreateCertificateWithMask,
1769
- useCreateMemory,
1770
- useCreateModelGroupReward,
1771
- useCreateRewardModel,
1772
- useDataTracking,
1773
- useDeleteRewardModel,
1774
- useGenerateFansipanCertificate,
1775
- useGenerateTemplateCertificate,
1776
- useGenerateThaocamvienCertificate,
1777
- useGetRewardModel,
1778
- useGetUserRewards,
1779
- useGoogleLogin,
1780
- useInfiniteMemories,
1781
- useListRewardModels,
1782
- useLocationDetail,
1783
- useLocationProgress,
1784
- useLocationsList,
1785
- useManyAchievementProgress,
1786
- useManyAchievements,
1787
- useManyAchievementsRewardModels,
1788
- useManyChildrenAchievements,
1789
- useManyMemory,
1790
- useManyUserActionLocations,
1791
- useManyUserRewards,
1792
- useMyProfile,
1793
- useOneAchievement,
1794
- useOneMemory,
1795
- useOneUserCampaign,
1796
- usePGLCoreService,
1797
- useScanChip,
1798
- useSendEmail,
1799
- useSyncCheckin,
1800
- useUpdateMyProfile,
1801
- useUpdateRewardModel,
1802
- useUploadMedia,
1803
- useUserAchievementAction,
1804
- useUserCampaignAction,
1805
- useV1ListRewards,
1806
- userInfoKey,
1807
- wrapTextWithFont
1808
- });
1809
- //# sourceMappingURL=index.cjs.map