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