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