@phygitallabs/tapquest-core 2.4.0 → 2.8.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.js ADDED
@@ -0,0 +1,1558 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __esm = (fn, res) => function __init() {
7
+ return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
8
+ };
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
22
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
23
+
24
+ // src/modules/auth/constants/index.ts
25
+ var userInfoKey, accessTokenKey, refreshTokenKey, httpMaxRetries, retryAttemptsRefreshToken, deviceUIDKey, chipAuthTokenKey;
26
+ var init_constants = __esm({
27
+ "src/modules/auth/constants/index.ts"() {
28
+ "use strict";
29
+ userInfoKey = "phygital-user-info";
30
+ accessTokenKey = "accessToken";
31
+ refreshTokenKey = "refreshToken";
32
+ httpMaxRetries = 3;
33
+ retryAttemptsRefreshToken = "retryAttemptsRefreshToken";
34
+ deviceUIDKey = "Device-UID";
35
+ chipAuthTokenKey = "chip-auth-token";
36
+ }
37
+ });
38
+
39
+ // src/modules/auth/services/FirebaseAuthService.ts
40
+ var firebaseApp, firebaseAuth, getFirebaseModules, FirebaseAuthService;
41
+ var init_FirebaseAuthService = __esm({
42
+ "src/modules/auth/services/FirebaseAuthService.ts"() {
43
+ "use strict";
44
+ init_constants();
45
+ getFirebaseModules = async () => {
46
+ if (typeof window === "undefined") {
47
+ throw new Error("Firebase can only be used in client environment");
48
+ }
49
+ if (!firebaseApp || !firebaseAuth) {
50
+ const [
51
+ { initializeApp, getApps },
52
+ {
53
+ getAuth,
54
+ signInWithEmailAndPassword,
55
+ createUserWithEmailAndPassword,
56
+ signInWithPopup,
57
+ GoogleAuthProvider,
58
+ signOut: signOut2,
59
+ sendPasswordResetEmail,
60
+ sendEmailVerification,
61
+ updatePassword,
62
+ onAuthStateChanged
63
+ }
64
+ ] = await Promise.all([
65
+ import("firebase/app"),
66
+ import("firebase/auth")
67
+ ]);
68
+ firebaseApp = { initializeApp, getApps };
69
+ firebaseAuth = {
70
+ getAuth,
71
+ signInWithEmailAndPassword,
72
+ createUserWithEmailAndPassword,
73
+ signInWithPopup,
74
+ GoogleAuthProvider,
75
+ signOut: signOut2,
76
+ sendPasswordResetEmail,
77
+ sendEmailVerification,
78
+ updatePassword,
79
+ onAuthStateChanged
80
+ };
81
+ }
82
+ return { firebaseApp, firebaseAuth };
83
+ };
84
+ FirebaseAuthService = class {
85
+ constructor(config) {
86
+ __publicField(this, "app");
87
+ __publicField(this, "auth");
88
+ __publicField(this, "googleProvider");
89
+ __publicField(this, "config");
90
+ __publicField(this, "initialized", false);
91
+ this.config = config;
92
+ }
93
+ async ensureInitialized() {
94
+ if (this.initialized) return;
95
+ const { firebaseApp: firebaseApp2, firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
96
+ if (!firebaseApp2.getApps().length) {
97
+ this.app = firebaseApp2.initializeApp(this.config);
98
+ } else {
99
+ this.app = firebaseApp2.getApps()[0];
100
+ }
101
+ this.auth = firebaseAuth2.getAuth(this.app);
102
+ this.googleProvider = new firebaseAuth2.GoogleAuthProvider();
103
+ this.initialized = true;
104
+ }
105
+ transformUserData(user) {
106
+ return {
107
+ id: user.uid,
108
+ uid: user.uid,
109
+ userName: user.displayName || "",
110
+ displayName: user.displayName || "",
111
+ email: user.email || "",
112
+ refreshToken: user.refreshToken,
113
+ accessToken: user.accessToken || "",
114
+ exp: user.stsTokenManager?.expirationTime || 0,
115
+ emailVerified: user.emailVerified,
116
+ avatar: user.photoURL || "/images/default-avatar.jpg",
117
+ signInProvider: this.getSignInProvider(user),
118
+ role: void 0,
119
+ scanStatus: false
120
+ };
121
+ }
122
+ getSignInProvider(user) {
123
+ const providers = user.providerData.map((p) => p.providerId);
124
+ if (providers.includes("google.com")) return "google.com";
125
+ return "password";
126
+ }
127
+ translateErrorCode(errorCode) {
128
+ switch (errorCode) {
129
+ case "auth/invalid-email":
130
+ return "Email kh\xF4ng h\u1EE3p l\u1EC7";
131
+ case "auth/user-disabled":
132
+ return "T\xE0i kho\u1EA3n \u0111\xE3 b\u1ECB kh\xF3a";
133
+ case "auth/wrong-password":
134
+ return "T\xE0i kho\u1EA3n/m\u1EADt kh\u1EA9u kh\xF4ng \u0111\xFAng";
135
+ case "auth/user-not-found":
136
+ return "T\xE0i kho\u1EA3n/m\u1EADt kh\u1EA9u kh\xF4ng \u0111\xFAng";
137
+ case "auth/weak-password":
138
+ return "Weak password! Please use stronger password.";
139
+ case "auth/email-already-in-use":
140
+ return "Email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng";
141
+ case "auth/account-exists-with-different-credential":
142
+ return "T\xE0i kho\u1EA3n email \u0111\xE3 \u0111\u01B0\u1EE3c s\u1EED d\u1EE5ng b\u1EDFi m\u1ED9t ph\u01B0\u01A1ng th\u1EE9c \u0111\u0103ng nh\u1EADp kh\xE1c";
143
+ case "auth/email-not-verified":
144
+ return "Email ch\u01B0a \u0111\u01B0\u1EE3c x\xE1c th\u1EF1c";
145
+ default:
146
+ return "\u0110\xE3 c\xF3 l\u1ED7i x\u1EA3y ra";
147
+ }
148
+ }
149
+ async signInWithEmailAndPassword(email, password) {
150
+ try {
151
+ await this.ensureInitialized();
152
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
153
+ const signInResponse = await firebaseAuth2.signInWithEmailAndPassword(this.auth, email, password);
154
+ const { user } = signInResponse;
155
+ const data = this.transformUserData(user);
156
+ const { emailVerified } = data;
157
+ if (!emailVerified) {
158
+ await this.signOut();
159
+ localStorage.removeItem("phygital-user-info");
160
+ localStorage.removeItem(accessTokenKey);
161
+ localStorage.removeItem(refreshTokenKey);
162
+ throw new Error("Email is not verified");
163
+ }
164
+ return {
165
+ errorCode: "",
166
+ data
167
+ };
168
+ } catch (err) {
169
+ const errorCode = this.translateErrorCode(err.code);
170
+ return {
171
+ errorCode,
172
+ data: null
173
+ };
174
+ }
175
+ }
176
+ async signInWithGoogle() {
177
+ try {
178
+ await this.ensureInitialized();
179
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
180
+ const signInResponse = await firebaseAuth2.signInWithPopup(this.auth, this.googleProvider);
181
+ const { user } = signInResponse;
182
+ const data = this.transformUserData(user);
183
+ const { emailVerified } = data;
184
+ if (!emailVerified) {
185
+ await this.signOut();
186
+ throw new Error("Email is not verified");
187
+ }
188
+ return {
189
+ errorCode: "",
190
+ data
191
+ };
192
+ } catch (err) {
193
+ const errorCode = this.translateErrorCode(err.code);
194
+ return {
195
+ errorCode,
196
+ data: null
197
+ };
198
+ }
199
+ }
200
+ async signUp(email, password) {
201
+ try {
202
+ await this.ensureInitialized();
203
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
204
+ const signUpResponse = await firebaseAuth2.createUserWithEmailAndPassword(this.auth, email, password);
205
+ const { user } = signUpResponse;
206
+ const data = this.transformUserData(user);
207
+ return {
208
+ errorCode: "",
209
+ data
210
+ };
211
+ } catch (err) {
212
+ const errorCode = this.translateErrorCode(err.code);
213
+ return {
214
+ errorCode,
215
+ data: null
216
+ };
217
+ }
218
+ }
219
+ async signOut() {
220
+ try {
221
+ await this.ensureInitialized();
222
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
223
+ await firebaseAuth2.signOut(this.auth);
224
+ } catch (err) {
225
+ console.log("Firebase signOut error:", err);
226
+ }
227
+ }
228
+ async sendPasswordResetEmail(email) {
229
+ await this.ensureInitialized();
230
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
231
+ const actionCodeSettings = {
232
+ url: window.location.origin,
233
+ handleCodeInApp: true
234
+ };
235
+ await firebaseAuth2.sendPasswordResetEmail(this.auth, email, actionCodeSettings);
236
+ }
237
+ async sendEmailVerification() {
238
+ await this.ensureInitialized();
239
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
240
+ if (!this.auth.currentUser) {
241
+ throw new Error("No current user");
242
+ }
243
+ const actionCodeSettings = {
244
+ url: window.location.origin,
245
+ handleCodeInApp: true
246
+ };
247
+ await firebaseAuth2.sendEmailVerification(this.auth.currentUser, actionCodeSettings);
248
+ }
249
+ async changePassword(newPassword) {
250
+ await this.ensureInitialized();
251
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
252
+ const user = this.auth.currentUser;
253
+ if (!user) {
254
+ throw new Error("No current user");
255
+ }
256
+ return firebaseAuth2.updatePassword(user, newPassword);
257
+ }
258
+ onAuthStateChanged(callback) {
259
+ if (typeof window === "undefined") {
260
+ return () => {
261
+ };
262
+ }
263
+ let unsubscriber = null;
264
+ this.ensureInitialized().then(async () => {
265
+ const { firebaseAuth: firebaseAuth2 } = await getFirebaseModules();
266
+ unsubscriber = firebaseAuth2.onAuthStateChanged(this.auth, (user) => {
267
+ if (user && user.emailVerified) {
268
+ const userData = this.transformUserData(user);
269
+ callback(userData);
270
+ } else {
271
+ callback(null);
272
+ }
273
+ });
274
+ });
275
+ return () => {
276
+ if (unsubscriber) {
277
+ unsubscriber();
278
+ }
279
+ };
280
+ }
281
+ getCurrentUser() {
282
+ if (typeof window === "undefined" || !this.initialized) {
283
+ return null;
284
+ }
285
+ const user = this.auth.currentUser;
286
+ if (user && user.emailVerified) {
287
+ return this.transformUserData(user);
288
+ }
289
+ return null;
290
+ }
291
+ };
292
+ }
293
+ });
294
+
295
+ // src/modules/auth/services/authServiceFactory.ts
296
+ var authServiceInstance, createAuthService, getAuthService, resetAuthService;
297
+ var init_authServiceFactory = __esm({
298
+ "src/modules/auth/services/authServiceFactory.ts"() {
299
+ "use strict";
300
+ init_FirebaseAuthService();
301
+ authServiceInstance = null;
302
+ createAuthService = (config) => {
303
+ if (!authServiceInstance) {
304
+ authServiceInstance = new FirebaseAuthService(config.firebaseConfig);
305
+ }
306
+ return authServiceInstance;
307
+ };
308
+ getAuthService = () => {
309
+ return authServiceInstance;
310
+ };
311
+ resetAuthService = () => {
312
+ authServiceInstance = null;
313
+ };
314
+ }
315
+ });
316
+
317
+ // src/modules/auth/services/index.ts
318
+ var services_exports = {};
319
+ __export(services_exports, {
320
+ FirebaseAuthService: () => FirebaseAuthService,
321
+ createAuthService: () => createAuthService,
322
+ getAuthService: () => getAuthService,
323
+ resetAuthService: () => resetAuthService
324
+ });
325
+ var init_services = __esm({
326
+ "src/modules/auth/services/index.ts"() {
327
+ "use strict";
328
+ init_FirebaseAuthService();
329
+ init_authServiceFactory();
330
+ }
331
+ });
332
+
333
+ // src/index.ts
334
+ var index_exports = {};
335
+ __export(index_exports, {
336
+ AchievementRuleActionType: () => AchievementRuleActionType,
337
+ AchievementServiceProvider: () => AchievementServiceProvider,
338
+ AchievementType: () => AchievementType,
339
+ AuthProvider: () => AuthProvider,
340
+ CampaignState: () => CampaignState,
341
+ CmentityRewardType: () => CmentityRewardType,
342
+ NotificationProvider: () => NotificationProvider,
343
+ RewardClaimStatus: () => RewardClaimStatus,
344
+ TapquestCoreProvider: () => TapquestCoreProvider,
345
+ TaskType: () => TaskType,
346
+ UserSourceType: () => UserSourceType,
347
+ accessTokenKey: () => accessTokenKey,
348
+ checkDeviceUid: () => checkDeviceUid,
349
+ chipAuthTokenKey: () => chipAuthTokenKey,
350
+ cn: () => cn,
351
+ convertSnakeToCamel: () => convertSnakeToCamel,
352
+ createRefreshTokenFunction: () => createRefreshTokenFunction,
353
+ deviceUIDKey: () => deviceUIDKey,
354
+ fileToBase64: () => fileToBase64,
355
+ filterLocationsByProperty: () => filterLocationsByProperty,
356
+ generateDeviceId: () => generateDeviceId,
357
+ getAccessToken: () => getAccessToken,
358
+ getActionsFromAchievementRule: () => getActionsFromAchievementRule,
359
+ getChipAuthToken: () => getChipAuthToken,
360
+ getDeviceUid: () => getDeviceUid,
361
+ getLocationIdsFromAchievementRule: () => getLocationIdsFromAchievementRule,
362
+ getRefreshToken: () => getRefreshToken,
363
+ getRetryAttemptsRefreshToken: () => getRetryAttemptsRefreshToken,
364
+ getUserInfo: () => getUserInfo,
365
+ httpMaxRetries: () => httpMaxRetries,
366
+ isAchievementCompleted: () => isAchievementCompleted,
367
+ locationQueryKeys: () => locationQueryKeys,
368
+ memoriesKey: () => memoriesKey,
369
+ parse: () => parse,
370
+ refreshTokenKey: () => refreshTokenKey,
371
+ removeAccessToken: () => removeAccessToken,
372
+ removeChipAuthToken: () => removeChipAuthToken,
373
+ removeDeviceUid: () => removeDeviceUid,
374
+ removeRefreshToken: () => removeRefreshToken,
375
+ removeUserInfo: () => removeUserInfo,
376
+ resetMemoriesQuery: () => resetMemoriesQuery,
377
+ retryAttemptsRefreshToken: () => retryAttemptsRefreshToken,
378
+ setAccessToken: () => setAccessToken,
379
+ setChipAuthToken: () => setChipAuthToken,
380
+ setDeviceUid: () => setDeviceUid,
381
+ setRefreshToken: () => setRefreshToken,
382
+ setRetryAttemptsRefreshToken: () => setRetryAttemptsRefreshToken,
383
+ setUserInfo: () => setUserInfo,
384
+ sortLocationsByIndex: () => sortLocationsByIndex,
385
+ useAchievementProgress: () => useAchievementProgress,
386
+ useAchivementPlusRewardModel: () => achivementPlusRewardModel_default,
387
+ useAuth: () => useAuth,
388
+ useCampaignDetail: () => useOneCampaign,
389
+ useCancelUserRewardsRequest: () => useCancelUserRewardsRequest,
390
+ useChipScanStory: () => useChipScanStory,
391
+ useClaimUserReward: () => useClaimUserReward,
392
+ useClearUserRewardCache: () => useClearUserRewardCache,
393
+ useCreateMemory: () => useCreateMemory,
394
+ useCreateModelGroupReward: () => useCreateModelGroupReward,
395
+ useCreateRewardModel: () => useApiCreateRewardModel,
396
+ useDataTracking: () => useDataTracking,
397
+ useDeleteRewardModel: () => useApiDeleteRewardModel,
398
+ useGenerateFansipanCertificate: () => useGenerateFansipanCertificate,
399
+ useGenerateTemplateCertificate: () => useGenerateTemplateCertificate,
400
+ useGenerateThaocamvienCertificate: () => useGenerateThaocamvienCertificate,
401
+ useGetRewardModel: () => useApiGetRewardModel,
402
+ useGetUserRewards: () => useGetUserRewards,
403
+ useInfiniteMemories: () => useInfiniteMemories,
404
+ useListRewardModels: () => useApiListRewardModels,
405
+ useLocationDetail: () => useOneLocation,
406
+ useLocationProgress: () => useUserCampaignsCompletedLocation,
407
+ useLocationsList: () => useManyLocations,
408
+ useManyAchievementProgress: () => useManyAchievementProgress,
409
+ useManyAchievements: () => useManyAchievements,
410
+ useManyAchievementsRewardModels: () => useManyAchievementsRewardModels,
411
+ useManyChildrenAchievements: () => useManyChildrenAchievements,
412
+ useManyMemory: () => useManyMemory,
413
+ useManyUserActionLocations: () => useManyUserActionLocations,
414
+ useManyUserRewards: () => useManyUserRewards,
415
+ useMyProfile: () => useMyProfile,
416
+ useOneAchievement: () => useOneAchievement,
417
+ useOneMemory: () => useOneMemory,
418
+ useOneUserCampaign: () => useOneUserCampaign,
419
+ usePGLCoreService: () => usePGLCoreService,
420
+ useScanChip: () => useScanChip,
421
+ useSendEmail: () => useSendEmail,
422
+ useSyncCheckin: () => useSyncCheckin,
423
+ useUpdateMyProfile: () => useUpdateMyProfile,
424
+ useUpdateRewardModel: () => useApiUpdateRewardModel,
425
+ useUploadMedia: () => useUploadMedia,
426
+ useUserAchievementAction: () => useUserAchievementAction,
427
+ useUserCampaignAction: () => useUserCampaignAction,
428
+ useV1ListRewards: () => useV1ListRewards,
429
+ userInfoKey: () => userInfoKey
430
+ });
431
+
432
+ // src/modules/achievement/hooks/index.ts
433
+ import { useManyAchievementProgress as useManyAchievementProgressCore } from "@phygitallabs/achievement";
434
+ import { useManyAchievementProgressByDevice as useManyAchievementProgressByDeviceCore } from "@phygitallabs/api-core";
435
+ import {
436
+ useAchievementProgress,
437
+ useManyAchievements,
438
+ useUserAchievementAction,
439
+ useManyChildrenAchievements,
440
+ useOneAchievement,
441
+ useManyAchievementsRewardModels
442
+ } from "@phygitallabs/achievement";
443
+
444
+ // src/modules/achievement/helpers/index.ts
445
+ var getLocationIdsFromAchievementRule = (achievement) => {
446
+ if (!achievement.rule) return [];
447
+ const locationIds = [];
448
+ Object.values(achievement.rule).forEach((ruleList) => {
449
+ if (!ruleList.rules) return;
450
+ ruleList.rules.forEach((rule) => {
451
+ if (!rule.filter) return;
452
+ Object.values(rule.filter).forEach((filterList) => {
453
+ if (!filterList.filters) return;
454
+ filterList.filters.forEach((filter) => {
455
+ if (filter.label === "location_id" && filter.value) {
456
+ if (Array.isArray(filter.value)) {
457
+ locationIds.push(...filter.value);
458
+ } else {
459
+ locationIds.push(filter.value);
460
+ }
461
+ }
462
+ });
463
+ });
464
+ });
465
+ });
466
+ return Array.from(new Set(locationIds));
467
+ };
468
+ var getActionsFromAchievementRule = (achievement) => {
469
+ if (!achievement.rule) return [];
470
+ const actions = [];
471
+ Object.values(achievement.rule).forEach((ruleList) => {
472
+ if (!ruleList.rules) return;
473
+ ruleList.rules.forEach((rule) => {
474
+ if (rule.action) {
475
+ actions.push(rule.action);
476
+ }
477
+ });
478
+ });
479
+ return Array.from(new Set(actions));
480
+ };
481
+ var isAchievementCompleted = (achievement) => {
482
+ return achievement.isCompleted || achievement.overallPercentage === 100;
483
+ };
484
+ function convertSnakeToCamel(obj) {
485
+ if (obj === null || obj === void 0) {
486
+ return obj;
487
+ }
488
+ if (Array.isArray(obj)) {
489
+ return obj.map(
490
+ (item) => convertSnakeToCamel(item)
491
+ );
492
+ }
493
+ if (typeof obj === "object" && obj.constructor === Object) {
494
+ const converted = {};
495
+ for (const key in obj) {
496
+ if (obj.hasOwnProperty(key)) {
497
+ const camelKey = key.replace(
498
+ /_([a-z])/g,
499
+ (_, letter) => letter.toUpperCase()
500
+ );
501
+ converted[camelKey] = convertSnakeToCamel(
502
+ obj[key]
503
+ );
504
+ }
505
+ }
506
+ return converted;
507
+ }
508
+ return obj;
509
+ }
510
+
511
+ // src/modules/achievement/hooks/index.ts
512
+ var useManyAchievementProgress = (params, options) => {
513
+ const isLoggedIn = !!params.userId;
514
+ const queryParams = isLoggedIn ? {
515
+ achievementIds: params.achievementIds,
516
+ userId: params.userId,
517
+ applicationId: params.applicationId
518
+ } : {
519
+ achievement_ids: params.achievementIds,
520
+ device_uid: params.deviceUid,
521
+ applicationId: params.applicationId
522
+ };
523
+ if (isLoggedIn) {
524
+ return useManyAchievementProgressCore(
525
+ queryParams,
526
+ {
527
+ ...options,
528
+ select: (data) => data.map((item) => ({
529
+ ...item,
530
+ isCompleted: isAchievementCompleted(item)
531
+ }))
532
+ }
533
+ );
534
+ }
535
+ return useManyAchievementProgressByDeviceCore(
536
+ queryParams,
537
+ {
538
+ ...options,
539
+ select: (data) => {
540
+ const camelCaseData = convertSnakeToCamel(data);
541
+ return camelCaseData.map((item) => ({
542
+ ...item,
543
+ isCompleted: isAchievementCompleted(item)
544
+ }));
545
+ }
546
+ }
547
+ );
548
+ };
549
+
550
+ // src/modules/achievement/types/index.ts
551
+ import {
552
+ AchievementRuleActionType,
553
+ AchievementServiceProvider
554
+ } from "@phygitallabs/achievement";
555
+ var AchievementType = /* @__PURE__ */ ((AchievementType2) => {
556
+ AchievementType2["DEFAULT"] = "default";
557
+ AchievementType2["MULTIPLE_CHECK_INS"] = "multiple_check_ins";
558
+ AchievementType2["RANDOM_CHECK_INS"] = "random_check_ins";
559
+ AchievementType2["GROUP_MISSION"] = "group_mission";
560
+ return AchievementType2;
561
+ })(AchievementType || {});
562
+
563
+ // src/modules/reward/hooks/useRewardService.ts
564
+ import {
565
+ useManyUserRewards,
566
+ useGetUserRewards,
567
+ useClaimUserReward,
568
+ useApiListRewardModels,
569
+ useApiGetRewardModel,
570
+ useApiCreateRewardModel,
571
+ useApiUpdateRewardModel,
572
+ useApiDeleteRewardModel,
573
+ useCreateModelGroupReward,
574
+ useClearUserRewardCache,
575
+ useV1ListRewards
576
+ } from "@phygitallabs/reward/src/hooks";
577
+
578
+ // src/modules/reward/types/enums.ts
579
+ import {
580
+ CmentityRewardType
581
+ } from "@phygitallabs/reward";
582
+ var RewardClaimStatus = /* @__PURE__ */ ((RewardClaimStatus2) => {
583
+ RewardClaimStatus2["NOT_CLAIMED"] = "not_claimed";
584
+ RewardClaimStatus2["CLAIMED"] = "claimed";
585
+ RewardClaimStatus2["IN_PROGRESS"] = "in_progress";
586
+ RewardClaimStatus2["FAILED"] = "failed";
587
+ return RewardClaimStatus2;
588
+ })(RewardClaimStatus || {});
589
+
590
+ // src/modules/notification/index.ts
591
+ var notification_exports = {};
592
+ __export(notification_exports, {
593
+ NotificationProvider: () => NotificationProvider
594
+ });
595
+ __reExport(notification_exports, notification_api_star);
596
+ import * as notification_api_star from "@phygitallabs/notification-api";
597
+
598
+ // src/modules/notification/providers/index.tsx
599
+ import { NotificationProvider as NotificationProviderApi } from "@phygitallabs/notification-api";
600
+
601
+ // src/constants/service.ts
602
+ var serviceApiUrl = {
603
+ dev: {
604
+ API_BASE_URL: "https://backend-dev.nomion.io",
605
+ API_BASE_CORE_URL: "https://backend-dev.nomion.io/core",
606
+ API_ACHIEVEMENT_URL: "https://backend-dev.nomion.io/achievement",
607
+ API_REWARD_URL: "https://backend-dev.nomion.io/reward",
608
+ API_GENERATE_CERTIFICATE_URL: "https://media-prc-dev.nomion.io/api",
609
+ API_NOTIFICATION_SOCKET_URL: "https://backend-dev.nomion.io/notification-ws/ws"
610
+ },
611
+ staging: {
612
+ API_BASE_URL: "https://backend-staging.nomion.io",
613
+ API_BASE_CORE_URL: "https://backend-staging.nomion.io/core",
614
+ API_ACHIEVEMENT_URL: "https://backend-staging.nomion.io/achievement",
615
+ API_REWARD_URL: "https://backend-staging.nomion.io/reward",
616
+ API_GENERATE_CERTIFICATE_URL: "https://media-prc-staging.nomion.io/api",
617
+ API_NOTIFICATION_SOCKET_URL: "https://backend-staging.nomion.io/notification-ws/ws"
618
+ },
619
+ production: {
620
+ API_BASE_URL: "https://backend.nomion.io",
621
+ API_BASE_CORE_URL: "https://backend.nomion.io/core",
622
+ API_ACHIEVEMENT_URL: "https://backend.nomion.io/achievement",
623
+ API_REWARD_URL: "https://backend.nomion.io/reward",
624
+ API_GENERATE_CERTIFICATE_URL: "https://media-prc.nomion.io/api",
625
+ API_NOTIFICATION_SOCKET_URL: "https://backend.nomion.io/notification-ws/ws"
626
+ }
627
+ };
628
+ var service_default = serviceApiUrl;
629
+
630
+ // src/modules/notification/providers/index.tsx
631
+ import { jsx } from "react/jsx-runtime";
632
+ var NotificationProvider = ({
633
+ children,
634
+ autoConnect = true,
635
+ environment = "dev",
636
+ user,
637
+ onWebSocketOpen,
638
+ onWebSocketClose,
639
+ onWebSocketMessage
640
+ }) => {
641
+ const webSocketUrl = service_default[environment]?.API_NOTIFICATION_SOCKET_URL;
642
+ return /* @__PURE__ */ jsx(
643
+ NotificationProviderApi,
644
+ {
645
+ userUid: user.id,
646
+ accessToken: user.accessToken,
647
+ webSocketUrl,
648
+ autoConnect,
649
+ onWebSocketOpen,
650
+ onWebSocketClose,
651
+ onWebSocketMessage,
652
+ children
653
+ }
654
+ );
655
+ };
656
+
657
+ // src/index.ts
658
+ __reExport(index_exports, notification_exports);
659
+
660
+ // src/modules/memory/hooks/index.ts
661
+ import { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey } from "@phygitallabs/api-core";
662
+
663
+ // src/modules/auth/providers/AuthProvider.tsx
664
+ import { createContext, useEffect, useContext } from "react";
665
+
666
+ // src/store/hooks.ts
667
+ import { useDispatch, useSelector } from "react-redux";
668
+ var useAppDispatch = () => useDispatch();
669
+ var useAppSelector = useSelector;
670
+
671
+ // src/modules/auth/store/authSlice.ts
672
+ import { createSlice } from "@reduxjs/toolkit";
673
+
674
+ // src/modules/auth/helpers/index.ts
675
+ init_constants();
676
+ import { v4 as uuidv4 } from "uuid";
677
+
678
+ // src/modules/auth/helpers/refreshToken.ts
679
+ import mem from "mem";
680
+ var REFRESH_TOKEN_CONFIG = {
681
+ maxAge: 1e4
682
+ // 10 seconds cache
683
+ };
684
+ var createRefreshTokenFunction = (config) => {
685
+ const refreshTokenFn = async () => {
686
+ try {
687
+ const session = getUserInfo();
688
+ const refreshToken = getRefreshToken();
689
+ if (!refreshToken) {
690
+ removeUserInfo();
691
+ return;
692
+ }
693
+ const params = new URLSearchParams();
694
+ params.append("grant_type", "refresh_token");
695
+ params.append("refresh_token", refreshToken);
696
+ const fetchData = {
697
+ method: "POST",
698
+ headers: new Headers({
699
+ "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"
700
+ }),
701
+ body: params
702
+ };
703
+ const response = await fetch(
704
+ `https://securetoken.googleapis.com/v1/token?key=${config.firebaseApiKey}`,
705
+ fetchData
706
+ );
707
+ const data = await response.json();
708
+ if (data.error) {
709
+ removeUserInfo();
710
+ return;
711
+ }
712
+ const newSession = {
713
+ ...session,
714
+ accessToken: data.access_token,
715
+ refreshToken: data.refresh_token
716
+ };
717
+ setUserInfo(newSession);
718
+ return newSession;
719
+ } catch {
720
+ removeUserInfo();
721
+ }
722
+ };
723
+ return mem(refreshTokenFn, { maxAge: REFRESH_TOKEN_CONFIG.maxAge });
724
+ };
725
+
726
+ // src/modules/auth/helpers/index.ts
727
+ var generateDeviceId = async () => {
728
+ try {
729
+ const deviceFingerprint = await generateDeviceFingerprint();
730
+ return deviceFingerprint;
731
+ } catch (error) {
732
+ console.error("Error generating device fingerprint:", error);
733
+ return uuidv4();
734
+ }
735
+ };
736
+ var generateDeviceFingerprint = async () => {
737
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString();
738
+ const fingerprintRaw = [
739
+ navigator.userAgent,
740
+ navigator.language,
741
+ screen.width,
742
+ screen.height,
743
+ screen.colorDepth,
744
+ Intl.DateTimeFormat().resolvedOptions().timeZone,
745
+ navigator.platform,
746
+ navigator.hardwareConcurrency,
747
+ timestamp
748
+ // Include timestamp
749
+ ].join("::");
750
+ const encoder = new TextEncoder();
751
+ const data = encoder.encode(fingerprintRaw);
752
+ const hashBuffer = await crypto.subtle.digest("SHA-256", data);
753
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
754
+ const fingerprint = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("");
755
+ return fingerprint;
756
+ };
757
+ var getDeviceUid = () => {
758
+ if (typeof window === "undefined") return null;
759
+ return localStorage.getItem(deviceUIDKey);
760
+ };
761
+ var setDeviceUid = (deviceId) => {
762
+ if (typeof window === "undefined") return;
763
+ localStorage.setItem(deviceUIDKey, deviceId);
764
+ };
765
+ var removeDeviceUid = () => {
766
+ if (typeof window === "undefined") return;
767
+ localStorage.removeItem(deviceUIDKey);
768
+ };
769
+ var checkDeviceUid = async () => {
770
+ let deviceUID = getDeviceUid();
771
+ if (!deviceUID) {
772
+ deviceUID = await generateDeviceId();
773
+ setDeviceUid(deviceUID);
774
+ }
775
+ return deviceUID;
776
+ };
777
+ var getChipAuthToken = () => {
778
+ if (typeof window === "undefined") return null;
779
+ return localStorage.getItem(chipAuthTokenKey);
780
+ };
781
+ var setChipAuthToken = (value) => {
782
+ if (typeof window === "undefined") return;
783
+ localStorage.setItem(chipAuthTokenKey, value);
784
+ };
785
+ var removeChipAuthToken = () => {
786
+ if (typeof window === "undefined") return;
787
+ localStorage.removeItem(chipAuthTokenKey);
788
+ };
789
+ var getRetryAttemptsRefreshToken = () => {
790
+ if (typeof window === "undefined") return null;
791
+ return localStorage.getItem(retryAttemptsRefreshToken);
792
+ };
793
+ var setRetryAttemptsRefreshToken = (value) => {
794
+ if (typeof window === "undefined") return;
795
+ localStorage.setItem(retryAttemptsRefreshToken, value);
796
+ };
797
+ var getAccessToken = () => {
798
+ if (typeof window === "undefined") return null;
799
+ return localStorage.getItem(accessTokenKey);
800
+ };
801
+ var setAccessToken = (value) => {
802
+ if (typeof window === "undefined") return;
803
+ localStorage.setItem(accessTokenKey, value);
804
+ };
805
+ var removeAccessToken = () => {
806
+ if (typeof window === "undefined") return;
807
+ localStorage.removeItem(accessTokenKey);
808
+ };
809
+ var getRefreshToken = () => {
810
+ if (typeof window === "undefined") return null;
811
+ return localStorage.getItem(refreshTokenKey);
812
+ };
813
+ var setRefreshToken = (value) => {
814
+ if (typeof window === "undefined") return;
815
+ localStorage.setItem(refreshTokenKey, value);
816
+ };
817
+ var removeRefreshToken = () => {
818
+ if (typeof window === "undefined") return;
819
+ localStorage.removeItem(refreshTokenKey);
820
+ };
821
+ var getUserInfo = () => {
822
+ if (typeof window === "undefined") return null;
823
+ const userInfo = localStorage.getItem(userInfoKey);
824
+ if (!userInfo) return null;
825
+ try {
826
+ return JSON.parse(userInfo);
827
+ } catch (error) {
828
+ console.error("Failed to parse stored user data:", error);
829
+ return null;
830
+ }
831
+ };
832
+ var setUserInfo = (userData) => {
833
+ if (typeof window === "undefined") return;
834
+ localStorage.setItem(userInfoKey, JSON.stringify(userData));
835
+ };
836
+ var removeUserInfo = () => {
837
+ if (typeof window === "undefined") return;
838
+ localStorage.removeItem(userInfoKey);
839
+ };
840
+
841
+ // src/modules/auth/store/authSlice.ts
842
+ var defaultUser = {
843
+ uid: "",
844
+ id: "",
845
+ userName: "",
846
+ displayName: "",
847
+ avatar: "/images/default-avatar.jpg",
848
+ email: "",
849
+ exp: 0,
850
+ emailVerified: false,
851
+ refreshToken: "",
852
+ accessToken: "",
853
+ role: "NULL" /* NULL */,
854
+ scanStatus: false
855
+ };
856
+ var initialState = {
857
+ user: defaultUser,
858
+ isSignedIn: false,
859
+ pending: true
860
+ };
861
+ var authSlice = createSlice({
862
+ name: "auth",
863
+ initialState,
864
+ reducers: {
865
+ signIn: (state, action) => {
866
+ const userData = action.payload;
867
+ state.user = userData;
868
+ state.isSignedIn = true;
869
+ state.pending = false;
870
+ setUserInfo(userData);
871
+ setAccessToken(userData.accessToken);
872
+ setRefreshToken(userData.refreshToken);
873
+ },
874
+ signOut: (state) => {
875
+ state.user = defaultUser;
876
+ state.isSignedIn = false;
877
+ state.pending = false;
878
+ removeUserInfo();
879
+ removeAccessToken();
880
+ removeRefreshToken();
881
+ },
882
+ updateScanStatus: (state, action) => {
883
+ state.user.scanStatus = action.payload;
884
+ setUserInfo(state.user);
885
+ },
886
+ refreshUser: (state, action) => {
887
+ const userData = action.payload;
888
+ if (userData) {
889
+ state.user = userData;
890
+ state.isSignedIn = true;
891
+ state.pending = false;
892
+ setUserInfo(userData);
893
+ setAccessToken(userData.accessToken);
894
+ setRefreshToken(userData.refreshToken);
895
+ }
896
+ },
897
+ setPending: (state, action) => {
898
+ state.pending = action.payload;
899
+ },
900
+ initializeFromStorage: (state) => {
901
+ const storedUser = getUserInfo();
902
+ const accessToken = getAccessToken();
903
+ if (storedUser && accessToken) {
904
+ state.user = storedUser;
905
+ state.isSignedIn = true;
906
+ }
907
+ state.pending = false;
908
+ }
909
+ }
910
+ });
911
+ var {
912
+ signIn,
913
+ signOut,
914
+ updateScanStatus,
915
+ refreshUser,
916
+ setPending,
917
+ initializeFromStorage
918
+ } = authSlice.actions;
919
+ var selectUser = (state) => state.auth.user;
920
+ var selectIsSignedIn = (state) => state.auth.isSignedIn;
921
+ var selectIsLoading = (state) => state.auth.pending;
922
+ var authSlice_default = authSlice.reducer;
923
+
924
+ // src/modules/auth/providers/AuthProvider.tsx
925
+ import { jsx as jsx2 } from "react/jsx-runtime";
926
+ var AuthContext = createContext(null);
927
+ function AuthProvider({ children, authService, authCallbacks }) {
928
+ const dispatch = useAppDispatch();
929
+ useEffect(() => {
930
+ dispatch(initializeFromStorage());
931
+ const unsubscribe = authService.onAuthStateChanged((user2) => {
932
+ if (user2) {
933
+ dispatch(signIn(user2));
934
+ if (authCallbacks?.onUserIdentify && user2.email) {
935
+ authCallbacks.onUserIdentify({
936
+ email: user2.email,
937
+ name: user2.displayName,
938
+ avatar: user2.avatar,
939
+ uid: user2.uid
940
+ });
941
+ }
942
+ if (authCallbacks?.onSignInSuccess) {
943
+ authCallbacks.onSignInSuccess(user2);
944
+ }
945
+ } else {
946
+ dispatch(signOut());
947
+ if (authCallbacks?.onTrackingReset) {
948
+ authCallbacks.onTrackingReset();
949
+ }
950
+ }
951
+ dispatch(setPending(false));
952
+ });
953
+ return () => {
954
+ unsubscribe();
955
+ };
956
+ }, [authService, dispatch, authCallbacks]);
957
+ const user = useAppSelector(selectUser);
958
+ const isSignedIn = useAppSelector(selectIsSignedIn);
959
+ const isLoading = useAppSelector(selectIsLoading);
960
+ const signInWithCredential = async (email, password) => {
961
+ const result = await authService.signInWithEmailAndPassword(email, password);
962
+ if (result.data && authCallbacks?.onSignInSuccess) {
963
+ authCallbacks.onSignInSuccess(result.data);
964
+ } else if (result.errorCode && authCallbacks?.onSignInError) {
965
+ authCallbacks.onSignInError(result.errorCode);
966
+ }
967
+ return result;
968
+ };
969
+ const signInWithGoogle = async () => {
970
+ const result = await authService.signInWithGoogle();
971
+ if (result.data && authCallbacks?.onSignInSuccess) {
972
+ authCallbacks.onSignInSuccess(result.data);
973
+ return result;
974
+ } else if (result.errorCode && authCallbacks?.onSignInError) {
975
+ authCallbacks.onSignInError(result.errorCode);
976
+ }
977
+ return null;
978
+ };
979
+ const signUp = async (email, password) => {
980
+ const result = await authService.signUp(email, password);
981
+ if (result.data && authCallbacks?.onSignUpSuccess) {
982
+ authCallbacks.onSignUpSuccess(result.data);
983
+ } else if (result.errorCode && authCallbacks?.onSignUpError) {
984
+ authCallbacks.onSignUpError(result.errorCode);
985
+ }
986
+ return result;
987
+ };
988
+ const signOut2 = async () => {
989
+ await authService.signOut();
990
+ dispatch(signOut());
991
+ if (authCallbacks?.onSignOutSuccess) {
992
+ authCallbacks.onSignOutSuccess();
993
+ }
994
+ };
995
+ const forgotPassword = async (email) => {
996
+ return await authService.sendPasswordResetEmail(email);
997
+ };
998
+ const sendEmailVerification = async () => {
999
+ return await authService.sendEmailVerification();
1000
+ };
1001
+ const changePassword = async (newPassword) => {
1002
+ return await authService.changePassword(newPassword);
1003
+ };
1004
+ const updateScanStatus2 = (status) => {
1005
+ dispatch(updateScanStatus(status));
1006
+ };
1007
+ const refreshUser2 = (userData) => {
1008
+ dispatch(refreshUser(userData));
1009
+ };
1010
+ const contextValue = {
1011
+ authService,
1012
+ authCallbacks,
1013
+ // User state
1014
+ user,
1015
+ isSignedIn,
1016
+ isLoading,
1017
+ // Auth actions
1018
+ signInWithCredential,
1019
+ signInWithGoogle,
1020
+ signUp,
1021
+ signOut: signOut2,
1022
+ // Password actions
1023
+ forgotPassword,
1024
+ sendEmailVerification,
1025
+ changePassword,
1026
+ // User management
1027
+ updateScanStatus: updateScanStatus2,
1028
+ refreshUser: refreshUser2
1029
+ };
1030
+ return /* @__PURE__ */ jsx2(AuthContext.Provider, { value: contextValue, children });
1031
+ }
1032
+ var useAuth = () => {
1033
+ const authContext = useContext(AuthContext);
1034
+ if (!authContext) {
1035
+ throw new Error("useAuth must be used within an AuthProvider");
1036
+ }
1037
+ return authContext;
1038
+ };
1039
+
1040
+ // src/modules/auth/index.ts
1041
+ init_constants();
1042
+
1043
+ // src/modules/user-profile/hooks/index.ts
1044
+ import { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest } from "@phygitallabs/api-core";
1045
+
1046
+ // src/modules/user-profile/types/index.ts
1047
+ import { UserSourceType } from "@phygitallabs/api-core";
1048
+
1049
+ // src/modules/scan-chip/hooks/index.tsx
1050
+ import { useEffect as useEffect2 } from "react";
1051
+ import { useChipScanStory } from "@phygitallabs/api-core";
1052
+ import { usePGLCoreService } from "@phygitallabs/api-core";
1053
+ function useScanChip({ token, id, onScanChipError }) {
1054
+ const { updateHeaders } = usePGLCoreService();
1055
+ useEffect2(() => {
1056
+ if (!!token) {
1057
+ const header = {
1058
+ "Chip-Authorization": token
1059
+ };
1060
+ setChipAuthToken(token);
1061
+ updateHeaders(header);
1062
+ }
1063
+ }, [token, updateHeaders]);
1064
+ const { data, isLoading, isError, isSuccess } = useChipScanStory({
1065
+ token,
1066
+ id
1067
+ });
1068
+ useEffect2(() => {
1069
+ if (isError) {
1070
+ onScanChipError?.();
1071
+ }
1072
+ }, [isError, onScanChipError]);
1073
+ if (!data)
1074
+ return {
1075
+ data: null,
1076
+ isLoading,
1077
+ isError,
1078
+ isSuccess
1079
+ };
1080
+ return {
1081
+ data: {
1082
+ externalUrl: data?.external_url,
1083
+ campaignDetail: data?.project,
1084
+ locationDetail: data?.location,
1085
+ scanCounter: data?.scan_counter,
1086
+ campaignId: data?.campaign_id,
1087
+ chipModelId: data?.chip_model_id,
1088
+ organizationId: data?.organization_id,
1089
+ projectId: data?.project_id,
1090
+ locationId: data?.location_id,
1091
+ chipUid: data?.uid
1092
+ },
1093
+ isLoading,
1094
+ isError,
1095
+ isSuccess
1096
+ };
1097
+ }
1098
+
1099
+ // src/modules/campaign/hooks/useCampaignService.ts
1100
+ import {
1101
+ useOneCampaign,
1102
+ useUserCampaignAction,
1103
+ useOneUserCampaign
1104
+ } from "@phygitallabs/api-core";
1105
+
1106
+ // src/modules/campaign/types/enums.ts
1107
+ import {
1108
+ CampaignState
1109
+ } from "@phygitallabs/api-core";
1110
+
1111
+ // src/modules/campaign/types/campaign.ts
1112
+ var TaskType = /* @__PURE__ */ ((TaskType2) => {
1113
+ TaskType2["CHECK_IN"] = "check_in";
1114
+ TaskType2["CREATE_MEMORY"] = "create_memory";
1115
+ TaskType2["FILL_FORM"] = "fill_form";
1116
+ TaskType2["SHARE"] = "share";
1117
+ return TaskType2;
1118
+ })(TaskType || {});
1119
+
1120
+ // src/modules/location/hooks/useLocationService.ts
1121
+ import {
1122
+ useManyLocations,
1123
+ useOneLocation,
1124
+ useUserCampaignsCompletedLocation,
1125
+ useManyUserActionLocations,
1126
+ locationQueryKeys
1127
+ } from "@phygitallabs/api-core";
1128
+
1129
+ // src/modules/location/utils/locationHelpers.ts
1130
+ var sortLocationsByIndex = (locations) => {
1131
+ return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));
1132
+ };
1133
+ var filterLocationsByProperty = (locations, propertyName, value) => {
1134
+ return locations.filter((location) => location[propertyName] === value);
1135
+ };
1136
+
1137
+ // src/modules/generate-certificate/hooks/index.ts
1138
+ import {
1139
+ useGenerateThaocamvienCertificate,
1140
+ useGenerateTemplateCertificate,
1141
+ useGenerateFansipanCertificate
1142
+ } from "@phygitallabs/generate-certificate";
1143
+
1144
+ // src/modules/data-tracking/hooks/index.ts
1145
+ import posthog from "posthog-js";
1146
+ var pushEventToDataLayer = (event, data) => {
1147
+ try {
1148
+ window.dataLayer = window.dataLayer || [];
1149
+ window.dataLayer.push({
1150
+ event,
1151
+ ...data
1152
+ });
1153
+ } catch (error) {
1154
+ console.error(error);
1155
+ }
1156
+ };
1157
+ var pushEventToGA = (eventName, eventData) => {
1158
+ if (typeof gtag != "function") {
1159
+ console.error("gtag is not a function");
1160
+ return;
1161
+ }
1162
+ gtag("event", eventName, eventData);
1163
+ };
1164
+ var pushEventToPosthog = (eventName, eventData) => {
1165
+ posthog.capture(eventName, eventData);
1166
+ };
1167
+ function useDataTracking() {
1168
+ const trackEvent = (eventName, eventData, useTools) => {
1169
+ useTools = useTools || ["gtm"];
1170
+ if (useTools.includes("gtm") && typeof window !== "undefined") {
1171
+ pushEventToDataLayer(eventName, eventData);
1172
+ }
1173
+ if (useTools.includes("ga") && typeof gtag == "function") {
1174
+ pushEventToGA(eventName, eventData);
1175
+ }
1176
+ if (useTools.includes("posthog") && typeof posthog == "function") {
1177
+ pushEventToPosthog(eventName, eventData);
1178
+ }
1179
+ };
1180
+ return {
1181
+ trackEvent
1182
+ };
1183
+ }
1184
+
1185
+ // src/providers/TapquestCoreProvider.tsx
1186
+ import { useState as useState2, useEffect as useEffect4 } from "react";
1187
+ import { Provider } from "react-redux";
1188
+ import { PersistGate } from "redux-persist/integration/react";
1189
+
1190
+ // src/providers/ServicesProvider.tsx
1191
+ import { useEffect as useEffect3, useState, useMemo } from "react";
1192
+ import { PGLCoreServiceProvider } from "@phygitallabs/api-core";
1193
+ import { RewardServiceProvider } from "@phygitallabs/reward";
1194
+ import { AchievementServiceProvider as AchievementServiceProvider2 } from "@phygitallabs/achievement";
1195
+ import { GenerateCertificateServiceProvider } from "@phygitallabs/generate-certificate";
1196
+ import axios from "axios";
1197
+ import { Fragment, jsx as jsx3 } from "react/jsx-runtime";
1198
+ var ServicesProvider = ({
1199
+ children,
1200
+ queryClient,
1201
+ apiConfig = {
1202
+ environment: "dev",
1203
+ version: "v1"
1204
+ },
1205
+ firebaseConfig
1206
+ }) => {
1207
+ const { refreshUser: refreshUser2, signOut: signOut2 } = useAuth();
1208
+ const { environment, version } = apiConfig;
1209
+ const [commonServiceConfig, setCommonServiceConfig] = useState(null);
1210
+ const memoizedRefreshToken = useMemo(() => {
1211
+ if (!firebaseConfig?.apiKey) {
1212
+ console.warn("Firebase API key not provided, refresh token functionality will not work");
1213
+ return null;
1214
+ }
1215
+ return createRefreshTokenFunction({
1216
+ firebaseApiKey: firebaseConfig.apiKey
1217
+ });
1218
+ }, [firebaseConfig?.apiKey]);
1219
+ useEffect3(() => {
1220
+ const initClient = async () => {
1221
+ try {
1222
+ const deviceUid = await checkDeviceUid();
1223
+ const responseInterceptors = {
1224
+ onFulfilled: (response) => response,
1225
+ onRejected: async (error) => {
1226
+ const originalRequest = error.config;
1227
+ if (error.response?.status === 401 && !originalRequest._retry) {
1228
+ const retryAttempts = parseInt(
1229
+ getRetryAttemptsRefreshToken() || "0",
1230
+ 10
1231
+ );
1232
+ if (retryAttempts >= httpMaxRetries) {
1233
+ await signOut2();
1234
+ return Promise.reject(error);
1235
+ }
1236
+ setRetryAttemptsRefreshToken(`${retryAttempts + 1}`);
1237
+ originalRequest._retry = true;
1238
+ try {
1239
+ if (!memoizedRefreshToken) {
1240
+ await signOut2();
1241
+ return Promise.reject(error);
1242
+ }
1243
+ const result = await memoizedRefreshToken();
1244
+ if (result?.accessToken) {
1245
+ originalRequest.headers["Authorization"] = `Bearer ${result.accessToken}`;
1246
+ setRetryAttemptsRefreshToken("0");
1247
+ refreshUser2(result);
1248
+ return axios(originalRequest);
1249
+ }
1250
+ } catch (refreshError) {
1251
+ console.log("Failed to refresh token:", refreshError);
1252
+ }
1253
+ }
1254
+ return Promise.reject(error);
1255
+ }
1256
+ };
1257
+ const requestInterceptors = {
1258
+ onFulfilled: (config2) => {
1259
+ const currentToken = getAccessToken();
1260
+ if (currentToken && !config2.headers.Authorization) {
1261
+ config2.headers.Authorization = `Bearer ${currentToken}`;
1262
+ }
1263
+ return config2;
1264
+ },
1265
+ onRejected: (error) => Promise.reject(error)
1266
+ };
1267
+ const axiosConfig = {
1268
+ headers: {
1269
+ "Content-Type": "application/json",
1270
+ "Device-UID": deviceUid
1271
+ }
1272
+ };
1273
+ const config = {
1274
+ queryClient,
1275
+ axiosConfig,
1276
+ responseInterceptors,
1277
+ requestInterceptors,
1278
+ useDevTool: true
1279
+ };
1280
+ setCommonServiceConfig(config);
1281
+ } catch (error) {
1282
+ console.error(error);
1283
+ }
1284
+ };
1285
+ initClient();
1286
+ }, [queryClient]);
1287
+ if (!commonServiceConfig) {
1288
+ return /* @__PURE__ */ jsx3(Fragment, {});
1289
+ }
1290
+ return /* @__PURE__ */ jsx3(
1291
+ PGLCoreServiceProvider,
1292
+ {
1293
+ ...commonServiceConfig,
1294
+ baseURL: `${service_default[environment].API_BASE_URL}/${version}`,
1295
+ baseCoreURL: `${service_default[environment].API_BASE_CORE_URL}/${version}`,
1296
+ children: /* @__PURE__ */ jsx3(
1297
+ RewardServiceProvider,
1298
+ {
1299
+ ...commonServiceConfig,
1300
+ baseURL: `${service_default[environment].API_REWARD_URL}/v1`,
1301
+ children: /* @__PURE__ */ jsx3(
1302
+ AchievementServiceProvider2,
1303
+ {
1304
+ ...commonServiceConfig,
1305
+ baseURL: `${service_default[environment].API_ACHIEVEMENT_URL}/${version}`,
1306
+ children: /* @__PURE__ */ jsx3(
1307
+ GenerateCertificateServiceProvider,
1308
+ {
1309
+ ...commonServiceConfig,
1310
+ baseURL: `${service_default[environment].API_GENERATE_CERTIFICATE_URL}/v1`,
1311
+ children
1312
+ }
1313
+ )
1314
+ }
1315
+ )
1316
+ }
1317
+ )
1318
+ }
1319
+ );
1320
+ };
1321
+
1322
+ // src/store/index.ts
1323
+ import { configureStore } from "@reduxjs/toolkit";
1324
+ import storage from "redux-persist/lib/storage";
1325
+ import { persistReducer, persistStore } from "redux-persist";
1326
+ var authPersistConfig = {
1327
+ key: "tapquest-auth",
1328
+ storage,
1329
+ whitelist: ["user", "isSignedIn"]
1330
+ // Only persist user and sign-in status
1331
+ };
1332
+ var persistedAuthReducer = persistReducer(authPersistConfig, authSlice.reducer);
1333
+ var store = configureStore({
1334
+ reducer: {
1335
+ auth: persistedAuthReducer
1336
+ },
1337
+ middleware: (getDefaultMiddleware) => getDefaultMiddleware({
1338
+ serializableCheck: {
1339
+ // Ignore redux-persist actions
1340
+ ignoredActions: [
1341
+ "persist/FLUSH",
1342
+ "persist/REHYDRATE",
1343
+ "persist/PAUSE",
1344
+ "persist/PERSIST",
1345
+ "persist/PURGE",
1346
+ "persist/REGISTER"
1347
+ ]
1348
+ }
1349
+ })
1350
+ });
1351
+ var persistor = persistStore(store);
1352
+
1353
+ // src/providers/TapquestCoreProvider.tsx
1354
+ import { jsx as jsx4 } from "react/jsx-runtime";
1355
+ var TapquestCoreProvider = ({
1356
+ children,
1357
+ queryClient,
1358
+ apiConfig,
1359
+ firebaseConfig,
1360
+ authCallbacks
1361
+ }) => {
1362
+ const [internalAuthService, setInternalAuthService] = useState2(null);
1363
+ useEffect4(() => {
1364
+ if (firebaseConfig && typeof window !== "undefined") {
1365
+ Promise.resolve().then(() => (init_services(), services_exports)).then(({ createAuthService: createAuthService2 }) => {
1366
+ try {
1367
+ const authService = createAuthService2({ firebaseConfig });
1368
+ setInternalAuthService(authService);
1369
+ } catch (error) {
1370
+ console.warn("Failed to create auth service from firebase config:", error);
1371
+ setInternalAuthService(null);
1372
+ }
1373
+ }).catch((error) => {
1374
+ console.warn("Failed to dynamically import auth services:", error);
1375
+ setInternalAuthService(null);
1376
+ });
1377
+ } else {
1378
+ setInternalAuthService(null);
1379
+ }
1380
+ }, [firebaseConfig]);
1381
+ return /* @__PURE__ */ jsx4(Provider, { store, children: /* @__PURE__ */ jsx4(PersistGate, { loading: null, persistor, children: /* @__PURE__ */ jsx4(
1382
+ AuthProvider,
1383
+ {
1384
+ authService: internalAuthService,
1385
+ authCallbacks,
1386
+ children: /* @__PURE__ */ jsx4(
1387
+ ServicesProvider,
1388
+ {
1389
+ queryClient,
1390
+ apiConfig,
1391
+ firebaseConfig,
1392
+ children
1393
+ }
1394
+ )
1395
+ }
1396
+ ) }) });
1397
+ };
1398
+
1399
+ // src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts
1400
+ import { useManyAchievements as useManyAchievements2 } from "@phygitallabs/achievement";
1401
+ import { useCreateModelGroupReward as useCreateModelGroupReward2 } from "@phygitallabs/reward/src/hooks/useGroupReward";
1402
+ import { useEffect as useEffect5, useMemo as useMemo2 } from "react";
1403
+ function buildMappedAchievements(achievements, groupRewardData) {
1404
+ if (!groupRewardData?.reward_models) return [];
1405
+ const rewardModels = groupRewardData.reward_models;
1406
+ return achievements.map((achievement, achievementIndex) => {
1407
+ const parentReward = rewardModels[achievementIndex]?.[0] || null;
1408
+ const subAchievements = achievement.subAchievementIds?.map((subId, subIndex) => {
1409
+ const reward = rewardModels[achievementIndex * (achievement.subAchievementIds?.length || 0) + subIndex + 1]?.[0] || null;
1410
+ return {
1411
+ id: subId,
1412
+ reward_model: reward
1413
+ };
1414
+ }) || [];
1415
+ return {
1416
+ id: achievement.id,
1417
+ name: achievement.name,
1418
+ reward_model: parentReward,
1419
+ subAchievements
1420
+ };
1421
+ });
1422
+ }
1423
+ var useAchivementPlusRewardModel = ({ campaignId }) => {
1424
+ const { data: achievements, isLoading: isLoadingAchievements } = useManyAchievements2(
1425
+ {
1426
+ "filter.labels": { campaign_id: campaignId },
1427
+ "filter.type": "group_mission",
1428
+ "pagination.limit": 200
1429
+ },
1430
+ { enabled: !!campaignId }
1431
+ );
1432
+ const groupRewardIds = useMemo2(() => {
1433
+ if (!achievements?.data) return [];
1434
+ return achievements.data.map((achievement) => achievement.groupRewardId).filter((id) => id !== void 0);
1435
+ }, [achievements?.data]);
1436
+ const {
1437
+ mutate: fetchGroupRewardModels,
1438
+ data: groupRewardModelsData,
1439
+ isPending: isPendingGroupRewardModels
1440
+ } = useCreateModelGroupReward2();
1441
+ useEffect5(() => {
1442
+ if (groupRewardIds.length > 0) {
1443
+ fetchGroupRewardModels({ group_reward_ids: groupRewardIds });
1444
+ }
1445
+ }, [groupRewardIds, fetchGroupRewardModels]);
1446
+ const mappedAchievements = useMemo2(() => {
1447
+ if (!groupRewardModelsData?.data || !achievements?.data) return [];
1448
+ return buildMappedAchievements(achievements.data, groupRewardModelsData.data);
1449
+ }, [groupRewardModelsData, achievements?.data]);
1450
+ return {
1451
+ mappedAchievements,
1452
+ isLoading: isLoadingAchievements || isPendingGroupRewardModels
1453
+ };
1454
+ };
1455
+ var achivementPlusRewardModel_default = useAchivementPlusRewardModel;
1456
+
1457
+ // src/modules/send-email/hooks/index.ts
1458
+ import { useSendEmail } from "@phygitallabs/api-core";
1459
+
1460
+ // src/helper/helpers.ts
1461
+ import { cn, parse, fileToBase64 } from "@phygitallabs/helpers";
1462
+ export {
1463
+ AchievementRuleActionType,
1464
+ AchievementServiceProvider,
1465
+ AchievementType,
1466
+ AuthProvider,
1467
+ CampaignState,
1468
+ CmentityRewardType,
1469
+ NotificationProvider,
1470
+ RewardClaimStatus,
1471
+ TapquestCoreProvider,
1472
+ TaskType,
1473
+ UserSourceType,
1474
+ accessTokenKey,
1475
+ checkDeviceUid,
1476
+ chipAuthTokenKey,
1477
+ cn,
1478
+ convertSnakeToCamel,
1479
+ createRefreshTokenFunction,
1480
+ deviceUIDKey,
1481
+ fileToBase64,
1482
+ filterLocationsByProperty,
1483
+ generateDeviceId,
1484
+ getAccessToken,
1485
+ getActionsFromAchievementRule,
1486
+ getChipAuthToken,
1487
+ getDeviceUid,
1488
+ getLocationIdsFromAchievementRule,
1489
+ getRefreshToken,
1490
+ getRetryAttemptsRefreshToken,
1491
+ getUserInfo,
1492
+ httpMaxRetries,
1493
+ isAchievementCompleted,
1494
+ locationQueryKeys,
1495
+ memoriesKey,
1496
+ parse,
1497
+ refreshTokenKey,
1498
+ removeAccessToken,
1499
+ removeChipAuthToken,
1500
+ removeDeviceUid,
1501
+ removeRefreshToken,
1502
+ removeUserInfo,
1503
+ resetMemoriesQuery,
1504
+ retryAttemptsRefreshToken,
1505
+ setAccessToken,
1506
+ setChipAuthToken,
1507
+ setDeviceUid,
1508
+ setRefreshToken,
1509
+ setRetryAttemptsRefreshToken,
1510
+ setUserInfo,
1511
+ sortLocationsByIndex,
1512
+ useAchievementProgress,
1513
+ achivementPlusRewardModel_default as useAchivementPlusRewardModel,
1514
+ useAuth,
1515
+ useOneCampaign as useCampaignDetail,
1516
+ useCancelUserRewardsRequest,
1517
+ useChipScanStory,
1518
+ useClaimUserReward,
1519
+ useClearUserRewardCache,
1520
+ useCreateMemory,
1521
+ useCreateModelGroupReward,
1522
+ useApiCreateRewardModel as useCreateRewardModel,
1523
+ useDataTracking,
1524
+ useApiDeleteRewardModel as useDeleteRewardModel,
1525
+ useGenerateFansipanCertificate,
1526
+ useGenerateTemplateCertificate,
1527
+ useGenerateThaocamvienCertificate,
1528
+ useApiGetRewardModel as useGetRewardModel,
1529
+ useGetUserRewards,
1530
+ useInfiniteMemories,
1531
+ useApiListRewardModels as useListRewardModels,
1532
+ useOneLocation as useLocationDetail,
1533
+ useUserCampaignsCompletedLocation as useLocationProgress,
1534
+ useManyLocations as useLocationsList,
1535
+ useManyAchievementProgress,
1536
+ useManyAchievements,
1537
+ useManyAchievementsRewardModels,
1538
+ useManyChildrenAchievements,
1539
+ useManyMemory,
1540
+ useManyUserActionLocations,
1541
+ useManyUserRewards,
1542
+ useMyProfile,
1543
+ useOneAchievement,
1544
+ useOneMemory,
1545
+ useOneUserCampaign,
1546
+ usePGLCoreService,
1547
+ useScanChip,
1548
+ useSendEmail,
1549
+ useSyncCheckin,
1550
+ useUpdateMyProfile,
1551
+ useApiUpdateRewardModel as useUpdateRewardModel,
1552
+ useUploadMedia,
1553
+ useUserAchievementAction,
1554
+ useUserCampaignAction,
1555
+ useV1ListRewards,
1556
+ userInfoKey
1557
+ };
1558
+ //# sourceMappingURL=index.js.map