@phygitallabs/tapquest-core 2.7.0 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +16 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +21 -15
- package/dist/index.js.map +1 -1
- package/package.json +4 -1
- package/src/providers/TapquestCoreProvider.tsx +20 -12
package/dist/index.cjs
CHANGED
|
@@ -1331,17 +1331,24 @@ var TapquestCoreProvider = ({
|
|
|
1331
1331
|
firebaseConfig,
|
|
1332
1332
|
authCallbacks
|
|
1333
1333
|
}) => {
|
|
1334
|
-
const internalAuthService = (0, import_react4.
|
|
1334
|
+
const [internalAuthService, setInternalAuthService] = (0, import_react4.useState)(null);
|
|
1335
|
+
(0, import_react4.useEffect)(() => {
|
|
1335
1336
|
if (firebaseConfig && typeof window !== "undefined") {
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1337
|
+
Promise.resolve().then(() => (init_services(), services_exports)).then(({ createAuthService: createAuthService2 }) => {
|
|
1338
|
+
try {
|
|
1339
|
+
const authService = createAuthService2({ firebaseConfig });
|
|
1340
|
+
setInternalAuthService(authService);
|
|
1341
|
+
} catch (error) {
|
|
1342
|
+
console.warn("Failed to create auth service from firebase config:", error);
|
|
1343
|
+
setInternalAuthService(null);
|
|
1344
|
+
}
|
|
1345
|
+
}).catch((error) => {
|
|
1346
|
+
console.warn("Failed to dynamically import auth services:", error);
|
|
1347
|
+
setInternalAuthService(null);
|
|
1348
|
+
});
|
|
1349
|
+
} else {
|
|
1350
|
+
setInternalAuthService(null);
|
|
1343
1351
|
}
|
|
1344
|
-
return null;
|
|
1345
1352
|
}, [firebaseConfig]);
|
|
1346
1353
|
return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react_redux2.Provider, { store, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(import_react5.PersistGate, { loading: null, persistor, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
|
|
1347
1354
|
AuthProvider,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/auth/constants/index.ts","../src/modules/auth/services/FirebaseAuthService.ts","../src/modules/auth/services/authServiceFactory.ts","../src/modules/auth/services/index.ts","../src/index.ts","../src/modules/achievement/hooks/index.ts","../src/modules/achievement/helpers/index.ts","../src/modules/achievement/types/index.ts","../src/modules/reward/hooks/useRewardService.ts","../src/modules/reward/types/enums.ts","../src/modules/notification/index.ts","../src/modules/notification/providers/index.tsx","../src/constants/service.ts","../src/modules/memory/hooks/index.ts","../src/modules/auth/providers/AuthProvider.tsx","../src/store/hooks.ts","../src/modules/auth/store/authSlice.ts","../src/modules/auth/helpers/index.ts","../src/modules/auth/helpers/refreshToken.ts","../src/modules/auth/index.ts","../src/modules/user-profile/hooks/index.ts","../src/modules/user-profile/types/index.ts","../src/modules/scan-chip/hooks/index.tsx","../src/modules/campaign/hooks/useCampaignService.ts","../src/modules/campaign/types/enums.ts","../src/modules/campaign/types/campaign.ts","../src/modules/location/hooks/useLocationService.ts","../src/modules/location/utils/locationHelpers.ts","../src/modules/generate-certificate/hooks/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/store/index.ts","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["export const userInfoKey = \"phygital-user-info\";\nexport const accessTokenKey = \"accessToken\";\nexport const refreshTokenKey = \"refreshToken\";\nexport const httpMaxRetries = 3;\nexport const retryAttemptsRefreshToken = \"retryAttemptsRefreshToken\";\n\nexport const deviceUIDKey = \"Device-UID\";\nexport const chipAuthTokenKey = \"chip-auth-token\";\n\n","// Client-side only imports\nlet firebaseApp: any;\nlet firebaseAuth: any;\n\n// Dynamic imports for client-side only\nconst getFirebaseModules = async () => {\n if (typeof window === 'undefined') {\n throw new Error('Firebase can only be used in client environment');\n }\n\n if (!firebaseApp || !firebaseAuth) {\n const [\n { initializeApp, getApps },\n {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n }\n ] = await Promise.all([\n import(\"firebase/app\"),\n import(\"firebase/auth\")\n ]);\n\n firebaseApp = { initializeApp, getApps };\n firebaseAuth = {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n };\n }\n\n return { firebaseApp, firebaseAuth };\n};\n\nimport { AuthService, FirebaseConfig, AuthResponse, UserData, SignInProvider } from \"../types\";\nimport { accessTokenKey, refreshTokenKey } from \"../constants\";\n\nexport class FirebaseAuthService implements AuthService {\n private app: any;\n private auth: any;\n private googleProvider: any;\n private config: FirebaseConfig;\n private initialized = false;\n\n constructor(config: FirebaseConfig) {\n this.config = config;\n // Initialization will be done lazily in client environment\n }\n\n private async ensureInitialized() {\n if (this.initialized) return;\n\n const { firebaseApp, firebaseAuth } = await getFirebaseModules();\n\n // Initialize Firebase app if not already initialized\n if (!firebaseApp.getApps().length) {\n this.app = firebaseApp.initializeApp(this.config);\n } else {\n this.app = firebaseApp.getApps()[0];\n }\n\n this.auth = firebaseAuth.getAuth(this.app);\n this.googleProvider = new firebaseAuth.GoogleAuthProvider();\n this.initialized = true;\n }\n\n private transformUserData(user: any): UserData {\n return {\n id: user.uid,\n uid: user.uid,\n userName: user.displayName || \"\",\n displayName: user.displayName || \"\",\n email: user.email || \"\",\n refreshToken: user.refreshToken,\n accessToken: (user as any).accessToken || \"\",\n exp: (user as any).stsTokenManager?.expirationTime || 0,\n emailVerified: user.emailVerified,\n avatar: user.photoURL || \"/images/default-avatar.jpg\",\n signInProvider: this.getSignInProvider(user),\n role: undefined,\n scanStatus: false,\n };\n }\n\n private getSignInProvider(user: any): SignInProvider {\n const providers = user.providerData.map((p: any) => p.providerId);\n if (providers.includes(\"google.com\")) return \"google.com\";\n return \"password\";\n }\n\n private translateErrorCode(errorCode: string): string {\n switch (errorCode) {\n case \"auth/invalid-email\":\n return \"Email không hợp lệ\";\n case \"auth/user-disabled\":\n return \"Tài khoản đã bị khóa\";\n case \"auth/wrong-password\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/user-not-found\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/weak-password\":\n return \"Weak password! Please use stronger password.\";\n case \"auth/email-already-in-use\":\n return \"Email đã được sử dụng\";\n case \"auth/account-exists-with-different-credential\":\n return \"Tài khoản email đã được sử dụng bởi một phương thức đăng nhập khác\";\n case \"auth/email-not-verified\":\n return \"Email chưa được xác thực\";\n default:\n return \"Đã có lỗi xảy ra\";\n }\n }\n\n async signInWithEmailAndPassword(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithEmailAndPassword(this.auth, email, password);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n localStorage.removeItem(\"phygital-user-info\");\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signInWithGoogle(): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithPopup(this.auth, this.googleProvider);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signUp(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signUpResponse = await firebaseAuth.createUserWithEmailAndPassword(this.auth, email, password);\n const { user } = signUpResponse;\n const data = this.transformUserData(user);\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n await firebaseAuth.signOut(this.auth);\n // Tracking is now handled through callbacks in the consuming app\n } catch (err) {\n console.log(\"Firebase signOut error:\", err);\n }\n }\n\n async sendPasswordResetEmail(email: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendPasswordResetEmail(this.auth, email, actionCodeSettings);\n }\n\n async sendEmailVerification(): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n if (!this.auth.currentUser) {\n throw new Error(\"No current user\");\n }\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendEmailVerification(this.auth.currentUser, actionCodeSettings);\n }\n\n async changePassword(newPassword: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const user = this.auth.currentUser;\n if (!user) {\n throw new Error(\"No current user\");\n }\n return firebaseAuth.updatePassword(user, newPassword);\n }\n\n onAuthStateChanged(callback: (user: UserData | null) => void): () => void {\n // For client-side only usage, ensure initialization before setting up auth state listener\n if (typeof window === 'undefined') {\n return () => { }; // Return empty unsubscriber for server-side\n }\n\n // Set up the listener asynchronously\n let unsubscriber: (() => void) | null = null;\n\n this.ensureInitialized().then(async () => {\n const { firebaseAuth } = await getFirebaseModules();\n unsubscriber = firebaseAuth.onAuthStateChanged(this.auth, (user: any) => {\n if (user && user.emailVerified) {\n const userData = this.transformUserData(user);\n callback(userData);\n } else {\n callback(null);\n }\n });\n });\n\n // Return unsubscriber function\n return () => {\n if (unsubscriber) {\n unsubscriber();\n }\n };\n }\n\n getCurrentUser(): UserData | null {\n if (typeof window === 'undefined' || !this.initialized) {\n return null; // Return null for server-side or before initialization\n }\n\n const user = this.auth.currentUser;\n if (user && user.emailVerified) {\n return this.transformUserData(user);\n }\n return null;\n }\n}","import { FirebaseAuthService } from \"./FirebaseAuthService\";\n\ninterface AuthServiceConfig {\n firebaseConfig: any;\n}\n\nlet authServiceInstance: FirebaseAuthService | null = null;\n\nexport const createAuthService = (config: AuthServiceConfig): FirebaseAuthService => {\n if (!authServiceInstance) {\n authServiceInstance = new FirebaseAuthService(config.firebaseConfig);\n }\n return authServiceInstance;\n};\n\nexport const getAuthService = (): FirebaseAuthService | null => {\n return authServiceInstance;\n};\n\nexport const resetAuthService = (): void => {\n authServiceInstance = null;\n};","// Export Firebase auth service separately to avoid loading Firebase modules during SSR\nexport { FirebaseAuthService } from './FirebaseAuthService';\nexport { createAuthService, getAuthService, resetAuthService } from './authServiceFactory';","// Export all modules\nexport * from \"./modules/achievement\";\nexport * from \"./modules/reward\";\nexport * from \"./modules/notification\";\nexport * from \"./modules/memory\";\n\nexport * from \"./modules/auth\";\nexport * from \"./modules/user-profile\";\n\nexport * from \"./modules/scan-chip\";\nexport * from \"./modules/campaign\";\n\nexport * from \"./modules/location\";\n\nexport * from \"./modules/generate-certificate\";\n\nexport * from \"./modules/data-tracking\";\n\nexport * from \"./providers\";\n\nexport * from \"./modules/achivementWithReward\";\n\nexport * from \"./modules/send-email\";\n\nexport * from \"./helper\";\n","import { GetManyAchievementProgressParams, GetManyDeviceUidAchievementProgressParams, GetManyUserOrDeviceAchievementProgressParams } from \"@phygitallabs/achievement\";\n\nimport {\n GetManyAchievementProgressByDeviceParams,\n} from \"@phygitallabs/api-core\";\n\nimport { useManyAchievementProgress as useManyAchievementProgressCore } from \"@phygitallabs/achievement\";\nimport { useManyAchievementProgressByDevice as useManyAchievementProgressByDeviceCore } from \"@phygitallabs/api-core\";\n\n// Core react query hooks\nimport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n} from \"@phygitallabs/achievement\";\n\nimport { isAchievementCompleted, convertSnakeToCamel } from \"../helpers\";\n\nexport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n}\n\n// Customize react query hooks\n\n// Get achievement progress list by userid or deviceuid base on login status\nexport const useManyAchievementProgress = (\n params: GetManyUserOrDeviceAchievementProgressParams,\n options?: any\n) => {\n\n const isLoggedIn = !!params.userId;\n\n const queryParams = isLoggedIn\n ? {\n achievementIds: params.achievementIds,\n userId: params.userId!,\n applicationId: params.applicationId,\n } as GetManyAchievementProgressParams\n : {\n achievement_ids: params.achievementIds,\n device_uid: params.deviceUid!,\n applicationId: params.applicationId,\n } as GetManyDeviceUidAchievementProgressParams;\n\n if (isLoggedIn) {\n return useManyAchievementProgressCore(queryParams as GetManyAchievementProgressParams,\n {\n ...options,\n select: (data) => data.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n })),\n }\n );\n }\n\n return useManyAchievementProgressByDeviceCore(\n queryParams as GetManyAchievementProgressByDeviceParams, {\n ...options,\n select: (data) => {\n const camelCaseData = convertSnakeToCamel(data);\n return camelCaseData.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n }));\n },\n });\n};\n\n// export const useManyAchievementWithProgress = (\n// params: UseManyAchievementWithProgressParams,\n// options?: {\n// achievementOptions?: Partial<UseQueryOptions>;\n// progressOptions?: Partial<UseQueryOptions>;\n// }\n// ): UseManyAchievementWithProgressReturn => {\n// // Fetch achievements with retry logic\n// const achievementsQuery = useManyAchievements(\n// {\n// ...(params.achievementIds?.length && { ids: params.achievementIds }),\n// },\n// {\n// retry: (failureCount: number, error: Error) => {\n// // Retry up to 3 times with exponential backoff\n// if (failureCount < 3) {\n// console.warn(`Achievement fetch failed, retrying... (${failureCount + 1}/3)`, error);\n// return true;\n// }\n// return false;\n// },\n// retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000),\n// staleTime: 5 * 60 * 1000, // 5 minutes\n// gcTime: 10 * 60 * 1000, // 10 minutes\n// ...options?.achievementOptions,\n// }\n// );\n\n// // Prepare achievement IDs for progress query\n// const achievementIds = useMemo(() => {\n// if (params.achievementIds?.length) {\n// return params.achievementIds;\n// }\n// return achievementsQuery.data?.data?.map((a: any) => a.id) || [];\n// }, [params.achievementIds, achievementsQuery.data]);\n\n// // Fetch progress with retry logic (dependent on achievements)\n// const progressQuery = useManyAchievementProgress(\n// {\n// achievementIds,\n// userId: params.userId,\n// deviceUid: params.deviceUid,\n// applicationId: params.applicationId,\n// },\n// {\n// enabled: achievementIds.length > 0\n// }\n// );\n\n// // Combine data with error flags\n// const combinedData = useMemo((): AchievementWithProgress[] => {\n// const achievements = achievementsQuery.data?.data || [];\n// const progressData = progressQuery.data || [];\n\n// return achievements.map((achievement: any) => {\n// const progress = progressData.find((p: any) => p.achievementId === achievement.id) || null;\n\n// return {\n// achievement,\n// progress,\n// hasAchievementError: !!achievementsQuery.error,\n// hasProgressError: !!progressQuery.error,\n// };\n// });\n// }, [achievementsQuery.data, progressQuery.data, achievementsQuery.error, progressQuery.error]);\n\n// // Refetch functions\n// const refetchAchievements = () => {\n// console.log(\"Manually refetching achievements...\");\n// achievementsQuery.refetch();\n// };\n\n// const refetchProgress = () => {\n// console.log(\"Manually refetching progress...\");\n// progressQuery.refetch();\n// };\n\n// const refetchAll = () => {\n// console.log(\"Manually refetching all data...\");\n// Promise.all([achievementsQuery.refetch(), progressQuery.refetch()]);\n// };\n\n// return {\n// data: combinedData,\n// isLoading: achievementsQuery.isLoading || (achievementIds.length > 0 && progressQuery.isLoading),\n// isSuccess: achievementsQuery.isSuccess && (achievementIds.length === 0 || progressQuery.isSuccess),\n// achievementsError: achievementsQuery.error as Error | null,\n// progressError: progressQuery.error as Error | null,\n// refetchAchievements,\n// refetchProgress,\n// refetchAll,\n// };\n// };\n\n","import { Achievement, UserAchievementProgress } from \"../types\";\n\nconst getLocationIdsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const locationIds: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (!rule.filter) return;\n Object.values(rule.filter).forEach((filterList) => {\n if (!filterList.filters) return;\n filterList.filters.forEach((filter) => {\n if (filter.label === \"location_id\" && filter.value) {\n if (Array.isArray(filter.value)) {\n locationIds.push(...filter.value);\n } else {\n locationIds.push(filter.value);\n }\n }\n });\n });\n });\n });\n return Array.from(new Set(locationIds)) as string[];\n};\n\nconst getActionsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const actions: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (rule.action) {\n actions.push(rule.action)\n }\n });\n });\n return Array.from(new Set(actions)) as string[];\n};\n\nconst isAchievementCompleted = (achievement: UserAchievementProgress) => {\n return achievement.isCompleted || achievement.overallPercentage === 100;\n}\n\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n ? `${T}${Capitalize<SnakeToCamelCase<U>>}`\n : S;\n\ntype ConvertSnakeToCamel<T> = T extends (infer U)[]\n ? ConvertSnakeToCamel<U>[]\n : T extends Record<string, unknown>\n ? {\n [K in keyof T as K extends string\n ? SnakeToCamelCase<K>\n : K]: ConvertSnakeToCamel<T[K]>;\n }\n : T;\n\n/**\n * Converts snake_case keys to camelCase keys in an object or array of objects\n */\nexport function convertSnakeToCamel<T>(obj: T): ConvertSnakeToCamel<T> {\n if (obj === null || obj === undefined) {\n return obj as ConvertSnakeToCamel<T>;\n }\n \n if (Array.isArray(obj)) {\n return obj.map((item) =>\n convertSnakeToCamel(item)\n ) as ConvertSnakeToCamel<T>;\n }\n \n if (typeof obj === \"object\" && obj.constructor === Object) {\n const converted: Record<string, unknown> = {};\n \n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase()\n );\n converted[camelKey] = convertSnakeToCamel(\n (obj as Record<string, unknown>)[key]\n );\n }\n }\n \n return converted as ConvertSnakeToCamel<T>;\n }\n \n return obj as ConvertSnakeToCamel<T>;\n }\n \n\nexport {\n getLocationIdsFromAchievementRule,\n getActionsFromAchievementRule,\n isAchievementCompleted\n}","export {\n AchievementRuleActionType,\n AchievementServiceProvider,\n} from \"@phygitallabs/achievement\";\n\nimport type { Achievement, GetAchievementProgressResponse, UserAchievementProgress } from \"@phygitallabs/achievement\";\n\nexport {\n Achievement,\n GetAchievementProgressResponse,\n UserAchievementProgress,\n}\n\n// Combined types for hooks\nexport interface AchievementWithProgress {\n achievement: Achievement;\n progress: UserAchievementProgress | null;\n hasProgressError?: boolean;\n hasAchievementError?: boolean;\n}\n\nexport interface UseManyAchievementWithProgressParams {\n userId?: string;\n deviceUid?: string;\n applicationId?: string;\n achievementIds?: string[];\n}\n\nexport interface UseManyAchievementWithProgressReturn {\n data: AchievementWithProgress[];\n isLoading: boolean;\n isSuccess: boolean;\n achievementsError: Error | null;\n progressError: Error | null;\n refetchAchievements: () => void;\n refetchProgress: () => void;\n refetchAll: () => void;\n}\n\nexport enum AchievementType {\n DEFAULT = \"default\",\n MULTIPLE_CHECK_INS = \"multiple_check_ins\",\n RANDOM_CHECK_INS = \"random_check_ins\",\n GROUP_MISSION = \"group_mission\",\n}\n","// Re-export from @phygitallabs/reward package\nexport {\n useManyUserRewards,\n useGetUserRewards,\n useClaimUserReward,\n useApiListRewardModels as useListRewardModels,\n useApiGetRewardModel as useGetRewardModel,\n useApiCreateRewardModel as useCreateRewardModel,\n useApiUpdateRewardModel as useUpdateRewardModel,\n useApiDeleteRewardModel as useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward/src/hooks\";","// Re-export from @phygitallabs/reward package\nexport {\n CmentityRewardType,\n type CmentityStatus\n} from \"@phygitallabs/reward\";\n\n// Define RewardClaimStatus locally since it's not exported from reward package\nexport enum RewardClaimStatus {\n NOT_CLAIMED = \"not_claimed\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n FAILED = \"failed\",\n}","export * from \"@phygitallabs/notification-api\";\nexport { NotificationProvider } from \"./providers\";","import React from \"react\";\nimport { NotificationProvider as NotificationProviderApi } from \"@phygitallabs/notification-api\";\n\nimport { EnvironmentType } from \"../../../types/common\";\n\nimport type { LPResponse } from \"@phygitallabs/notification-api\";\n\nimport serviceApiUrl from \"../../../constants/service\";\n\ninterface NotificationCallbacks {\n onWebSocketOpen?: (metadata: Record<string, any>) => void;\n onWebSocketClose?: (metadata: Record<string, any>) => void;\n onWebSocketMessage?: (data: LPResponse) => void;\n}\n\ninterface NotificationProviderProps extends NotificationCallbacks {\n children: React.ReactNode;\n autoConnect?: boolean;\n user: { id: string; accessToken: string | null };\n environment?: EnvironmentType;\n}\n\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n autoConnect = true,\n environment = \"dev\",\n user,\n onWebSocketOpen,\n onWebSocketClose,\n onWebSocketMessage,\n}) => {\n\n const webSocketUrl = serviceApiUrl[environment]?.API_NOTIFICATION_SOCKET_URL;\n\n return (\n <NotificationProviderApi\n userUid={user.id}\n accessToken={user.accessToken}\n webSocketUrl={webSocketUrl}\n autoConnect={autoConnect}\n onWebSocketOpen={onWebSocketOpen}\n onWebSocketClose={onWebSocketClose}\n onWebSocketMessage={onWebSocketMessage}\n >\n {children}\n </NotificationProviderApi>\n );\n};\n\nexport default NotificationProvider;","const serviceApiUrl = {\n dev: {\n API_BASE_URL: \"https://backend-dev.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-dev.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-dev.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-dev.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-dev.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-dev.nomion.io/notification-ws/ws\",\n },\n staging: {\n API_BASE_URL: \"https://backend-staging.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-staging.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-staging.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-staging.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-staging.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-staging.nomion.io/notification-ws/ws\",\n\n },\n production: {\n API_BASE_URL: \"https://backend.nomion.io\",\n API_BASE_CORE_URL: \"https://backend.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend.nomion.io/notification-ws/ws\",\n\n },\n}\n\nexport default serviceApiUrl;","import { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey } from \"@phygitallabs/api-core\";\n\nexport { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey };","import { createContext, useEffect, ReactNode, useContext } from 'react';\nimport { AuthService, AuthCallbacks } from '../types';\n\nimport { useAppSelector, useAppDispatch } from '../../../store/hooks';\nimport {\n selectUser,\n selectIsSignedIn,\n selectIsLoading,\n signIn as signInAction,\n signOut as signOutAction,\n updateScanStatus as updateScanStatusAction,\n refreshUser as refreshUserAction,\n setPending,\n initializeFromStorage,\n} from '../store/authSlice';\n\nimport { AuthResponse, UserData } from '../types';\n\nexport interface AuthContextType {\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n // User state\n user: UserData;\n isSignedIn: boolean;\n isLoading: boolean;\n\n // Auth actions\n signInWithCredential: (email: string, password: string) => Promise<AuthResponse>;\n signInWithGoogle: () => Promise<AuthResponse | null>;\n signUp: (email: string, password: string) => Promise<AuthResponse>;\n signOut: () => Promise<void>;\n\n // Password actions\n forgotPassword: (email: string) => Promise<void>;\n sendEmailVerification: () => Promise<void>;\n changePassword: (newPassword: string) => Promise<void>;\n\n // User management\n updateScanStatus: (status: boolean) => void;\n refreshUser: (userData: UserData) => void;\n\n}\n\nexport const AuthContext = createContext<AuthContextType | null>(null);\n\nexport interface AuthProviderProps {\n children: ReactNode;\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n}\n\nexport function AuthProvider({ children, authService, authCallbacks }: AuthProviderProps) {\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n // Initialize auth state from localStorage\n dispatch(initializeFromStorage());\n\n // Set up auth state listener\n const unsubscribe = authService.onAuthStateChanged((user) => {\n if (user) {\n dispatch(signInAction(user));\n\n // Use auth callback for user identification\n if (authCallbacks?.onUserIdentify && user.email) {\n authCallbacks.onUserIdentify({\n email: user.email,\n name: user.displayName,\n avatar: user.avatar,\n uid: user.uid,\n });\n }\n\n // Notify about successful sign in\n if (authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(user);\n }\n } else {\n dispatch(signOutAction());\n\n // Use auth callback for reset\n if (authCallbacks?.onTrackingReset) {\n authCallbacks.onTrackingReset();\n }\n }\n dispatch(setPending(false));\n });\n\n return () => {\n unsubscribe();\n };\n }, [authService, dispatch, authCallbacks]);\n\n // Redux selectors\n const user = useAppSelector(selectUser);\n const isSignedIn = useAppSelector(selectIsSignedIn);\n const isLoading = useAppSelector(selectIsLoading);\n\n // Auth actions with auth callbacks\n const signInWithCredential = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signInWithEmailAndPassword(email, password);\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return result;\n };\n\n const signInWithGoogle = async (): Promise<AuthResponse | null> => {\n const result = await authService.signInWithGoogle();\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n return result;\n\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return null;\n };\n\n const signUp = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signUp(email, password);\n\n if (result.data && authCallbacks?.onSignUpSuccess) {\n authCallbacks.onSignUpSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignUpError) {\n authCallbacks.onSignUpError(result.errorCode);\n }\n\n return result;\n };\n\n const signOut = async (): Promise<void> => {\n await authService.signOut();\n dispatch(signOutAction());\n\n if (authCallbacks?.onSignOutSuccess) {\n authCallbacks.onSignOutSuccess();\n }\n };\n\n // Password actions\n const forgotPassword = async (email: string): Promise<void> => {\n return await authService.sendPasswordResetEmail(email);\n };\n\n const sendEmailVerification = async (): Promise<void> => {\n return await authService.sendEmailVerification();\n };\n\n const changePassword = async (newPassword: string): Promise<void> => {\n return await authService.changePassword(newPassword);\n };\n\n // User management\n const updateScanStatus = (status: boolean): void => {\n dispatch(updateScanStatusAction(status));\n };\n\n const refreshUser = (userData: UserData): void => {\n dispatch(refreshUserAction(userData));\n };\n\n const contextValue: AuthContextType = {\n authService,\n authCallbacks,\n // User state\n user,\n isSignedIn,\n isLoading,\n\n // Auth actions\n signInWithCredential,\n signInWithGoogle,\n signUp,\n signOut,\n\n // Password actions\n forgotPassword,\n sendEmailVerification,\n changePassword,\n\n // User management\n updateScanStatus,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport const useAuth = () => {\n const authContext = useContext(AuthContext);\n if (!authContext) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return authContext;\n};","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { TapquestCoreRootState, TapquestCoreAppDispatch } from './index';\n\n// Typed hooks for internal use within tapquest-core\nexport const useAppDispatch = () => useDispatch<TapquestCoreAppDispatch>();\nexport const useAppSelector: TypedUseSelectorHook<TapquestCoreRootState> = useSelector;","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { UserData, UserRole } from \"../types\";\nimport {\n setUserInfo,\n removeUserInfo,\n getUserInfo,\n setAccessToken,\n setRefreshToken,\n removeAccessToken,\n removeRefreshToken,\n getAccessToken,\n} from \"../helpers\";\n\nconst defaultUser: UserData = {\n uid: \"\",\n id: \"\",\n userName: \"\",\n displayName: \"\",\n avatar: \"/images/default-avatar.jpg\",\n email: \"\",\n exp: 0,\n emailVerified: false,\n refreshToken: \"\",\n accessToken: \"\",\n role: UserRole.NULL,\n scanStatus: false,\n};\n\nexport interface AuthState {\n user: UserData;\n isSignedIn: boolean;\n pending: boolean;\n}\n\nconst initialState: AuthState = {\n user: defaultUser,\n isSignedIn: false,\n pending: true,\n};\n\nexport const authSlice = createSlice<\n AuthState,\n {\n signIn: (state: AuthState, action: PayloadAction<UserData>) => void;\n signOut: (state: AuthState) => void;\n updateScanStatus: (state: AuthState, action: PayloadAction<boolean>) => void;\n refreshUser: (state: AuthState, action: PayloadAction<UserData>) => void;\n setPending: (state: AuthState, action: PayloadAction<boolean>) => void;\n initializeFromStorage: (state: AuthState) => void;\n },\n 'auth'\n>({\n name: \"auth\",\n initialState,\n reducers: {\n signIn: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Store in localStorage for persistence\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n },\n signOut: (state) => {\n state.user = defaultUser;\n state.isSignedIn = false;\n state.pending = false;\n\n // Clear localStorage\n removeUserInfo();\n removeAccessToken();\n removeRefreshToken();\n },\n updateScanStatus: (state, action: PayloadAction<boolean>) => {\n state.user.scanStatus = action.payload;\n\n // Update localStorage\n setUserInfo(state.user);\n },\n refreshUser: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n if (userData) {\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Update localStorage\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n }\n },\n setPending: (state, action: PayloadAction<boolean>) => {\n state.pending = action.payload;\n },\n initializeFromStorage: (state) => {\n const storedUser = getUserInfo();\n const accessToken = getAccessToken();\n\n if (storedUser && accessToken) {\n state.user = storedUser;\n state.isSignedIn = true;\n }\n state.pending = false;\n },\n },\n});\n\nexport const {\n signIn,\n signOut,\n updateScanStatus,\n refreshUser,\n setPending,\n initializeFromStorage,\n} = authSlice.actions;\n\n// Selectors\nexport const selectAuth = (state: any) => state.auth;\nexport const selectUser = (state: any) => state.auth.user;\nexport const selectUserUId = (state: any) =>\n state.auth.user.uid || state.auth.user.id;\nexport const selectUserAccesstoken = (state: any) =>\n state.auth.user.accessToken;\nexport const selectUserEmail = (state: any) => state.auth.user.email;\nexport const selectUsername = (state: any) => state.auth.user.userName;\nexport const selectSignInProvider = (state: any) =>\n state.auth.user.signInProvider;\nexport const selectUserScanStatus = (state: any) =>\n state.auth.user.scanStatus;\nexport const selectIsSignedIn = (state: any) => state.auth.isSignedIn;\nexport const selectIsLoading = (state: any) => state.auth.pending;\n\nexport default authSlice.reducer;","import {\n deviceUIDKey,\n chipAuthTokenKey,\n retryAttemptsRefreshToken,\n accessTokenKey,\n refreshTokenKey,\n userInfoKey,\n} from \"../constants\";\n\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const generateDeviceId = async (): Promise<string> => {\n try {\n const deviceFingerprint = await generateDeviceFingerprint();\n return deviceFingerprint;\n } catch (error) {\n console.error(\"Error generating device fingerprint:\", error);\n return uuidv4();\n }\n};\n\nconst generateDeviceFingerprint = async (): Promise<string> => {\n const timestamp = new Date().toISOString(); // UTC timestamp\n\n const fingerprintRaw = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.platform,\n navigator.hardwareConcurrency,\n timestamp, // Include timestamp\n ].join(\"::\");\n\n const encoder = new TextEncoder();\n const data = encoder.encode(fingerprintRaw);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return fingerprint;\n};\n\nexport default generateDeviceFingerprint;\n\n\nexport const getDeviceUid = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(deviceUIDKey);\n};\n\nexport const setDeviceUid = (deviceId: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(deviceUIDKey, deviceId);\n};\n\nexport const removeDeviceUid = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(deviceUIDKey);\n};\n\nexport const checkDeviceUid = async (): Promise<string> => {\n // if (typeof window === \"undefined\") return null;\n\n let deviceUID = getDeviceUid();\n\n if (!deviceUID) {\n deviceUID = await generateDeviceId();\n setDeviceUid(deviceUID);\n }\n\n return deviceUID;\n};\n\n// CHIP AUTH TOKEN\nexport const getChipAuthToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(chipAuthTokenKey);\n};\n\nexport const setChipAuthToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(chipAuthTokenKey, value);\n};\n\nexport const removeChipAuthToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(chipAuthTokenKey);\n};\n\n// RETRY ATTEMPTS\nexport const getRetryAttemptsRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(retryAttemptsRefreshToken);\n};\n\nexport const setRetryAttemptsRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(retryAttemptsRefreshToken, value);\n};\n\n// ACCESS TOKEN\nexport const getAccessToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(accessTokenKey);\n};\n\nexport const setAccessToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(accessTokenKey, value);\n};\n\nexport const removeAccessToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(accessTokenKey);\n};\n\n// REFRESH TOKEN\nexport const getRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(refreshTokenKey);\n};\n\nexport const setRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(refreshTokenKey, value);\n};\n\nexport const removeRefreshToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(refreshTokenKey);\n};\n\n// USER INFO\nexport const getUserInfo = () => {\n if (typeof window === \"undefined\") return null;\n const userInfo = localStorage.getItem(userInfoKey);\n if (!userInfo) return null;\n try {\n return JSON.parse(userInfo);\n } catch (error) {\n console.error(\"Failed to parse stored user data:\", error);\n return null;\n }\n};\n\nexport const setUserInfo = (userData: any) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(userInfoKey, JSON.stringify(userData));\n};\n\nexport const removeUserInfo = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(userInfoKey);\n};\n\nexport { createRefreshTokenFunction } from \"./refreshToken\";\nexport type { RefreshTokenConfig } from \"./refreshToken\";","import mem from \"mem\";\nimport { setUserInfo, removeUserInfo, getUserInfo, getRefreshToken } from \"./index\";\n\n// Internal configuration - managed by tapquest-core\nconst REFRESH_TOKEN_CONFIG = {\n maxAge: 10000, // 10 seconds cache\n} as const;\n\nexport interface RefreshTokenConfig {\n firebaseApiKey: string;\n}\n\nconst createRefreshTokenFunction = (config: RefreshTokenConfig) => {\n const refreshTokenFn = async () => {\n try {\n const session = getUserInfo();\n const refreshToken = getRefreshToken();\n\n if (!refreshToken) {\n removeUserInfo();\n return;\n }\n\n const params = new URLSearchParams();\n params.append(\"grant_type\", \"refresh_token\");\n params.append(\"refresh_token\", refreshToken);\n\n const fetchData = {\n method: \"POST\",\n headers: new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n }),\n body: params,\n };\n\n const response = await fetch(\n `https://securetoken.googleapis.com/v1/token?key=${config.firebaseApiKey}`,\n fetchData\n );\n const data = await response.json();\n\n if (data.error) {\n removeUserInfo();\n return;\n }\n\n const newSession = {\n ...session,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n setUserInfo(newSession);\n\n return newSession;\n } catch {\n removeUserInfo();\n }\n };\n\n return mem(refreshTokenFn, { maxAge: REFRESH_TOKEN_CONFIG.maxAge });\n};\n\nexport { createRefreshTokenFunction };","// Export types\nexport type {\n UserData,\n UserRole,\n SignInProvider,\n AuthResponse,\n AuthService,\n FirebaseConfig,\n UseAuthReturn,\n AuthProviderProps,\n AuthCallbacks,\n} from './types';\n\n// Export hooks and providers\n// export { useAuth } from './hooks';\nexport { useAuth, AuthProvider } from './providers';\n\n// Export constants and helpers\nexport * from './constants';\nexport * from './helpers';","import { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest } from \"@phygitallabs/api-core\";\n\nexport { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest };","import { UserSourceType } from \"@phygitallabs/api-core\";\n\nexport { UserSourceType };","import { useEffect } from \"react\";\nimport { useChipScanStory } from \"@phygitallabs/api-core\";\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { setChipAuthToken } from \"../../auth/helpers\";\n\nimport { ScanChipResponse } from \"../types\";\n\ninterface UseScanChipProps {\n token?: string;\n id?: string;\n onScanChipError?: () => void;\n}\nexport { useChipScanStory, usePGLCoreService };\nexport function useScanChip({ token, id, onScanChipError }: UseScanChipProps): ScanChipResponse {\n const { updateHeaders } = usePGLCoreService();\n\n useEffect(() => {\n if (!!token) {\n\n const header = {\n \"Chip-Authorization\": token,\n };\n\n setChipAuthToken(token);\n updateHeaders(header);\n\n }\n }, [token, updateHeaders]);\n\n const { data, isLoading, isError, isSuccess } = useChipScanStory({\n token,\n id,\n });\n\n useEffect(() => {\n if (isError) {\n onScanChipError?.();\n }\n }, [isError, onScanChipError]);\n\n\n if (!data)\n return {\n data: null,\n isLoading,\n isError,\n isSuccess\n };\n\n return {\n data: {\n externalUrl: data?.external_url,\n campaignDetail: data?.project,\n locationDetail: data?.location,\n scanCounter: data?.scan_counter,\n campaignId: data?.campaign_id,\n chipModelId: data?.chip_model_id,\n organizationId: data?.organization_id,\n projectId: data?.project_id,\n locationId: data?.location_id,\n chipUid: data?.uid,\n },\n isLoading,\n isError,\n isSuccess\n }\n}","// Re-export from @phygitallabs/api-core package\nexport {\n useOneCampaign as useCampaignDetail,\n useUserCampaignAction,\n useOneUserCampaign,\n\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport {\n CampaignState\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport type {\n CampaignModel,\n UserCampaignModel,\n MissionWithProgress,\n TaskWithProgress,\n UserCampaignMission,\n Mission,\n MissionProgress,\n TaskProgress,\n} from \"@phygitallabs/api-core\";\n\nexport enum TaskType {\n CHECK_IN = \"check_in\",\n CREATE_MEMORY = \"create_memory\",\n FILL_FORM = \"fill_form\",\n SHARE = \"share\",\n}\n\n// Define other types locally since they're not exported from api-core package\nexport interface CampaignByProjectIdModel {\n id: string;\n certificate_index?: number;\n completed_checkin_rule?: number;\n completed_device_uids?: string[];\n completed_location_ids?: string[];\n completed_user_ids?: string[];\n description?: string;\n image_url?: string;\n is_custom_checkin_rule?: boolean;\n location_ids?: string[];\n name: string;\n total_completed?: number;\n user_campaign?: any;\n custom_info: Record<string, any>;\n mission: Record<string, any>;\n achievement_id: string;\n start_date: string;\n end_date: string;\n certificate: {\n image: any;\n title: string;\n };\n project_id?: string;\n status: string;\n created_at: number;\n updated_at: number;\n created_by?: string;\n updated_by?: string;\n}\n\n","// Re-export from @phygitallabs/api-core package\nexport {\n useManyLocations as useLocationsList,\n useOneLocation as useLocationDetail,\n useUserCampaignsCompletedLocation as useLocationProgress,\n useManyUserActionLocations,\n locationQueryKeys\n} from \"@phygitallabs/api-core\";","\nexport const sortLocationsByIndex = <T extends { index?: number }>(locations: T[]): T[] => {\n return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n};\n\n\nexport const filterLocationsByProperty = <T extends Record<string, any>>(\n locations: T[],\n propertyName: keyof T,\n value: boolean\n): T[] => {\n return locations.filter(location => location[propertyName] === value);\n};\n","import { \n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate\n} from \"@phygitallabs/generate-certificate\";\n\n\nexport { useGenerateThaocamvienCertificate, useGenerateTemplateCertificate, useGenerateFansipanCertificate };","import posthog from \"posthog-js\";\n\ndeclare global {\n interface Window {\n dataLayer: Record<string, any>[];\n }\n}\n\ndeclare function gtag(\n command: \"event\",\n eventName: string,\n eventParameters: Record<string, any>\n): void;\n\n\n// GTM\nconst pushEventToDataLayer = (event: string, data: Record<string, any>) => {\n try {\n window.dataLayer = window.dataLayer || [];\n\n window.dataLayer.push({\n event,\n ...data,\n });\n\n } catch (error) {\n console.error(error);\n }\n};\n\n// GA\nconst pushEventToGA = (eventName: string, eventData: Record<string, any>) => {\n if (typeof gtag != \"function\") {\n console.error(\"gtag is not a function\");\n return;\n }\n gtag(\"event\", eventName, eventData);\n};\n\n// Posthog\nconst pushEventToPosthog = (eventName: string, eventData: Record<string, any>) => {\n posthog.capture(eventName, eventData);\n};\n\nfunction useDataTracking() {\n const trackEvent = (eventName: string, eventData: Record<string, any>, useTools?: (\"gtm\" | \"ga\" | \"posthog\")[]) => {\n\n useTools = useTools || [\"gtm\"];\n\n if (useTools.includes(\"gtm\") && typeof window !== \"undefined\") {\n pushEventToDataLayer(eventName, eventData);\n }\n if (useTools.includes(\"ga\") && typeof gtag == \"function\") {\n pushEventToGA(eventName, eventData);\n }\n if (useTools.includes(\"posthog\") && typeof posthog == \"function\") {\n pushEventToPosthog(eventName, eventData);\n }\n };\n\n return {\n trackEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { useMemo } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { PersistGate } from \"redux-persist/integration/react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { store, persistor } from \"../store\";\nimport { AuthCallbacks } from \"../modules/auth/types\";\nimport { AuthProvider } from \"../modules/auth/providers\";\nimport { FirebaseConfig } from \"../modules/auth/types\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: FirebaseConfig;\n authCallbacks?: AuthCallbacks;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n firebaseConfig,\n authCallbacks\n}) => {\n\n const internalAuthService = useMemo(() => {\n if (firebaseConfig && typeof window !== \"undefined\") {\n try {\n // Dynamic import to avoid loading Firebase modules during build\n const { createAuthService } = require(\"../modules/auth/services\");\n return createAuthService({ firebaseConfig });\n } catch (error) {\n console.warn(\"Failed to create auth service from firebase config:\", error);\n return null;\n }\n }\n\n return null;\n }, [firebaseConfig]);\n\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <AuthProvider\n authService={internalAuthService}\n authCallbacks={authCallbacks}\n >\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n firebaseConfig={firebaseConfig}\n >\n {children}\n </ServicesProvider>\n </AuthProvider>\n\n </PersistGate>\n </Provider>\n );\n};","import React, { useEffect, useState, useMemo } from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { PGLCoreServiceProvider } from \"@phygitallabs/api-core\";\nimport { RewardServiceProvider } from \"@phygitallabs/reward\";\nimport { AchievementServiceProvider } from \"@phygitallabs/achievement\";\nimport { GenerateCertificateServiceProvider } from \"@phygitallabs/generate-certificate\";\n\nimport serviceApiUrl from \"../constants/service\";\nimport { APIConfig, ServiceConfig } from \"../types/service\";\n\nimport { checkDeviceUid, getAccessToken, getRetryAttemptsRefreshToken, setRetryAttemptsRefreshToken, createRefreshTokenFunction } from \"../modules/auth/helpers\";\n\nimport { httpMaxRetries } from \"../modules/auth\";\n\nimport { useAuth } from \"../modules/auth\";\n\nimport axios from \"axios\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: any;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n firebaseConfig\n}) => {\n const { refreshUser, signOut } = useAuth();\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\n\n // Create memoized refresh token function\n const memoizedRefreshToken = useMemo(() => {\n if (!firebaseConfig?.apiKey) {\n console.warn(\"Firebase API key not provided, refresh token functionality will not work\");\n return null;\n }\n return createRefreshTokenFunction({\n firebaseApiKey: firebaseConfig.apiKey\n });\n }, [firebaseConfig?.apiKey]);\n\n // Init client\n useEffect(() => {\n const initClient = async () => {\n try {\n const deviceUid = await checkDeviceUid();\n\n const responseInterceptors = ({\n onFulfilled: (response: any) => response,\n onRejected: async (error: any) => {\n\n // TODO: Remove\n // Feature: use refresh token to get new access token when token expired, have maximum `retry attempts`\n const originalRequest = error.config;\n\n if (error.response?.status === 401 && !originalRequest._retry) {\n const retryAttempts = parseInt(\n getRetryAttemptsRefreshToken() || \"0\",\n 10\n );\n\n if (retryAttempts >= httpMaxRetries) {\n await signOut();\n return Promise.reject(error);\n }\n\n setRetryAttemptsRefreshToken(`${retryAttempts + 1}`);\n originalRequest._retry = true;\n\n try {\n if (!memoizedRefreshToken) {\n await signOut();\n return Promise.reject(error);\n }\n\n const result = await memoizedRefreshToken();\n\n if (result?.accessToken) {\n originalRequest.headers[\n \"Authorization\"\n ] = `Bearer ${result.accessToken}`;\n\n setRetryAttemptsRefreshToken(\"0\");\n \n refreshUser(result);\n\n return axios(originalRequest);\n }\n } catch (refreshError) {\n console.log(\"Failed to refresh token:\", refreshError);\n }\n }\n\n return Promise.reject(error);\n },\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => {\n // Feature: set access token to request header\n const currentToken = getAccessToken();\n\n if (currentToken && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${currentToken}`;\n }\n return config;\n },\n onRejected: (error: any) => Promise.reject(error),\n })\n\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n \"Device-UID\": deviceUid,\n }\n }\n\n const config: ServiceConfig = {\n queryClient,\n axiosConfig,\n responseInterceptors,\n requestInterceptors,\n useDevTool: true,\n };\n\n setCommonServiceConfig(config);\n\n } catch (error) {\n console.error(error);\n }\n }\n\n initClient();\n }, [queryClient]);\n\n if (!commonServiceConfig) {\n return <></>\n }\n\n return (\n <PGLCoreServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}/${version}`}\n baseCoreURL={`${serviceApiUrl[environment].API_BASE_CORE_URL}/${version}`}\n >\n <RewardServiceProvider\n {...commonServiceConfig}\n // baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/${version}`}\n baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/v1`} // todo: using v1 until backend fully migrate\n >\n <AchievementServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_ACHIEVEMENT_URL}/${version}`}\n >\n <GenerateCertificateServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_GENERATE_CERTIFICATE_URL}/v1`}\n >\n {children}\n </GenerateCertificateServiceProvider>\n </AchievementServiceProvider>\n </RewardServiceProvider>\n </PGLCoreServiceProvider>\n );\n};\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport storage from \"redux-persist/lib/storage\";\nimport { persistReducer, persistStore, PersistConfig } from \"redux-persist\";\nimport { authSlice } from \"../modules/auth/store/authSlice\";\n\n// Auth persist config\nconst authPersistConfig: PersistConfig<any> = {\n key: \"tapquest-auth\",\n storage,\n whitelist: [\"user\", \"isSignedIn\"], // Only persist user and sign-in status\n};\n\n// Create persisted auth reducer\nconst persistedAuthReducer = persistReducer(authPersistConfig, authSlice.reducer);\n\n// Configure the tapquest-core store\nexport const store = configureStore({\n reducer: {\n auth: persistedAuthReducer,\n },\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Ignore redux-persist actions\n ignoredActions: [\n 'persist/FLUSH',\n 'persist/REHYDRATE',\n 'persist/PAUSE',\n 'persist/PERSIST',\n 'persist/PURGE',\n 'persist/REGISTER',\n ],\n },\n }),\n});\n\n// Create persistor\nexport const persistor = persistStore(store);\n\n// Export types\nexport type TapquestCoreRootState = ReturnType<typeof store.getState>;\nexport type TapquestCoreAppDispatch = typeof store.dispatch;\n\n// Export store instance for internal use\nexport { store as tapquestCoreStore };","import { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward/src/hooks/useGroupReward\";\nimport { useEffect, useMemo } from \"react\";\n\ninterface UseAchivementPlusRewardModelParams {\n campaignId: string;\n}\ninterface GroupRewardData {\n reward_models: EntityRewardModel[][];\n}\n\nfunction buildMappedAchievements(achievements: Achievement[], groupRewardData: GroupRewardData) {\n if (!groupRewardData?.reward_models) return [];\n\n const rewardModels = groupRewardData.reward_models;\n\n return achievements.map((achievement, achievementIndex) => {\n const parentReward = rewardModels[achievementIndex]?.[0] || null;\n\n const subAchievements =\n achievement.subAchievementIds?.map((subId: string, subIndex: number) => {\n const reward =\n rewardModels[\n achievementIndex * (achievement.subAchievementIds?.length || 0) +\n subIndex +\n 1\n ]?.[0] || null;\n\n return {\n id: subId,\n reward_model: reward,\n };\n }) || [];\n\n return {\n id: achievement.id,\n name: achievement.name,\n reward_model: parentReward,\n subAchievements,\n };\n });\n}\n\nconst useAchivementPlusRewardModel = ({ campaignId }: UseAchivementPlusRewardModelParams) => {\n const { data: achievements, isLoading: isLoadingAchievements } =\n useManyAchievements(\n {\n \"filter.labels\": { campaign_id: campaignId },\n \"filter.type\": \"group_mission\",\n \"pagination.limit\": 200,\n },\n { enabled: !!campaignId }\n );\n\n const groupRewardIds = useMemo(() => {\n if (!achievements?.data) return [];\n return achievements.data\n .map((achievement) => achievement.groupRewardId)\n .filter((id): id is string => id !== undefined);\n }, [achievements?.data]);\n const {\n mutate: fetchGroupRewardModels,\n data: groupRewardModelsData,\n isPending: isPendingGroupRewardModels,\n } = useCreateModelGroupReward();\n useEffect(() => {\n if (groupRewardIds.length > 0) {\n fetchGroupRewardModels({ group_reward_ids: groupRewardIds });\n }\n }, [groupRewardIds, fetchGroupRewardModels]);\n\n const mappedAchievements = useMemo(() => {\n if (!groupRewardModelsData?.data || !achievements?.data) return [];\n return buildMappedAchievements(achievements.data, groupRewardModelsData.data);\n }, [groupRewardModelsData, achievements?.data]);\n return {\n mappedAchievements,\n isLoading: isLoadingAchievements || isPendingGroupRewardModels,\n };\n};\n\nexport default useAchivementPlusRewardModel;\n","import { useSendEmail } from \"@phygitallabs/api-core\";\nexport {useSendEmail}","import { cn, parse, fileToBase64 } from \"@phygitallabs/helpers\";\n\nexport { cn, parse, fileToBase64 };"],"mappings":"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","names":["signOut","firebaseApp","firebaseAuth","import_achievement","useManyAchievementProgressCore","useManyAchievementProgressByDeviceCore","import_achievement","AchievementType","RewardClaimStatus","NotificationProviderApi","import_api_core","mem","uuidv4","import_jsx_runtime","user","signOut","updateScanStatus","refreshUser","import_api_core","import_api_core","import_react","import_api_core","import_api_core","import_api_core","TaskType","import_api_core","posthog","import_react","import_react_redux","import_react","import_api_core","import_reward","import_achievement","import_generate_certificate","import_jsx_runtime","refreshUser","signOut","axios","config","import_toolkit","storage","import_jsx_runtime","createAuthService","import_achievement","import_react","import_api_core","import_helpers"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/auth/constants/index.ts","../src/modules/auth/services/FirebaseAuthService.ts","../src/modules/auth/services/authServiceFactory.ts","../src/modules/auth/services/index.ts","../src/index.ts","../src/modules/achievement/hooks/index.ts","../src/modules/achievement/helpers/index.ts","../src/modules/achievement/types/index.ts","../src/modules/reward/hooks/useRewardService.ts","../src/modules/reward/types/enums.ts","../src/modules/notification/index.ts","../src/modules/notification/providers/index.tsx","../src/constants/service.ts","../src/modules/memory/hooks/index.ts","../src/modules/auth/providers/AuthProvider.tsx","../src/store/hooks.ts","../src/modules/auth/store/authSlice.ts","../src/modules/auth/helpers/index.ts","../src/modules/auth/helpers/refreshToken.ts","../src/modules/auth/index.ts","../src/modules/user-profile/hooks/index.ts","../src/modules/user-profile/types/index.ts","../src/modules/scan-chip/hooks/index.tsx","../src/modules/campaign/hooks/useCampaignService.ts","../src/modules/campaign/types/enums.ts","../src/modules/campaign/types/campaign.ts","../src/modules/location/hooks/useLocationService.ts","../src/modules/location/utils/locationHelpers.ts","../src/modules/generate-certificate/hooks/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/store/index.ts","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["export const userInfoKey = \"phygital-user-info\";\nexport const accessTokenKey = \"accessToken\";\nexport const refreshTokenKey = \"refreshToken\";\nexport const httpMaxRetries = 3;\nexport const retryAttemptsRefreshToken = \"retryAttemptsRefreshToken\";\n\nexport const deviceUIDKey = \"Device-UID\";\nexport const chipAuthTokenKey = \"chip-auth-token\";\n\n","// Client-side only imports\nlet firebaseApp: any;\nlet firebaseAuth: any;\n\n// Dynamic imports for client-side only\nconst getFirebaseModules = async () => {\n if (typeof window === 'undefined') {\n throw new Error('Firebase can only be used in client environment');\n }\n\n if (!firebaseApp || !firebaseAuth) {\n const [\n { initializeApp, getApps },\n {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n }\n ] = await Promise.all([\n import(\"firebase/app\"),\n import(\"firebase/auth\")\n ]);\n\n firebaseApp = { initializeApp, getApps };\n firebaseAuth = {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n };\n }\n\n return { firebaseApp, firebaseAuth };\n};\n\nimport { AuthService, FirebaseConfig, AuthResponse, UserData, SignInProvider } from \"../types\";\nimport { accessTokenKey, refreshTokenKey } from \"../constants\";\n\nexport class FirebaseAuthService implements AuthService {\n private app: any;\n private auth: any;\n private googleProvider: any;\n private config: FirebaseConfig;\n private initialized = false;\n\n constructor(config: FirebaseConfig) {\n this.config = config;\n // Initialization will be done lazily in client environment\n }\n\n private async ensureInitialized() {\n if (this.initialized) return;\n\n const { firebaseApp, firebaseAuth } = await getFirebaseModules();\n\n // Initialize Firebase app if not already initialized\n if (!firebaseApp.getApps().length) {\n this.app = firebaseApp.initializeApp(this.config);\n } else {\n this.app = firebaseApp.getApps()[0];\n }\n\n this.auth = firebaseAuth.getAuth(this.app);\n this.googleProvider = new firebaseAuth.GoogleAuthProvider();\n this.initialized = true;\n }\n\n private transformUserData(user: any): UserData {\n return {\n id: user.uid,\n uid: user.uid,\n userName: user.displayName || \"\",\n displayName: user.displayName || \"\",\n email: user.email || \"\",\n refreshToken: user.refreshToken,\n accessToken: (user as any).accessToken || \"\",\n exp: (user as any).stsTokenManager?.expirationTime || 0,\n emailVerified: user.emailVerified,\n avatar: user.photoURL || \"/images/default-avatar.jpg\",\n signInProvider: this.getSignInProvider(user),\n role: undefined,\n scanStatus: false,\n };\n }\n\n private getSignInProvider(user: any): SignInProvider {\n const providers = user.providerData.map((p: any) => p.providerId);\n if (providers.includes(\"google.com\")) return \"google.com\";\n return \"password\";\n }\n\n private translateErrorCode(errorCode: string): string {\n switch (errorCode) {\n case \"auth/invalid-email\":\n return \"Email không hợp lệ\";\n case \"auth/user-disabled\":\n return \"Tài khoản đã bị khóa\";\n case \"auth/wrong-password\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/user-not-found\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/weak-password\":\n return \"Weak password! Please use stronger password.\";\n case \"auth/email-already-in-use\":\n return \"Email đã được sử dụng\";\n case \"auth/account-exists-with-different-credential\":\n return \"Tài khoản email đã được sử dụng bởi một phương thức đăng nhập khác\";\n case \"auth/email-not-verified\":\n return \"Email chưa được xác thực\";\n default:\n return \"Đã có lỗi xảy ra\";\n }\n }\n\n async signInWithEmailAndPassword(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithEmailAndPassword(this.auth, email, password);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n localStorage.removeItem(\"phygital-user-info\");\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signInWithGoogle(): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithPopup(this.auth, this.googleProvider);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signUp(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signUpResponse = await firebaseAuth.createUserWithEmailAndPassword(this.auth, email, password);\n const { user } = signUpResponse;\n const data = this.transformUserData(user);\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n await firebaseAuth.signOut(this.auth);\n // Tracking is now handled through callbacks in the consuming app\n } catch (err) {\n console.log(\"Firebase signOut error:\", err);\n }\n }\n\n async sendPasswordResetEmail(email: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendPasswordResetEmail(this.auth, email, actionCodeSettings);\n }\n\n async sendEmailVerification(): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n if (!this.auth.currentUser) {\n throw new Error(\"No current user\");\n }\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendEmailVerification(this.auth.currentUser, actionCodeSettings);\n }\n\n async changePassword(newPassword: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const user = this.auth.currentUser;\n if (!user) {\n throw new Error(\"No current user\");\n }\n return firebaseAuth.updatePassword(user, newPassword);\n }\n\n onAuthStateChanged(callback: (user: UserData | null) => void): () => void {\n // For client-side only usage, ensure initialization before setting up auth state listener\n if (typeof window === 'undefined') {\n return () => { }; // Return empty unsubscriber for server-side\n }\n\n // Set up the listener asynchronously\n let unsubscriber: (() => void) | null = null;\n\n this.ensureInitialized().then(async () => {\n const { firebaseAuth } = await getFirebaseModules();\n unsubscriber = firebaseAuth.onAuthStateChanged(this.auth, (user: any) => {\n if (user && user.emailVerified) {\n const userData = this.transformUserData(user);\n callback(userData);\n } else {\n callback(null);\n }\n });\n });\n\n // Return unsubscriber function\n return () => {\n if (unsubscriber) {\n unsubscriber();\n }\n };\n }\n\n getCurrentUser(): UserData | null {\n if (typeof window === 'undefined' || !this.initialized) {\n return null; // Return null for server-side or before initialization\n }\n\n const user = this.auth.currentUser;\n if (user && user.emailVerified) {\n return this.transformUserData(user);\n }\n return null;\n }\n}","import { FirebaseAuthService } from \"./FirebaseAuthService\";\n\ninterface AuthServiceConfig {\n firebaseConfig: any;\n}\n\nlet authServiceInstance: FirebaseAuthService | null = null;\n\nexport const createAuthService = (config: AuthServiceConfig): FirebaseAuthService => {\n if (!authServiceInstance) {\n authServiceInstance = new FirebaseAuthService(config.firebaseConfig);\n }\n return authServiceInstance;\n};\n\nexport const getAuthService = (): FirebaseAuthService | null => {\n return authServiceInstance;\n};\n\nexport const resetAuthService = (): void => {\n authServiceInstance = null;\n};","// Export Firebase auth service separately to avoid loading Firebase modules during SSR\nexport { FirebaseAuthService } from './FirebaseAuthService';\nexport { createAuthService, getAuthService, resetAuthService } from './authServiceFactory';","// Export all modules\nexport * from \"./modules/achievement\";\nexport * from \"./modules/reward\";\nexport * from \"./modules/notification\";\nexport * from \"./modules/memory\";\n\nexport * from \"./modules/auth\";\nexport * from \"./modules/user-profile\";\n\nexport * from \"./modules/scan-chip\";\nexport * from \"./modules/campaign\";\n\nexport * from \"./modules/location\";\n\nexport * from \"./modules/generate-certificate\";\n\nexport * from \"./modules/data-tracking\";\n\nexport * from \"./providers\";\n\nexport * from \"./modules/achivementWithReward\";\n\nexport * from \"./modules/send-email\";\n\nexport * from \"./helper\";\n","import { GetManyAchievementProgressParams, GetManyDeviceUidAchievementProgressParams, GetManyUserOrDeviceAchievementProgressParams } from \"@phygitallabs/achievement\";\n\nimport {\n GetManyAchievementProgressByDeviceParams,\n} from \"@phygitallabs/api-core\";\n\nimport { useManyAchievementProgress as useManyAchievementProgressCore } from \"@phygitallabs/achievement\";\nimport { useManyAchievementProgressByDevice as useManyAchievementProgressByDeviceCore } from \"@phygitallabs/api-core\";\n\n// Core react query hooks\nimport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n} from \"@phygitallabs/achievement\";\n\nimport { isAchievementCompleted, convertSnakeToCamel } from \"../helpers\";\n\nexport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n}\n\n// Customize react query hooks\n\n// Get achievement progress list by userid or deviceuid base on login status\nexport const useManyAchievementProgress = (\n params: GetManyUserOrDeviceAchievementProgressParams,\n options?: any\n) => {\n\n const isLoggedIn = !!params.userId;\n\n const queryParams = isLoggedIn\n ? {\n achievementIds: params.achievementIds,\n userId: params.userId!,\n applicationId: params.applicationId,\n } as GetManyAchievementProgressParams\n : {\n achievement_ids: params.achievementIds,\n device_uid: params.deviceUid!,\n applicationId: params.applicationId,\n } as GetManyDeviceUidAchievementProgressParams;\n\n if (isLoggedIn) {\n return useManyAchievementProgressCore(queryParams as GetManyAchievementProgressParams,\n {\n ...options,\n select: (data) => data.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n })),\n }\n );\n }\n\n return useManyAchievementProgressByDeviceCore(\n queryParams as GetManyAchievementProgressByDeviceParams, {\n ...options,\n select: (data) => {\n const camelCaseData = convertSnakeToCamel(data);\n return camelCaseData.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n }));\n },\n });\n};\n\n// export const useManyAchievementWithProgress = (\n// params: UseManyAchievementWithProgressParams,\n// options?: {\n// achievementOptions?: Partial<UseQueryOptions>;\n// progressOptions?: Partial<UseQueryOptions>;\n// }\n// ): UseManyAchievementWithProgressReturn => {\n// // Fetch achievements with retry logic\n// const achievementsQuery = useManyAchievements(\n// {\n// ...(params.achievementIds?.length && { ids: params.achievementIds }),\n// },\n// {\n// retry: (failureCount: number, error: Error) => {\n// // Retry up to 3 times with exponential backoff\n// if (failureCount < 3) {\n// console.warn(`Achievement fetch failed, retrying... (${failureCount + 1}/3)`, error);\n// return true;\n// }\n// return false;\n// },\n// retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000),\n// staleTime: 5 * 60 * 1000, // 5 minutes\n// gcTime: 10 * 60 * 1000, // 10 minutes\n// ...options?.achievementOptions,\n// }\n// );\n\n// // Prepare achievement IDs for progress query\n// const achievementIds = useMemo(() => {\n// if (params.achievementIds?.length) {\n// return params.achievementIds;\n// }\n// return achievementsQuery.data?.data?.map((a: any) => a.id) || [];\n// }, [params.achievementIds, achievementsQuery.data]);\n\n// // Fetch progress with retry logic (dependent on achievements)\n// const progressQuery = useManyAchievementProgress(\n// {\n// achievementIds,\n// userId: params.userId,\n// deviceUid: params.deviceUid,\n// applicationId: params.applicationId,\n// },\n// {\n// enabled: achievementIds.length > 0\n// }\n// );\n\n// // Combine data with error flags\n// const combinedData = useMemo((): AchievementWithProgress[] => {\n// const achievements = achievementsQuery.data?.data || [];\n// const progressData = progressQuery.data || [];\n\n// return achievements.map((achievement: any) => {\n// const progress = progressData.find((p: any) => p.achievementId === achievement.id) || null;\n\n// return {\n// achievement,\n// progress,\n// hasAchievementError: !!achievementsQuery.error,\n// hasProgressError: !!progressQuery.error,\n// };\n// });\n// }, [achievementsQuery.data, progressQuery.data, achievementsQuery.error, progressQuery.error]);\n\n// // Refetch functions\n// const refetchAchievements = () => {\n// console.log(\"Manually refetching achievements...\");\n// achievementsQuery.refetch();\n// };\n\n// const refetchProgress = () => {\n// console.log(\"Manually refetching progress...\");\n// progressQuery.refetch();\n// };\n\n// const refetchAll = () => {\n// console.log(\"Manually refetching all data...\");\n// Promise.all([achievementsQuery.refetch(), progressQuery.refetch()]);\n// };\n\n// return {\n// data: combinedData,\n// isLoading: achievementsQuery.isLoading || (achievementIds.length > 0 && progressQuery.isLoading),\n// isSuccess: achievementsQuery.isSuccess && (achievementIds.length === 0 || progressQuery.isSuccess),\n// achievementsError: achievementsQuery.error as Error | null,\n// progressError: progressQuery.error as Error | null,\n// refetchAchievements,\n// refetchProgress,\n// refetchAll,\n// };\n// };\n\n","import { Achievement, UserAchievementProgress } from \"../types\";\n\nconst getLocationIdsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const locationIds: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (!rule.filter) return;\n Object.values(rule.filter).forEach((filterList) => {\n if (!filterList.filters) return;\n filterList.filters.forEach((filter) => {\n if (filter.label === \"location_id\" && filter.value) {\n if (Array.isArray(filter.value)) {\n locationIds.push(...filter.value);\n } else {\n locationIds.push(filter.value);\n }\n }\n });\n });\n });\n });\n return Array.from(new Set(locationIds)) as string[];\n};\n\nconst getActionsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const actions: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (rule.action) {\n actions.push(rule.action)\n }\n });\n });\n return Array.from(new Set(actions)) as string[];\n};\n\nconst isAchievementCompleted = (achievement: UserAchievementProgress) => {\n return achievement.isCompleted || achievement.overallPercentage === 100;\n}\n\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n ? `${T}${Capitalize<SnakeToCamelCase<U>>}`\n : S;\n\ntype ConvertSnakeToCamel<T> = T extends (infer U)[]\n ? ConvertSnakeToCamel<U>[]\n : T extends Record<string, unknown>\n ? {\n [K in keyof T as K extends string\n ? SnakeToCamelCase<K>\n : K]: ConvertSnakeToCamel<T[K]>;\n }\n : T;\n\n/**\n * Converts snake_case keys to camelCase keys in an object or array of objects\n */\nexport function convertSnakeToCamel<T>(obj: T): ConvertSnakeToCamel<T> {\n if (obj === null || obj === undefined) {\n return obj as ConvertSnakeToCamel<T>;\n }\n \n if (Array.isArray(obj)) {\n return obj.map((item) =>\n convertSnakeToCamel(item)\n ) as ConvertSnakeToCamel<T>;\n }\n \n if (typeof obj === \"object\" && obj.constructor === Object) {\n const converted: Record<string, unknown> = {};\n \n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase()\n );\n converted[camelKey] = convertSnakeToCamel(\n (obj as Record<string, unknown>)[key]\n );\n }\n }\n \n return converted as ConvertSnakeToCamel<T>;\n }\n \n return obj as ConvertSnakeToCamel<T>;\n }\n \n\nexport {\n getLocationIdsFromAchievementRule,\n getActionsFromAchievementRule,\n isAchievementCompleted\n}","export {\n AchievementRuleActionType,\n AchievementServiceProvider,\n} from \"@phygitallabs/achievement\";\n\nimport type { Achievement, GetAchievementProgressResponse, UserAchievementProgress } from \"@phygitallabs/achievement\";\n\nexport {\n Achievement,\n GetAchievementProgressResponse,\n UserAchievementProgress,\n}\n\n// Combined types for hooks\nexport interface AchievementWithProgress {\n achievement: Achievement;\n progress: UserAchievementProgress | null;\n hasProgressError?: boolean;\n hasAchievementError?: boolean;\n}\n\nexport interface UseManyAchievementWithProgressParams {\n userId?: string;\n deviceUid?: string;\n applicationId?: string;\n achievementIds?: string[];\n}\n\nexport interface UseManyAchievementWithProgressReturn {\n data: AchievementWithProgress[];\n isLoading: boolean;\n isSuccess: boolean;\n achievementsError: Error | null;\n progressError: Error | null;\n refetchAchievements: () => void;\n refetchProgress: () => void;\n refetchAll: () => void;\n}\n\nexport enum AchievementType {\n DEFAULT = \"default\",\n MULTIPLE_CHECK_INS = \"multiple_check_ins\",\n RANDOM_CHECK_INS = \"random_check_ins\",\n GROUP_MISSION = \"group_mission\",\n}\n","// Re-export from @phygitallabs/reward package\nexport {\n useManyUserRewards,\n useGetUserRewards,\n useClaimUserReward,\n useApiListRewardModels as useListRewardModels,\n useApiGetRewardModel as useGetRewardModel,\n useApiCreateRewardModel as useCreateRewardModel,\n useApiUpdateRewardModel as useUpdateRewardModel,\n useApiDeleteRewardModel as useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward/src/hooks\";","// Re-export from @phygitallabs/reward package\nexport {\n CmentityRewardType,\n type CmentityStatus\n} from \"@phygitallabs/reward\";\n\n// Define RewardClaimStatus locally since it's not exported from reward package\nexport enum RewardClaimStatus {\n NOT_CLAIMED = \"not_claimed\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n FAILED = \"failed\",\n}","export * from \"@phygitallabs/notification-api\";\nexport { NotificationProvider } from \"./providers\";","import React from \"react\";\nimport { NotificationProvider as NotificationProviderApi } from \"@phygitallabs/notification-api\";\n\nimport { EnvironmentType } from \"../../../types/common\";\n\nimport type { LPResponse } from \"@phygitallabs/notification-api\";\n\nimport serviceApiUrl from \"../../../constants/service\";\n\ninterface NotificationCallbacks {\n onWebSocketOpen?: (metadata: Record<string, any>) => void;\n onWebSocketClose?: (metadata: Record<string, any>) => void;\n onWebSocketMessage?: (data: LPResponse) => void;\n}\n\ninterface NotificationProviderProps extends NotificationCallbacks {\n children: React.ReactNode;\n autoConnect?: boolean;\n user: { id: string; accessToken: string | null };\n environment?: EnvironmentType;\n}\n\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n autoConnect = true,\n environment = \"dev\",\n user,\n onWebSocketOpen,\n onWebSocketClose,\n onWebSocketMessage,\n}) => {\n\n const webSocketUrl = serviceApiUrl[environment]?.API_NOTIFICATION_SOCKET_URL;\n\n return (\n <NotificationProviderApi\n userUid={user.id}\n accessToken={user.accessToken}\n webSocketUrl={webSocketUrl}\n autoConnect={autoConnect}\n onWebSocketOpen={onWebSocketOpen}\n onWebSocketClose={onWebSocketClose}\n onWebSocketMessage={onWebSocketMessage}\n >\n {children}\n </NotificationProviderApi>\n );\n};\n\nexport default NotificationProvider;","const serviceApiUrl = {\n dev: {\n API_BASE_URL: \"https://backend-dev.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-dev.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-dev.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-dev.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-dev.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-dev.nomion.io/notification-ws/ws\",\n },\n staging: {\n API_BASE_URL: \"https://backend-staging.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-staging.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-staging.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-staging.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-staging.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-staging.nomion.io/notification-ws/ws\",\n\n },\n production: {\n API_BASE_URL: \"https://backend.nomion.io\",\n API_BASE_CORE_URL: \"https://backend.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend.nomion.io/notification-ws/ws\",\n\n },\n}\n\nexport default serviceApiUrl;","import { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey } from \"@phygitallabs/api-core\";\n\nexport { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey };","import { createContext, useEffect, ReactNode, useContext } from 'react';\nimport { AuthService, AuthCallbacks } from '../types';\n\nimport { useAppSelector, useAppDispatch } from '../../../store/hooks';\nimport {\n selectUser,\n selectIsSignedIn,\n selectIsLoading,\n signIn as signInAction,\n signOut as signOutAction,\n updateScanStatus as updateScanStatusAction,\n refreshUser as refreshUserAction,\n setPending,\n initializeFromStorage,\n} from '../store/authSlice';\n\nimport { AuthResponse, UserData } from '../types';\n\nexport interface AuthContextType {\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n // User state\n user: UserData;\n isSignedIn: boolean;\n isLoading: boolean;\n\n // Auth actions\n signInWithCredential: (email: string, password: string) => Promise<AuthResponse>;\n signInWithGoogle: () => Promise<AuthResponse | null>;\n signUp: (email: string, password: string) => Promise<AuthResponse>;\n signOut: () => Promise<void>;\n\n // Password actions\n forgotPassword: (email: string) => Promise<void>;\n sendEmailVerification: () => Promise<void>;\n changePassword: (newPassword: string) => Promise<void>;\n\n // User management\n updateScanStatus: (status: boolean) => void;\n refreshUser: (userData: UserData) => void;\n\n}\n\nexport const AuthContext = createContext<AuthContextType | null>(null);\n\nexport interface AuthProviderProps {\n children: ReactNode;\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n}\n\nexport function AuthProvider({ children, authService, authCallbacks }: AuthProviderProps) {\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n // Initialize auth state from localStorage\n dispatch(initializeFromStorage());\n\n // Set up auth state listener\n const unsubscribe = authService.onAuthStateChanged((user) => {\n if (user) {\n dispatch(signInAction(user));\n\n // Use auth callback for user identification\n if (authCallbacks?.onUserIdentify && user.email) {\n authCallbacks.onUserIdentify({\n email: user.email,\n name: user.displayName,\n avatar: user.avatar,\n uid: user.uid,\n });\n }\n\n // Notify about successful sign in\n if (authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(user);\n }\n } else {\n dispatch(signOutAction());\n\n // Use auth callback for reset\n if (authCallbacks?.onTrackingReset) {\n authCallbacks.onTrackingReset();\n }\n }\n dispatch(setPending(false));\n });\n\n return () => {\n unsubscribe();\n };\n }, [authService, dispatch, authCallbacks]);\n\n // Redux selectors\n const user = useAppSelector(selectUser);\n const isSignedIn = useAppSelector(selectIsSignedIn);\n const isLoading = useAppSelector(selectIsLoading);\n\n // Auth actions with auth callbacks\n const signInWithCredential = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signInWithEmailAndPassword(email, password);\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return result;\n };\n\n const signInWithGoogle = async (): Promise<AuthResponse | null> => {\n const result = await authService.signInWithGoogle();\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n return result;\n\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return null;\n };\n\n const signUp = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signUp(email, password);\n\n if (result.data && authCallbacks?.onSignUpSuccess) {\n authCallbacks.onSignUpSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignUpError) {\n authCallbacks.onSignUpError(result.errorCode);\n }\n\n return result;\n };\n\n const signOut = async (): Promise<void> => {\n await authService.signOut();\n dispatch(signOutAction());\n\n if (authCallbacks?.onSignOutSuccess) {\n authCallbacks.onSignOutSuccess();\n }\n };\n\n // Password actions\n const forgotPassword = async (email: string): Promise<void> => {\n return await authService.sendPasswordResetEmail(email);\n };\n\n const sendEmailVerification = async (): Promise<void> => {\n return await authService.sendEmailVerification();\n };\n\n const changePassword = async (newPassword: string): Promise<void> => {\n return await authService.changePassword(newPassword);\n };\n\n // User management\n const updateScanStatus = (status: boolean): void => {\n dispatch(updateScanStatusAction(status));\n };\n\n const refreshUser = (userData: UserData): void => {\n dispatch(refreshUserAction(userData));\n };\n\n const contextValue: AuthContextType = {\n authService,\n authCallbacks,\n // User state\n user,\n isSignedIn,\n isLoading,\n\n // Auth actions\n signInWithCredential,\n signInWithGoogle,\n signUp,\n signOut,\n\n // Password actions\n forgotPassword,\n sendEmailVerification,\n changePassword,\n\n // User management\n updateScanStatus,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport const useAuth = () => {\n const authContext = useContext(AuthContext);\n if (!authContext) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return authContext;\n};","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { TapquestCoreRootState, TapquestCoreAppDispatch } from './index';\n\n// Typed hooks for internal use within tapquest-core\nexport const useAppDispatch = () => useDispatch<TapquestCoreAppDispatch>();\nexport const useAppSelector: TypedUseSelectorHook<TapquestCoreRootState> = useSelector;","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { UserData, UserRole } from \"../types\";\nimport {\n setUserInfo,\n removeUserInfo,\n getUserInfo,\n setAccessToken,\n setRefreshToken,\n removeAccessToken,\n removeRefreshToken,\n getAccessToken,\n} from \"../helpers\";\n\nconst defaultUser: UserData = {\n uid: \"\",\n id: \"\",\n userName: \"\",\n displayName: \"\",\n avatar: \"/images/default-avatar.jpg\",\n email: \"\",\n exp: 0,\n emailVerified: false,\n refreshToken: \"\",\n accessToken: \"\",\n role: UserRole.NULL,\n scanStatus: false,\n};\n\nexport interface AuthState {\n user: UserData;\n isSignedIn: boolean;\n pending: boolean;\n}\n\nconst initialState: AuthState = {\n user: defaultUser,\n isSignedIn: false,\n pending: true,\n};\n\nexport const authSlice = createSlice<\n AuthState,\n {\n signIn: (state: AuthState, action: PayloadAction<UserData>) => void;\n signOut: (state: AuthState) => void;\n updateScanStatus: (state: AuthState, action: PayloadAction<boolean>) => void;\n refreshUser: (state: AuthState, action: PayloadAction<UserData>) => void;\n setPending: (state: AuthState, action: PayloadAction<boolean>) => void;\n initializeFromStorage: (state: AuthState) => void;\n },\n 'auth'\n>({\n name: \"auth\",\n initialState,\n reducers: {\n signIn: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Store in localStorage for persistence\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n },\n signOut: (state) => {\n state.user = defaultUser;\n state.isSignedIn = false;\n state.pending = false;\n\n // Clear localStorage\n removeUserInfo();\n removeAccessToken();\n removeRefreshToken();\n },\n updateScanStatus: (state, action: PayloadAction<boolean>) => {\n state.user.scanStatus = action.payload;\n\n // Update localStorage\n setUserInfo(state.user);\n },\n refreshUser: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n if (userData) {\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Update localStorage\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n }\n },\n setPending: (state, action: PayloadAction<boolean>) => {\n state.pending = action.payload;\n },\n initializeFromStorage: (state) => {\n const storedUser = getUserInfo();\n const accessToken = getAccessToken();\n\n if (storedUser && accessToken) {\n state.user = storedUser;\n state.isSignedIn = true;\n }\n state.pending = false;\n },\n },\n});\n\nexport const {\n signIn,\n signOut,\n updateScanStatus,\n refreshUser,\n setPending,\n initializeFromStorage,\n} = authSlice.actions;\n\n// Selectors\nexport const selectAuth = (state: any) => state.auth;\nexport const selectUser = (state: any) => state.auth.user;\nexport const selectUserUId = (state: any) =>\n state.auth.user.uid || state.auth.user.id;\nexport const selectUserAccesstoken = (state: any) =>\n state.auth.user.accessToken;\nexport const selectUserEmail = (state: any) => state.auth.user.email;\nexport const selectUsername = (state: any) => state.auth.user.userName;\nexport const selectSignInProvider = (state: any) =>\n state.auth.user.signInProvider;\nexport const selectUserScanStatus = (state: any) =>\n state.auth.user.scanStatus;\nexport const selectIsSignedIn = (state: any) => state.auth.isSignedIn;\nexport const selectIsLoading = (state: any) => state.auth.pending;\n\nexport default authSlice.reducer;","import {\n deviceUIDKey,\n chipAuthTokenKey,\n retryAttemptsRefreshToken,\n accessTokenKey,\n refreshTokenKey,\n userInfoKey,\n} from \"../constants\";\n\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const generateDeviceId = async (): Promise<string> => {\n try {\n const deviceFingerprint = await generateDeviceFingerprint();\n return deviceFingerprint;\n } catch (error) {\n console.error(\"Error generating device fingerprint:\", error);\n return uuidv4();\n }\n};\n\nconst generateDeviceFingerprint = async (): Promise<string> => {\n const timestamp = new Date().toISOString(); // UTC timestamp\n\n const fingerprintRaw = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.platform,\n navigator.hardwareConcurrency,\n timestamp, // Include timestamp\n ].join(\"::\");\n\n const encoder = new TextEncoder();\n const data = encoder.encode(fingerprintRaw);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return fingerprint;\n};\n\nexport default generateDeviceFingerprint;\n\n\nexport const getDeviceUid = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(deviceUIDKey);\n};\n\nexport const setDeviceUid = (deviceId: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(deviceUIDKey, deviceId);\n};\n\nexport const removeDeviceUid = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(deviceUIDKey);\n};\n\nexport const checkDeviceUid = async (): Promise<string> => {\n // if (typeof window === \"undefined\") return null;\n\n let deviceUID = getDeviceUid();\n\n if (!deviceUID) {\n deviceUID = await generateDeviceId();\n setDeviceUid(deviceUID);\n }\n\n return deviceUID;\n};\n\n// CHIP AUTH TOKEN\nexport const getChipAuthToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(chipAuthTokenKey);\n};\n\nexport const setChipAuthToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(chipAuthTokenKey, value);\n};\n\nexport const removeChipAuthToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(chipAuthTokenKey);\n};\n\n// RETRY ATTEMPTS\nexport const getRetryAttemptsRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(retryAttemptsRefreshToken);\n};\n\nexport const setRetryAttemptsRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(retryAttemptsRefreshToken, value);\n};\n\n// ACCESS TOKEN\nexport const getAccessToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(accessTokenKey);\n};\n\nexport const setAccessToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(accessTokenKey, value);\n};\n\nexport const removeAccessToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(accessTokenKey);\n};\n\n// REFRESH TOKEN\nexport const getRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(refreshTokenKey);\n};\n\nexport const setRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(refreshTokenKey, value);\n};\n\nexport const removeRefreshToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(refreshTokenKey);\n};\n\n// USER INFO\nexport const getUserInfo = () => {\n if (typeof window === \"undefined\") return null;\n const userInfo = localStorage.getItem(userInfoKey);\n if (!userInfo) return null;\n try {\n return JSON.parse(userInfo);\n } catch (error) {\n console.error(\"Failed to parse stored user data:\", error);\n return null;\n }\n};\n\nexport const setUserInfo = (userData: any) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(userInfoKey, JSON.stringify(userData));\n};\n\nexport const removeUserInfo = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(userInfoKey);\n};\n\nexport { createRefreshTokenFunction } from \"./refreshToken\";\nexport type { RefreshTokenConfig } from \"./refreshToken\";","import mem from \"mem\";\nimport { setUserInfo, removeUserInfo, getUserInfo, getRefreshToken } from \"./index\";\n\n// Internal configuration - managed by tapquest-core\nconst REFRESH_TOKEN_CONFIG = {\n maxAge: 10000, // 10 seconds cache\n} as const;\n\nexport interface RefreshTokenConfig {\n firebaseApiKey: string;\n}\n\nconst createRefreshTokenFunction = (config: RefreshTokenConfig) => {\n const refreshTokenFn = async () => {\n try {\n const session = getUserInfo();\n const refreshToken = getRefreshToken();\n\n if (!refreshToken) {\n removeUserInfo();\n return;\n }\n\n const params = new URLSearchParams();\n params.append(\"grant_type\", \"refresh_token\");\n params.append(\"refresh_token\", refreshToken);\n\n const fetchData = {\n method: \"POST\",\n headers: new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n }),\n body: params,\n };\n\n const response = await fetch(\n `https://securetoken.googleapis.com/v1/token?key=${config.firebaseApiKey}`,\n fetchData\n );\n const data = await response.json();\n\n if (data.error) {\n removeUserInfo();\n return;\n }\n\n const newSession = {\n ...session,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n setUserInfo(newSession);\n\n return newSession;\n } catch {\n removeUserInfo();\n }\n };\n\n return mem(refreshTokenFn, { maxAge: REFRESH_TOKEN_CONFIG.maxAge });\n};\n\nexport { createRefreshTokenFunction };","// Export types\nexport type {\n UserData,\n UserRole,\n SignInProvider,\n AuthResponse,\n AuthService,\n FirebaseConfig,\n UseAuthReturn,\n AuthProviderProps,\n AuthCallbacks,\n} from './types';\n\n// Export hooks and providers\n// export { useAuth } from './hooks';\nexport { useAuth, AuthProvider } from './providers';\n\n// Export constants and helpers\nexport * from './constants';\nexport * from './helpers';","import { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest } from \"@phygitallabs/api-core\";\n\nexport { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest };","import { UserSourceType } from \"@phygitallabs/api-core\";\n\nexport { UserSourceType };","import { useEffect } from \"react\";\nimport { useChipScanStory } from \"@phygitallabs/api-core\";\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { setChipAuthToken } from \"../../auth/helpers\";\n\nimport { ScanChipResponse } from \"../types\";\n\ninterface UseScanChipProps {\n token?: string;\n id?: string;\n onScanChipError?: () => void;\n}\nexport { useChipScanStory, usePGLCoreService };\nexport function useScanChip({ token, id, onScanChipError }: UseScanChipProps): ScanChipResponse {\n const { updateHeaders } = usePGLCoreService();\n\n useEffect(() => {\n if (!!token) {\n\n const header = {\n \"Chip-Authorization\": token,\n };\n\n setChipAuthToken(token);\n updateHeaders(header);\n\n }\n }, [token, updateHeaders]);\n\n const { data, isLoading, isError, isSuccess } = useChipScanStory({\n token,\n id,\n });\n\n useEffect(() => {\n if (isError) {\n onScanChipError?.();\n }\n }, [isError, onScanChipError]);\n\n\n if (!data)\n return {\n data: null,\n isLoading,\n isError,\n isSuccess\n };\n\n return {\n data: {\n externalUrl: data?.external_url,\n campaignDetail: data?.project,\n locationDetail: data?.location,\n scanCounter: data?.scan_counter,\n campaignId: data?.campaign_id,\n chipModelId: data?.chip_model_id,\n organizationId: data?.organization_id,\n projectId: data?.project_id,\n locationId: data?.location_id,\n chipUid: data?.uid,\n },\n isLoading,\n isError,\n isSuccess\n }\n}","// Re-export from @phygitallabs/api-core package\nexport {\n useOneCampaign as useCampaignDetail,\n useUserCampaignAction,\n useOneUserCampaign,\n\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport {\n CampaignState\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport type {\n CampaignModel,\n UserCampaignModel,\n MissionWithProgress,\n TaskWithProgress,\n UserCampaignMission,\n Mission,\n MissionProgress,\n TaskProgress,\n} from \"@phygitallabs/api-core\";\n\nexport enum TaskType {\n CHECK_IN = \"check_in\",\n CREATE_MEMORY = \"create_memory\",\n FILL_FORM = \"fill_form\",\n SHARE = \"share\",\n}\n\n// Define other types locally since they're not exported from api-core package\nexport interface CampaignByProjectIdModel {\n id: string;\n certificate_index?: number;\n completed_checkin_rule?: number;\n completed_device_uids?: string[];\n completed_location_ids?: string[];\n completed_user_ids?: string[];\n description?: string;\n image_url?: string;\n is_custom_checkin_rule?: boolean;\n location_ids?: string[];\n name: string;\n total_completed?: number;\n user_campaign?: any;\n custom_info: Record<string, any>;\n mission: Record<string, any>;\n achievement_id: string;\n start_date: string;\n end_date: string;\n certificate: {\n image: any;\n title: string;\n };\n project_id?: string;\n status: string;\n created_at: number;\n updated_at: number;\n created_by?: string;\n updated_by?: string;\n}\n\n","// Re-export from @phygitallabs/api-core package\nexport {\n useManyLocations as useLocationsList,\n useOneLocation as useLocationDetail,\n useUserCampaignsCompletedLocation as useLocationProgress,\n useManyUserActionLocations,\n locationQueryKeys\n} from \"@phygitallabs/api-core\";","\nexport const sortLocationsByIndex = <T extends { index?: number }>(locations: T[]): T[] => {\n return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n};\n\n\nexport const filterLocationsByProperty = <T extends Record<string, any>>(\n locations: T[],\n propertyName: keyof T,\n value: boolean\n): T[] => {\n return locations.filter(location => location[propertyName] === value);\n};\n","import { \n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate\n} from \"@phygitallabs/generate-certificate\";\n\n\nexport { useGenerateThaocamvienCertificate, useGenerateTemplateCertificate, useGenerateFansipanCertificate };","import posthog from \"posthog-js\";\n\ndeclare global {\n interface Window {\n dataLayer: Record<string, any>[];\n }\n}\n\ndeclare function gtag(\n command: \"event\",\n eventName: string,\n eventParameters: Record<string, any>\n): void;\n\n\n// GTM\nconst pushEventToDataLayer = (event: string, data: Record<string, any>) => {\n try {\n window.dataLayer = window.dataLayer || [];\n\n window.dataLayer.push({\n event,\n ...data,\n });\n\n } catch (error) {\n console.error(error);\n }\n};\n\n// GA\nconst pushEventToGA = (eventName: string, eventData: Record<string, any>) => {\n if (typeof gtag != \"function\") {\n console.error(\"gtag is not a function\");\n return;\n }\n gtag(\"event\", eventName, eventData);\n};\n\n// Posthog\nconst pushEventToPosthog = (eventName: string, eventData: Record<string, any>) => {\n posthog.capture(eventName, eventData);\n};\n\nfunction useDataTracking() {\n const trackEvent = (eventName: string, eventData: Record<string, any>, useTools?: (\"gtm\" | \"ga\" | \"posthog\")[]) => {\n\n useTools = useTools || [\"gtm\"];\n\n if (useTools.includes(\"gtm\") && typeof window !== \"undefined\") {\n pushEventToDataLayer(eventName, eventData);\n }\n if (useTools.includes(\"ga\") && typeof gtag == \"function\") {\n pushEventToGA(eventName, eventData);\n }\n if (useTools.includes(\"posthog\") && typeof posthog == \"function\") {\n pushEventToPosthog(eventName, eventData);\n }\n };\n\n return {\n trackEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { useState, useEffect } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { PersistGate } from \"redux-persist/integration/react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { store, persistor } from \"../store\";\nimport { AuthCallbacks } from \"../modules/auth/types\";\nimport { AuthProvider } from \"../modules/auth/providers\";\nimport { FirebaseConfig } from \"../modules/auth/types\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: FirebaseConfig;\n authCallbacks?: AuthCallbacks;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n firebaseConfig,\n authCallbacks\n}) => {\n const [internalAuthService, setInternalAuthService] = useState<any>(null);\n\n useEffect(() => {\n if (firebaseConfig && typeof window !== \"undefined\") {\n // Dynamic import to avoid loading Firebase modules during build\n import(\"../modules/auth/services\")\n .then(({ createAuthService }) => {\n try {\n const authService = createAuthService({ firebaseConfig });\n setInternalAuthService(authService);\n } catch (error) {\n console.warn(\"Failed to create auth service from firebase config:\", error);\n setInternalAuthService(null);\n }\n })\n .catch((error) => {\n console.warn(\"Failed to dynamically import auth services:\", error);\n setInternalAuthService(null);\n });\n } else {\n setInternalAuthService(null);\n }\n }, [firebaseConfig]);\n\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <AuthProvider\n authService={internalAuthService}\n authCallbacks={authCallbacks}\n >\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n firebaseConfig={firebaseConfig}\n >\n {children}\n </ServicesProvider>\n </AuthProvider>\n\n </PersistGate>\n </Provider>\n );\n};","import React, { useEffect, useState, useMemo } from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { PGLCoreServiceProvider } from \"@phygitallabs/api-core\";\nimport { RewardServiceProvider } from \"@phygitallabs/reward\";\nimport { AchievementServiceProvider } from \"@phygitallabs/achievement\";\nimport { GenerateCertificateServiceProvider } from \"@phygitallabs/generate-certificate\";\n\nimport serviceApiUrl from \"../constants/service\";\nimport { APIConfig, ServiceConfig } from \"../types/service\";\n\nimport { checkDeviceUid, getAccessToken, getRetryAttemptsRefreshToken, setRetryAttemptsRefreshToken, createRefreshTokenFunction } from \"../modules/auth/helpers\";\n\nimport { httpMaxRetries } from \"../modules/auth\";\n\nimport { useAuth } from \"../modules/auth\";\n\nimport axios from \"axios\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: any;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n firebaseConfig\n}) => {\n const { refreshUser, signOut } = useAuth();\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\n\n // Create memoized refresh token function\n const memoizedRefreshToken = useMemo(() => {\n if (!firebaseConfig?.apiKey) {\n console.warn(\"Firebase API key not provided, refresh token functionality will not work\");\n return null;\n }\n return createRefreshTokenFunction({\n firebaseApiKey: firebaseConfig.apiKey\n });\n }, [firebaseConfig?.apiKey]);\n\n // Init client\n useEffect(() => {\n const initClient = async () => {\n try {\n const deviceUid = await checkDeviceUid();\n\n const responseInterceptors = ({\n onFulfilled: (response: any) => response,\n onRejected: async (error: any) => {\n\n // TODO: Remove\n // Feature: use refresh token to get new access token when token expired, have maximum `retry attempts`\n const originalRequest = error.config;\n\n if (error.response?.status === 401 && !originalRequest._retry) {\n const retryAttempts = parseInt(\n getRetryAttemptsRefreshToken() || \"0\",\n 10\n );\n\n if (retryAttempts >= httpMaxRetries) {\n await signOut();\n return Promise.reject(error);\n }\n\n setRetryAttemptsRefreshToken(`${retryAttempts + 1}`);\n originalRequest._retry = true;\n\n try {\n if (!memoizedRefreshToken) {\n await signOut();\n return Promise.reject(error);\n }\n\n const result = await memoizedRefreshToken();\n\n if (result?.accessToken) {\n originalRequest.headers[\n \"Authorization\"\n ] = `Bearer ${result.accessToken}`;\n\n setRetryAttemptsRefreshToken(\"0\");\n \n refreshUser(result);\n\n return axios(originalRequest);\n }\n } catch (refreshError) {\n console.log(\"Failed to refresh token:\", refreshError);\n }\n }\n\n return Promise.reject(error);\n },\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => {\n // Feature: set access token to request header\n const currentToken = getAccessToken();\n\n if (currentToken && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${currentToken}`;\n }\n return config;\n },\n onRejected: (error: any) => Promise.reject(error),\n })\n\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n \"Device-UID\": deviceUid,\n }\n }\n\n const config: ServiceConfig = {\n queryClient,\n axiosConfig,\n responseInterceptors,\n requestInterceptors,\n useDevTool: true,\n };\n\n setCommonServiceConfig(config);\n\n } catch (error) {\n console.error(error);\n }\n }\n\n initClient();\n }, [queryClient]);\n\n if (!commonServiceConfig) {\n return <></>\n }\n\n return (\n <PGLCoreServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}/${version}`}\n baseCoreURL={`${serviceApiUrl[environment].API_BASE_CORE_URL}/${version}`}\n >\n <RewardServiceProvider\n {...commonServiceConfig}\n // baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/${version}`}\n baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/v1`} // todo: using v1 until backend fully migrate\n >\n <AchievementServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_ACHIEVEMENT_URL}/${version}`}\n >\n <GenerateCertificateServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_GENERATE_CERTIFICATE_URL}/v1`}\n >\n {children}\n </GenerateCertificateServiceProvider>\n </AchievementServiceProvider>\n </RewardServiceProvider>\n </PGLCoreServiceProvider>\n );\n};\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport storage from \"redux-persist/lib/storage\";\nimport { persistReducer, persistStore, PersistConfig } from \"redux-persist\";\nimport { authSlice } from \"../modules/auth/store/authSlice\";\n\n// Auth persist config\nconst authPersistConfig: PersistConfig<any> = {\n key: \"tapquest-auth\",\n storage,\n whitelist: [\"user\", \"isSignedIn\"], // Only persist user and sign-in status\n};\n\n// Create persisted auth reducer\nconst persistedAuthReducer = persistReducer(authPersistConfig, authSlice.reducer);\n\n// Configure the tapquest-core store\nexport const store = configureStore({\n reducer: {\n auth: persistedAuthReducer,\n },\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Ignore redux-persist actions\n ignoredActions: [\n 'persist/FLUSH',\n 'persist/REHYDRATE',\n 'persist/PAUSE',\n 'persist/PERSIST',\n 'persist/PURGE',\n 'persist/REGISTER',\n ],\n },\n }),\n});\n\n// Create persistor\nexport const persistor = persistStore(store);\n\n// Export types\nexport type TapquestCoreRootState = ReturnType<typeof store.getState>;\nexport type TapquestCoreAppDispatch = typeof store.dispatch;\n\n// Export store instance for internal use\nexport { store as tapquestCoreStore };","import { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward/src/hooks/useGroupReward\";\nimport { useEffect, useMemo } from \"react\";\n\ninterface UseAchivementPlusRewardModelParams {\n campaignId: string;\n}\ninterface GroupRewardData {\n reward_models: EntityRewardModel[][];\n}\n\nfunction buildMappedAchievements(achievements: Achievement[], groupRewardData: GroupRewardData) {\n if (!groupRewardData?.reward_models) return [];\n\n const rewardModels = groupRewardData.reward_models;\n\n return achievements.map((achievement, achievementIndex) => {\n const parentReward = rewardModels[achievementIndex]?.[0] || null;\n\n const subAchievements =\n achievement.subAchievementIds?.map((subId: string, subIndex: number) => {\n const reward =\n rewardModels[\n achievementIndex * (achievement.subAchievementIds?.length || 0) +\n subIndex +\n 1\n ]?.[0] || null;\n\n return {\n id: subId,\n reward_model: reward,\n };\n }) || [];\n\n return {\n id: achievement.id,\n name: achievement.name,\n reward_model: parentReward,\n subAchievements,\n };\n });\n}\n\nconst useAchivementPlusRewardModel = ({ campaignId }: UseAchivementPlusRewardModelParams) => {\n const { data: achievements, isLoading: isLoadingAchievements } =\n useManyAchievements(\n {\n \"filter.labels\": { campaign_id: campaignId },\n \"filter.type\": \"group_mission\",\n \"pagination.limit\": 200,\n },\n { enabled: !!campaignId }\n );\n\n const groupRewardIds = useMemo(() => {\n if (!achievements?.data) return [];\n return achievements.data\n .map((achievement) => achievement.groupRewardId)\n .filter((id): id is string => id !== undefined);\n }, [achievements?.data]);\n const {\n mutate: fetchGroupRewardModels,\n data: groupRewardModelsData,\n isPending: isPendingGroupRewardModels,\n } = useCreateModelGroupReward();\n useEffect(() => {\n if (groupRewardIds.length > 0) {\n fetchGroupRewardModels({ group_reward_ids: groupRewardIds });\n }\n }, [groupRewardIds, fetchGroupRewardModels]);\n\n const mappedAchievements = useMemo(() => {\n if (!groupRewardModelsData?.data || !achievements?.data) return [];\n return buildMappedAchievements(achievements.data, groupRewardModelsData.data);\n }, [groupRewardModelsData, achievements?.data]);\n return {\n mappedAchievements,\n isLoading: isLoadingAchievements || isPendingGroupRewardModels,\n };\n};\n\nexport default useAchivementPlusRewardModel;\n","import { useSendEmail } from \"@phygitallabs/api-core\";\nexport {useSendEmail}","import { cn, parse, fileToBase64 } from \"@phygitallabs/helpers\";\n\nexport { cn, parse, fileToBase64 };"],"mappings":"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","names":["signOut","firebaseApp","firebaseAuth","import_achievement","useManyAchievementProgressCore","useManyAchievementProgressByDeviceCore","import_achievement","AchievementType","RewardClaimStatus","NotificationProviderApi","import_api_core","mem","uuidv4","import_jsx_runtime","user","signOut","updateScanStatus","refreshUser","import_api_core","import_api_core","import_react","import_api_core","import_api_core","import_api_core","TaskType","import_api_core","posthog","import_react","import_react_redux","import_react","import_api_core","import_reward","import_achievement","import_generate_certificate","import_jsx_runtime","refreshUser","signOut","axios","config","import_toolkit","storage","import_jsx_runtime","createAuthService","import_achievement","import_react","import_api_core","import_helpers"]}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,6 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
19
19
|
return to;
|
|
20
20
|
};
|
|
21
21
|
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
22
|
-
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
22
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
24
23
|
|
|
25
24
|
// src/modules/auth/constants/index.ts
|
|
@@ -1184,7 +1183,7 @@ function useDataTracking() {
|
|
|
1184
1183
|
}
|
|
1185
1184
|
|
|
1186
1185
|
// src/providers/TapquestCoreProvider.tsx
|
|
1187
|
-
import {
|
|
1186
|
+
import { useState as useState2, useEffect as useEffect4 } from "react";
|
|
1188
1187
|
import { Provider } from "react-redux";
|
|
1189
1188
|
import { PersistGate } from "redux-persist/integration/react";
|
|
1190
1189
|
|
|
@@ -1360,17 +1359,24 @@ var TapquestCoreProvider = ({
|
|
|
1360
1359
|
firebaseConfig,
|
|
1361
1360
|
authCallbacks
|
|
1362
1361
|
}) => {
|
|
1363
|
-
const internalAuthService =
|
|
1362
|
+
const [internalAuthService, setInternalAuthService] = useState2(null);
|
|
1363
|
+
useEffect4(() => {
|
|
1364
1364
|
if (firebaseConfig && typeof window !== "undefined") {
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1365
|
+
Promise.resolve().then(() => (init_services(), services_exports)).then(({ createAuthService: createAuthService2 }) => {
|
|
1366
|
+
try {
|
|
1367
|
+
const authService = createAuthService2({ firebaseConfig });
|
|
1368
|
+
setInternalAuthService(authService);
|
|
1369
|
+
} catch (error) {
|
|
1370
|
+
console.warn("Failed to create auth service from firebase config:", error);
|
|
1371
|
+
setInternalAuthService(null);
|
|
1372
|
+
}
|
|
1373
|
+
}).catch((error) => {
|
|
1374
|
+
console.warn("Failed to dynamically import auth services:", error);
|
|
1375
|
+
setInternalAuthService(null);
|
|
1376
|
+
});
|
|
1377
|
+
} else {
|
|
1378
|
+
setInternalAuthService(null);
|
|
1372
1379
|
}
|
|
1373
|
-
return null;
|
|
1374
1380
|
}, [firebaseConfig]);
|
|
1375
1381
|
return /* @__PURE__ */ jsx4(Provider, { store, children: /* @__PURE__ */ jsx4(PersistGate, { loading: null, persistor, children: /* @__PURE__ */ jsx4(
|
|
1376
1382
|
AuthProvider,
|
|
@@ -1393,7 +1399,7 @@ var TapquestCoreProvider = ({
|
|
|
1393
1399
|
// src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts
|
|
1394
1400
|
import { useManyAchievements as useManyAchievements2 } from "@phygitallabs/achievement";
|
|
1395
1401
|
import { useCreateModelGroupReward as useCreateModelGroupReward2 } from "@phygitallabs/reward/src/hooks/useGroupReward";
|
|
1396
|
-
import { useEffect as
|
|
1402
|
+
import { useEffect as useEffect5, useMemo as useMemo2 } from "react";
|
|
1397
1403
|
function buildMappedAchievements(achievements, groupRewardData) {
|
|
1398
1404
|
if (!groupRewardData?.reward_models) return [];
|
|
1399
1405
|
const rewardModels = groupRewardData.reward_models;
|
|
@@ -1423,7 +1429,7 @@ var useAchivementPlusRewardModel = ({ campaignId }) => {
|
|
|
1423
1429
|
},
|
|
1424
1430
|
{ enabled: !!campaignId }
|
|
1425
1431
|
);
|
|
1426
|
-
const groupRewardIds =
|
|
1432
|
+
const groupRewardIds = useMemo2(() => {
|
|
1427
1433
|
if (!achievements?.data) return [];
|
|
1428
1434
|
return achievements.data.map((achievement) => achievement.groupRewardId).filter((id) => id !== void 0);
|
|
1429
1435
|
}, [achievements?.data]);
|
|
@@ -1432,12 +1438,12 @@ var useAchivementPlusRewardModel = ({ campaignId }) => {
|
|
|
1432
1438
|
data: groupRewardModelsData,
|
|
1433
1439
|
isPending: isPendingGroupRewardModels
|
|
1434
1440
|
} = useCreateModelGroupReward2();
|
|
1435
|
-
|
|
1441
|
+
useEffect5(() => {
|
|
1436
1442
|
if (groupRewardIds.length > 0) {
|
|
1437
1443
|
fetchGroupRewardModels({ group_reward_ids: groupRewardIds });
|
|
1438
1444
|
}
|
|
1439
1445
|
}, [groupRewardIds, fetchGroupRewardModels]);
|
|
1440
|
-
const mappedAchievements =
|
|
1446
|
+
const mappedAchievements = useMemo2(() => {
|
|
1441
1447
|
if (!groupRewardModelsData?.data || !achievements?.data) return [];
|
|
1442
1448
|
return buildMappedAchievements(achievements.data, groupRewardModelsData.data);
|
|
1443
1449
|
}, [groupRewardModelsData, achievements?.data]);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/modules/auth/constants/index.ts","../src/modules/auth/services/FirebaseAuthService.ts","../src/modules/auth/services/authServiceFactory.ts","../src/modules/auth/services/index.ts","../src/index.ts","../src/modules/achievement/hooks/index.ts","../src/modules/achievement/helpers/index.ts","../src/modules/achievement/types/index.ts","../src/modules/reward/hooks/useRewardService.ts","../src/modules/reward/types/enums.ts","../src/modules/notification/index.ts","../src/modules/notification/providers/index.tsx","../src/constants/service.ts","../src/modules/memory/hooks/index.ts","../src/modules/auth/providers/AuthProvider.tsx","../src/store/hooks.ts","../src/modules/auth/store/authSlice.ts","../src/modules/auth/helpers/index.ts","../src/modules/auth/helpers/refreshToken.ts","../src/modules/auth/index.ts","../src/modules/user-profile/hooks/index.ts","../src/modules/user-profile/types/index.ts","../src/modules/scan-chip/hooks/index.tsx","../src/modules/campaign/hooks/useCampaignService.ts","../src/modules/campaign/types/enums.ts","../src/modules/campaign/types/campaign.ts","../src/modules/location/hooks/useLocationService.ts","../src/modules/location/utils/locationHelpers.ts","../src/modules/generate-certificate/hooks/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/store/index.ts","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["export const userInfoKey = \"phygital-user-info\";\nexport const accessTokenKey = \"accessToken\";\nexport const refreshTokenKey = \"refreshToken\";\nexport const httpMaxRetries = 3;\nexport const retryAttemptsRefreshToken = \"retryAttemptsRefreshToken\";\n\nexport const deviceUIDKey = \"Device-UID\";\nexport const chipAuthTokenKey = \"chip-auth-token\";\n\n","// Client-side only imports\nlet firebaseApp: any;\nlet firebaseAuth: any;\n\n// Dynamic imports for client-side only\nconst getFirebaseModules = async () => {\n if (typeof window === 'undefined') {\n throw new Error('Firebase can only be used in client environment');\n }\n\n if (!firebaseApp || !firebaseAuth) {\n const [\n { initializeApp, getApps },\n {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n }\n ] = await Promise.all([\n import(\"firebase/app\"),\n import(\"firebase/auth\")\n ]);\n\n firebaseApp = { initializeApp, getApps };\n firebaseAuth = {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n };\n }\n\n return { firebaseApp, firebaseAuth };\n};\n\nimport { AuthService, FirebaseConfig, AuthResponse, UserData, SignInProvider } from \"../types\";\nimport { accessTokenKey, refreshTokenKey } from \"../constants\";\n\nexport class FirebaseAuthService implements AuthService {\n private app: any;\n private auth: any;\n private googleProvider: any;\n private config: FirebaseConfig;\n private initialized = false;\n\n constructor(config: FirebaseConfig) {\n this.config = config;\n // Initialization will be done lazily in client environment\n }\n\n private async ensureInitialized() {\n if (this.initialized) return;\n\n const { firebaseApp, firebaseAuth } = await getFirebaseModules();\n\n // Initialize Firebase app if not already initialized\n if (!firebaseApp.getApps().length) {\n this.app = firebaseApp.initializeApp(this.config);\n } else {\n this.app = firebaseApp.getApps()[0];\n }\n\n this.auth = firebaseAuth.getAuth(this.app);\n this.googleProvider = new firebaseAuth.GoogleAuthProvider();\n this.initialized = true;\n }\n\n private transformUserData(user: any): UserData {\n return {\n id: user.uid,\n uid: user.uid,\n userName: user.displayName || \"\",\n displayName: user.displayName || \"\",\n email: user.email || \"\",\n refreshToken: user.refreshToken,\n accessToken: (user as any).accessToken || \"\",\n exp: (user as any).stsTokenManager?.expirationTime || 0,\n emailVerified: user.emailVerified,\n avatar: user.photoURL || \"/images/default-avatar.jpg\",\n signInProvider: this.getSignInProvider(user),\n role: undefined,\n scanStatus: false,\n };\n }\n\n private getSignInProvider(user: any): SignInProvider {\n const providers = user.providerData.map((p: any) => p.providerId);\n if (providers.includes(\"google.com\")) return \"google.com\";\n return \"password\";\n }\n\n private translateErrorCode(errorCode: string): string {\n switch (errorCode) {\n case \"auth/invalid-email\":\n return \"Email không hợp lệ\";\n case \"auth/user-disabled\":\n return \"Tài khoản đã bị khóa\";\n case \"auth/wrong-password\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/user-not-found\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/weak-password\":\n return \"Weak password! Please use stronger password.\";\n case \"auth/email-already-in-use\":\n return \"Email đã được sử dụng\";\n case \"auth/account-exists-with-different-credential\":\n return \"Tài khoản email đã được sử dụng bởi một phương thức đăng nhập khác\";\n case \"auth/email-not-verified\":\n return \"Email chưa được xác thực\";\n default:\n return \"Đã có lỗi xảy ra\";\n }\n }\n\n async signInWithEmailAndPassword(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithEmailAndPassword(this.auth, email, password);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n localStorage.removeItem(\"phygital-user-info\");\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signInWithGoogle(): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithPopup(this.auth, this.googleProvider);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signUp(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signUpResponse = await firebaseAuth.createUserWithEmailAndPassword(this.auth, email, password);\n const { user } = signUpResponse;\n const data = this.transformUserData(user);\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n await firebaseAuth.signOut(this.auth);\n // Tracking is now handled through callbacks in the consuming app\n } catch (err) {\n console.log(\"Firebase signOut error:\", err);\n }\n }\n\n async sendPasswordResetEmail(email: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendPasswordResetEmail(this.auth, email, actionCodeSettings);\n }\n\n async sendEmailVerification(): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n if (!this.auth.currentUser) {\n throw new Error(\"No current user\");\n }\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendEmailVerification(this.auth.currentUser, actionCodeSettings);\n }\n\n async changePassword(newPassword: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const user = this.auth.currentUser;\n if (!user) {\n throw new Error(\"No current user\");\n }\n return firebaseAuth.updatePassword(user, newPassword);\n }\n\n onAuthStateChanged(callback: (user: UserData | null) => void): () => void {\n // For client-side only usage, ensure initialization before setting up auth state listener\n if (typeof window === 'undefined') {\n return () => { }; // Return empty unsubscriber for server-side\n }\n\n // Set up the listener asynchronously\n let unsubscriber: (() => void) | null = null;\n\n this.ensureInitialized().then(async () => {\n const { firebaseAuth } = await getFirebaseModules();\n unsubscriber = firebaseAuth.onAuthStateChanged(this.auth, (user: any) => {\n if (user && user.emailVerified) {\n const userData = this.transformUserData(user);\n callback(userData);\n } else {\n callback(null);\n }\n });\n });\n\n // Return unsubscriber function\n return () => {\n if (unsubscriber) {\n unsubscriber();\n }\n };\n }\n\n getCurrentUser(): UserData | null {\n if (typeof window === 'undefined' || !this.initialized) {\n return null; // Return null for server-side or before initialization\n }\n\n const user = this.auth.currentUser;\n if (user && user.emailVerified) {\n return this.transformUserData(user);\n }\n return null;\n }\n}","import { FirebaseAuthService } from \"./FirebaseAuthService\";\n\ninterface AuthServiceConfig {\n firebaseConfig: any;\n}\n\nlet authServiceInstance: FirebaseAuthService | null = null;\n\nexport const createAuthService = (config: AuthServiceConfig): FirebaseAuthService => {\n if (!authServiceInstance) {\n authServiceInstance = new FirebaseAuthService(config.firebaseConfig);\n }\n return authServiceInstance;\n};\n\nexport const getAuthService = (): FirebaseAuthService | null => {\n return authServiceInstance;\n};\n\nexport const resetAuthService = (): void => {\n authServiceInstance = null;\n};","// Export Firebase auth service separately to avoid loading Firebase modules during SSR\nexport { FirebaseAuthService } from './FirebaseAuthService';\nexport { createAuthService, getAuthService, resetAuthService } from './authServiceFactory';","// Export all modules\nexport * from \"./modules/achievement\";\nexport * from \"./modules/reward\";\nexport * from \"./modules/notification\";\nexport * from \"./modules/memory\";\n\nexport * from \"./modules/auth\";\nexport * from \"./modules/user-profile\";\n\nexport * from \"./modules/scan-chip\";\nexport * from \"./modules/campaign\";\n\nexport * from \"./modules/location\";\n\nexport * from \"./modules/generate-certificate\";\n\nexport * from \"./modules/data-tracking\";\n\nexport * from \"./providers\";\n\nexport * from \"./modules/achivementWithReward\";\n\nexport * from \"./modules/send-email\";\n\nexport * from \"./helper\";\n","import { GetManyAchievementProgressParams, GetManyDeviceUidAchievementProgressParams, GetManyUserOrDeviceAchievementProgressParams } from \"@phygitallabs/achievement\";\n\nimport {\n GetManyAchievementProgressByDeviceParams,\n} from \"@phygitallabs/api-core\";\n\nimport { useManyAchievementProgress as useManyAchievementProgressCore } from \"@phygitallabs/achievement\";\nimport { useManyAchievementProgressByDevice as useManyAchievementProgressByDeviceCore } from \"@phygitallabs/api-core\";\n\n// Core react query hooks\nimport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n} from \"@phygitallabs/achievement\";\n\nimport { isAchievementCompleted, convertSnakeToCamel } from \"../helpers\";\n\nexport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n}\n\n// Customize react query hooks\n\n// Get achievement progress list by userid or deviceuid base on login status\nexport const useManyAchievementProgress = (\n params: GetManyUserOrDeviceAchievementProgressParams,\n options?: any\n) => {\n\n const isLoggedIn = !!params.userId;\n\n const queryParams = isLoggedIn\n ? {\n achievementIds: params.achievementIds,\n userId: params.userId!,\n applicationId: params.applicationId,\n } as GetManyAchievementProgressParams\n : {\n achievement_ids: params.achievementIds,\n device_uid: params.deviceUid!,\n applicationId: params.applicationId,\n } as GetManyDeviceUidAchievementProgressParams;\n\n if (isLoggedIn) {\n return useManyAchievementProgressCore(queryParams as GetManyAchievementProgressParams,\n {\n ...options,\n select: (data) => data.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n })),\n }\n );\n }\n\n return useManyAchievementProgressByDeviceCore(\n queryParams as GetManyAchievementProgressByDeviceParams, {\n ...options,\n select: (data) => {\n const camelCaseData = convertSnakeToCamel(data);\n return camelCaseData.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n }));\n },\n });\n};\n\n// export const useManyAchievementWithProgress = (\n// params: UseManyAchievementWithProgressParams,\n// options?: {\n// achievementOptions?: Partial<UseQueryOptions>;\n// progressOptions?: Partial<UseQueryOptions>;\n// }\n// ): UseManyAchievementWithProgressReturn => {\n// // Fetch achievements with retry logic\n// const achievementsQuery = useManyAchievements(\n// {\n// ...(params.achievementIds?.length && { ids: params.achievementIds }),\n// },\n// {\n// retry: (failureCount: number, error: Error) => {\n// // Retry up to 3 times with exponential backoff\n// if (failureCount < 3) {\n// console.warn(`Achievement fetch failed, retrying... (${failureCount + 1}/3)`, error);\n// return true;\n// }\n// return false;\n// },\n// retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000),\n// staleTime: 5 * 60 * 1000, // 5 minutes\n// gcTime: 10 * 60 * 1000, // 10 minutes\n// ...options?.achievementOptions,\n// }\n// );\n\n// // Prepare achievement IDs for progress query\n// const achievementIds = useMemo(() => {\n// if (params.achievementIds?.length) {\n// return params.achievementIds;\n// }\n// return achievementsQuery.data?.data?.map((a: any) => a.id) || [];\n// }, [params.achievementIds, achievementsQuery.data]);\n\n// // Fetch progress with retry logic (dependent on achievements)\n// const progressQuery = useManyAchievementProgress(\n// {\n// achievementIds,\n// userId: params.userId,\n// deviceUid: params.deviceUid,\n// applicationId: params.applicationId,\n// },\n// {\n// enabled: achievementIds.length > 0\n// }\n// );\n\n// // Combine data with error flags\n// const combinedData = useMemo((): AchievementWithProgress[] => {\n// const achievements = achievementsQuery.data?.data || [];\n// const progressData = progressQuery.data || [];\n\n// return achievements.map((achievement: any) => {\n// const progress = progressData.find((p: any) => p.achievementId === achievement.id) || null;\n\n// return {\n// achievement,\n// progress,\n// hasAchievementError: !!achievementsQuery.error,\n// hasProgressError: !!progressQuery.error,\n// };\n// });\n// }, [achievementsQuery.data, progressQuery.data, achievementsQuery.error, progressQuery.error]);\n\n// // Refetch functions\n// const refetchAchievements = () => {\n// console.log(\"Manually refetching achievements...\");\n// achievementsQuery.refetch();\n// };\n\n// const refetchProgress = () => {\n// console.log(\"Manually refetching progress...\");\n// progressQuery.refetch();\n// };\n\n// const refetchAll = () => {\n// console.log(\"Manually refetching all data...\");\n// Promise.all([achievementsQuery.refetch(), progressQuery.refetch()]);\n// };\n\n// return {\n// data: combinedData,\n// isLoading: achievementsQuery.isLoading || (achievementIds.length > 0 && progressQuery.isLoading),\n// isSuccess: achievementsQuery.isSuccess && (achievementIds.length === 0 || progressQuery.isSuccess),\n// achievementsError: achievementsQuery.error as Error | null,\n// progressError: progressQuery.error as Error | null,\n// refetchAchievements,\n// refetchProgress,\n// refetchAll,\n// };\n// };\n\n","import { Achievement, UserAchievementProgress } from \"../types\";\n\nconst getLocationIdsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const locationIds: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (!rule.filter) return;\n Object.values(rule.filter).forEach((filterList) => {\n if (!filterList.filters) return;\n filterList.filters.forEach((filter) => {\n if (filter.label === \"location_id\" && filter.value) {\n if (Array.isArray(filter.value)) {\n locationIds.push(...filter.value);\n } else {\n locationIds.push(filter.value);\n }\n }\n });\n });\n });\n });\n return Array.from(new Set(locationIds)) as string[];\n};\n\nconst getActionsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const actions: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (rule.action) {\n actions.push(rule.action)\n }\n });\n });\n return Array.from(new Set(actions)) as string[];\n};\n\nconst isAchievementCompleted = (achievement: UserAchievementProgress) => {\n return achievement.isCompleted || achievement.overallPercentage === 100;\n}\n\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n ? `${T}${Capitalize<SnakeToCamelCase<U>>}`\n : S;\n\ntype ConvertSnakeToCamel<T> = T extends (infer U)[]\n ? ConvertSnakeToCamel<U>[]\n : T extends Record<string, unknown>\n ? {\n [K in keyof T as K extends string\n ? SnakeToCamelCase<K>\n : K]: ConvertSnakeToCamel<T[K]>;\n }\n : T;\n\n/**\n * Converts snake_case keys to camelCase keys in an object or array of objects\n */\nexport function convertSnakeToCamel<T>(obj: T): ConvertSnakeToCamel<T> {\n if (obj === null || obj === undefined) {\n return obj as ConvertSnakeToCamel<T>;\n }\n \n if (Array.isArray(obj)) {\n return obj.map((item) =>\n convertSnakeToCamel(item)\n ) as ConvertSnakeToCamel<T>;\n }\n \n if (typeof obj === \"object\" && obj.constructor === Object) {\n const converted: Record<string, unknown> = {};\n \n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase()\n );\n converted[camelKey] = convertSnakeToCamel(\n (obj as Record<string, unknown>)[key]\n );\n }\n }\n \n return converted as ConvertSnakeToCamel<T>;\n }\n \n return obj as ConvertSnakeToCamel<T>;\n }\n \n\nexport {\n getLocationIdsFromAchievementRule,\n getActionsFromAchievementRule,\n isAchievementCompleted\n}","export {\n AchievementRuleActionType,\n AchievementServiceProvider,\n} from \"@phygitallabs/achievement\";\n\nimport type { Achievement, GetAchievementProgressResponse, UserAchievementProgress } from \"@phygitallabs/achievement\";\n\nexport {\n Achievement,\n GetAchievementProgressResponse,\n UserAchievementProgress,\n}\n\n// Combined types for hooks\nexport interface AchievementWithProgress {\n achievement: Achievement;\n progress: UserAchievementProgress | null;\n hasProgressError?: boolean;\n hasAchievementError?: boolean;\n}\n\nexport interface UseManyAchievementWithProgressParams {\n userId?: string;\n deviceUid?: string;\n applicationId?: string;\n achievementIds?: string[];\n}\n\nexport interface UseManyAchievementWithProgressReturn {\n data: AchievementWithProgress[];\n isLoading: boolean;\n isSuccess: boolean;\n achievementsError: Error | null;\n progressError: Error | null;\n refetchAchievements: () => void;\n refetchProgress: () => void;\n refetchAll: () => void;\n}\n\nexport enum AchievementType {\n DEFAULT = \"default\",\n MULTIPLE_CHECK_INS = \"multiple_check_ins\",\n RANDOM_CHECK_INS = \"random_check_ins\",\n GROUP_MISSION = \"group_mission\",\n}\n","// Re-export from @phygitallabs/reward package\nexport {\n useManyUserRewards,\n useGetUserRewards,\n useClaimUserReward,\n useApiListRewardModels as useListRewardModels,\n useApiGetRewardModel as useGetRewardModel,\n useApiCreateRewardModel as useCreateRewardModel,\n useApiUpdateRewardModel as useUpdateRewardModel,\n useApiDeleteRewardModel as useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward/src/hooks\";","// Re-export from @phygitallabs/reward package\nexport {\n CmentityRewardType,\n type CmentityStatus\n} from \"@phygitallabs/reward\";\n\n// Define RewardClaimStatus locally since it's not exported from reward package\nexport enum RewardClaimStatus {\n NOT_CLAIMED = \"not_claimed\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n FAILED = \"failed\",\n}","export * from \"@phygitallabs/notification-api\";\nexport { NotificationProvider } from \"./providers\";","import React from \"react\";\nimport { NotificationProvider as NotificationProviderApi } from \"@phygitallabs/notification-api\";\n\nimport { EnvironmentType } from \"../../../types/common\";\n\nimport type { LPResponse } from \"@phygitallabs/notification-api\";\n\nimport serviceApiUrl from \"../../../constants/service\";\n\ninterface NotificationCallbacks {\n onWebSocketOpen?: (metadata: Record<string, any>) => void;\n onWebSocketClose?: (metadata: Record<string, any>) => void;\n onWebSocketMessage?: (data: LPResponse) => void;\n}\n\ninterface NotificationProviderProps extends NotificationCallbacks {\n children: React.ReactNode;\n autoConnect?: boolean;\n user: { id: string; accessToken: string | null };\n environment?: EnvironmentType;\n}\n\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n autoConnect = true,\n environment = \"dev\",\n user,\n onWebSocketOpen,\n onWebSocketClose,\n onWebSocketMessage,\n}) => {\n\n const webSocketUrl = serviceApiUrl[environment]?.API_NOTIFICATION_SOCKET_URL;\n\n return (\n <NotificationProviderApi\n userUid={user.id}\n accessToken={user.accessToken}\n webSocketUrl={webSocketUrl}\n autoConnect={autoConnect}\n onWebSocketOpen={onWebSocketOpen}\n onWebSocketClose={onWebSocketClose}\n onWebSocketMessage={onWebSocketMessage}\n >\n {children}\n </NotificationProviderApi>\n );\n};\n\nexport default NotificationProvider;","const serviceApiUrl = {\n dev: {\n API_BASE_URL: \"https://backend-dev.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-dev.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-dev.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-dev.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-dev.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-dev.nomion.io/notification-ws/ws\",\n },\n staging: {\n API_BASE_URL: \"https://backend-staging.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-staging.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-staging.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-staging.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-staging.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-staging.nomion.io/notification-ws/ws\",\n\n },\n production: {\n API_BASE_URL: \"https://backend.nomion.io\",\n API_BASE_CORE_URL: \"https://backend.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend.nomion.io/notification-ws/ws\",\n\n },\n}\n\nexport default serviceApiUrl;","import { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey } from \"@phygitallabs/api-core\";\n\nexport { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey };","import { createContext, useEffect, ReactNode, useContext } from 'react';\nimport { AuthService, AuthCallbacks } from '../types';\n\nimport { useAppSelector, useAppDispatch } from '../../../store/hooks';\nimport {\n selectUser,\n selectIsSignedIn,\n selectIsLoading,\n signIn as signInAction,\n signOut as signOutAction,\n updateScanStatus as updateScanStatusAction,\n refreshUser as refreshUserAction,\n setPending,\n initializeFromStorage,\n} from '../store/authSlice';\n\nimport { AuthResponse, UserData } from '../types';\n\nexport interface AuthContextType {\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n // User state\n user: UserData;\n isSignedIn: boolean;\n isLoading: boolean;\n\n // Auth actions\n signInWithCredential: (email: string, password: string) => Promise<AuthResponse>;\n signInWithGoogle: () => Promise<AuthResponse | null>;\n signUp: (email: string, password: string) => Promise<AuthResponse>;\n signOut: () => Promise<void>;\n\n // Password actions\n forgotPassword: (email: string) => Promise<void>;\n sendEmailVerification: () => Promise<void>;\n changePassword: (newPassword: string) => Promise<void>;\n\n // User management\n updateScanStatus: (status: boolean) => void;\n refreshUser: (userData: UserData) => void;\n\n}\n\nexport const AuthContext = createContext<AuthContextType | null>(null);\n\nexport interface AuthProviderProps {\n children: ReactNode;\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n}\n\nexport function AuthProvider({ children, authService, authCallbacks }: AuthProviderProps) {\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n // Initialize auth state from localStorage\n dispatch(initializeFromStorage());\n\n // Set up auth state listener\n const unsubscribe = authService.onAuthStateChanged((user) => {\n if (user) {\n dispatch(signInAction(user));\n\n // Use auth callback for user identification\n if (authCallbacks?.onUserIdentify && user.email) {\n authCallbacks.onUserIdentify({\n email: user.email,\n name: user.displayName,\n avatar: user.avatar,\n uid: user.uid,\n });\n }\n\n // Notify about successful sign in\n if (authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(user);\n }\n } else {\n dispatch(signOutAction());\n\n // Use auth callback for reset\n if (authCallbacks?.onTrackingReset) {\n authCallbacks.onTrackingReset();\n }\n }\n dispatch(setPending(false));\n });\n\n return () => {\n unsubscribe();\n };\n }, [authService, dispatch, authCallbacks]);\n\n // Redux selectors\n const user = useAppSelector(selectUser);\n const isSignedIn = useAppSelector(selectIsSignedIn);\n const isLoading = useAppSelector(selectIsLoading);\n\n // Auth actions with auth callbacks\n const signInWithCredential = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signInWithEmailAndPassword(email, password);\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return result;\n };\n\n const signInWithGoogle = async (): Promise<AuthResponse | null> => {\n const result = await authService.signInWithGoogle();\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n return result;\n\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return null;\n };\n\n const signUp = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signUp(email, password);\n\n if (result.data && authCallbacks?.onSignUpSuccess) {\n authCallbacks.onSignUpSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignUpError) {\n authCallbacks.onSignUpError(result.errorCode);\n }\n\n return result;\n };\n\n const signOut = async (): Promise<void> => {\n await authService.signOut();\n dispatch(signOutAction());\n\n if (authCallbacks?.onSignOutSuccess) {\n authCallbacks.onSignOutSuccess();\n }\n };\n\n // Password actions\n const forgotPassword = async (email: string): Promise<void> => {\n return await authService.sendPasswordResetEmail(email);\n };\n\n const sendEmailVerification = async (): Promise<void> => {\n return await authService.sendEmailVerification();\n };\n\n const changePassword = async (newPassword: string): Promise<void> => {\n return await authService.changePassword(newPassword);\n };\n\n // User management\n const updateScanStatus = (status: boolean): void => {\n dispatch(updateScanStatusAction(status));\n };\n\n const refreshUser = (userData: UserData): void => {\n dispatch(refreshUserAction(userData));\n };\n\n const contextValue: AuthContextType = {\n authService,\n authCallbacks,\n // User state\n user,\n isSignedIn,\n isLoading,\n\n // Auth actions\n signInWithCredential,\n signInWithGoogle,\n signUp,\n signOut,\n\n // Password actions\n forgotPassword,\n sendEmailVerification,\n changePassword,\n\n // User management\n updateScanStatus,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport const useAuth = () => {\n const authContext = useContext(AuthContext);\n if (!authContext) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return authContext;\n};","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { TapquestCoreRootState, TapquestCoreAppDispatch } from './index';\n\n// Typed hooks for internal use within tapquest-core\nexport const useAppDispatch = () => useDispatch<TapquestCoreAppDispatch>();\nexport const useAppSelector: TypedUseSelectorHook<TapquestCoreRootState> = useSelector;","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { UserData, UserRole } from \"../types\";\nimport {\n setUserInfo,\n removeUserInfo,\n getUserInfo,\n setAccessToken,\n setRefreshToken,\n removeAccessToken,\n removeRefreshToken,\n getAccessToken,\n} from \"../helpers\";\n\nconst defaultUser: UserData = {\n uid: \"\",\n id: \"\",\n userName: \"\",\n displayName: \"\",\n avatar: \"/images/default-avatar.jpg\",\n email: \"\",\n exp: 0,\n emailVerified: false,\n refreshToken: \"\",\n accessToken: \"\",\n role: UserRole.NULL,\n scanStatus: false,\n};\n\nexport interface AuthState {\n user: UserData;\n isSignedIn: boolean;\n pending: boolean;\n}\n\nconst initialState: AuthState = {\n user: defaultUser,\n isSignedIn: false,\n pending: true,\n};\n\nexport const authSlice = createSlice<\n AuthState,\n {\n signIn: (state: AuthState, action: PayloadAction<UserData>) => void;\n signOut: (state: AuthState) => void;\n updateScanStatus: (state: AuthState, action: PayloadAction<boolean>) => void;\n refreshUser: (state: AuthState, action: PayloadAction<UserData>) => void;\n setPending: (state: AuthState, action: PayloadAction<boolean>) => void;\n initializeFromStorage: (state: AuthState) => void;\n },\n 'auth'\n>({\n name: \"auth\",\n initialState,\n reducers: {\n signIn: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Store in localStorage for persistence\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n },\n signOut: (state) => {\n state.user = defaultUser;\n state.isSignedIn = false;\n state.pending = false;\n\n // Clear localStorage\n removeUserInfo();\n removeAccessToken();\n removeRefreshToken();\n },\n updateScanStatus: (state, action: PayloadAction<boolean>) => {\n state.user.scanStatus = action.payload;\n\n // Update localStorage\n setUserInfo(state.user);\n },\n refreshUser: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n if (userData) {\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Update localStorage\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n }\n },\n setPending: (state, action: PayloadAction<boolean>) => {\n state.pending = action.payload;\n },\n initializeFromStorage: (state) => {\n const storedUser = getUserInfo();\n const accessToken = getAccessToken();\n\n if (storedUser && accessToken) {\n state.user = storedUser;\n state.isSignedIn = true;\n }\n state.pending = false;\n },\n },\n});\n\nexport const {\n signIn,\n signOut,\n updateScanStatus,\n refreshUser,\n setPending,\n initializeFromStorage,\n} = authSlice.actions;\n\n// Selectors\nexport const selectAuth = (state: any) => state.auth;\nexport const selectUser = (state: any) => state.auth.user;\nexport const selectUserUId = (state: any) =>\n state.auth.user.uid || state.auth.user.id;\nexport const selectUserAccesstoken = (state: any) =>\n state.auth.user.accessToken;\nexport const selectUserEmail = (state: any) => state.auth.user.email;\nexport const selectUsername = (state: any) => state.auth.user.userName;\nexport const selectSignInProvider = (state: any) =>\n state.auth.user.signInProvider;\nexport const selectUserScanStatus = (state: any) =>\n state.auth.user.scanStatus;\nexport const selectIsSignedIn = (state: any) => state.auth.isSignedIn;\nexport const selectIsLoading = (state: any) => state.auth.pending;\n\nexport default authSlice.reducer;","import {\n deviceUIDKey,\n chipAuthTokenKey,\n retryAttemptsRefreshToken,\n accessTokenKey,\n refreshTokenKey,\n userInfoKey,\n} from \"../constants\";\n\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const generateDeviceId = async (): Promise<string> => {\n try {\n const deviceFingerprint = await generateDeviceFingerprint();\n return deviceFingerprint;\n } catch (error) {\n console.error(\"Error generating device fingerprint:\", error);\n return uuidv4();\n }\n};\n\nconst generateDeviceFingerprint = async (): Promise<string> => {\n const timestamp = new Date().toISOString(); // UTC timestamp\n\n const fingerprintRaw = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.platform,\n navigator.hardwareConcurrency,\n timestamp, // Include timestamp\n ].join(\"::\");\n\n const encoder = new TextEncoder();\n const data = encoder.encode(fingerprintRaw);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return fingerprint;\n};\n\nexport default generateDeviceFingerprint;\n\n\nexport const getDeviceUid = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(deviceUIDKey);\n};\n\nexport const setDeviceUid = (deviceId: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(deviceUIDKey, deviceId);\n};\n\nexport const removeDeviceUid = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(deviceUIDKey);\n};\n\nexport const checkDeviceUid = async (): Promise<string> => {\n // if (typeof window === \"undefined\") return null;\n\n let deviceUID = getDeviceUid();\n\n if (!deviceUID) {\n deviceUID = await generateDeviceId();\n setDeviceUid(deviceUID);\n }\n\n return deviceUID;\n};\n\n// CHIP AUTH TOKEN\nexport const getChipAuthToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(chipAuthTokenKey);\n};\n\nexport const setChipAuthToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(chipAuthTokenKey, value);\n};\n\nexport const removeChipAuthToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(chipAuthTokenKey);\n};\n\n// RETRY ATTEMPTS\nexport const getRetryAttemptsRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(retryAttemptsRefreshToken);\n};\n\nexport const setRetryAttemptsRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(retryAttemptsRefreshToken, value);\n};\n\n// ACCESS TOKEN\nexport const getAccessToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(accessTokenKey);\n};\n\nexport const setAccessToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(accessTokenKey, value);\n};\n\nexport const removeAccessToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(accessTokenKey);\n};\n\n// REFRESH TOKEN\nexport const getRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(refreshTokenKey);\n};\n\nexport const setRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(refreshTokenKey, value);\n};\n\nexport const removeRefreshToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(refreshTokenKey);\n};\n\n// USER INFO\nexport const getUserInfo = () => {\n if (typeof window === \"undefined\") return null;\n const userInfo = localStorage.getItem(userInfoKey);\n if (!userInfo) return null;\n try {\n return JSON.parse(userInfo);\n } catch (error) {\n console.error(\"Failed to parse stored user data:\", error);\n return null;\n }\n};\n\nexport const setUserInfo = (userData: any) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(userInfoKey, JSON.stringify(userData));\n};\n\nexport const removeUserInfo = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(userInfoKey);\n};\n\nexport { createRefreshTokenFunction } from \"./refreshToken\";\nexport type { RefreshTokenConfig } from \"./refreshToken\";","import mem from \"mem\";\nimport { setUserInfo, removeUserInfo, getUserInfo, getRefreshToken } from \"./index\";\n\n// Internal configuration - managed by tapquest-core\nconst REFRESH_TOKEN_CONFIG = {\n maxAge: 10000, // 10 seconds cache\n} as const;\n\nexport interface RefreshTokenConfig {\n firebaseApiKey: string;\n}\n\nconst createRefreshTokenFunction = (config: RefreshTokenConfig) => {\n const refreshTokenFn = async () => {\n try {\n const session = getUserInfo();\n const refreshToken = getRefreshToken();\n\n if (!refreshToken) {\n removeUserInfo();\n return;\n }\n\n const params = new URLSearchParams();\n params.append(\"grant_type\", \"refresh_token\");\n params.append(\"refresh_token\", refreshToken);\n\n const fetchData = {\n method: \"POST\",\n headers: new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n }),\n body: params,\n };\n\n const response = await fetch(\n `https://securetoken.googleapis.com/v1/token?key=${config.firebaseApiKey}`,\n fetchData\n );\n const data = await response.json();\n\n if (data.error) {\n removeUserInfo();\n return;\n }\n\n const newSession = {\n ...session,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n setUserInfo(newSession);\n\n return newSession;\n } catch {\n removeUserInfo();\n }\n };\n\n return mem(refreshTokenFn, { maxAge: REFRESH_TOKEN_CONFIG.maxAge });\n};\n\nexport { createRefreshTokenFunction };","// Export types\nexport type {\n UserData,\n UserRole,\n SignInProvider,\n AuthResponse,\n AuthService,\n FirebaseConfig,\n UseAuthReturn,\n AuthProviderProps,\n AuthCallbacks,\n} from './types';\n\n// Export hooks and providers\n// export { useAuth } from './hooks';\nexport { useAuth, AuthProvider } from './providers';\n\n// Export constants and helpers\nexport * from './constants';\nexport * from './helpers';","import { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest } from \"@phygitallabs/api-core\";\n\nexport { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest };","import { UserSourceType } from \"@phygitallabs/api-core\";\n\nexport { UserSourceType };","import { useEffect } from \"react\";\nimport { useChipScanStory } from \"@phygitallabs/api-core\";\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { setChipAuthToken } from \"../../auth/helpers\";\n\nimport { ScanChipResponse } from \"../types\";\n\ninterface UseScanChipProps {\n token?: string;\n id?: string;\n onScanChipError?: () => void;\n}\nexport { useChipScanStory, usePGLCoreService };\nexport function useScanChip({ token, id, onScanChipError }: UseScanChipProps): ScanChipResponse {\n const { updateHeaders } = usePGLCoreService();\n\n useEffect(() => {\n if (!!token) {\n\n const header = {\n \"Chip-Authorization\": token,\n };\n\n setChipAuthToken(token);\n updateHeaders(header);\n\n }\n }, [token, updateHeaders]);\n\n const { data, isLoading, isError, isSuccess } = useChipScanStory({\n token,\n id,\n });\n\n useEffect(() => {\n if (isError) {\n onScanChipError?.();\n }\n }, [isError, onScanChipError]);\n\n\n if (!data)\n return {\n data: null,\n isLoading,\n isError,\n isSuccess\n };\n\n return {\n data: {\n externalUrl: data?.external_url,\n campaignDetail: data?.project,\n locationDetail: data?.location,\n scanCounter: data?.scan_counter,\n campaignId: data?.campaign_id,\n chipModelId: data?.chip_model_id,\n organizationId: data?.organization_id,\n projectId: data?.project_id,\n locationId: data?.location_id,\n chipUid: data?.uid,\n },\n isLoading,\n isError,\n isSuccess\n }\n}","// Re-export from @phygitallabs/api-core package\nexport {\n useOneCampaign as useCampaignDetail,\n useUserCampaignAction,\n useOneUserCampaign,\n\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport {\n CampaignState\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport type {\n CampaignModel,\n UserCampaignModel,\n MissionWithProgress,\n TaskWithProgress,\n UserCampaignMission,\n Mission,\n MissionProgress,\n TaskProgress,\n} from \"@phygitallabs/api-core\";\n\nexport enum TaskType {\n CHECK_IN = \"check_in\",\n CREATE_MEMORY = \"create_memory\",\n FILL_FORM = \"fill_form\",\n SHARE = \"share\",\n}\n\n// Define other types locally since they're not exported from api-core package\nexport interface CampaignByProjectIdModel {\n id: string;\n certificate_index?: number;\n completed_checkin_rule?: number;\n completed_device_uids?: string[];\n completed_location_ids?: string[];\n completed_user_ids?: string[];\n description?: string;\n image_url?: string;\n is_custom_checkin_rule?: boolean;\n location_ids?: string[];\n name: string;\n total_completed?: number;\n user_campaign?: any;\n custom_info: Record<string, any>;\n mission: Record<string, any>;\n achievement_id: string;\n start_date: string;\n end_date: string;\n certificate: {\n image: any;\n title: string;\n };\n project_id?: string;\n status: string;\n created_at: number;\n updated_at: number;\n created_by?: string;\n updated_by?: string;\n}\n\n","// Re-export from @phygitallabs/api-core package\nexport {\n useManyLocations as useLocationsList,\n useOneLocation as useLocationDetail,\n useUserCampaignsCompletedLocation as useLocationProgress,\n useManyUserActionLocations,\n locationQueryKeys\n} from \"@phygitallabs/api-core\";","\nexport const sortLocationsByIndex = <T extends { index?: number }>(locations: T[]): T[] => {\n return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n};\n\n\nexport const filterLocationsByProperty = <T extends Record<string, any>>(\n locations: T[],\n propertyName: keyof T,\n value: boolean\n): T[] => {\n return locations.filter(location => location[propertyName] === value);\n};\n","import { \n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate\n} from \"@phygitallabs/generate-certificate\";\n\n\nexport { useGenerateThaocamvienCertificate, useGenerateTemplateCertificate, useGenerateFansipanCertificate };","import posthog from \"posthog-js\";\n\ndeclare global {\n interface Window {\n dataLayer: Record<string, any>[];\n }\n}\n\ndeclare function gtag(\n command: \"event\",\n eventName: string,\n eventParameters: Record<string, any>\n): void;\n\n\n// GTM\nconst pushEventToDataLayer = (event: string, data: Record<string, any>) => {\n try {\n window.dataLayer = window.dataLayer || [];\n\n window.dataLayer.push({\n event,\n ...data,\n });\n\n } catch (error) {\n console.error(error);\n }\n};\n\n// GA\nconst pushEventToGA = (eventName: string, eventData: Record<string, any>) => {\n if (typeof gtag != \"function\") {\n console.error(\"gtag is not a function\");\n return;\n }\n gtag(\"event\", eventName, eventData);\n};\n\n// Posthog\nconst pushEventToPosthog = (eventName: string, eventData: Record<string, any>) => {\n posthog.capture(eventName, eventData);\n};\n\nfunction useDataTracking() {\n const trackEvent = (eventName: string, eventData: Record<string, any>, useTools?: (\"gtm\" | \"ga\" | \"posthog\")[]) => {\n\n useTools = useTools || [\"gtm\"];\n\n if (useTools.includes(\"gtm\") && typeof window !== \"undefined\") {\n pushEventToDataLayer(eventName, eventData);\n }\n if (useTools.includes(\"ga\") && typeof gtag == \"function\") {\n pushEventToGA(eventName, eventData);\n }\n if (useTools.includes(\"posthog\") && typeof posthog == \"function\") {\n pushEventToPosthog(eventName, eventData);\n }\n };\n\n return {\n trackEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { useMemo } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { PersistGate } from \"redux-persist/integration/react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { store, persistor } from \"../store\";\nimport { AuthCallbacks } from \"../modules/auth/types\";\nimport { AuthProvider } from \"../modules/auth/providers\";\nimport { FirebaseConfig } from \"../modules/auth/types\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: FirebaseConfig;\n authCallbacks?: AuthCallbacks;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n firebaseConfig,\n authCallbacks\n}) => {\n\n const internalAuthService = useMemo(() => {\n if (firebaseConfig && typeof window !== \"undefined\") {\n try {\n // Dynamic import to avoid loading Firebase modules during build\n const { createAuthService } = require(\"../modules/auth/services\");\n return createAuthService({ firebaseConfig });\n } catch (error) {\n console.warn(\"Failed to create auth service from firebase config:\", error);\n return null;\n }\n }\n\n return null;\n }, [firebaseConfig]);\n\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <AuthProvider\n authService={internalAuthService}\n authCallbacks={authCallbacks}\n >\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n firebaseConfig={firebaseConfig}\n >\n {children}\n </ServicesProvider>\n </AuthProvider>\n\n </PersistGate>\n </Provider>\n );\n};","import React, { useEffect, useState, useMemo } from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { PGLCoreServiceProvider } from \"@phygitallabs/api-core\";\nimport { RewardServiceProvider } from \"@phygitallabs/reward\";\nimport { AchievementServiceProvider } from \"@phygitallabs/achievement\";\nimport { GenerateCertificateServiceProvider } from \"@phygitallabs/generate-certificate\";\n\nimport serviceApiUrl from \"../constants/service\";\nimport { APIConfig, ServiceConfig } from \"../types/service\";\n\nimport { checkDeviceUid, getAccessToken, getRetryAttemptsRefreshToken, setRetryAttemptsRefreshToken, createRefreshTokenFunction } from \"../modules/auth/helpers\";\n\nimport { httpMaxRetries } from \"../modules/auth\";\n\nimport { useAuth } from \"../modules/auth\";\n\nimport axios from \"axios\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: any;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n firebaseConfig\n}) => {\n const { refreshUser, signOut } = useAuth();\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\n\n // Create memoized refresh token function\n const memoizedRefreshToken = useMemo(() => {\n if (!firebaseConfig?.apiKey) {\n console.warn(\"Firebase API key not provided, refresh token functionality will not work\");\n return null;\n }\n return createRefreshTokenFunction({\n firebaseApiKey: firebaseConfig.apiKey\n });\n }, [firebaseConfig?.apiKey]);\n\n // Init client\n useEffect(() => {\n const initClient = async () => {\n try {\n const deviceUid = await checkDeviceUid();\n\n const responseInterceptors = ({\n onFulfilled: (response: any) => response,\n onRejected: async (error: any) => {\n\n // TODO: Remove\n // Feature: use refresh token to get new access token when token expired, have maximum `retry attempts`\n const originalRequest = error.config;\n\n if (error.response?.status === 401 && !originalRequest._retry) {\n const retryAttempts = parseInt(\n getRetryAttemptsRefreshToken() || \"0\",\n 10\n );\n\n if (retryAttempts >= httpMaxRetries) {\n await signOut();\n return Promise.reject(error);\n }\n\n setRetryAttemptsRefreshToken(`${retryAttempts + 1}`);\n originalRequest._retry = true;\n\n try {\n if (!memoizedRefreshToken) {\n await signOut();\n return Promise.reject(error);\n }\n\n const result = await memoizedRefreshToken();\n\n if (result?.accessToken) {\n originalRequest.headers[\n \"Authorization\"\n ] = `Bearer ${result.accessToken}`;\n\n setRetryAttemptsRefreshToken(\"0\");\n \n refreshUser(result);\n\n return axios(originalRequest);\n }\n } catch (refreshError) {\n console.log(\"Failed to refresh token:\", refreshError);\n }\n }\n\n return Promise.reject(error);\n },\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => {\n // Feature: set access token to request header\n const currentToken = getAccessToken();\n\n if (currentToken && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${currentToken}`;\n }\n return config;\n },\n onRejected: (error: any) => Promise.reject(error),\n })\n\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n \"Device-UID\": deviceUid,\n }\n }\n\n const config: ServiceConfig = {\n queryClient,\n axiosConfig,\n responseInterceptors,\n requestInterceptors,\n useDevTool: true,\n };\n\n setCommonServiceConfig(config);\n\n } catch (error) {\n console.error(error);\n }\n }\n\n initClient();\n }, [queryClient]);\n\n if (!commonServiceConfig) {\n return <></>\n }\n\n return (\n <PGLCoreServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}/${version}`}\n baseCoreURL={`${serviceApiUrl[environment].API_BASE_CORE_URL}/${version}`}\n >\n <RewardServiceProvider\n {...commonServiceConfig}\n // baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/${version}`}\n baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/v1`} // todo: using v1 until backend fully migrate\n >\n <AchievementServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_ACHIEVEMENT_URL}/${version}`}\n >\n <GenerateCertificateServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_GENERATE_CERTIFICATE_URL}/v1`}\n >\n {children}\n </GenerateCertificateServiceProvider>\n </AchievementServiceProvider>\n </RewardServiceProvider>\n </PGLCoreServiceProvider>\n );\n};\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport storage from \"redux-persist/lib/storage\";\nimport { persistReducer, persistStore, PersistConfig } from \"redux-persist\";\nimport { authSlice } from \"../modules/auth/store/authSlice\";\n\n// Auth persist config\nconst authPersistConfig: PersistConfig<any> = {\n key: \"tapquest-auth\",\n storage,\n whitelist: [\"user\", \"isSignedIn\"], // Only persist user and sign-in status\n};\n\n// Create persisted auth reducer\nconst persistedAuthReducer = persistReducer(authPersistConfig, authSlice.reducer);\n\n// Configure the tapquest-core store\nexport const store = configureStore({\n reducer: {\n auth: persistedAuthReducer,\n },\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Ignore redux-persist actions\n ignoredActions: [\n 'persist/FLUSH',\n 'persist/REHYDRATE',\n 'persist/PAUSE',\n 'persist/PERSIST',\n 'persist/PURGE',\n 'persist/REGISTER',\n ],\n },\n }),\n});\n\n// Create persistor\nexport const persistor = persistStore(store);\n\n// Export types\nexport type TapquestCoreRootState = ReturnType<typeof store.getState>;\nexport type TapquestCoreAppDispatch = typeof store.dispatch;\n\n// Export store instance for internal use\nexport { store as tapquestCoreStore };","import { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward/src/hooks/useGroupReward\";\nimport { useEffect, useMemo } from \"react\";\n\ninterface UseAchivementPlusRewardModelParams {\n campaignId: string;\n}\ninterface GroupRewardData {\n reward_models: EntityRewardModel[][];\n}\n\nfunction buildMappedAchievements(achievements: Achievement[], groupRewardData: GroupRewardData) {\n if (!groupRewardData?.reward_models) return [];\n\n const rewardModels = groupRewardData.reward_models;\n\n return achievements.map((achievement, achievementIndex) => {\n const parentReward = rewardModels[achievementIndex]?.[0] || null;\n\n const subAchievements =\n achievement.subAchievementIds?.map((subId: string, subIndex: number) => {\n const reward =\n rewardModels[\n achievementIndex * (achievement.subAchievementIds?.length || 0) +\n subIndex +\n 1\n ]?.[0] || null;\n\n return {\n id: subId,\n reward_model: reward,\n };\n }) || [];\n\n return {\n id: achievement.id,\n name: achievement.name,\n reward_model: parentReward,\n subAchievements,\n };\n });\n}\n\nconst useAchivementPlusRewardModel = ({ campaignId }: UseAchivementPlusRewardModelParams) => {\n const { data: achievements, isLoading: isLoadingAchievements } =\n useManyAchievements(\n {\n \"filter.labels\": { campaign_id: campaignId },\n \"filter.type\": \"group_mission\",\n \"pagination.limit\": 200,\n },\n { enabled: !!campaignId }\n );\n\n const groupRewardIds = useMemo(() => {\n if (!achievements?.data) return [];\n return achievements.data\n .map((achievement) => achievement.groupRewardId)\n .filter((id): id is string => id !== undefined);\n }, [achievements?.data]);\n const {\n mutate: fetchGroupRewardModels,\n data: groupRewardModelsData,\n isPending: isPendingGroupRewardModels,\n } = useCreateModelGroupReward();\n useEffect(() => {\n if (groupRewardIds.length > 0) {\n fetchGroupRewardModels({ group_reward_ids: groupRewardIds });\n }\n }, [groupRewardIds, fetchGroupRewardModels]);\n\n const mappedAchievements = useMemo(() => {\n if (!groupRewardModelsData?.data || !achievements?.data) return [];\n return buildMappedAchievements(achievements.data, groupRewardModelsData.data);\n }, [groupRewardModelsData, achievements?.data]);\n return {\n mappedAchievements,\n isLoading: isLoadingAchievements || isPendingGroupRewardModels,\n };\n};\n\nexport default useAchivementPlusRewardModel;\n","import { useSendEmail } from \"@phygitallabs/api-core\";\nexport {useSendEmail}","import { cn, parse, fileToBase64 } from \"@phygitallabs/helpers\";\n\nexport { cn, parse, fileToBase64 };"],"mappings":"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","names":["signOut","firebaseApp","firebaseAuth","AchievementType","RewardClaimStatus","jsx","user","signOut","updateScanStatus","refreshUser","useEffect","useEffect","TaskType","useMemo","useEffect","AchievementServiceProvider","jsx","refreshUser","signOut","useEffect","config","AchievementServiceProvider","jsx","useMemo","createAuthService","useManyAchievements","useCreateModelGroupReward","useEffect","useMemo"]}
|
|
1
|
+
{"version":3,"sources":["../src/modules/auth/constants/index.ts","../src/modules/auth/services/FirebaseAuthService.ts","../src/modules/auth/services/authServiceFactory.ts","../src/modules/auth/services/index.ts","../src/index.ts","../src/modules/achievement/hooks/index.ts","../src/modules/achievement/helpers/index.ts","../src/modules/achievement/types/index.ts","../src/modules/reward/hooks/useRewardService.ts","../src/modules/reward/types/enums.ts","../src/modules/notification/index.ts","../src/modules/notification/providers/index.tsx","../src/constants/service.ts","../src/modules/memory/hooks/index.ts","../src/modules/auth/providers/AuthProvider.tsx","../src/store/hooks.ts","../src/modules/auth/store/authSlice.ts","../src/modules/auth/helpers/index.ts","../src/modules/auth/helpers/refreshToken.ts","../src/modules/auth/index.ts","../src/modules/user-profile/hooks/index.ts","../src/modules/user-profile/types/index.ts","../src/modules/scan-chip/hooks/index.tsx","../src/modules/campaign/hooks/useCampaignService.ts","../src/modules/campaign/types/enums.ts","../src/modules/campaign/types/campaign.ts","../src/modules/location/hooks/useLocationService.ts","../src/modules/location/utils/locationHelpers.ts","../src/modules/generate-certificate/hooks/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/store/index.ts","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["export const userInfoKey = \"phygital-user-info\";\nexport const accessTokenKey = \"accessToken\";\nexport const refreshTokenKey = \"refreshToken\";\nexport const httpMaxRetries = 3;\nexport const retryAttemptsRefreshToken = \"retryAttemptsRefreshToken\";\n\nexport const deviceUIDKey = \"Device-UID\";\nexport const chipAuthTokenKey = \"chip-auth-token\";\n\n","// Client-side only imports\nlet firebaseApp: any;\nlet firebaseAuth: any;\n\n// Dynamic imports for client-side only\nconst getFirebaseModules = async () => {\n if (typeof window === 'undefined') {\n throw new Error('Firebase can only be used in client environment');\n }\n\n if (!firebaseApp || !firebaseAuth) {\n const [\n { initializeApp, getApps },\n {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n }\n ] = await Promise.all([\n import(\"firebase/app\"),\n import(\"firebase/auth\")\n ]);\n\n firebaseApp = { initializeApp, getApps };\n firebaseAuth = {\n getAuth,\n signInWithEmailAndPassword,\n createUserWithEmailAndPassword,\n signInWithPopup,\n GoogleAuthProvider,\n signOut,\n sendPasswordResetEmail,\n sendEmailVerification,\n updatePassword,\n onAuthStateChanged,\n };\n }\n\n return { firebaseApp, firebaseAuth };\n};\n\nimport { AuthService, FirebaseConfig, AuthResponse, UserData, SignInProvider } from \"../types\";\nimport { accessTokenKey, refreshTokenKey } from \"../constants\";\n\nexport class FirebaseAuthService implements AuthService {\n private app: any;\n private auth: any;\n private googleProvider: any;\n private config: FirebaseConfig;\n private initialized = false;\n\n constructor(config: FirebaseConfig) {\n this.config = config;\n // Initialization will be done lazily in client environment\n }\n\n private async ensureInitialized() {\n if (this.initialized) return;\n\n const { firebaseApp, firebaseAuth } = await getFirebaseModules();\n\n // Initialize Firebase app if not already initialized\n if (!firebaseApp.getApps().length) {\n this.app = firebaseApp.initializeApp(this.config);\n } else {\n this.app = firebaseApp.getApps()[0];\n }\n\n this.auth = firebaseAuth.getAuth(this.app);\n this.googleProvider = new firebaseAuth.GoogleAuthProvider();\n this.initialized = true;\n }\n\n private transformUserData(user: any): UserData {\n return {\n id: user.uid,\n uid: user.uid,\n userName: user.displayName || \"\",\n displayName: user.displayName || \"\",\n email: user.email || \"\",\n refreshToken: user.refreshToken,\n accessToken: (user as any).accessToken || \"\",\n exp: (user as any).stsTokenManager?.expirationTime || 0,\n emailVerified: user.emailVerified,\n avatar: user.photoURL || \"/images/default-avatar.jpg\",\n signInProvider: this.getSignInProvider(user),\n role: undefined,\n scanStatus: false,\n };\n }\n\n private getSignInProvider(user: any): SignInProvider {\n const providers = user.providerData.map((p: any) => p.providerId);\n if (providers.includes(\"google.com\")) return \"google.com\";\n return \"password\";\n }\n\n private translateErrorCode(errorCode: string): string {\n switch (errorCode) {\n case \"auth/invalid-email\":\n return \"Email không hợp lệ\";\n case \"auth/user-disabled\":\n return \"Tài khoản đã bị khóa\";\n case \"auth/wrong-password\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/user-not-found\":\n return \"Tài khoản/mật khẩu không đúng\";\n case \"auth/weak-password\":\n return \"Weak password! Please use stronger password.\";\n case \"auth/email-already-in-use\":\n return \"Email đã được sử dụng\";\n case \"auth/account-exists-with-different-credential\":\n return \"Tài khoản email đã được sử dụng bởi một phương thức đăng nhập khác\";\n case \"auth/email-not-verified\":\n return \"Email chưa được xác thực\";\n default:\n return \"Đã có lỗi xảy ra\";\n }\n }\n\n async signInWithEmailAndPassword(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithEmailAndPassword(this.auth, email, password);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n localStorage.removeItem(\"phygital-user-info\");\n localStorage.removeItem(accessTokenKey);\n localStorage.removeItem(refreshTokenKey);\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signInWithGoogle(): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signInResponse = await firebaseAuth.signInWithPopup(this.auth, this.googleProvider);\n const { user } = signInResponse;\n const data = this.transformUserData(user);\n\n const { emailVerified } = data;\n if (!emailVerified) {\n await this.signOut();\n throw new Error(\"Email is not verified\");\n }\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signUp(email: string, password: string): Promise<AuthResponse> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const signUpResponse = await firebaseAuth.createUserWithEmailAndPassword(this.auth, email, password);\n const { user } = signUpResponse;\n const data = this.transformUserData(user);\n\n return {\n errorCode: \"\",\n data,\n };\n } catch (err: any) {\n const errorCode = this.translateErrorCode(err.code);\n return {\n errorCode,\n data: null,\n };\n }\n }\n\n async signOut(): Promise<void> {\n try {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n await firebaseAuth.signOut(this.auth);\n // Tracking is now handled through callbacks in the consuming app\n } catch (err) {\n console.log(\"Firebase signOut error:\", err);\n }\n }\n\n async sendPasswordResetEmail(email: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendPasswordResetEmail(this.auth, email, actionCodeSettings);\n }\n\n async sendEmailVerification(): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n if (!this.auth.currentUser) {\n throw new Error(\"No current user\");\n }\n const actionCodeSettings = {\n url: window.location.origin,\n handleCodeInApp: true,\n };\n await firebaseAuth.sendEmailVerification(this.auth.currentUser, actionCodeSettings);\n }\n\n async changePassword(newPassword: string): Promise<void> {\n await this.ensureInitialized();\n const { firebaseAuth } = await getFirebaseModules();\n const user = this.auth.currentUser;\n if (!user) {\n throw new Error(\"No current user\");\n }\n return firebaseAuth.updatePassword(user, newPassword);\n }\n\n onAuthStateChanged(callback: (user: UserData | null) => void): () => void {\n // For client-side only usage, ensure initialization before setting up auth state listener\n if (typeof window === 'undefined') {\n return () => { }; // Return empty unsubscriber for server-side\n }\n\n // Set up the listener asynchronously\n let unsubscriber: (() => void) | null = null;\n\n this.ensureInitialized().then(async () => {\n const { firebaseAuth } = await getFirebaseModules();\n unsubscriber = firebaseAuth.onAuthStateChanged(this.auth, (user: any) => {\n if (user && user.emailVerified) {\n const userData = this.transformUserData(user);\n callback(userData);\n } else {\n callback(null);\n }\n });\n });\n\n // Return unsubscriber function\n return () => {\n if (unsubscriber) {\n unsubscriber();\n }\n };\n }\n\n getCurrentUser(): UserData | null {\n if (typeof window === 'undefined' || !this.initialized) {\n return null; // Return null for server-side or before initialization\n }\n\n const user = this.auth.currentUser;\n if (user && user.emailVerified) {\n return this.transformUserData(user);\n }\n return null;\n }\n}","import { FirebaseAuthService } from \"./FirebaseAuthService\";\n\ninterface AuthServiceConfig {\n firebaseConfig: any;\n}\n\nlet authServiceInstance: FirebaseAuthService | null = null;\n\nexport const createAuthService = (config: AuthServiceConfig): FirebaseAuthService => {\n if (!authServiceInstance) {\n authServiceInstance = new FirebaseAuthService(config.firebaseConfig);\n }\n return authServiceInstance;\n};\n\nexport const getAuthService = (): FirebaseAuthService | null => {\n return authServiceInstance;\n};\n\nexport const resetAuthService = (): void => {\n authServiceInstance = null;\n};","// Export Firebase auth service separately to avoid loading Firebase modules during SSR\nexport { FirebaseAuthService } from './FirebaseAuthService';\nexport { createAuthService, getAuthService, resetAuthService } from './authServiceFactory';","// Export all modules\nexport * from \"./modules/achievement\";\nexport * from \"./modules/reward\";\nexport * from \"./modules/notification\";\nexport * from \"./modules/memory\";\n\nexport * from \"./modules/auth\";\nexport * from \"./modules/user-profile\";\n\nexport * from \"./modules/scan-chip\";\nexport * from \"./modules/campaign\";\n\nexport * from \"./modules/location\";\n\nexport * from \"./modules/generate-certificate\";\n\nexport * from \"./modules/data-tracking\";\n\nexport * from \"./providers\";\n\nexport * from \"./modules/achivementWithReward\";\n\nexport * from \"./modules/send-email\";\n\nexport * from \"./helper\";\n","import { GetManyAchievementProgressParams, GetManyDeviceUidAchievementProgressParams, GetManyUserOrDeviceAchievementProgressParams } from \"@phygitallabs/achievement\";\n\nimport {\n GetManyAchievementProgressByDeviceParams,\n} from \"@phygitallabs/api-core\";\n\nimport { useManyAchievementProgress as useManyAchievementProgressCore } from \"@phygitallabs/achievement\";\nimport { useManyAchievementProgressByDevice as useManyAchievementProgressByDeviceCore } from \"@phygitallabs/api-core\";\n\n// Core react query hooks\nimport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n} from \"@phygitallabs/achievement\";\n\nimport { isAchievementCompleted, convertSnakeToCamel } from \"../helpers\";\n\nexport {\n useAchievementProgress,\n useManyAchievements,\n useUserAchievementAction,\n useManyChildrenAchievements,\n useOneAchievement,\n useManyAchievementsRewardModels,\n}\n\n// Customize react query hooks\n\n// Get achievement progress list by userid or deviceuid base on login status\nexport const useManyAchievementProgress = (\n params: GetManyUserOrDeviceAchievementProgressParams,\n options?: any\n) => {\n\n const isLoggedIn = !!params.userId;\n\n const queryParams = isLoggedIn\n ? {\n achievementIds: params.achievementIds,\n userId: params.userId!,\n applicationId: params.applicationId,\n } as GetManyAchievementProgressParams\n : {\n achievement_ids: params.achievementIds,\n device_uid: params.deviceUid!,\n applicationId: params.applicationId,\n } as GetManyDeviceUidAchievementProgressParams;\n\n if (isLoggedIn) {\n return useManyAchievementProgressCore(queryParams as GetManyAchievementProgressParams,\n {\n ...options,\n select: (data) => data.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n })),\n }\n );\n }\n\n return useManyAchievementProgressByDeviceCore(\n queryParams as GetManyAchievementProgressByDeviceParams, {\n ...options,\n select: (data) => {\n const camelCaseData = convertSnakeToCamel(data);\n return camelCaseData.map((item) => ({\n ...item,\n isCompleted: isAchievementCompleted(item),\n }));\n },\n });\n};\n\n// export const useManyAchievementWithProgress = (\n// params: UseManyAchievementWithProgressParams,\n// options?: {\n// achievementOptions?: Partial<UseQueryOptions>;\n// progressOptions?: Partial<UseQueryOptions>;\n// }\n// ): UseManyAchievementWithProgressReturn => {\n// // Fetch achievements with retry logic\n// const achievementsQuery = useManyAchievements(\n// {\n// ...(params.achievementIds?.length && { ids: params.achievementIds }),\n// },\n// {\n// retry: (failureCount: number, error: Error) => {\n// // Retry up to 3 times with exponential backoff\n// if (failureCount < 3) {\n// console.warn(`Achievement fetch failed, retrying... (${failureCount + 1}/3)`, error);\n// return true;\n// }\n// return false;\n// },\n// retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000),\n// staleTime: 5 * 60 * 1000, // 5 minutes\n// gcTime: 10 * 60 * 1000, // 10 minutes\n// ...options?.achievementOptions,\n// }\n// );\n\n// // Prepare achievement IDs for progress query\n// const achievementIds = useMemo(() => {\n// if (params.achievementIds?.length) {\n// return params.achievementIds;\n// }\n// return achievementsQuery.data?.data?.map((a: any) => a.id) || [];\n// }, [params.achievementIds, achievementsQuery.data]);\n\n// // Fetch progress with retry logic (dependent on achievements)\n// const progressQuery = useManyAchievementProgress(\n// {\n// achievementIds,\n// userId: params.userId,\n// deviceUid: params.deviceUid,\n// applicationId: params.applicationId,\n// },\n// {\n// enabled: achievementIds.length > 0\n// }\n// );\n\n// // Combine data with error flags\n// const combinedData = useMemo((): AchievementWithProgress[] => {\n// const achievements = achievementsQuery.data?.data || [];\n// const progressData = progressQuery.data || [];\n\n// return achievements.map((achievement: any) => {\n// const progress = progressData.find((p: any) => p.achievementId === achievement.id) || null;\n\n// return {\n// achievement,\n// progress,\n// hasAchievementError: !!achievementsQuery.error,\n// hasProgressError: !!progressQuery.error,\n// };\n// });\n// }, [achievementsQuery.data, progressQuery.data, achievementsQuery.error, progressQuery.error]);\n\n// // Refetch functions\n// const refetchAchievements = () => {\n// console.log(\"Manually refetching achievements...\");\n// achievementsQuery.refetch();\n// };\n\n// const refetchProgress = () => {\n// console.log(\"Manually refetching progress...\");\n// progressQuery.refetch();\n// };\n\n// const refetchAll = () => {\n// console.log(\"Manually refetching all data...\");\n// Promise.all([achievementsQuery.refetch(), progressQuery.refetch()]);\n// };\n\n// return {\n// data: combinedData,\n// isLoading: achievementsQuery.isLoading || (achievementIds.length > 0 && progressQuery.isLoading),\n// isSuccess: achievementsQuery.isSuccess && (achievementIds.length === 0 || progressQuery.isSuccess),\n// achievementsError: achievementsQuery.error as Error | null,\n// progressError: progressQuery.error as Error | null,\n// refetchAchievements,\n// refetchProgress,\n// refetchAll,\n// };\n// };\n\n","import { Achievement, UserAchievementProgress } from \"../types\";\n\nconst getLocationIdsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const locationIds: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (!rule.filter) return;\n Object.values(rule.filter).forEach((filterList) => {\n if (!filterList.filters) return;\n filterList.filters.forEach((filter) => {\n if (filter.label === \"location_id\" && filter.value) {\n if (Array.isArray(filter.value)) {\n locationIds.push(...filter.value);\n } else {\n locationIds.push(filter.value);\n }\n }\n });\n });\n });\n });\n return Array.from(new Set(locationIds)) as string[];\n};\n\nconst getActionsFromAchievementRule = (achievement: Achievement) => {\n if (!achievement.rule) return [];\n const actions: string[] = [];\n Object.values(achievement.rule).forEach((ruleList) => {\n if (!ruleList.rules) return;\n ruleList.rules.forEach((rule) => {\n if (rule.action) {\n actions.push(rule.action)\n }\n });\n });\n return Array.from(new Set(actions)) as string[];\n};\n\nconst isAchievementCompleted = (achievement: UserAchievementProgress) => {\n return achievement.isCompleted || achievement.overallPercentage === 100;\n}\n\ntype SnakeToCamelCase<S extends string> = S extends `${infer T}_${infer U}`\n ? `${T}${Capitalize<SnakeToCamelCase<U>>}`\n : S;\n\ntype ConvertSnakeToCamel<T> = T extends (infer U)[]\n ? ConvertSnakeToCamel<U>[]\n : T extends Record<string, unknown>\n ? {\n [K in keyof T as K extends string\n ? SnakeToCamelCase<K>\n : K]: ConvertSnakeToCamel<T[K]>;\n }\n : T;\n\n/**\n * Converts snake_case keys to camelCase keys in an object or array of objects\n */\nexport function convertSnakeToCamel<T>(obj: T): ConvertSnakeToCamel<T> {\n if (obj === null || obj === undefined) {\n return obj as ConvertSnakeToCamel<T>;\n }\n \n if (Array.isArray(obj)) {\n return obj.map((item) =>\n convertSnakeToCamel(item)\n ) as ConvertSnakeToCamel<T>;\n }\n \n if (typeof obj === \"object\" && obj.constructor === Object) {\n const converted: Record<string, unknown> = {};\n \n for (const key in obj) {\n if (obj.hasOwnProperty(key)) {\n const camelKey = key.replace(/_([a-z])/g, (_, letter) =>\n letter.toUpperCase()\n );\n converted[camelKey] = convertSnakeToCamel(\n (obj as Record<string, unknown>)[key]\n );\n }\n }\n \n return converted as ConvertSnakeToCamel<T>;\n }\n \n return obj as ConvertSnakeToCamel<T>;\n }\n \n\nexport {\n getLocationIdsFromAchievementRule,\n getActionsFromAchievementRule,\n isAchievementCompleted\n}","export {\n AchievementRuleActionType,\n AchievementServiceProvider,\n} from \"@phygitallabs/achievement\";\n\nimport type { Achievement, GetAchievementProgressResponse, UserAchievementProgress } from \"@phygitallabs/achievement\";\n\nexport {\n Achievement,\n GetAchievementProgressResponse,\n UserAchievementProgress,\n}\n\n// Combined types for hooks\nexport interface AchievementWithProgress {\n achievement: Achievement;\n progress: UserAchievementProgress | null;\n hasProgressError?: boolean;\n hasAchievementError?: boolean;\n}\n\nexport interface UseManyAchievementWithProgressParams {\n userId?: string;\n deviceUid?: string;\n applicationId?: string;\n achievementIds?: string[];\n}\n\nexport interface UseManyAchievementWithProgressReturn {\n data: AchievementWithProgress[];\n isLoading: boolean;\n isSuccess: boolean;\n achievementsError: Error | null;\n progressError: Error | null;\n refetchAchievements: () => void;\n refetchProgress: () => void;\n refetchAll: () => void;\n}\n\nexport enum AchievementType {\n DEFAULT = \"default\",\n MULTIPLE_CHECK_INS = \"multiple_check_ins\",\n RANDOM_CHECK_INS = \"random_check_ins\",\n GROUP_MISSION = \"group_mission\",\n}\n","// Re-export from @phygitallabs/reward package\nexport {\n useManyUserRewards,\n useGetUserRewards,\n useClaimUserReward,\n useApiListRewardModels as useListRewardModels,\n useApiGetRewardModel as useGetRewardModel,\n useApiCreateRewardModel as useCreateRewardModel,\n useApiUpdateRewardModel as useUpdateRewardModel,\n useApiDeleteRewardModel as useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward/src/hooks\";","// Re-export from @phygitallabs/reward package\nexport {\n CmentityRewardType,\n type CmentityStatus\n} from \"@phygitallabs/reward\";\n\n// Define RewardClaimStatus locally since it's not exported from reward package\nexport enum RewardClaimStatus {\n NOT_CLAIMED = \"not_claimed\",\n CLAIMED = \"claimed\",\n IN_PROGRESS = \"in_progress\",\n FAILED = \"failed\",\n}","export * from \"@phygitallabs/notification-api\";\nexport { NotificationProvider } from \"./providers\";","import React from \"react\";\nimport { NotificationProvider as NotificationProviderApi } from \"@phygitallabs/notification-api\";\n\nimport { EnvironmentType } from \"../../../types/common\";\n\nimport type { LPResponse } from \"@phygitallabs/notification-api\";\n\nimport serviceApiUrl from \"../../../constants/service\";\n\ninterface NotificationCallbacks {\n onWebSocketOpen?: (metadata: Record<string, any>) => void;\n onWebSocketClose?: (metadata: Record<string, any>) => void;\n onWebSocketMessage?: (data: LPResponse) => void;\n}\n\ninterface NotificationProviderProps extends NotificationCallbacks {\n children: React.ReactNode;\n autoConnect?: boolean;\n user: { id: string; accessToken: string | null };\n environment?: EnvironmentType;\n}\n\nexport const NotificationProvider: React.FC<NotificationProviderProps> = ({\n children,\n autoConnect = true,\n environment = \"dev\",\n user,\n onWebSocketOpen,\n onWebSocketClose,\n onWebSocketMessage,\n}) => {\n\n const webSocketUrl = serviceApiUrl[environment]?.API_NOTIFICATION_SOCKET_URL;\n\n return (\n <NotificationProviderApi\n userUid={user.id}\n accessToken={user.accessToken}\n webSocketUrl={webSocketUrl}\n autoConnect={autoConnect}\n onWebSocketOpen={onWebSocketOpen}\n onWebSocketClose={onWebSocketClose}\n onWebSocketMessage={onWebSocketMessage}\n >\n {children}\n </NotificationProviderApi>\n );\n};\n\nexport default NotificationProvider;","const serviceApiUrl = {\n dev: {\n API_BASE_URL: \"https://backend-dev.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-dev.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-dev.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-dev.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-dev.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-dev.nomion.io/notification-ws/ws\",\n },\n staging: {\n API_BASE_URL: \"https://backend-staging.nomion.io\",\n API_BASE_CORE_URL: \"https://backend-staging.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend-staging.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend-staging.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc-staging.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend-staging.nomion.io/notification-ws/ws\",\n\n },\n production: {\n API_BASE_URL: \"https://backend.nomion.io\",\n API_BASE_CORE_URL: \"https://backend.nomion.io/core\",\n API_ACHIEVEMENT_URL: \"https://backend.nomion.io/achievement\",\n API_REWARD_URL: \"https://backend.nomion.io/reward\",\n API_GENERATE_CERTIFICATE_URL: \"https://media-prc.nomion.io/api\",\n API_NOTIFICATION_SOCKET_URL: \"https://backend.nomion.io/notification-ws/ws\",\n\n },\n}\n\nexport default serviceApiUrl;","import { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey } from \"@phygitallabs/api-core\";\n\nexport { useOneMemory, useManyMemory, useInfiniteMemories, useCreateMemory, useUploadMedia, resetMemoriesQuery, memoriesKey };","import { createContext, useEffect, ReactNode, useContext } from 'react';\nimport { AuthService, AuthCallbacks } from '../types';\n\nimport { useAppSelector, useAppDispatch } from '../../../store/hooks';\nimport {\n selectUser,\n selectIsSignedIn,\n selectIsLoading,\n signIn as signInAction,\n signOut as signOutAction,\n updateScanStatus as updateScanStatusAction,\n refreshUser as refreshUserAction,\n setPending,\n initializeFromStorage,\n} from '../store/authSlice';\n\nimport { AuthResponse, UserData } from '../types';\n\nexport interface AuthContextType {\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n // User state\n user: UserData;\n isSignedIn: boolean;\n isLoading: boolean;\n\n // Auth actions\n signInWithCredential: (email: string, password: string) => Promise<AuthResponse>;\n signInWithGoogle: () => Promise<AuthResponse | null>;\n signUp: (email: string, password: string) => Promise<AuthResponse>;\n signOut: () => Promise<void>;\n\n // Password actions\n forgotPassword: (email: string) => Promise<void>;\n sendEmailVerification: () => Promise<void>;\n changePassword: (newPassword: string) => Promise<void>;\n\n // User management\n updateScanStatus: (status: boolean) => void;\n refreshUser: (userData: UserData) => void;\n\n}\n\nexport const AuthContext = createContext<AuthContextType | null>(null);\n\nexport interface AuthProviderProps {\n children: ReactNode;\n authService: AuthService;\n authCallbacks?: AuthCallbacks;\n}\n\nexport function AuthProvider({ children, authService, authCallbacks }: AuthProviderProps) {\n const dispatch = useAppDispatch();\n\n useEffect(() => {\n // Initialize auth state from localStorage\n dispatch(initializeFromStorage());\n\n // Set up auth state listener\n const unsubscribe = authService.onAuthStateChanged((user) => {\n if (user) {\n dispatch(signInAction(user));\n\n // Use auth callback for user identification\n if (authCallbacks?.onUserIdentify && user.email) {\n authCallbacks.onUserIdentify({\n email: user.email,\n name: user.displayName,\n avatar: user.avatar,\n uid: user.uid,\n });\n }\n\n // Notify about successful sign in\n if (authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(user);\n }\n } else {\n dispatch(signOutAction());\n\n // Use auth callback for reset\n if (authCallbacks?.onTrackingReset) {\n authCallbacks.onTrackingReset();\n }\n }\n dispatch(setPending(false));\n });\n\n return () => {\n unsubscribe();\n };\n }, [authService, dispatch, authCallbacks]);\n\n // Redux selectors\n const user = useAppSelector(selectUser);\n const isSignedIn = useAppSelector(selectIsSignedIn);\n const isLoading = useAppSelector(selectIsLoading);\n\n // Auth actions with auth callbacks\n const signInWithCredential = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signInWithEmailAndPassword(email, password);\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return result;\n };\n\n const signInWithGoogle = async (): Promise<AuthResponse | null> => {\n const result = await authService.signInWithGoogle();\n\n if (result.data && authCallbacks?.onSignInSuccess) {\n authCallbacks.onSignInSuccess(result.data);\n return result;\n\n } else if (result.errorCode && authCallbacks?.onSignInError) {\n authCallbacks.onSignInError(result.errorCode);\n }\n\n return null;\n };\n\n const signUp = async (email: string, password: string): Promise<AuthResponse> => {\n const result = await authService.signUp(email, password);\n\n if (result.data && authCallbacks?.onSignUpSuccess) {\n authCallbacks.onSignUpSuccess(result.data);\n } else if (result.errorCode && authCallbacks?.onSignUpError) {\n authCallbacks.onSignUpError(result.errorCode);\n }\n\n return result;\n };\n\n const signOut = async (): Promise<void> => {\n await authService.signOut();\n dispatch(signOutAction());\n\n if (authCallbacks?.onSignOutSuccess) {\n authCallbacks.onSignOutSuccess();\n }\n };\n\n // Password actions\n const forgotPassword = async (email: string): Promise<void> => {\n return await authService.sendPasswordResetEmail(email);\n };\n\n const sendEmailVerification = async (): Promise<void> => {\n return await authService.sendEmailVerification();\n };\n\n const changePassword = async (newPassword: string): Promise<void> => {\n return await authService.changePassword(newPassword);\n };\n\n // User management\n const updateScanStatus = (status: boolean): void => {\n dispatch(updateScanStatusAction(status));\n };\n\n const refreshUser = (userData: UserData): void => {\n dispatch(refreshUserAction(userData));\n };\n\n const contextValue: AuthContextType = {\n authService,\n authCallbacks,\n // User state\n user,\n isSignedIn,\n isLoading,\n\n // Auth actions\n signInWithCredential,\n signInWithGoogle,\n signUp,\n signOut,\n\n // Password actions\n forgotPassword,\n sendEmailVerification,\n changePassword,\n\n // User management\n updateScanStatus,\n refreshUser,\n };\n\n return (\n <AuthContext.Provider value={contextValue}>\n {children}\n </AuthContext.Provider>\n );\n}\n\nexport const useAuth = () => {\n const authContext = useContext(AuthContext);\n if (!authContext) {\n throw new Error('useAuth must be used within an AuthProvider');\n }\n\n return authContext;\n};","import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';\nimport type { TapquestCoreRootState, TapquestCoreAppDispatch } from './index';\n\n// Typed hooks for internal use within tapquest-core\nexport const useAppDispatch = () => useDispatch<TapquestCoreAppDispatch>();\nexport const useAppSelector: TypedUseSelectorHook<TapquestCoreRootState> = useSelector;","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\nimport { UserData, UserRole } from \"../types\";\nimport {\n setUserInfo,\n removeUserInfo,\n getUserInfo,\n setAccessToken,\n setRefreshToken,\n removeAccessToken,\n removeRefreshToken,\n getAccessToken,\n} from \"../helpers\";\n\nconst defaultUser: UserData = {\n uid: \"\",\n id: \"\",\n userName: \"\",\n displayName: \"\",\n avatar: \"/images/default-avatar.jpg\",\n email: \"\",\n exp: 0,\n emailVerified: false,\n refreshToken: \"\",\n accessToken: \"\",\n role: UserRole.NULL,\n scanStatus: false,\n};\n\nexport interface AuthState {\n user: UserData;\n isSignedIn: boolean;\n pending: boolean;\n}\n\nconst initialState: AuthState = {\n user: defaultUser,\n isSignedIn: false,\n pending: true,\n};\n\nexport const authSlice = createSlice<\n AuthState,\n {\n signIn: (state: AuthState, action: PayloadAction<UserData>) => void;\n signOut: (state: AuthState) => void;\n updateScanStatus: (state: AuthState, action: PayloadAction<boolean>) => void;\n refreshUser: (state: AuthState, action: PayloadAction<UserData>) => void;\n setPending: (state: AuthState, action: PayloadAction<boolean>) => void;\n initializeFromStorage: (state: AuthState) => void;\n },\n 'auth'\n>({\n name: \"auth\",\n initialState,\n reducers: {\n signIn: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Store in localStorage for persistence\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n },\n signOut: (state) => {\n state.user = defaultUser;\n state.isSignedIn = false;\n state.pending = false;\n\n // Clear localStorage\n removeUserInfo();\n removeAccessToken();\n removeRefreshToken();\n },\n updateScanStatus: (state, action: PayloadAction<boolean>) => {\n state.user.scanStatus = action.payload;\n\n // Update localStorage\n setUserInfo(state.user);\n },\n refreshUser: (state, action: PayloadAction<UserData>) => {\n const userData = action.payload;\n if (userData) {\n state.user = userData;\n state.isSignedIn = true;\n state.pending = false;\n\n // Update localStorage\n setUserInfo(userData);\n setAccessToken(userData.accessToken);\n setRefreshToken(userData.refreshToken);\n }\n },\n setPending: (state, action: PayloadAction<boolean>) => {\n state.pending = action.payload;\n },\n initializeFromStorage: (state) => {\n const storedUser = getUserInfo();\n const accessToken = getAccessToken();\n\n if (storedUser && accessToken) {\n state.user = storedUser;\n state.isSignedIn = true;\n }\n state.pending = false;\n },\n },\n});\n\nexport const {\n signIn,\n signOut,\n updateScanStatus,\n refreshUser,\n setPending,\n initializeFromStorage,\n} = authSlice.actions;\n\n// Selectors\nexport const selectAuth = (state: any) => state.auth;\nexport const selectUser = (state: any) => state.auth.user;\nexport const selectUserUId = (state: any) =>\n state.auth.user.uid || state.auth.user.id;\nexport const selectUserAccesstoken = (state: any) =>\n state.auth.user.accessToken;\nexport const selectUserEmail = (state: any) => state.auth.user.email;\nexport const selectUsername = (state: any) => state.auth.user.userName;\nexport const selectSignInProvider = (state: any) =>\n state.auth.user.signInProvider;\nexport const selectUserScanStatus = (state: any) =>\n state.auth.user.scanStatus;\nexport const selectIsSignedIn = (state: any) => state.auth.isSignedIn;\nexport const selectIsLoading = (state: any) => state.auth.pending;\n\nexport default authSlice.reducer;","import {\n deviceUIDKey,\n chipAuthTokenKey,\n retryAttemptsRefreshToken,\n accessTokenKey,\n refreshTokenKey,\n userInfoKey,\n} from \"../constants\";\n\nimport { v4 as uuidv4 } from \"uuid\";\n\nexport const generateDeviceId = async (): Promise<string> => {\n try {\n const deviceFingerprint = await generateDeviceFingerprint();\n return deviceFingerprint;\n } catch (error) {\n console.error(\"Error generating device fingerprint:\", error);\n return uuidv4();\n }\n};\n\nconst generateDeviceFingerprint = async (): Promise<string> => {\n const timestamp = new Date().toISOString(); // UTC timestamp\n\n const fingerprintRaw = [\n navigator.userAgent,\n navigator.language,\n screen.width,\n screen.height,\n screen.colorDepth,\n Intl.DateTimeFormat().resolvedOptions().timeZone,\n navigator.platform,\n navigator.hardwareConcurrency,\n timestamp, // Include timestamp\n ].join(\"::\");\n\n const encoder = new TextEncoder();\n const data = encoder.encode(fingerprintRaw);\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const fingerprint = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n return fingerprint;\n};\n\nexport default generateDeviceFingerprint;\n\n\nexport const getDeviceUid = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(deviceUIDKey);\n};\n\nexport const setDeviceUid = (deviceId: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(deviceUIDKey, deviceId);\n};\n\nexport const removeDeviceUid = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(deviceUIDKey);\n};\n\nexport const checkDeviceUid = async (): Promise<string> => {\n // if (typeof window === \"undefined\") return null;\n\n let deviceUID = getDeviceUid();\n\n if (!deviceUID) {\n deviceUID = await generateDeviceId();\n setDeviceUid(deviceUID);\n }\n\n return deviceUID;\n};\n\n// CHIP AUTH TOKEN\nexport const getChipAuthToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(chipAuthTokenKey);\n};\n\nexport const setChipAuthToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(chipAuthTokenKey, value);\n};\n\nexport const removeChipAuthToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(chipAuthTokenKey);\n};\n\n// RETRY ATTEMPTS\nexport const getRetryAttemptsRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(retryAttemptsRefreshToken);\n};\n\nexport const setRetryAttemptsRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(retryAttemptsRefreshToken, value);\n};\n\n// ACCESS TOKEN\nexport const getAccessToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(accessTokenKey);\n};\n\nexport const setAccessToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(accessTokenKey, value);\n};\n\nexport const removeAccessToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(accessTokenKey);\n};\n\n// REFRESH TOKEN\nexport const getRefreshToken = () => {\n if (typeof window === \"undefined\") return null;\n return localStorage.getItem(refreshTokenKey);\n};\n\nexport const setRefreshToken = (value: string) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(refreshTokenKey, value);\n};\n\nexport const removeRefreshToken = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(refreshTokenKey);\n};\n\n// USER INFO\nexport const getUserInfo = () => {\n if (typeof window === \"undefined\") return null;\n const userInfo = localStorage.getItem(userInfoKey);\n if (!userInfo) return null;\n try {\n return JSON.parse(userInfo);\n } catch (error) {\n console.error(\"Failed to parse stored user data:\", error);\n return null;\n }\n};\n\nexport const setUserInfo = (userData: any) => {\n if (typeof window === \"undefined\") return;\n localStorage.setItem(userInfoKey, JSON.stringify(userData));\n};\n\nexport const removeUserInfo = () => {\n if (typeof window === \"undefined\") return;\n localStorage.removeItem(userInfoKey);\n};\n\nexport { createRefreshTokenFunction } from \"./refreshToken\";\nexport type { RefreshTokenConfig } from \"./refreshToken\";","import mem from \"mem\";\nimport { setUserInfo, removeUserInfo, getUserInfo, getRefreshToken } from \"./index\";\n\n// Internal configuration - managed by tapquest-core\nconst REFRESH_TOKEN_CONFIG = {\n maxAge: 10000, // 10 seconds cache\n} as const;\n\nexport interface RefreshTokenConfig {\n firebaseApiKey: string;\n}\n\nconst createRefreshTokenFunction = (config: RefreshTokenConfig) => {\n const refreshTokenFn = async () => {\n try {\n const session = getUserInfo();\n const refreshToken = getRefreshToken();\n\n if (!refreshToken) {\n removeUserInfo();\n return;\n }\n\n const params = new URLSearchParams();\n params.append(\"grant_type\", \"refresh_token\");\n params.append(\"refresh_token\", refreshToken);\n\n const fetchData = {\n method: \"POST\",\n headers: new Headers({\n \"Content-Type\": \"application/x-www-form-urlencoded;charset=UTF-8\",\n }),\n body: params,\n };\n\n const response = await fetch(\n `https://securetoken.googleapis.com/v1/token?key=${config.firebaseApiKey}`,\n fetchData\n );\n const data = await response.json();\n\n if (data.error) {\n removeUserInfo();\n return;\n }\n\n const newSession = {\n ...session,\n accessToken: data.access_token,\n refreshToken: data.refresh_token,\n };\n setUserInfo(newSession);\n\n return newSession;\n } catch {\n removeUserInfo();\n }\n };\n\n return mem(refreshTokenFn, { maxAge: REFRESH_TOKEN_CONFIG.maxAge });\n};\n\nexport { createRefreshTokenFunction };","// Export types\nexport type {\n UserData,\n UserRole,\n SignInProvider,\n AuthResponse,\n AuthService,\n FirebaseConfig,\n UseAuthReturn,\n AuthProviderProps,\n AuthCallbacks,\n} from './types';\n\n// Export hooks and providers\n// export { useAuth } from './hooks';\nexport { useAuth, AuthProvider } from './providers';\n\n// Export constants and helpers\nexport * from './constants';\nexport * from './helpers';","import { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest } from \"@phygitallabs/api-core\";\n\nexport { useMyProfile, useUpdateMyProfile, useSyncCheckin, useCancelUserRewardsRequest };","import { UserSourceType } from \"@phygitallabs/api-core\";\n\nexport { UserSourceType };","import { useEffect } from \"react\";\nimport { useChipScanStory } from \"@phygitallabs/api-core\";\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { setChipAuthToken } from \"../../auth/helpers\";\n\nimport { ScanChipResponse } from \"../types\";\n\ninterface UseScanChipProps {\n token?: string;\n id?: string;\n onScanChipError?: () => void;\n}\nexport { useChipScanStory, usePGLCoreService };\nexport function useScanChip({ token, id, onScanChipError }: UseScanChipProps): ScanChipResponse {\n const { updateHeaders } = usePGLCoreService();\n\n useEffect(() => {\n if (!!token) {\n\n const header = {\n \"Chip-Authorization\": token,\n };\n\n setChipAuthToken(token);\n updateHeaders(header);\n\n }\n }, [token, updateHeaders]);\n\n const { data, isLoading, isError, isSuccess } = useChipScanStory({\n token,\n id,\n });\n\n useEffect(() => {\n if (isError) {\n onScanChipError?.();\n }\n }, [isError, onScanChipError]);\n\n\n if (!data)\n return {\n data: null,\n isLoading,\n isError,\n isSuccess\n };\n\n return {\n data: {\n externalUrl: data?.external_url,\n campaignDetail: data?.project,\n locationDetail: data?.location,\n scanCounter: data?.scan_counter,\n campaignId: data?.campaign_id,\n chipModelId: data?.chip_model_id,\n organizationId: data?.organization_id,\n projectId: data?.project_id,\n locationId: data?.location_id,\n chipUid: data?.uid,\n },\n isLoading,\n isError,\n isSuccess\n }\n}","// Re-export from @phygitallabs/api-core package\nexport {\n useOneCampaign as useCampaignDetail,\n useUserCampaignAction,\n useOneUserCampaign,\n\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport {\n CampaignState\n} from \"@phygitallabs/api-core\";\n","// Re-export from @phygitallabs/api-core package\nexport type {\n CampaignModel,\n UserCampaignModel,\n MissionWithProgress,\n TaskWithProgress,\n UserCampaignMission,\n Mission,\n MissionProgress,\n TaskProgress,\n} from \"@phygitallabs/api-core\";\n\nexport enum TaskType {\n CHECK_IN = \"check_in\",\n CREATE_MEMORY = \"create_memory\",\n FILL_FORM = \"fill_form\",\n SHARE = \"share\",\n}\n\n// Define other types locally since they're not exported from api-core package\nexport interface CampaignByProjectIdModel {\n id: string;\n certificate_index?: number;\n completed_checkin_rule?: number;\n completed_device_uids?: string[];\n completed_location_ids?: string[];\n completed_user_ids?: string[];\n description?: string;\n image_url?: string;\n is_custom_checkin_rule?: boolean;\n location_ids?: string[];\n name: string;\n total_completed?: number;\n user_campaign?: any;\n custom_info: Record<string, any>;\n mission: Record<string, any>;\n achievement_id: string;\n start_date: string;\n end_date: string;\n certificate: {\n image: any;\n title: string;\n };\n project_id?: string;\n status: string;\n created_at: number;\n updated_at: number;\n created_by?: string;\n updated_by?: string;\n}\n\n","// Re-export from @phygitallabs/api-core package\nexport {\n useManyLocations as useLocationsList,\n useOneLocation as useLocationDetail,\n useUserCampaignsCompletedLocation as useLocationProgress,\n useManyUserActionLocations,\n locationQueryKeys\n} from \"@phygitallabs/api-core\";","\nexport const sortLocationsByIndex = <T extends { index?: number }>(locations: T[]): T[] => {\n return [...locations].sort((a, b) => (a.index ?? 0) - (b.index ?? 0));\n};\n\n\nexport const filterLocationsByProperty = <T extends Record<string, any>>(\n locations: T[],\n propertyName: keyof T,\n value: boolean\n): T[] => {\n return locations.filter(location => location[propertyName] === value);\n};\n","import { \n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate\n} from \"@phygitallabs/generate-certificate\";\n\n\nexport { useGenerateThaocamvienCertificate, useGenerateTemplateCertificate, useGenerateFansipanCertificate };","import posthog from \"posthog-js\";\n\ndeclare global {\n interface Window {\n dataLayer: Record<string, any>[];\n }\n}\n\ndeclare function gtag(\n command: \"event\",\n eventName: string,\n eventParameters: Record<string, any>\n): void;\n\n\n// GTM\nconst pushEventToDataLayer = (event: string, data: Record<string, any>) => {\n try {\n window.dataLayer = window.dataLayer || [];\n\n window.dataLayer.push({\n event,\n ...data,\n });\n\n } catch (error) {\n console.error(error);\n }\n};\n\n// GA\nconst pushEventToGA = (eventName: string, eventData: Record<string, any>) => {\n if (typeof gtag != \"function\") {\n console.error(\"gtag is not a function\");\n return;\n }\n gtag(\"event\", eventName, eventData);\n};\n\n// Posthog\nconst pushEventToPosthog = (eventName: string, eventData: Record<string, any>) => {\n posthog.capture(eventName, eventData);\n};\n\nfunction useDataTracking() {\n const trackEvent = (eventName: string, eventData: Record<string, any>, useTools?: (\"gtm\" | \"ga\" | \"posthog\")[]) => {\n\n useTools = useTools || [\"gtm\"];\n\n if (useTools.includes(\"gtm\") && typeof window !== \"undefined\") {\n pushEventToDataLayer(eventName, eventData);\n }\n if (useTools.includes(\"ga\") && typeof gtag == \"function\") {\n pushEventToGA(eventName, eventData);\n }\n if (useTools.includes(\"posthog\") && typeof posthog == \"function\") {\n pushEventToPosthog(eventName, eventData);\n }\n };\n\n return {\n trackEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { useState, useEffect } from \"react\";\nimport { Provider } from \"react-redux\";\nimport { PersistGate } from \"redux-persist/integration/react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { store, persistor } from \"../store\";\nimport { AuthCallbacks } from \"../modules/auth/types\";\nimport { AuthProvider } from \"../modules/auth/providers\";\nimport { FirebaseConfig } from \"../modules/auth/types\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: FirebaseConfig;\n authCallbacks?: AuthCallbacks;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n firebaseConfig,\n authCallbacks\n}) => {\n const [internalAuthService, setInternalAuthService] = useState<any>(null);\n\n useEffect(() => {\n if (firebaseConfig && typeof window !== \"undefined\") {\n // Dynamic import to avoid loading Firebase modules during build\n import(\"../modules/auth/services\")\n .then(({ createAuthService }) => {\n try {\n const authService = createAuthService({ firebaseConfig });\n setInternalAuthService(authService);\n } catch (error) {\n console.warn(\"Failed to create auth service from firebase config:\", error);\n setInternalAuthService(null);\n }\n })\n .catch((error) => {\n console.warn(\"Failed to dynamically import auth services:\", error);\n setInternalAuthService(null);\n });\n } else {\n setInternalAuthService(null);\n }\n }, [firebaseConfig]);\n\n return (\n <Provider store={store}>\n <PersistGate loading={null} persistor={persistor}>\n <AuthProvider\n authService={internalAuthService}\n authCallbacks={authCallbacks}\n >\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n firebaseConfig={firebaseConfig}\n >\n {children}\n </ServicesProvider>\n </AuthProvider>\n\n </PersistGate>\n </Provider>\n );\n};","import React, { useEffect, useState, useMemo } from \"react\";\nimport { QueryClient } from \"@tanstack/react-query\";\nimport { PGLCoreServiceProvider } from \"@phygitallabs/api-core\";\nimport { RewardServiceProvider } from \"@phygitallabs/reward\";\nimport { AchievementServiceProvider } from \"@phygitallabs/achievement\";\nimport { GenerateCertificateServiceProvider } from \"@phygitallabs/generate-certificate\";\n\nimport serviceApiUrl from \"../constants/service\";\nimport { APIConfig, ServiceConfig } from \"../types/service\";\n\nimport { checkDeviceUid, getAccessToken, getRetryAttemptsRefreshToken, setRetryAttemptsRefreshToken, createRefreshTokenFunction } from \"../modules/auth/helpers\";\n\nimport { httpMaxRetries } from \"../modules/auth\";\n\nimport { useAuth } from \"../modules/auth\";\n\nimport axios from \"axios\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n firebaseConfig?: any;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n firebaseConfig\n}) => {\n const { refreshUser, signOut } = useAuth();\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\n\n // Create memoized refresh token function\n const memoizedRefreshToken = useMemo(() => {\n if (!firebaseConfig?.apiKey) {\n console.warn(\"Firebase API key not provided, refresh token functionality will not work\");\n return null;\n }\n return createRefreshTokenFunction({\n firebaseApiKey: firebaseConfig.apiKey\n });\n }, [firebaseConfig?.apiKey]);\n\n // Init client\n useEffect(() => {\n const initClient = async () => {\n try {\n const deviceUid = await checkDeviceUid();\n\n const responseInterceptors = ({\n onFulfilled: (response: any) => response,\n onRejected: async (error: any) => {\n\n // TODO: Remove\n // Feature: use refresh token to get new access token when token expired, have maximum `retry attempts`\n const originalRequest = error.config;\n\n if (error.response?.status === 401 && !originalRequest._retry) {\n const retryAttempts = parseInt(\n getRetryAttemptsRefreshToken() || \"0\",\n 10\n );\n\n if (retryAttempts >= httpMaxRetries) {\n await signOut();\n return Promise.reject(error);\n }\n\n setRetryAttemptsRefreshToken(`${retryAttempts + 1}`);\n originalRequest._retry = true;\n\n try {\n if (!memoizedRefreshToken) {\n await signOut();\n return Promise.reject(error);\n }\n\n const result = await memoizedRefreshToken();\n\n if (result?.accessToken) {\n originalRequest.headers[\n \"Authorization\"\n ] = `Bearer ${result.accessToken}`;\n\n setRetryAttemptsRefreshToken(\"0\");\n \n refreshUser(result);\n\n return axios(originalRequest);\n }\n } catch (refreshError) {\n console.log(\"Failed to refresh token:\", refreshError);\n }\n }\n\n return Promise.reject(error);\n },\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => {\n // Feature: set access token to request header\n const currentToken = getAccessToken();\n\n if (currentToken && !config.headers.Authorization) {\n config.headers.Authorization = `Bearer ${currentToken}`;\n }\n return config;\n },\n onRejected: (error: any) => Promise.reject(error),\n })\n\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n \"Device-UID\": deviceUid,\n }\n }\n\n const config: ServiceConfig = {\n queryClient,\n axiosConfig,\n responseInterceptors,\n requestInterceptors,\n useDevTool: true,\n };\n\n setCommonServiceConfig(config);\n\n } catch (error) {\n console.error(error);\n }\n }\n\n initClient();\n }, [queryClient]);\n\n if (!commonServiceConfig) {\n return <></>\n }\n\n return (\n <PGLCoreServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}/${version}`}\n baseCoreURL={`${serviceApiUrl[environment].API_BASE_CORE_URL}/${version}`}\n >\n <RewardServiceProvider\n {...commonServiceConfig}\n // baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/${version}`}\n baseURL={`${serviceApiUrl[environment].API_REWARD_URL}/v1`} // todo: using v1 until backend fully migrate\n >\n <AchievementServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_ACHIEVEMENT_URL}/${version}`}\n >\n <GenerateCertificateServiceProvider\n {...commonServiceConfig}\n baseURL={`${serviceApiUrl[environment].API_GENERATE_CERTIFICATE_URL}/v1`}\n >\n {children}\n </GenerateCertificateServiceProvider>\n </AchievementServiceProvider>\n </RewardServiceProvider>\n </PGLCoreServiceProvider>\n );\n};\n","import { configureStore } from \"@reduxjs/toolkit\";\nimport storage from \"redux-persist/lib/storage\";\nimport { persistReducer, persistStore, PersistConfig } from \"redux-persist\";\nimport { authSlice } from \"../modules/auth/store/authSlice\";\n\n// Auth persist config\nconst authPersistConfig: PersistConfig<any> = {\n key: \"tapquest-auth\",\n storage,\n whitelist: [\"user\", \"isSignedIn\"], // Only persist user and sign-in status\n};\n\n// Create persisted auth reducer\nconst persistedAuthReducer = persistReducer(authPersistConfig, authSlice.reducer);\n\n// Configure the tapquest-core store\nexport const store = configureStore({\n reducer: {\n auth: persistedAuthReducer,\n },\n middleware: (getDefaultMiddleware) =>\n getDefaultMiddleware({\n serializableCheck: {\n // Ignore redux-persist actions\n ignoredActions: [\n 'persist/FLUSH',\n 'persist/REHYDRATE',\n 'persist/PAUSE',\n 'persist/PERSIST',\n 'persist/PURGE',\n 'persist/REGISTER',\n ],\n },\n }),\n});\n\n// Create persistor\nexport const persistor = persistStore(store);\n\n// Export types\nexport type TapquestCoreRootState = ReturnType<typeof store.getState>;\nexport type TapquestCoreAppDispatch = typeof store.dispatch;\n\n// Export store instance for internal use\nexport { store as tapquestCoreStore };","import { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward/src/hooks/useGroupReward\";\nimport { useEffect, useMemo } from \"react\";\n\ninterface UseAchivementPlusRewardModelParams {\n campaignId: string;\n}\ninterface GroupRewardData {\n reward_models: EntityRewardModel[][];\n}\n\nfunction buildMappedAchievements(achievements: Achievement[], groupRewardData: GroupRewardData) {\n if (!groupRewardData?.reward_models) return [];\n\n const rewardModels = groupRewardData.reward_models;\n\n return achievements.map((achievement, achievementIndex) => {\n const parentReward = rewardModels[achievementIndex]?.[0] || null;\n\n const subAchievements =\n achievement.subAchievementIds?.map((subId: string, subIndex: number) => {\n const reward =\n rewardModels[\n achievementIndex * (achievement.subAchievementIds?.length || 0) +\n subIndex +\n 1\n ]?.[0] || null;\n\n return {\n id: subId,\n reward_model: reward,\n };\n }) || [];\n\n return {\n id: achievement.id,\n name: achievement.name,\n reward_model: parentReward,\n subAchievements,\n };\n });\n}\n\nconst useAchivementPlusRewardModel = ({ campaignId }: UseAchivementPlusRewardModelParams) => {\n const { data: achievements, isLoading: isLoadingAchievements } =\n useManyAchievements(\n {\n \"filter.labels\": { campaign_id: campaignId },\n \"filter.type\": \"group_mission\",\n \"pagination.limit\": 200,\n },\n { enabled: !!campaignId }\n );\n\n const groupRewardIds = useMemo(() => {\n if (!achievements?.data) return [];\n return achievements.data\n .map((achievement) => achievement.groupRewardId)\n .filter((id): id is string => id !== undefined);\n }, [achievements?.data]);\n const {\n mutate: fetchGroupRewardModels,\n data: groupRewardModelsData,\n isPending: isPendingGroupRewardModels,\n } = useCreateModelGroupReward();\n useEffect(() => {\n if (groupRewardIds.length > 0) {\n fetchGroupRewardModels({ group_reward_ids: groupRewardIds });\n }\n }, [groupRewardIds, fetchGroupRewardModels]);\n\n const mappedAchievements = useMemo(() => {\n if (!groupRewardModelsData?.data || !achievements?.data) return [];\n return buildMappedAchievements(achievements.data, groupRewardModelsData.data);\n }, [groupRewardModelsData, achievements?.data]);\n return {\n mappedAchievements,\n isLoading: isLoadingAchievements || isPendingGroupRewardModels,\n };\n};\n\nexport default useAchivementPlusRewardModel;\n","import { useSendEmail } from \"@phygitallabs/api-core\";\nexport {useSendEmail}","import { cn, parse, fileToBase64 } from \"@phygitallabs/helpers\";\n\nexport { cn, parse, fileToBase64 };"],"mappings":"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","names":["signOut","firebaseApp","firebaseAuth","AchievementType","RewardClaimStatus","jsx","user","signOut","updateScanStatus","refreshUser","useEffect","useEffect","TaskType","useState","useEffect","useEffect","AchievementServiceProvider","jsx","refreshUser","signOut","useEffect","config","AchievementServiceProvider","jsx","useState","useEffect","createAuthService","useManyAchievements","useCreateModelGroupReward","useEffect","useMemo"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phygitallabs/tapquest-core",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
8
|
"type": "module",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.mjs",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
9
12
|
"scripts": {
|
|
10
13
|
"prepublishOnly": "npm run build",
|
|
11
14
|
"build": "tsup",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, {
|
|
1
|
+
import React, { useState, useEffect } from "react";
|
|
2
2
|
import { Provider } from "react-redux";
|
|
3
3
|
import { PersistGate } from "redux-persist/integration/react";
|
|
4
4
|
|
|
@@ -26,20 +26,28 @@ export const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({
|
|
|
26
26
|
firebaseConfig,
|
|
27
27
|
authCallbacks
|
|
28
28
|
}) => {
|
|
29
|
+
const [internalAuthService, setInternalAuthService] = useState<any>(null);
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
useEffect(() => {
|
|
31
32
|
if (firebaseConfig && typeof window !== "undefined") {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
33
|
+
// Dynamic import to avoid loading Firebase modules during build
|
|
34
|
+
import("../modules/auth/services")
|
|
35
|
+
.then(({ createAuthService }) => {
|
|
36
|
+
try {
|
|
37
|
+
const authService = createAuthService({ firebaseConfig });
|
|
38
|
+
setInternalAuthService(authService);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
console.warn("Failed to create auth service from firebase config:", error);
|
|
41
|
+
setInternalAuthService(null);
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
.catch((error) => {
|
|
45
|
+
console.warn("Failed to dynamically import auth services:", error);
|
|
46
|
+
setInternalAuthService(null);
|
|
47
|
+
});
|
|
48
|
+
} else {
|
|
49
|
+
setInternalAuthService(null);
|
|
40
50
|
}
|
|
41
|
-
|
|
42
|
-
return null;
|
|
43
51
|
}, [firebaseConfig]);
|
|
44
52
|
|
|
45
53
|
return (
|