@phygitallabs/tapquest-core 3.3.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,191 @@
1
+ # Tapquest-Core Bundle Analysis (Level 3)
2
+
3
+ ## Package Information
4
+
5
+ **Package:** `@phygitallabs/tapquest-core`
6
+ **Level:** 3 (Deepest dependency chain)
7
+ **Version:** 4.0.0
8
+
9
+ ---
10
+
11
+ ## Bundle Size
12
+
13
+ | File | Size | Description |
14
+ |------|------|-------------|
15
+ | `index.mjs` | **31 KB** | Main bundle (minified) |
16
+ | `index.d.mts` | 24 KB | TypeScript definitions |
17
+ | `index.mjs.map` | 115 KB | Source map |
18
+ | **Total** | **170 KB** | Complete package output |
19
+
20
+ ---
21
+
22
+ ## Source Structure
23
+
24
+ **Total Source Files:** 79 TypeScript files
25
+
26
+ ### Main Modules:
27
+ - `providers/` - TapquestCoreProvider, ServicesProvider
28
+ - `modules/scan-chip/` - Chip scanning functionality
29
+ - `modules/achievement/` - Achievement system integration
30
+ - `modules/data-tracking/` - Analytics tracking
31
+ - `modules/memory/` - Memory/state management
32
+ - `modules/reward/` - Reward system integration
33
+ - `modules/certificate/` - Certificate generation
34
+ - `types/` - Type definitions
35
+ - `constants/` - Service constants
36
+
37
+ ---
38
+
39
+ ## Dependencies
40
+
41
+ ### Internal Dependencies (Level 0-2 packages):
42
+
43
+ | Dependency | Level | Purpose |
44
+ |------------|-------|---------|
45
+ | `@phygitallabs/achievement` | Level 2 | Achievement management |
46
+ | `@phygitallabs/reward` | Level 2 | Reward system |
47
+ | `@phygitallabs/api-core` | Level 0 | API functionality |
48
+ | `@phygitallabs/authentication` | Level 0 | User authentication |
49
+ | `@phygitallabs/helpers` | Level 0 | Utility functions |
50
+ | `@phygitallabs/generate-certificate` | Level 0 | Certificate generation |
51
+ | `@phygitallabs/notification-api` | Level 0 | Notifications |
52
+
53
+ **Total Internal Dependencies:** 7 packages (most complex in monorepo!)
54
+
55
+ ### External Dependencies:
56
+ - React (peer)
57
+ - Redux Toolkit
58
+ - React Redux
59
+ - Tanstack React Query
60
+ - Zustand
61
+ - Axios
62
+ - PostHog
63
+ - uuid
64
+ - jwt-decode
65
+
66
+ ---
67
+
68
+ ## Build Configuration
69
+
70
+ ```typescript
71
+ // tsup.config.ts
72
+ {
73
+ entry: ["index.ts"],
74
+ format: ["esm"],
75
+ dts: true,
76
+ splitting: false, // No code splitting
77
+ sourcemap: true,
78
+ minify: true, // Minification enabled
79
+ clean: true
80
+ }
81
+ ```
82
+
83
+ **Key Settings:**
84
+ - ✅ Minification enabled (helps keep 31 KB small)
85
+ - ❌ No code splitting (single bundle)
86
+ - ✅ ESM format only
87
+ - ✅ Type definitions generated
88
+
89
+ ---
90
+
91
+ ## Analysis Results
92
+
93
+ ### ✅ Strengths
94
+
95
+ 1. **Small Bundle Size** - Only 31 KB despite 7 internal dependencies
96
+ - Well-optimized build
97
+ - Minification working effectively
98
+ - Tree-shaking appears to be working
99
+
100
+ 2. **Good Module Organization** - 79 files organized into clear modules
101
+ - Each feature has its own folder
102
+ - Clear separation of concerns
103
+
104
+ 3. **Proper Externalization** - All dependencies are external
105
+ - Peer dependencies properly configured
106
+ - No bundling of dependencies
107
+
108
+ ### 🟡 Considerations
109
+
110
+ 1. **No Code Splitting** - Single 31 KB bundle
111
+ - **Current:** Everything loads at once
112
+ - **Impact:** Acceptable for Level 3 integration package
113
+ - **Reason:** Likely needs everything together for functionality
114
+
115
+ 2. **Complex Dependency Chain** - Depends on 7 internal packages
116
+ - **Implication:** Changes in any Level 0-2 package could affect this
117
+ - **Risk:** Higher chance of breaking changes
118
+ - **Mitigation:** Good version management needed
119
+
120
+ 3. **All Modules Bundled** - No separate entry points for modules
121
+ - **Current:** Import entire package even if you only need one module
122
+ - **Potential Improvement:** Could create entry points per module (scan-chip, achievement, etc.)
123
+
124
+ ---
125
+
126
+ ## Comparison with ui-landing-page (Level 2)
127
+
128
+ | Metric | tapquest-core (L3) | ui-landing-page (L2) |
129
+ |--------|-------------------|----------------------|
130
+ | Bundle Size | 31 KB | 950 KB (before split) |
131
+ | Entry Points | 1 | 44 (after optimization) |
132
+ | Code Splitting | No | Yes |
133
+ | Source Files | 79 | ~100+ |
134
+ | Dependencies | 7 internal | 3 internal |
135
+
136
+ **Key Difference:**
137
+ - `tapquest-core` is an **integration package** (smaller, unified)
138
+ - `ui-landing-page` is a **component library** (larger, benefits from splitting)
139
+
140
+ ---
141
+
142
+ ## Recommendations
143
+
144
+ ### 🟢 No Action Needed (Already Optimized)
145
+
146
+ The package is **well-optimized** for its purpose:
147
+ - Small bundle size (31 KB)
148
+ - Minification enabled
149
+ - Proper dependency externalization
150
+ - Good module organization
151
+
152
+ ### 🟡 Optional Improvements (Low Priority)
153
+
154
+ 1. **Module-Level Entry Points** (if needed)
155
+ ```typescript
156
+ // Allow importing specific modules
157
+ import { useScanChip } from '@phygitallabs/tapquest-core/scan-chip';
158
+ import { useAchievement } from '@phygitallabs/tapquest-core/achievement';
159
+ ```
160
+ **Benefit:** Smaller bundles if only using one module
161
+ **Trade-off:** More complex build setup
162
+
163
+ 2. **Bundle Analysis**
164
+ ```typescript
165
+ // Add to tsup.config.ts
166
+ metafile: true,
167
+ ```
168
+ **Purpose:** See what's inside the 31 KB
169
+
170
+ ---
171
+
172
+ ## Conclusion
173
+
174
+ ✅ **Status:** Well-optimized, ready for production
175
+
176
+ **Summary:**
177
+ - Small 31 KB bundle despite complex dependencies
178
+ - No optimization needed at this time
179
+ - Good candidate for Level 3 package
180
+ - Well-structured codebase with clear modules
181
+
182
+ **Next Steps:**
183
+ - Continue monitoring bundle size
184
+ - Consider module-level entry points if usage patterns show need
185
+ - Maintain version compatibility with 7 dependent packages
186
+
187
+ ---
188
+
189
+ **Analysis Date:** November 5, 2025
190
+ **Build Time:** 1.5s
191
+ **Bundle Status:** ✅ Optimized
package/bun.lock CHANGED
@@ -237,25 +237,25 @@
237
237
 
238
238
  "@phosphor-icons/react": ["@phosphor-icons/react@2.1.10", "", { "peerDependencies": { "react": ">= 16.8", "react-dom": ">= 16.8" } }, "sha512-vt8Tvq8GLjheAZZYa+YG/pW7HDbov8El/MANW8pOAz4eGxrwhnbfrQZq0Cp4q8zBEu8NIhHdnr+r8thnfRSNYA=="],
239
239
 
240
- "@phygitallabs/achievement": ["@phygitallabs/achievement@3.3.0", "", { "dependencies": { "@hookform/resolvers": "^3.3.1", "@phygitallabs/form-ui-kit": "latest", "@tanstack/react-query": "^5.66.8", "@tanstack/react-query-devtools": "^5.74.7", "axios": "^1.8.4", "react-hook-form": "^7.54.2", "typescript": "latest" }, "peerDependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@phosphor-icons/react": "^2.1.7", "antd": "^5.24.1", "dayjs": "^1.11.7", "next": "15.1.7", "react": ">=18.2", "yup": "^1.6.1" } }, "sha512-iF5s7dAM5sWVuKygPsVIv5EJ3WmEBBc2so7uPhh6XIa7lMABadwU3IsZ+ZkrMZ0ESaIJZnPARRmmu3USY6GfZw=="],
240
+ "@phygitallabs/achievement": ["@phygitallabs/achievement@4.0.0", "", { "dependencies": { "@hookform/resolvers": "^3.3.1", "@phygitallabs/form-ui-kit": "latest", "@tanstack/react-query": "^5.66.8", "@tanstack/react-query-devtools": "^5.74.7", "axios": "^1.8.4", "react-hook-form": "^7.54.2", "typescript": "latest" }, "peerDependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@phosphor-icons/react": "^2.1.7", "antd": "^5.24.1", "dayjs": "^1.11.7", "next": "15.1.7", "react": ">=18.2", "yup": "^1.6.1" } }, "sha512-obTQHDqZGXQOompfy9NYjU9lJqKQbqSvc9oA4xkmyIbPn5qEu2HMTSZDFvlQN4WxvE2OK34vNrfFDOvPLxJS8Q=="],
241
241
 
242
- "@phygitallabs/api-core": ["@phygitallabs/api-core@3.3.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "@tanstack/react-query-devtools": "^5.74.7", "axios": "^1.8.4", "typescript": "latest" } }, "sha512-sFM59SpZ3SV+whxl5dECfxLYuLXdiVBXR9kIWf3jCe+Yg5sd6gAkSvIM+1l40+JYlqHVlfqf1ipBIz/Qso4ZkQ=="],
242
+ "@phygitallabs/api-core": ["@phygitallabs/api-core@4.1.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "axios": "^1.8.4" } }, "sha512-T3rNlmIWJJut+yKRD3X5s0wmKc51LC4K6HTzP4C1H6XBKL272IGwPPQB7TmsOvFCHdRoQ+VJiEqmghq3wdBzCA=="],
243
243
 
244
- "@phygitallabs/authentication": ["@phygitallabs/authentication@3.3.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "@tanstack/react-query-devtools": "^5.74.7", "axios": "^1.8.4", "typescript": "latest" } }, "sha512-p1BkiR4skIW9va1g6a87zhkkXtoRVDsSp4kZst9rjs4K8P9EjXa27w9Ty7/XnyTNbJc5SQh/YBC5NBpLxFCZpQ=="],
244
+ "@phygitallabs/authentication": ["@phygitallabs/authentication@4.0.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "axios": "^1.8.4" } }, "sha512-qg7jHanj/axRVpJP4Ibj4LuHqJ3xyYe3pWvmxSA7dVQ69kxxw05dDtb6x19hfxOnxUSoEAqJL13ju+6h7n9RDA=="],
245
245
 
246
- "@phygitallabs/form-ui-kit": ["@phygitallabs/form-ui-kit@3.3.0", "", { "dependencies": { "@phygitallabs/helpers": "latest", "lodash": "^4.17.21", "nomion-rich-editor": "latest", "react-hook-form": "^7.54.2", "react-quill-new": "^3.4.6", "typescript": "latest", "yup": "^1.6.1" }, "peerDependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@hookform/resolvers": "^3.3.1", "@phosphor-icons/react": "^2.1.7", "antd": "^5.24.1", "dayjs": "^1.11.7", "next": "15.1.7", "react": ">=18.2", "react-icons": "^5.0.1" } }, "sha512-75kmHkEaevyIryWJ6OSNoHU4sVRBp1YKrj65DDaxWks5+XRXRTNPHA7Eovt3Ur4kk+6ZRZz1NsxouuWm/ZQXtA=="],
246
+ "@phygitallabs/form-ui-kit": ["@phygitallabs/form-ui-kit@4.0.0", "", { "dependencies": { "@phygitallabs/helpers": "latest", "lodash": "^4.17.21" }, "peerDependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@hookform/resolvers": "^3.3.1", "@phosphor-icons/react": "^2.1.7", "antd": "^5.24.1", "dayjs": "^1.11.7", "next": "15.1.7", "nomion-rich-editor": "latest", "react": ">=18.2", "react-dom": ">=18.2", "react-hook-form": "^7.54.2", "react-icons": "^5.0.1", "react-quill-new": "^3.4.6", "yup": "^1.6.1" } }, "sha512-zFf5m3Ctukn1BHPjY/W0sHJFZhpqHfDcfb6Knc5X52ZAbG5YYKjTJzjYh807HScxUfYhjVFqgsQUtncmG6TFYw=="],
247
247
 
248
- "@phygitallabs/generate-certificate": ["@phygitallabs/generate-certificate@3.3.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "@tanstack/react-query-devtools": "^5.74.7", "axios": "^1.8.4", "typescript": "latest" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-WRLkth2RkFFq7p4N9vLzEQqv6tPT1P6mz4qveqOQe81ZSKBSsDMqRD1DTCYz0xACSyoH0k9fFzcgeRtWtTLFQg=="],
248
+ "@phygitallabs/generate-certificate": ["@phygitallabs/generate-certificate@4.0.0", "", { "dependencies": { "@tanstack/react-query": "^5.66.8", "axios": "^1.8.4" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-0pUjkgVftsxdF7RIIqEjcuNEjzV05xF92aKWuUOTA9vyk23jZOp9PFXNvFOgalQoRlxa1LMYWZGk8TqckXn3rg=="],
249
249
 
250
- "@phygitallabs/helpers": ["@phygitallabs/helpers@3.3.0", "", { "dependencies": { "clsx": "^2.1.1", "html-react-parser": "^4.0.0", "tailwind-merge": "^2.3.0", "typescript": "latest" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-Lz421+310PzeVee6Ll73zdpcB6RdlQrbpS+Rd2DAFCDB5zQI+9WwIWzaI9/huodjm4SekUjfE3tHMCNj7dwfPg=="],
250
+ "@phygitallabs/helpers": ["@phygitallabs/helpers@4.0.0", "", { "dependencies": { "clsx": "^2.1.1", "html-react-parser": "^4.0.0", "tailwind-merge": "^2.3.0" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-8OdpXVpjVOF8PGs0n9RmtT9unNCbVJPGrt42LdzA8XdwLP60N8gIToK4G/tty7uscso4nqAcHLDiQs7NzC4ajQ=="],
251
251
 
252
- "@phygitallabs/notification-api": ["@phygitallabs/notification-api@3.3.0", "", { "dependencies": { "@tanstack/react-query": "^5.81.5", "@types/react": "^18.0.0", "axios": "^1.7.7", "react": "^18.0.0", "typescript": "latest", "zustand": "^5.0.8" } }, "sha512-rxSQa+l4DsAnlvxURuqdFR4+rZ6x08PEdhnD+5RZ/3Zqtzgfwmcpq/4ir4y5af2k9aFxB6n7eAWvz1EzfrtZzg=="],
252
+ "@phygitallabs/notification-api": ["@phygitallabs/notification-api@4.0.0", "", { "dependencies": { "@tanstack/react-query": "^5.81.5", "axios": "^1.7.7", "zustand": "^5.0.8" }, "peerDependencies": { "react": "^18.0.0" } }, "sha512-oqEHjhDZecIeQ+S+9qnhUmmrPJGZwfHK/L05JrshsuMPgkK8+bNcnWzxd+pyRSDM6jjp5niW5bkHvD+vHHt53A=="],
253
253
 
254
- "@phygitallabs/reward": ["@phygitallabs/reward@3.3.0", "", { "dependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@hookform/resolvers": "^3.3.1", "@phosphor-icons/react": "^2.1.7", "@phygitallabs/api-core": "latest", "@phygitallabs/form-ui-kit": "latest", "@tanstack/react-query": "^5.59.16", "@types/lodash": "^4.17.13", "antd": "^5.21.6", "axios": "^1.7.7", "clsx": "^2.1.1", "compressorjs": "^1.2.1", "dayjs": "^1.11.13", "detectincognitojs": "^1.4.1", "html-react-parser": "^4.2.10", "immer": "^10.1.1", "lodash": "^4.17.21", "next": "15.1.7", "react-hook-form": "^7.53.2", "react-i18next": "^15.1.1", "react-quill-new": "^3.4.6", "react-router-dom": "^6.28.0", "swagger-typescript-api": "^13.1.3", "tailwind-merge": "^2.5.4", "use-dehydrated-state": "^0.1.0", "uuid": "^11.0.3", "yup": "^1.3.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-4CU2i3f+4brYme/sT5uvo9xETAauznnZSmWuwQNOLNRgzlz7N5Jg14qRrLZyzLK6HCH1Ynfcf1NHQ7pC5sTBqA=="],
254
+ "@phygitallabs/reward": ["@phygitallabs/reward@4.0.0", "", { "dependencies": { "@ant-design/v5-patch-for-react-19": "^1.0.3", "@hookform/resolvers": "^3.3.1", "@phosphor-icons/react": "^2.1.7", "@phygitallabs/api-core": "latest", "@phygitallabs/form-ui-kit": "latest", "@tanstack/react-query": "^5.59.16", "@types/lodash": "^4.17.13", "antd": "^5.21.6", "axios": "^1.7.7", "clsx": "^2.1.1", "compressorjs": "^1.2.1", "dayjs": "^1.11.13", "detectincognitojs": "^1.4.1", "html-react-parser": "^4.2.10", "immer": "^10.1.1", "lodash": "^4.17.21", "next": "15.1.7", "react-hook-form": "^7.53.2", "react-i18next": "^15.1.1", "react-quill-new": "^3.4.6", "react-router-dom": "^6.28.0", "swagger-typescript-api": "^13.1.3", "tailwind-merge": "^2.5.4", "use-dehydrated-state": "^0.1.0", "uuid": "^11.0.3", "yup": "^1.3.3", "zustand": "^4.4.1" }, "peerDependencies": { "react": ">=18.2" } }, "sha512-SM79ypYqMNTRprKyDx78Uqc11MwabYfL3Mc0k1vCravvri0lq+c/zQ71ANTa3C+i5qxwRlvGuY++6rVQc9pUbQ=="],
255
255
 
256
256
  "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
257
257
 
258
- "@posthog/core": ["@posthog/core@1.5.0", "", {}, "sha512-oxfV20QMNwH30jKybUyqi3yGuMghULQz1zkJgQG3rjpHDxhD2vDN6E7UpmaqgphMIvGG3Q+DgfU10zfSPA7w7w=="],
258
+ "@posthog/core": ["@posthog/core@1.5.1", "", { "dependencies": { "cross-spawn": "^7.0.6" } }, "sha512-8fdEzfvdStr45iIncTD+gnqp45UBTUpRK/bwB4shP5usCKytnPIeilU8rIpNBOVjJPwfW+2N8yWhQ0l14x191Q=="],
259
259
 
260
260
  "@radix-ui/primitive": ["@radix-ui/primitive@1.1.3", "", {}, "sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg=="],
261
261
 
@@ -403,7 +403,7 @@
403
403
 
404
404
  "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
405
405
 
406
- "axios": ["axios@1.13.1", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw=="],
406
+ "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="],
407
407
 
408
408
  "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
409
409
 
@@ -595,8 +595,6 @@
595
595
 
596
596
  "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="],
597
597
 
598
- "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
599
-
600
598
  "json2mq": ["json2mq@0.2.0", "", { "dependencies": { "string-convert": "^0.2.0" } }, "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA=="],
601
599
 
602
600
  "jwt-decode": ["jwt-decode@4.0.0", "", {}, "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA=="],
@@ -621,8 +619,6 @@
621
619
 
622
620
  "lodash.sortby": ["lodash.sortby@4.7.0", "", {}, "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="],
623
621
 
624
- "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
625
-
626
622
  "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
627
623
 
628
624
  "lucide-react": ["lucide-react@0.545.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-7r1/yUuflQDSt4f1bpn5ZAocyIxcTyVyBBChSVtBKn5M+392cPmI5YJMWOJKk/HUWGm5wg83chlAZtCcGbEZtw=="],
@@ -663,7 +659,7 @@
663
659
 
664
660
  "node-readfiles": ["node-readfiles@0.2.0", "", { "dependencies": { "es6-promise": "^3.2.1" } }, "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA=="],
665
661
 
666
- "nomion-rich-editor": ["nomion-rich-editor@3.3.0", "", { "dependencies": { "@ant-design/icons": "^5.3.0", "@floating-ui/dom": "^1.6.8", "@lexical/html": "0.16.1", "@lexical/link": "0.16.1", "@lexical/list": "0.16.1", "@lexical/react": "0.16.1", "@lexical/rich-text": "0.16.1", "@lexical/selection": "0.16.1", "@lexical/utils": "0.16.1", "@radix-ui/react-dialog": "^1.0.4", "@ungap/structured-clone": "^1.2.0", "antd": "^5.16.5", "clsx": "^2.1.0", "html-react-parser": "^5.1.10", "lexical": "0.16.1", "lucide-react": "^0.545.0", "react": "19.1.0", "react-dom": "19.1.0", "tailwind-merge": "^2.2.2" } }, "sha512-fmOCuNkUnEQU3kE1bMVCV0bi3/eaPmvPvQAPmd5xbMNARGn6hjdbA9Qan75FcVJddWR2sba+I/W/AGN/An3rwg=="],
662
+ "nomion-rich-editor": ["nomion-rich-editor@4.0.0", "", { "dependencies": { "@ant-design/icons": "^5.3.0", "@floating-ui/dom": "^1.6.8", "@lexical/html": "0.16.1", "@lexical/link": "0.16.1", "@lexical/list": "0.16.1", "@lexical/react": "0.16.1", "@lexical/rich-text": "0.16.1", "@lexical/selection": "0.16.1", "@lexical/utils": "0.16.1", "@radix-ui/react-dialog": "^1.0.4", "@ungap/structured-clone": "^1.2.0", "clsx": "^2.1.0", "html-react-parser": "^5.1.10", "lexical": "0.16.1", "lucide-react": "^0.545.0", "tailwind-merge": "^2.2.2" }, "peerDependencies": { "antd": "^5.0.0", "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-6qgDxkx1f7Mg+SAhijC40kavJyy+lZy1i3lXD0sk4QiOdMYFGVREkL0/YYecG739WVIRiLBFg9G54uFFHmueFA=="],
667
663
 
668
664
  "nypm": ["nypm@0.6.2", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.3.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g=="],
669
665
 
@@ -709,7 +705,7 @@
709
705
 
710
706
  "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
711
707
 
712
- "posthog-js": ["posthog-js@1.285.1", "", { "dependencies": { "@posthog/core": "1.5.0", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" } }, "sha512-+Cn3igI6LoOJuGtsiVsD15a0jGIaR1zE5tEG3Ovd4MLgti3RFHdS1eOisZTJUuQa2bR8X/Bx7HdoXsGNmW9h4Q=="],
708
+ "posthog-js": ["posthog-js@1.286.0", "", { "dependencies": { "@posthog/core": "1.5.1", "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" } }, "sha512-l7XbkJLG6GZ4eo538uKAxG0yFTse3QsONP4U/QMMngb/5b44jR8uMn4h7ZLhGC1y8kq2cXlpgSVtLyIXXpPdjg=="],
713
709
 
714
710
  "preact": ["preact@10.27.2", "", {}, "sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg=="],
715
711
 
@@ -797,7 +793,7 @@
797
793
 
798
794
  "react": ["react@19.2.0", "", {}, "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ=="],
799
795
 
800
- "react-dom": ["react-dom@19.1.0", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g=="],
796
+ "react-dom": ["react-dom@19.2.0", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.0" } }, "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ=="],
801
797
 
802
798
  "react-error-boundary": ["react-error-boundary@3.1.4", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "react": ">=16.13.1" } }, "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA=="],
803
799
 
@@ -845,7 +841,7 @@
845
841
 
846
842
  "rollup": ["rollup@4.52.5", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.52.5", "@rollup/rollup-android-arm64": "4.52.5", "@rollup/rollup-darwin-arm64": "4.52.5", "@rollup/rollup-darwin-x64": "4.52.5", "@rollup/rollup-freebsd-arm64": "4.52.5", "@rollup/rollup-freebsd-x64": "4.52.5", "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", "@rollup/rollup-linux-arm-musleabihf": "4.52.5", "@rollup/rollup-linux-arm64-gnu": "4.52.5", "@rollup/rollup-linux-arm64-musl": "4.52.5", "@rollup/rollup-linux-loong64-gnu": "4.52.5", "@rollup/rollup-linux-ppc64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-gnu": "4.52.5", "@rollup/rollup-linux-riscv64-musl": "4.52.5", "@rollup/rollup-linux-s390x-gnu": "4.52.5", "@rollup/rollup-linux-x64-gnu": "4.52.5", "@rollup/rollup-linux-x64-musl": "4.52.5", "@rollup/rollup-openharmony-arm64": "4.52.5", "@rollup/rollup-win32-arm64-msvc": "4.52.5", "@rollup/rollup-win32-ia32-msvc": "4.52.5", "@rollup/rollup-win32-x64-gnu": "4.52.5", "@rollup/rollup-win32-x64-msvc": "4.52.5", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw=="],
847
843
 
848
- "scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="],
844
+ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="],
849
845
 
850
846
  "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="],
851
847
 
@@ -981,8 +977,6 @@
981
977
 
982
978
  "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
983
979
 
984
- "@phygitallabs/notification-api/react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
985
-
986
980
  "@phygitallabs/reward/uuid": ["uuid@11.1.0", "", { "bin": { "uuid": "dist/esm/bin/uuid" } }, "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A=="],
987
981
 
988
982
  "@phygitallabs/reward/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="],
@@ -1001,11 +995,9 @@
1001
995
 
1002
996
  "nomion-rich-editor/html-react-parser": ["html-react-parser@5.2.8", "", { "dependencies": { "domhandler": "5.0.3", "html-dom-parser": "5.1.1", "react-property": "2.0.2", "style-to-js": "1.1.19" }, "peerDependencies": { "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19", "react": "0.14 || 15 || 16 || 17 || 18 || 19" }, "optionalPeers": ["@types/react"] }, "sha512-09WaI81tbpwhXWeMe1m9VptZVJUcigo0l59zVt+2HUIQT7+baU38/oNhllj6MKhOuGXqh0nrlwOgxbxbm6xXHw=="],
1003
997
 
1004
- "nomion-rich-editor/react": ["react@19.1.0", "", {}, "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg=="],
1005
-
1006
998
  "nypm/pkg-types": ["pkg-types@2.3.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="],
1007
999
 
1008
- "nypm/tinyexec": ["tinyexec@1.0.1", "", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="],
1000
+ "nypm/tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
1009
1001
 
1010
1002
  "oas-linter/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
1011
1003
 
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var we=Object.defineProperty;var Ve=Object.getOwnPropertyDescriptor;var qe=Object.getOwnPropertyNames;var He=Object.prototype.hasOwnProperty;var ke=(e,s)=>{for(var o in s)we(e,o,{get:s[o],enumerable:!0})},Pe=(e,s,o,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let t of qe(s))!He.call(e,t)&&t!==o&&we(e,t,{get:()=>s[t],enumerable:!(r=Ve(s,t))||r.enumerable});return e},u=(e,s,o)=>(Pe(e,s,"default"),o&&Pe(o,s,"default"));var g={};ke(g,{ALLOWED_ORIGINS:()=>se,AchievementRuleActionType:()=>sr,AchievementServiceProvider:()=>ir,AchievementType:()=>Te,AuthProvider:()=>z,CALLBACK_URL:()=>ne,CampaignState:()=>co,CmentityRewardType:()=>ar,NotificationProvider:()=>te,RewardClaimStatus:()=>Se,TapquestCoreProvider:()=>Go,TaskType:()=>Ne,UserSourceType:()=>io,accessTokenKey:()=>_,checkDeviceUid:()=>de,chipAuthTokenKey:()=>L,cn:()=>Vo,convertSnakeToCamel:()=>S,deviceUIDKey:()=>U,fileToBase64:()=>Ho,filterLocationsByProperty:()=>Fe,generateDeviceId:()=>Le,getAccessToken:()=>Hr,getActionsFromAchievementRule:()=>je,getChipAuthToken:()=>Kr,getDeviceUid:()=>ce,getLocationIdsFromAchievementRule:()=>Ze,getRefreshToken:()=>Qr,getRetryAttemptsRefreshToken:()=>Vr,getUserInfo:()=>Xr,httpMaxRetries:()=>vr,isAchievementCompleted:()=>G,locationQueryKeys:()=>ve,memoriesKey:()=>Ar,parse:()=>qo,refreshTokenKey:()=>x,removeAccessToken:()=>jr,removeChipAuthToken:()=>$r,removeDeviceUid:()=>Wr,removeRefreshToken:()=>Jr,removeUserInfo:()=>ro,resetMemoriesQuery:()=>hr,retryAttemptsRefreshToken:()=>F,setAccessToken:()=>Zr,setChipAuthToken:()=>ue,setDeviceUid:()=>Me,setRefreshToken:()=>Yr,setRetryAttemptsRefreshToken:()=>qr,setUserInfo:()=>eo,sortLocationsByIndex:()=>Ge,useAchievementProgress:()=>Je,useAchivementPlusRewardModel:()=>Ie,useAuth:()=>T,useCampaignDetail:()=>le,useCancelUserRewardsRequest:()=>so,useChipScanStory:()=>be,useClaimUserReward:()=>Z,useClearUserRewardCache:()=>re,useCreateCertificate:()=>mo,useCreateCertificateAnonymous:()=>fo,useCreateCertificateWithMask:()=>go,useCreateMemory:()=>fr,useCreateModelGroupReward:()=>ee,useCreateRewardModel:()=>Y,useDataTracking:()=>_o,useDeleteRewardModel:()=>X,useGenerateFansipanCertificate:()=>po,useGenerateTemplateCertificate:()=>lo,useGenerateThaocamvienCertificate:()=>uo,useGetRewardModel:()=>Q,useGetUserRewards:()=>H,useGoogleLogin:()=>ae,useInfiniteMemories:()=>mr,useListRewardModels:()=>j,useLocationDetail:()=>ge,useLocationProgress:()=>he,useLocationsList:()=>fe,useManyAchievementProgress:()=>nr,useManyAchievements:()=>Xe,useManyAchievementsRewardModels:()=>tr,useManyChildrenAchievements:()=>rr,useManyMemory:()=>pr,useManyUserActionLocations:()=>Ae,useManyUserRewards:()=>q,useMyProfile:()=>oo,useOneAchievement:()=>or,useOneMemory:()=>lr,useOneUserCampaign:()=>me,usePGLCoreService:()=>De,useScanChip:()=>ao,useSendEmail:()=>$o,useSyncCheckin:()=>no,useUpdateMyProfile:()=>to,useUpdateRewardModel:()=>J,useUploadMedia:()=>gr,useUserAchievementAction:()=>er,useUserCampaignAction:()=>pe,useV1ListRewards:()=>oe,userInfoKey:()=>E,wrapTextWithFont:()=>ho});import{useManyAchievementProgress as Qe}from"@phygitallabs/achievement";import{useManyAchievementProgressByDevice as Ye}from"@phygitallabs/api-core";import{useAchievementProgress as Je,useManyAchievements as Xe,useUserAchievementAction as er,useManyChildrenAchievements as rr,useOneAchievement as or,useManyAchievementsRewardModels as tr}from"@phygitallabs/achievement";var Ze=e=>{if(!e.rule)return[];let s=[];return Object.values(e.rule).forEach(o=>{o.rules&&o.rules.forEach(r=>{r.filter&&Object.values(r.filter).forEach(t=>{t.filters&&t.filters.forEach(n=>{n.label==="location_id"&&n.value&&(Array.isArray(n.value)?s.push(...n.value):s.push(n.value))})})})}),Array.from(new Set(s))},je=e=>{if(!e.rule)return[];let s=[];return Object.values(e.rule).forEach(o=>{o.rules&&o.rules.forEach(r=>{r.action&&s.push(r.action)})}),Array.from(new Set(s))},G=e=>e.isCompleted||e.overallPercentage===100;function S(e){if(e==null)return e;if(Array.isArray(e))return e.map(s=>S(s));if(typeof e=="object"&&e.constructor===Object){let s={};for(let o in e)if(e.hasOwnProperty(o)){let r=o.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());s[r]=S(e[o])}return s}return e}var nr=(e,s)=>{let o=!!e.userId,r=o?{achievementIds:e.achievementIds,userId:e.userId,applicationId:e.applicationId}:{achievement_ids:e.achievementIds,device_uid:e.deviceUid,applicationId:e.applicationId};return o?Qe(r,{...s,select:t=>t.map(n=>({...n,isCompleted:G(n)}))}):Ye(r,{...s,select:t=>S(t).map(i=>({...i,isCompleted:G(i)}))})};import{AchievementRuleActionType as sr,AchievementServiceProvider as ir}from"@phygitallabs/achievement";var Te=(t=>(t.DEFAULT="default",t.MULTIPLE_CHECK_INS="multiple_check_ins",t.RANDOM_CHECK_INS="random_check_ins",t.GROUP_MISSION="group_mission",t))(Te||{});import{useManyUserRewards as q,useGetUserRewards as H,useClaimUserReward as Z,useListRewardModels as j,useGetRewardModel as Q,useCreateRewardModel as Y,useUpdateRewardModel as J,useDeleteRewardModel as X,useCreateModelGroupReward as ee,useClearUserRewardCache as re,useV1ListRewards as oe}from"@phygitallabs/reward";import{CmentityRewardType as ar}from"@phygitallabs/reward";var Se=(t=>(t.NOT_CLAIMED="not_claimed",t.CLAIMED="claimed",t.IN_PROGRESS="in_progress",t.FAILED="failed",t))(Se||{});var d={};ke(d,{NotificationProvider:()=>te});u(d,kt);import*as kt from"@phygitallabs/notification-api";import{NotificationProvider as dr}from"@phygitallabs/notification-api";var cr={dev:{API_BASE_URL:"https://backend-dev.nomion.io",API_BASE_CORE_URL:"https://backend-dev.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend-dev.nomion.io/achievement",API_REWARD_URL:"https://backend-dev.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc-dev.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend-dev.nomion.io/notification-ws/ws"},staging:{API_BASE_URL:"https://backend-staging.nomion.io",API_BASE_CORE_URL:"https://backend-staging.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend-staging.nomion.io/achievement",API_REWARD_URL:"https://backend-staging.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc-staging.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend-staging.nomion.io/notification-ws/ws"},production:{API_BASE_URL:"https://backend.nomion.io",API_BASE_CORE_URL:"https://backend.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend.nomion.io/achievement",API_REWARD_URL:"https://backend.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend.nomion.io/notification-ws/ws"}},y=cr;import{jsx as ur}from"react/jsx-runtime";var te=({children:e,autoConnect:s=!0,environment:o="dev",user:r,onWebSocketOpen:t,onWebSocketClose:n,onWebSocketMessage:i})=>{let a=y[o]?.API_NOTIFICATION_SOCKET_URL;return ur(dr,{userUid:r?.id,accessToken:r?.accessToken??null,webSocketUrl:a,autoConnect:s,onWebSocketOpen:t,onWebSocketClose:n,onWebSocketMessage:i,children:e})};u(g,d);import{useOneMemory as lr,useManyMemory as pr,useInfiniteMemories as mr,useCreateMemory as fr,useUploadMedia as gr,resetMemoriesQuery as hr,memoriesKey as Ar}from"@phygitallabs/api-core";import{AuthenticationProvider as Er,useAuthenticationHeaders as _r,tokenStorage as B}from"@phygitallabs/authentication";import{useEffect as xr}from"react";import{create as Rr}from"zustand";import{immer as yr}from"zustand/middleware/immer";import{createJSONStorage as Cr,devtools as Ir,persist as Pr,subscribeWithSelector as wr}from"zustand/middleware";import{authService as M,verifyCodeService as O,tokenStorage as I}from"@phygitallabs/authentication";var E="phygital-user-info",_="accessToken",x="refreshToken",vr=3,F="retryAttemptsRefreshToken",U="Device-UID",L="chip-auth-token",ne="https://s3-sgn10.fptcloud.com/nomion-assets/platform/callback.html",se=["https://s3-sgn10.fptcloud.com","https://accounts.google.com/"];var kr={user:null,isSignedIn:!1,isInitialized:!1,isLoading:!1,error:null,cleanupFunctions:{},eventCallbacks:{}},m=Rr()(Ir(Pr(wr(yr((e,s)=>({...kr,actions:{setIsLoading:o=>e(r=>{r.isLoading=o}),setCleanupFunctions:o=>e(r=>{r.cleanupFunctions={...r.cleanupFunctions,...o}}),addEventCallbacks:o=>(e(r=>{r.eventCallbacks={...r.eventCallbacks,...o}}),()=>{e(r=>{r.eventCallbacks={...r.eventCallbacks,...o}})}),signInWithEmail:async(o,r)=>{let{eventCallbacks:t}=s();e(n=>{n.isLoading=!0,n.error=null});try{let n=await M.signIn({email:o,password:r});return n?.data?.idToken&&n?.data?.refreshToken&&(I.setTokens({idToken:n.data.idToken,refreshToken:n.data.refreshToken}),e(i=>{i.isSignedIn=!0}),t.onLoginSuccess?.(n.data.idToken)),n}catch(n){if(n?.response?.data?.code===7)return{data:void 0,message:"Email verification required",code:7};let i=n instanceof Error?n.message:"Login failed";throw e(a=>{a.error=i}),t.onLoginError?.(new Error(i)),n}finally{e(n=>{n.isLoading=!1})}},signInWithGoogle:async()=>{let{eventCallbacks:o}=s();try{let r=ne;return await M.getOAuthSignInUrl(r)}catch(r){let t=r instanceof Error?r.message:"Google sign in failed";throw e(n=>{n.error=t}),o.onLoginError?.(new Error(t)),r}},signUpWithEmail:async(o,r)=>{let{eventCallbacks:t}=s();e(n=>{n.isLoading=!0,n.error=null});try{let n=await M.signUp({email:o,password:r});return n.data&&t.onSignupSuccess?.(),n}catch(n){let i=n instanceof Error?n.message:"Signup failed";throw e(a=>{a.error=i}),t.onSignupError?.(new Error(i)),n}finally{e(n=>{n.isLoading=!1,n.user=null,n.isSignedIn=!1})}},signOut:async()=>{let{eventCallbacks:o,cleanupFunctions:r}=s();e(t=>{t.isLoading=!0,t.error=null});try{if(e(i=>{i.user=null,i.isSignedIn=!1,i.error=null}),I.isTokenExpired()){I.clearTokens(),localStorage.clear();return}let n=I.getRefreshToken();n&&await M.logout({refreshToken:n}),localStorage.clear(),I.clearTokens();try{r.clearQueryCache?.(),r.clearOrganization?.(),r.clearCustomData?.(),r.clearHeaders?.()}catch(i){console.warn("Error during logout cleanup:",i)}o.onLogoutSuccess?.()}catch(t){console.log(t);let n=t instanceof Error?t.message:"Logout failed";throw e(i=>{i.error=n}),o.onLogoutError?.(new Error(n)),t}finally{e(t=>{t.isLoading=!1})}},sendPasswordResetEmail:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{await O.forgotPassword({email:o})}catch(r){let t=r instanceof Error?r.message:"Failed to send reset email";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},resetPassword:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await O.resetPassword(o)}catch(r){let t=r instanceof Error?r.message:"Failed to reset password";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},changePassword:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await O.changePassword(o)}catch(r){throw r}finally{e(r=>{r.isLoading=!1})}},verifyEmailCode:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await O.verifyEmail(o)}catch(r){let t=r instanceof Error?r.message:"Failed to send reset email";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},sendVerifyCode:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await O.sendVerifyCode(o)}catch(r){let t=r instanceof Error?r.message:"Failed to send verify code";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},refreshToken:async o=>await M.refreshToken({refreshToken:o??I.getRefreshToken()??""}),clearError:()=>e(o=>{o.error=null}),setUser:o=>e(r=>{r.user=o}),setIsSignedIn:o=>e(r=>{r.isSignedIn=o}),setIsInitialized:o=>e(r=>{r.isInitialized=o}),patchUser:o=>e(r=>{r.user?r.user={...r.user,...o}:r.user=o}),initialize:()=>{e(o=>{let r=I.getAuthToken();o.isSignedIn=!!r,o.isInitialized=!0})},syncAuthState:()=>{e(o=>{let r=I.getAuthToken(),t=o.isSignedIn;o.isSignedIn=!!r,t!==o.isSignedIn&&(o.isSignedIn?o.eventCallbacks?.onAuthStateChange?.(o.user,!0):o.eventCallbacks?.onAuthStateChange?.(null,!1))})}}}))),{version:1,name:"auth-store",storage:Cr(()=>localStorage),partialize:e=>({isSignedIn:e.isSignedIn,user:e.user})}))),T=()=>{let e=m(i=>i.user),s=m(i=>i.isSignedIn),o=m(i=>i.isInitialized),r=m(i=>i.isLoading),t=m(i=>i.error),n=m(i=>i.actions);return{user:e,isSignedIn:s,isInitialized:o,isLoading:r,error:t,...n}};import Tr from"jwt-decode";var Ee=(e,s)=>{let o={...e},r={};try{r=Tr(s)}catch(t){console.warn("Failed to decode token in transformUserData:",t)}return o.exp=r.exp||0,o.accessToken=s||"",o.roles=r?.roles||["USER"],o.account_type=r?.account_type||0,o.picture=e.picture||"",o};import{userService as Ur}from"@phygitallabs/api-core";import{usePGLCoreService as Lr}from"@phygitallabs/api-core";import{useAchievementService as Mr}from"@phygitallabs/achievement";import{useRewardService as Or}from"@phygitallabs/reward";import{useGenerateCertificateService as br}from"@phygitallabs/generate-certificate";import{useQuery as Sr}from"@tanstack/react-query";import{tokenStorage as ie}from"@phygitallabs/authentication";function _e(){let{refreshToken:e,signOut:s}=T(),o=async()=>{try{if(!ie.isTokenExpired())return;let t=await e();t.data?.idToken&&t.data?.refreshToken&&ie.setTokens({idToken:t.data?.idToken,refreshToken:t.data?.refreshToken})}catch(r){console.error("Failed to refresh token:",r),s()}};Sr({queryKey:["refresh-token"],queryFn:()=>o(),refetchInterval:1800*1e3,refetchIntervalInBackground:!1,refetchOnWindowFocus:!0,retry:!1,enabled:!!ie.getAuthToken()})}import{jsx as xe,jsxs as Gr}from"react/jsx-runtime";var Dr=()=>{let{updateHeaders:e}=_r(),{updateHeaders:s,coreApi:o}=Lr(),{updateHeaders:r}=Mr(),{updateHeaders:t}=Or(),{updateHeaders:n}=br();return xr(()=>{m.getState().actions.initialize();let i=B.getAuthToken();if(i){e({Authorization:`Bearer ${i}`}),s({Authorization:`Bearer ${i}`}),r({Authorization:`Bearer ${i}`}),t({Authorization:`Bearer ${i}`}),n({Authorization:`Bearer ${i}`});let{user:f}=m.getState();f&&f.accessToken!==i&&m.getState().actions.setUser({...f,accessToken:i})}let a=m.getState().isSignedIn,c=m.subscribe(f=>[f.isSignedIn,f.user],async([f])=>{if(f!==a)if(a=f,f){let l=B.getAuthToken();if(l){e({Authorization:`Bearer ${l}`}),s({Authorization:`Bearer ${l}`}),r({Authorization:`Bearer ${l}`}),t({Authorization:`Bearer ${l}`}),n({Authorization:`Bearer ${l}`});try{let P=await Ur(o).getMyProfile(),w=Ee(P,l);m.getState().actions.setUser(w)}catch{m.getState().actions.signOut()}}let{eventCallbacks:p,user:h}=m.getState();p?.onAuthStateChange?.(h,!0)}else{e({}),s({}),r({Authorization:""}),t({Authorization:""}),n({Authorization:""});let{eventCallbacks:l}=m.getState();l?.onAuthStateChange?.(null,!1)}}),k=B.addTokenChangeListener(async()=>{let{isSignedIn:f,user:l}=m.getState();if(f){let p=B.getAuthToken();p?(e({Authorization:`Bearer ${p}`}),s({Authorization:`Bearer ${p}`}),r({Authorization:`Bearer ${p}`}),t({Authorization:`Bearer ${p}`}),n({Authorization:`Bearer ${p}`}),l&&l.accessToken!==p&&m.getState().actions.setUser({...l,accessToken:p})):(m.getState().actions.signOut(),e({}),s({}),r({Authorization:""}),t({Authorization:""}),n({Authorization:""}))}});return()=>{c(),k()}},[e,s,r,t,n,o]),null},Nr=()=>(_e(),null),z=({children:e,baseURL:s,queryClient:o})=>Gr(Er,{axiosConfig:{headers:{"Content-Type":"application/json"}},baseURL:s,queryClient:o,children:[xe(Dr,{}),xe(Nr,{}),e]});import{useRef as W,useCallback as K,useEffect as Ue}from"react";import{tokenStorage as Fr}from"@phygitallabs/authentication";function ae(e={}){let{onSuccess:s,onError:o,onPopupBlocked:r,onPopupClosed:t}=e,{signInWithGoogle:n,refreshToken:i,setIsSignedIn:a,setIsLoading:c,isLoading:k}=T(),f=W(null),l=W(!1),p=W(null),h=W(null),D=K(async A=>{if(A)try{let v=await i(A);v.data?.idToken&&v.data?.refreshToken&&(Fr.setTokens({idToken:v.data.idToken,refreshToken:v.data.refreshToken}),a(!0),c(!1),s?.())}catch(v){let R=v instanceof Error?v.message:"Token refresh failed";h.current=R,o?.(R),c(!1)}},[i,a,c,s,o]),P=K(()=>{p.current&&(clearInterval(p.current),p.current=null),l.current=!1},[]),w=K(A=>{let v=se.concat(window?.location?.origin);if(A.origin!=="*"&&!v.includes(A.origin)){console.warn("Rejected message from untrusted origin:",A.origin);return}if(!A.data||typeof A.data!="object"){console.warn("Invalid message data received");return}if(A.data.type==="LOGIN_SUCCESS"){let{refreshToken:R}=A.data;R&&D(R),l.current=!0,P()}else if(A.data.type==="LOGIN_ERROR"){let R=A.data.error||"Login failed";h.current=R,o?.(R),c(!1),l.current=!0,P()}},[D,c,P,o]),Ke=K(async()=>{let R=window.screenX+(window.outerWidth-500)/2,$e=window.screenY+(window.outerHeight-600)/2;try{h.current=null,c(!0);let N=await n();if(f.current=window.open(`${N.statusMessage}`,"oauthPopup",`width=500,height=600,left=${R},top=${$e},resizable,scrollbars`),!f.current){c(!1);let C="Popup blocked. Please allow popups for this site.";h.current=C,r?.(),o?.(C);return}p.current=setInterval(()=>{if(f.current&&f.current.closed&&(p.current&&(clearInterval(p.current),p.current=null),!l.current)){let C="Authentication popup was closed";h.current=C,t?.(),o?.(C),c(!1)}},500)}catch(N){let C=N instanceof Error?N.message:"Google sign in failed";h.current=C,o?.(C),c(!1)}},[n,c,w,o,r,t]);return Ue(()=>(window.addEventListener("message",w),()=>{window.removeEventListener("message",w)}),[w]),Ue(()=>()=>{P()},[P,w]),{signIn:Ke,isLoading:k,error:h.current}}import{v4 as Br}from"uuid";var Le=async()=>{try{return await zr()}catch(e){return console.error("Error generating device fingerprint:",e),Br()}},zr=async()=>{let e=new Date().toISOString(),s=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,Intl.DateTimeFormat().resolvedOptions().timeZone,navigator.platform,navigator.hardwareConcurrency,e].join("::"),r=new TextEncoder().encode(s),t=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(t)).map(a=>a.toString(16).padStart(2,"0")).join("")};var ce=()=>typeof window>"u"?null:localStorage.getItem(U),Me=e=>{typeof window>"u"||localStorage.setItem(U,e)},Wr=()=>{typeof window>"u"||localStorage.removeItem(U)},de=async()=>{let e=ce();return e||(e=await Le(),Me(e)),e},Kr=()=>typeof window>"u"?null:localStorage.getItem(L),ue=e=>{typeof window>"u"||localStorage.setItem(L,e)},$r=()=>{typeof window>"u"||localStorage.removeItem(L)},Vr=()=>typeof window>"u"?null:localStorage.getItem(F),qr=e=>{typeof window>"u"||localStorage.setItem(F,e)},Hr=()=>typeof window>"u"?null:localStorage.getItem(_),Zr=e=>{typeof window>"u"||localStorage.setItem(_,e)},jr=()=>{typeof window>"u"||localStorage.removeItem(_)},Qr=()=>typeof window>"u"?null:localStorage.getItem(x),Yr=e=>{typeof window>"u"||localStorage.setItem(x,e)},Jr=()=>{typeof window>"u"||localStorage.removeItem(x)},Xr=()=>{if(typeof window>"u")return null;let e=localStorage.getItem(E);if(!e)return null;try{return JSON.parse(e)}catch(s){return console.error("Failed to parse stored user data:",s),null}},eo=e=>{typeof window>"u"||localStorage.setItem(E,JSON.stringify(e))},ro=()=>{typeof window>"u"||localStorage.removeItem(E)};import{useMyProfile as oo,useUpdateMyProfile as to,useSyncCheckin as no,useCancelUserRewardsRequest as so}from"@phygitallabs/api-core";import{UserSourceType as io}from"@phygitallabs/api-core";import{useEffect as Oe}from"react";import{useChipScanStory as be}from"@phygitallabs/api-core";import{usePGLCoreService as De}from"@phygitallabs/api-core";function ao({token:e,id:s,onScanChipError:o}){let{updateHeaders:r}=De();Oe(()=>{if(e){let c={"Chip-Authorization":e};ue(e),r(c)}},[e,r]);let{data:t,isLoading:n,isError:i,isSuccess:a}=be({token:e,id:s});return Oe(()=>{i&&o?.()},[i,o]),t?{data:{externalUrl:t?.external_url,campaignDetail:t?.project,locationDetail:t?.location,scanCounter:t?.scan_counter,campaignId:t?.campaign_id,chipModelId:t?.chip_model_id,organizationId:t?.organization_id,projectId:t?.project_id,locationId:t?.location_id,chipUid:t?.uid},isLoading:n,isError:i,isSuccess:a}:{data:null,isLoading:n,isError:i,isSuccess:a}}import{useOneCampaign as le,useUserCampaignAction as pe,useOneUserCampaign as me}from"@phygitallabs/api-core";import{CampaignState as co}from"@phygitallabs/api-core";var Ne=(t=>(t.CHECK_IN="check_in",t.CREATE_MEMORY="create_memory",t.FILL_FORM="fill_form",t.SHARE="share",t))(Ne||{});import{useManyLocations as fe,useOneLocation as ge,useUserCampaignsCompletedLocation as he,useManyUserActionLocations as Ae,locationQueryKeys as ve}from"@phygitallabs/api-core";var Ge=e=>[...e].sort((s,o)=>(s.index??0)-(o.index??0)),Fe=(e,s,o)=>e.filter(r=>r[s]===o);import{useGenerateThaocamvienCertificate as uo,useGenerateTemplateCertificate as lo,useGenerateFansipanCertificate as po,useCreateCertificate as mo,useCreateCertificateAnonymous as fo,useCreateCertificateWithMask as go}from"@phygitallabs/generate-certificate";import{wrapTextWithFont as ho}from"@phygitallabs/generate-certificate";import V from"posthog-js";import{createContext as Ao,useEffect as vo,useReducer as Ro}from"react";import{v4 as yo}from"uuid";var Be=()=>typeof window<"u";import{jsx as wo}from"react/jsx-runtime";var $=Ao(null);function Co(){return yo()}async function Io(e){try{let s=(await import("@openreplay/tracker")).default,o=e?.userIdEnabled&&e?.getUserId?e.getUserId:Co,r={projectKey:e?.projectKey||process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY,ingestPoint:e?.ingestPoint,captureExceptions:e.captureExceptions??!0,capturePerformance:e.capturePerformance??!0,network:e.network||{capturePayload:!0,sanitizer:n=>n},console:e.console||{levels:["error","warn","log"]},obscureTextEmails:e.obscureTextEmails??!0,obscureTextNumbers:e.obscureTextNumbers??!1,obscureInputEmails:e.obscureInputEmails??!0,__DISABLE_SECURE_MODE:e.__DISABLE_SECURE_MODE??(typeof process<"u"&&process.env?.NODE_ENV==="development")},t=new s(r);if(e?.userIdEnabled){let n=o();t.setUserID(n),console.log("User ID set:",n)}return console.log("OpenReplay tracker initialized"),console.log("Project Key:",r.projectKey),console.log("Ingest Point:",r.ingestPoint),t}catch(s){throw console.error("Failed to create tracker:",s),s}}function Po(e,s){let{debug:o=!1}=e.config;switch(s.type){case"init":return!e.tracker&&Be()?!e.config.projectKey&&!process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY?(console.warn(o,"Project key not found. Skipping session replay initialization."),e):{...e,tracker:Io(e.config)}:e;case"start":return e.tracker?Promise.resolve(e.tracker).then(r=>{r.start(),console.log(o,"Session replay tracker started")}).catch(r=>{console.error("Failed to start tracker:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;case"setUserId":return e.tracker?Promise.resolve(e.tracker).then(r=>{r.setUserID(s.payload),console.log(o,"User ID updated:",s.payload)}).catch(r=>{console.error("Failed to set user ID:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;case"setMetadata":return e.tracker?Promise.resolve(e.tracker).then(r=>{Object.entries(s.payload||{})?.forEach(([t,n])=>{r.setMetadata(t,n)}),console.log(o,"Metadata updated:",s.payload.metadata)}).catch(r=>{console.error("Failed to set metadata:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;default:return e}}var Re=({children:e,config:s={}})=>{let[,o]=Ro(Po,{tracker:null,config:s}),r=()=>o({type:"init"}),t=()=>o({type:"start"}),n=a=>o({type:"setUserId",payload:a}),i=a=>o({type:"setMetadata",payload:a});return vo(()=>{r(),t()},[]),wo($.Provider,{value:{initTracker:r,startTracking:t,setUserId:n,setMetadata:i},children:e})};import{useContext as ko}from"react";function ye(){let e=ko($);if(!e)throw new Error("useSessionReplay must be used within a SessionReplayProvider. Make sure your component is wrapped with <SessionReplayProvider>.");return e}var To=(e,s)=>{try{window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:e,...s})}catch(o){console.error(o)}},So=(e,s)=>{if(typeof gtag!="function"){console.error("gtag is not a function");return}gtag("event",e,s)},Eo=(e,s)=>{V.capture(e,s)};function _o(){let{setUserId:e,setMetadata:s}=ye();return{trackEvent:(n,i,a)=>{a=a||["gtm"],a.includes("gtm")&&typeof window<"u"&&To(n,i),a.includes("ga")&&typeof gtag=="function"&&So(n,i),a.includes("posthog")&&typeof V=="function"&&Eo(n,i)},trackUserIdentify:n=>{V.identify(n.email,{email:n.email,name:n.name,avatar:n.avatar,uid:n.uid}),e(n.id),s({user_email:n.email})},trackLogoutEvent:()=>{V.capture("user_signed_out")}}}import{useMemo as No}from"react";import{useEffect as xo,useState as Uo}from"react";import{PGLCoreServiceProvider as Lo}from"@phygitallabs/api-core";import{RewardServiceProvider as Mo}from"@phygitallabs/reward";import{AchievementServiceProvider as Oo}from"@phygitallabs/achievement";import{GenerateCertificateServiceProvider as bo}from"@phygitallabs/generate-certificate";import{Fragment as Do,jsx as b}from"react/jsx-runtime";var ze=({children:e,queryClient:s,apiConfig:o={environment:"dev",version:"v1"}})=>{let{environment:r,version:t}=o,[n,i]=Uo(null);return xo(()=>{(async()=>{try{let c=await de();i({queryClient:s,axiosConfig:{headers:{"Content-Type":"application/json","Device-UID":c}},responseInterceptors:{onFulfilled:h=>h,onRejected:async h=>Promise.reject(h)},requestInterceptors:{onFulfilled:h=>h,onRejected:h=>Promise.reject(h)},useDevTool:!0})}catch(c){console.error(c)}})()},[s]),n?b(Lo,{...n,baseURL:`${y[r].API_BASE_URL}/${t}`,baseCoreURL:`${y[r].API_BASE_CORE_URL}/${t}`,children:b(Mo,{...n,baseURL:`${y[r].API_REWARD_URL}/v1`,children:b(Oo,{...n,baseURL:`${y[r].API_ACHIEVEMENT_URL}/${t}`,children:b(bo,{...n,baseURL:`${y[r].API_GENERATE_CERTIFICATE_URL}/v1`,children:e})})})}):b(Do,{})};import{jsx as Ce}from"react/jsx-runtime";var Go=({children:e,queryClient:s,apiConfig:o})=>{let{environment:r}=o,t=No(()=>{let n=process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY;if(n)return{projectKey:n,ingestPoint:process.env.NEXT_PUBLIC_OPENREPLAY_INGEST_POINT,debug:process.env.NODE_ENV==="development",captureExceptions:!0,capturePerformance:!0,obscureTextEmails:!0,obscureInputEmails:!0}},[]);return Ce(Re,{config:t,children:Ce(ze,{queryClient:s,apiConfig:o,children:Ce(z,{baseURL:`${y[r].API_BASE_URL}`,queryClient:s,children:e})})})};import{useManyAchievements as Fo}from"@phygitallabs/achievement";import{useCreateModelGroupReward as Bo}from"@phygitallabs/reward";import{useEffect as zo,useMemo as We}from"react";function Wo(e,s){if(!s?.reward_models)return[];let o=s.reward_models;return e.map((r,t)=>{let n=o[t]?.[0]||null,i=r.subAchievementIds?.map((a,c)=>{let k=o[t*(r.subAchievementIds?.length||0)+c+1]?.[0]||null;return{id:a,reward_model:k}})||[];return{id:r.id,name:r.name,reward_model:n,subAchievements:i}})}var Ko=({campaignId:e})=>{let{data:s,isLoading:o}=Fo({"filter.labels":{campaign_id:e},"filter.type":"group_mission","pagination.limit":200},{enabled:!!e}),r=We(()=>s?.data?s.data.map(c=>c.groupRewardId).filter(c=>c!==void 0):[],[s?.data]),{mutate:t,data:n,isPending:i}=Bo();return zo(()=>{r.length>0&&t({group_reward_ids:r})},[r,t]),{mappedAchievements:We(()=>!n?.data||!s?.data?[]:Wo(s.data,n.data),[n,s?.data]),isLoading:o||i}},Ie=Ko;import{useSendEmail as $o}from"@phygitallabs/api-core";import{cn as Vo,parse as qo,fileToBase64 as Ho}from"@phygitallabs/helpers";export{se as ALLOWED_ORIGINS,sr as AchievementRuleActionType,ir as AchievementServiceProvider,Te as AchievementType,z as AuthProvider,ne as CALLBACK_URL,co as CampaignState,ar as CmentityRewardType,te as NotificationProvider,Se as RewardClaimStatus,Go as TapquestCoreProvider,Ne as TaskType,io as UserSourceType,_ as accessTokenKey,de as checkDeviceUid,L as chipAuthTokenKey,Vo as cn,S as convertSnakeToCamel,U as deviceUIDKey,Ho as fileToBase64,Fe as filterLocationsByProperty,Le as generateDeviceId,Hr as getAccessToken,je as getActionsFromAchievementRule,Kr as getChipAuthToken,ce as getDeviceUid,Ze as getLocationIdsFromAchievementRule,Qr as getRefreshToken,Vr as getRetryAttemptsRefreshToken,Xr as getUserInfo,vr as httpMaxRetries,G as isAchievementCompleted,ve as locationQueryKeys,Ar as memoriesKey,qo as parse,x as refreshTokenKey,jr as removeAccessToken,$r as removeChipAuthToken,Wr as removeDeviceUid,Jr as removeRefreshToken,ro as removeUserInfo,hr as resetMemoriesQuery,F as retryAttemptsRefreshToken,Zr as setAccessToken,ue as setChipAuthToken,Me as setDeviceUid,Yr as setRefreshToken,qr as setRetryAttemptsRefreshToken,eo as setUserInfo,Ge as sortLocationsByIndex,Je as useAchievementProgress,Ie as useAchivementPlusRewardModel,T as useAuth,le as useCampaignDetail,so as useCancelUserRewardsRequest,be as useChipScanStory,Z as useClaimUserReward,re as useClearUserRewardCache,mo as useCreateCertificate,fo as useCreateCertificateAnonymous,go as useCreateCertificateWithMask,fr as useCreateMemory,ee as useCreateModelGroupReward,Y as useCreateRewardModel,_o as useDataTracking,X as useDeleteRewardModel,po as useGenerateFansipanCertificate,lo as useGenerateTemplateCertificate,uo as useGenerateThaocamvienCertificate,Q as useGetRewardModel,H as useGetUserRewards,ae as useGoogleLogin,mr as useInfiniteMemories,j as useListRewardModels,ge as useLocationDetail,he as useLocationProgress,fe as useLocationsList,nr as useManyAchievementProgress,Xe as useManyAchievements,tr as useManyAchievementsRewardModels,rr as useManyChildrenAchievements,pr as useManyMemory,Ae as useManyUserActionLocations,q as useManyUserRewards,oo as useMyProfile,or as useOneAchievement,lr as useOneMemory,me as useOneUserCampaign,De as usePGLCoreService,ao as useScanChip,$o as useSendEmail,no as useSyncCheckin,to as useUpdateMyProfile,J as useUpdateRewardModel,gr as useUploadMedia,er as useUserAchievementAction,pe as useUserCampaignAction,oe as useV1ListRewards,E as userInfoKey,ho as wrapTextWithFont};
1
+ var be=Object.defineProperty;var qr=Object.getOwnPropertyDescriptor;var Hr=Object.getOwnPropertyNames;var Zr=Object.prototype.hasOwnProperty;var ye=(e,s)=>{for(var o in s)be(e,o,{get:s[o],enumerable:!0})},Oe=(e,s,o,r)=>{if(s&&typeof s=="object"||typeof s=="function")for(let t of Hr(s))!Zr.call(e,t)&&t!==o&&be(e,t,{get:()=>s[t],enumerable:!(r=qr(s,t))||r.enumerable});return e},d=(e,s,o)=>(Oe(e,s,"default"),o&&Oe(o,s,"default"));var Re={};ye(Re,{ALLOWED_ORIGINS:()=>ee,AchievementRuleActionType:()=>Ve,AchievementServiceProvider:()=>qe,AchievementType:()=>Ce,AuthProvider:()=>N,CALLBACK_URL:()=>X,CampaignState:()=>Sr,CmentityRewardType:()=>He,NotificationProvider:()=>J,RewardClaimStatus:()=>Ie,TapquestCoreProvider:()=>Gr,TaskType:()=>Ee,UserSourceType:()=>wr,accessTokenKey:()=>x,checkDeviceUid:()=>ie,chipAuthTokenKey:()=>L,cn:()=>zr,convertSnakeToCamel:()=>S,deviceUIDKey:()=>U,fileToBase64:()=>Kr,filterLocationsByProperty:()=>_e,generateDeviceId:()=>we,getAccessToken:()=>lr,getActionsFromAchievementRule:()=>Ne,getChipAuthToken:()=>ar,getDeviceUid:()=>se,getLocationIdsFromAchievementRule:()=>De,getRefreshToken:()=>fr,getRetryAttemptsRefreshToken:()=>dr,getUserInfo:()=>Ar,httpMaxRetries:()=>rr,isAchievementCompleted:()=>M,locationQueryKeys:()=>ge,memoriesKey:()=>er,parse:()=>Wr,refreshTokenKey:()=>_,removeAccessToken:()=>mr,removeChipAuthToken:()=>cr,removeDeviceUid:()=>ir,removeRefreshToken:()=>hr,removeUserInfo:()=>Rr,resetMemoriesQuery:()=>Xe,retryAttemptsRefreshToken:()=>O,setAccessToken:()=>pr,setChipAuthToken:()=>ae,setDeviceUid:()=>ke,setRefreshToken:()=>gr,setRetryAttemptsRefreshToken:()=>ur,setUserInfo:()=>vr,sortLocationsByIndex:()=>xe,useAchievementProgress:()=>Ge,useAchivementPlusRewardModel:()=>ve,useAuth:()=>k,useCampaignDetail:()=>ce,useCancelUserRewardsRequest:()=>Pr,useChipScanStory:()=>Te,useClaimUserReward:()=>K,useClearUserRewardCache:()=>Q,useCreateCertificate:()=>Ur,useCreateCertificateAnonymous:()=>Lr,useCreateCertificateWithMask:()=>Mr,useCreateMemory:()=>Ye,useCreateModelGroupReward:()=>j,useCreateRewardModel:()=>q,useDataTracking:()=>Dr,useDeleteRewardModel:()=>Z,useGenerateFansipanCertificate:()=>_r,useGenerateTemplateCertificate:()=>xr,useGenerateThaocamvienCertificate:()=>Er,useGetRewardModel:()=>V,useGetUserRewards:()=>W,useGoogleLogin:()=>ne,useInfiniteMemories:()=>Qe,useListRewardModels:()=>$,useLocationDetail:()=>pe,useLocationProgress:()=>me,useLocationsList:()=>le,useManyAchievementProgress:()=>$e,useManyAchievements:()=>Fe,useManyAchievementsRewardModels:()=>Ke,useManyChildrenAchievements:()=>ze,useManyMemory:()=>je,useManyUserActionLocations:()=>fe,useManyUserRewards:()=>z,useMyProfile:()=>yr,useOneAchievement:()=>We,useOneMemory:()=>Ze,useOneUserCampaign:()=>ue,usePGLCoreService:()=>Se,useScanChip:()=>Tr,useSendEmail:()=>Br,useSyncCheckin:()=>Ir,useUpdateMyProfile:()=>Cr,useUpdateRewardModel:()=>H,useUploadMedia:()=>Je,useUserAchievementAction:()=>Be,useUserCampaignAction:()=>de,useV1ListRewards:()=>Y,userInfoKey:()=>E,wrapTextWithFont:()=>Or});var l={};ye(l,{ALLOWED_ORIGINS:()=>ee,AchievementRuleActionType:()=>Ve,AchievementServiceProvider:()=>qe,AchievementType:()=>Ce,AuthProvider:()=>N,CALLBACK_URL:()=>X,CampaignState:()=>Sr,CmentityRewardType:()=>He,NotificationProvider:()=>J,RewardClaimStatus:()=>Ie,TapquestCoreProvider:()=>Gr,TaskType:()=>Ee,UserSourceType:()=>wr,accessTokenKey:()=>x,checkDeviceUid:()=>ie,chipAuthTokenKey:()=>L,cn:()=>zr,convertSnakeToCamel:()=>S,deviceUIDKey:()=>U,fileToBase64:()=>Kr,filterLocationsByProperty:()=>_e,generateDeviceId:()=>we,getAccessToken:()=>lr,getActionsFromAchievementRule:()=>Ne,getChipAuthToken:()=>ar,getDeviceUid:()=>se,getLocationIdsFromAchievementRule:()=>De,getRefreshToken:()=>fr,getRetryAttemptsRefreshToken:()=>dr,getUserInfo:()=>Ar,httpMaxRetries:()=>rr,isAchievementCompleted:()=>M,locationQueryKeys:()=>ge,memoriesKey:()=>er,parse:()=>Wr,refreshTokenKey:()=>_,removeAccessToken:()=>mr,removeChipAuthToken:()=>cr,removeDeviceUid:()=>ir,removeRefreshToken:()=>hr,removeUserInfo:()=>Rr,resetMemoriesQuery:()=>Xe,retryAttemptsRefreshToken:()=>O,setAccessToken:()=>pr,setChipAuthToken:()=>ae,setDeviceUid:()=>ke,setRefreshToken:()=>gr,setRetryAttemptsRefreshToken:()=>ur,setUserInfo:()=>vr,sortLocationsByIndex:()=>xe,useAchievementProgress:()=>Ge,useAchivementPlusRewardModel:()=>ve,useAuth:()=>k,useCampaignDetail:()=>ce,useCancelUserRewardsRequest:()=>Pr,useChipScanStory:()=>Te,useClaimUserReward:()=>K,useClearUserRewardCache:()=>Q,useCreateCertificate:()=>Ur,useCreateCertificateAnonymous:()=>Lr,useCreateCertificateWithMask:()=>Mr,useCreateMemory:()=>Ye,useCreateModelGroupReward:()=>j,useCreateRewardModel:()=>q,useDataTracking:()=>Dr,useDeleteRewardModel:()=>Z,useGenerateFansipanCertificate:()=>_r,useGenerateTemplateCertificate:()=>xr,useGenerateThaocamvienCertificate:()=>Er,useGetRewardModel:()=>V,useGetUserRewards:()=>W,useGoogleLogin:()=>ne,useInfiniteMemories:()=>Qe,useListRewardModels:()=>$,useLocationDetail:()=>pe,useLocationProgress:()=>me,useLocationsList:()=>le,useManyAchievementProgress:()=>$e,useManyAchievements:()=>Fe,useManyAchievementsRewardModels:()=>Ke,useManyChildrenAchievements:()=>ze,useManyMemory:()=>je,useManyUserActionLocations:()=>fe,useManyUserRewards:()=>z,useMyProfile:()=>yr,useOneAchievement:()=>We,useOneMemory:()=>Ze,useOneUserCampaign:()=>ue,usePGLCoreService:()=>Se,useScanChip:()=>Tr,useSendEmail:()=>Br,useSyncCheckin:()=>Ir,useUpdateMyProfile:()=>Cr,useUpdateRewardModel:()=>H,useUploadMedia:()=>Je,useUserAchievementAction:()=>Be,useUserCampaignAction:()=>de,useV1ListRewards:()=>Y,userInfoKey:()=>E,wrapTextWithFont:()=>Or});import{useManyAchievementProgress as jr}from"@phygitallabs/achievement";import{useManyAchievementProgressByDevice as Qr}from"@phygitallabs/api-core";import{useAchievementProgress as Ge,useManyAchievements as Fe,useUserAchievementAction as Be,useManyChildrenAchievements as ze,useOneAchievement as We,useManyAchievementsRewardModels as Ke}from"@phygitallabs/achievement";var De=e=>{if(!e.rule)return[];let s=[];return Object.values(e.rule).forEach(o=>{o.rules&&o.rules.forEach(r=>{r.filter&&Object.values(r.filter).forEach(t=>{t.filters&&t.filters.forEach(n=>{n.label==="location_id"&&n.value&&(Array.isArray(n.value)?s.push(...n.value):s.push(n.value))})})})}),Array.from(new Set(s))},Ne=e=>{if(!e.rule)return[];let s=[];return Object.values(e.rule).forEach(o=>{o.rules&&o.rules.forEach(r=>{r.action&&s.push(r.action)})}),Array.from(new Set(s))},M=e=>e.isCompleted||e.overallPercentage===100;function S(e){if(e==null)return e;if(Array.isArray(e))return e.map(s=>S(s));if(typeof e=="object"&&e.constructor===Object){let s={};for(let o in e)if(e.hasOwnProperty(o)){let r=o.replace(/_([a-z])/g,(t,n)=>n.toUpperCase());s[r]=S(e[o])}return s}return e}var $e=(e,s)=>{let o=!!e.userId,r=o?{achievementIds:e.achievementIds,userId:e.userId,applicationId:e.applicationId}:{achievement_ids:e.achievementIds,device_uid:e.deviceUid,applicationId:e.applicationId};return o?jr(r,{...s,select:t=>t.map(n=>({...n,isCompleted:M(n)}))}):Qr(r,{...s,select:t=>S(t).map(i=>({...i,isCompleted:M(i)}))})};import{AchievementRuleActionType as Ve,AchievementServiceProvider as qe}from"@phygitallabs/achievement";var Ce=(t=>(t.DEFAULT="default",t.MULTIPLE_CHECK_INS="multiple_check_ins",t.RANDOM_CHECK_INS="random_check_ins",t.GROUP_MISSION="group_mission",t))(Ce||{});import{useManyUserRewards as z,useGetUserRewards as W,useClaimUserReward as K,useListRewardModels as $,useGetRewardModel as V,useCreateRewardModel as q,useUpdateRewardModel as H,useDeleteRewardModel as Z,useCreateModelGroupReward as j,useClearUserRewardCache as Q,useV1ListRewards as Y}from"@phygitallabs/reward";import{CmentityRewardType as He}from"@phygitallabs/reward";var Ie=(t=>(t.NOT_CLAIMED="not_claimed",t.CLAIMED="claimed",t.IN_PROGRESS="in_progress",t.FAILED="failed",t))(Ie||{});var u={};ye(u,{NotificationProvider:()=>J});d(u,Tt);import*as Tt from"@phygitallabs/notification-api";import{NotificationProvider as Jr}from"@phygitallabs/notification-api";var Yr={dev:{API_BASE_URL:"https://backend-dev.nomion.io",API_BASE_CORE_URL:"https://backend-dev.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend-dev.nomion.io/achievement",API_REWARD_URL:"https://backend-dev.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc-dev.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend-dev.nomion.io/notification-ws/ws"},staging:{API_BASE_URL:"https://backend-staging.nomion.io",API_BASE_CORE_URL:"https://backend-staging.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend-staging.nomion.io/achievement",API_REWARD_URL:"https://backend-staging.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc-staging.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend-staging.nomion.io/notification-ws/ws"},production:{API_BASE_URL:"https://backend.nomion.io",API_BASE_CORE_URL:"https://backend.nomion.io/core",API_ACHIEVEMENT_URL:"https://backend.nomion.io/achievement",API_REWARD_URL:"https://backend.nomion.io/reward",API_GENERATE_CERTIFICATE_URL:"https://media-prc.nomion.io/api",API_NOTIFICATION_SOCKET_URL:"https://backend.nomion.io/notification-ws/ws"}},y=Yr;import{jsx as Xr}from"react/jsx-runtime";var J=({children:e,autoConnect:s=!0,environment:o="dev",user:r,onWebSocketOpen:t,onWebSocketClose:n,onWebSocketMessage:i})=>{let a=y[o]?.API_NOTIFICATION_SOCKET_URL;return Xr(Jr,{userUid:r?.id,accessToken:r?.accessToken??null,webSocketUrl:a,autoConnect:s,onWebSocketOpen:t,onWebSocketClose:n,onWebSocketMessage:i,children:e})};d(l,u);import{useOneMemory as Ze,useManyMemory as je,useInfiniteMemories as Qe,useCreateMemory as Ye,useUploadMedia as Je,resetMemoriesQuery as Xe,memoriesKey as er}from"@phygitallabs/api-core";import{AuthenticationProvider as uo,useAuthenticationHeaders as lo,tokenStorage as re}from"@phygitallabs/authentication";import{useEffect as po}from"react";import{create as eo}from"zustand";import{immer as ro}from"zustand/middleware/immer";import{createJSONStorage as oo,devtools as to,persist as no,subscribeWithSelector as so}from"zustand/middleware";import{authService as b,verifyCodeService as D,tokenStorage as I}from"@phygitallabs/authentication";var E="phygital-user-info",x="accessToken",_="refreshToken",rr=3,O="retryAttemptsRefreshToken",U="Device-UID",L="chip-auth-token",X="https://s3-sgn10.fptcloud.com/nomion-assets/platform/callback.html",ee=["https://s3-sgn10.fptcloud.com","https://accounts.google.com/"];var io={user:null,isSignedIn:!1,isInitialized:!1,isLoading:!1,error:null,cleanupFunctions:{},eventCallbacks:{}},f=eo()(to(no(so(ro((e,s)=>({...io,actions:{setIsLoading:o=>e(r=>{r.isLoading=o}),setCleanupFunctions:o=>e(r=>{r.cleanupFunctions={...r.cleanupFunctions,...o}}),addEventCallbacks:o=>(e(r=>{r.eventCallbacks={...r.eventCallbacks,...o}}),()=>{e(r=>{r.eventCallbacks={...r.eventCallbacks,...o}})}),signInWithEmail:async(o,r)=>{let{eventCallbacks:t}=s();e(n=>{n.isLoading=!0,n.error=null});try{let n=await b.signIn({email:o,password:r});return n?.data?.idToken&&n?.data?.refreshToken&&(I.setTokens({idToken:n.data.idToken,refreshToken:n.data.refreshToken}),e(i=>{i.isSignedIn=!0}),t.onLoginSuccess?.(n.data.idToken)),n}catch(n){if(n?.response?.data?.code===7)return{data:void 0,message:"Email verification required",code:7};let i=n instanceof Error?n.message:"Login failed";throw e(a=>{a.error=i}),t.onLoginError?.(new Error(i)),n}finally{e(n=>{n.isLoading=!1})}},signInWithGoogle:async()=>{let{eventCallbacks:o}=s();try{let r=X;return await b.getOAuthSignInUrl(r)}catch(r){let t=r instanceof Error?r.message:"Google sign in failed";throw e(n=>{n.error=t}),o.onLoginError?.(new Error(t)),r}},signUpWithEmail:async(o,r)=>{let{eventCallbacks:t}=s();e(n=>{n.isLoading=!0,n.error=null});try{let n=await b.signUp({email:o,password:r});return n.data&&t.onSignupSuccess?.(),n}catch(n){let i=n instanceof Error?n.message:"Signup failed";throw e(a=>{a.error=i}),t.onSignupError?.(new Error(i)),n}finally{e(n=>{n.isLoading=!1,n.user=null,n.isSignedIn=!1})}},signOut:async()=>{let{eventCallbacks:o,cleanupFunctions:r}=s();e(t=>{t.isLoading=!0,t.error=null});try{if(e(i=>{i.user=null,i.isSignedIn=!1,i.error=null}),I.isTokenExpired()){I.clearTokens(),localStorage.clear();return}let n=I.getRefreshToken();n&&await b.logout({refreshToken:n}),localStorage.clear(),I.clearTokens();try{r.clearQueryCache?.(),r.clearOrganization?.(),r.clearCustomData?.(),r.clearHeaders?.()}catch(i){console.warn("Error during logout cleanup:",i)}o.onLogoutSuccess?.()}catch(t){console.log(t);let n=t instanceof Error?t.message:"Logout failed";throw e(i=>{i.error=n}),o.onLogoutError?.(new Error(n)),t}finally{e(t=>{t.isLoading=!1})}},sendPasswordResetEmail:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{await D.forgotPassword({email:o})}catch(r){let t=r instanceof Error?r.message:"Failed to send reset email";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},resetPassword:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await D.resetPassword(o)}catch(r){let t=r instanceof Error?r.message:"Failed to reset password";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},changePassword:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await D.changePassword(o)}catch(r){throw r}finally{e(r=>{r.isLoading=!1})}},verifyEmailCode:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await D.verifyEmail(o)}catch(r){let t=r instanceof Error?r.message:"Failed to send reset email";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},sendVerifyCode:async o=>{e(r=>{r.isLoading=!0,r.error=null});try{return await D.sendVerifyCode(o)}catch(r){let t=r instanceof Error?r.message:"Failed to send verify code";throw e(n=>{n.error=t}),r}finally{e(r=>{r.isLoading=!1})}},refreshToken:async o=>await b.refreshToken({refreshToken:o??I.getRefreshToken()??""}),clearError:()=>e(o=>{o.error=null}),setUser:o=>e(r=>{r.user=o}),setIsSignedIn:o=>e(r=>{r.isSignedIn=o}),setIsInitialized:o=>e(r=>{r.isInitialized=o}),patchUser:o=>e(r=>{r.user?r.user={...r.user,...o}:r.user=o}),initialize:()=>{e(o=>{let r=I.getAuthToken();o.isSignedIn=!!r,o.isInitialized=!0})},syncAuthState:()=>{e(o=>{let r=I.getAuthToken(),t=o.isSignedIn;o.isSignedIn=!!r,t!==o.isSignedIn&&(o.isSignedIn?o.eventCallbacks?.onAuthStateChange?.(o.user,!0):o.eventCallbacks?.onAuthStateChange?.(null,!1))})}}}))),{version:1,name:"auth-store",storage:oo(()=>localStorage),partialize:e=>({isSignedIn:e.isSignedIn,user:e.user})}))),k=()=>{let e=f(i=>i.user),s=f(i=>i.isSignedIn),o=f(i=>i.isInitialized),r=f(i=>i.isLoading),t=f(i=>i.error),n=f(i=>i.actions);return{user:e,isSignedIn:s,isInitialized:o,isLoading:r,error:t,...n}};import ao from"jwt-decode";var or=(e,s)=>{let o={...e},r={};try{r=ao(s)}catch(t){console.warn("Failed to decode token in transformUserData:",t)}return o.exp=r.exp||0,o.accessToken=s||"",o.roles=r?.roles||["USER"],o.account_type=r?.account_type||0,o.picture=e.picture||"",o};import{userService as mo}from"@phygitallabs/api-core";import{usePGLCoreService as fo}from"@phygitallabs/api-core";import{useAchievementService as go}from"@phygitallabs/achievement";import{useRewardService as ho}from"@phygitallabs/reward";import{useGenerateCertificateService as Ao}from"@phygitallabs/generate-certificate";import{useQuery as co}from"@tanstack/react-query";import{tokenStorage as Pe}from"@phygitallabs/authentication";function tr(){let{refreshToken:e,signOut:s}=k(),o=async()=>{try{if(!Pe.isTokenExpired())return;let t=await e();t.data?.idToken&&t.data?.refreshToken&&Pe.setTokens({idToken:t.data?.idToken,refreshToken:t.data?.refreshToken})}catch(r){console.error("Failed to refresh token:",r),s()}};co({queryKey:["refresh-token"],queryFn:()=>o(),refetchInterval:1800*1e3,refetchIntervalInBackground:!1,refetchOnWindowFocus:!0,retry:!1,enabled:!!Pe.getAuthToken()})}import{jsx as nr,jsxs as yo}from"react/jsx-runtime";var vo=()=>{let{updateHeaders:e}=lo(),{updateHeaders:s,coreApi:o}=fo(),{updateHeaders:r}=go(),{updateHeaders:t}=ho(),{updateHeaders:n}=Ao();return po(()=>{f.getState().actions.initialize();let i=re.getAuthToken();if(i){e({Authorization:`Bearer ${i}`}),s({Authorization:`Bearer ${i}`}),r({Authorization:`Bearer ${i}`}),t({Authorization:`Bearer ${i}`}),n({Authorization:`Bearer ${i}`});let{user:g}=f.getState();g&&g.accessToken!==i&&f.getState().actions.setUser({...g,accessToken:i})}let a=f.getState().isSignedIn,c=f.subscribe(g=>[g.isSignedIn,g.user],async([g])=>{if(g!==a)if(a=g,g){let p=re.getAuthToken();if(p){e({Authorization:`Bearer ${p}`}),s({Authorization:`Bearer ${p}`}),r({Authorization:`Bearer ${p}`}),t({Authorization:`Bearer ${p}`}),n({Authorization:`Bearer ${p}`});try{let P=await mo(o).getMyProfile(),w=or(P,p);f.getState().actions.setUser(w)}catch{f.getState().actions.signOut()}}let{eventCallbacks:m,user:h}=f.getState();m?.onAuthStateChange?.(h,!0)}else{e({}),s({}),r({Authorization:""}),t({Authorization:""}),n({Authorization:""});let{eventCallbacks:p}=f.getState();p?.onAuthStateChange?.(null,!1)}}),T=re.addTokenChangeListener(async()=>{let{isSignedIn:g,user:p}=f.getState();if(g){let m=re.getAuthToken();m?(e({Authorization:`Bearer ${m}`}),s({Authorization:`Bearer ${m}`}),r({Authorization:`Bearer ${m}`}),t({Authorization:`Bearer ${m}`}),n({Authorization:`Bearer ${m}`}),p&&p.accessToken!==m&&f.getState().actions.setUser({...p,accessToken:m})):(f.getState().actions.signOut(),e({}),s({}),r({Authorization:""}),t({Authorization:""}),n({Authorization:""}))}});return()=>{c(),T()}},[e,s,r,t,n,o]),null},Ro=()=>(tr(),null),N=({children:e,baseURL:s,queryClient:o})=>yo(uo,{axiosConfig:{headers:{"Content-Type":"application/json"}},baseURL:s,queryClient:o,children:[nr(vo,{}),nr(Ro,{}),e]});import{useRef as oe,useCallback as te,useEffect as sr}from"react";import{tokenStorage as Co}from"@phygitallabs/authentication";function ne(e={}){let{onSuccess:s,onError:o,onPopupBlocked:r,onPopupClosed:t}=e,{signInWithGoogle:n,refreshToken:i,setIsSignedIn:a,setIsLoading:c,isLoading:T}=k(),g=oe(null),p=oe(!1),m=oe(null),h=oe(null),F=te(async A=>{if(A)try{let v=await i(A);v.data?.idToken&&v.data?.refreshToken&&(Co.setTokens({idToken:v.data.idToken,refreshToken:v.data.refreshToken}),a(!0),c(!1),s?.())}catch(v){let R=v instanceof Error?v.message:"Token refresh failed";h.current=R,o?.(R),c(!1)}},[i,a,c,s,o]),P=te(()=>{m.current&&(clearInterval(m.current),m.current=null),p.current=!1},[]),w=te(A=>{let v=ee.concat(window?.location?.origin);if(A.origin!=="*"&&!v.includes(A.origin)){console.warn("Rejected message from untrusted origin:",A.origin);return}if(!A.data||typeof A.data!="object"){console.warn("Invalid message data received");return}if(A.data.type==="LOGIN_SUCCESS"){let{refreshToken:R}=A.data;R&&F(R),p.current=!0,P()}else if(A.data.type==="LOGIN_ERROR"){let R=A.data.error||"Login failed";h.current=R,o?.(R),c(!1),p.current=!0,P()}},[F,c,P,o]),$r=te(async()=>{let R=window.screenX+(window.outerWidth-500)/2,Vr=window.screenY+(window.outerHeight-600)/2;try{h.current=null,c(!0);let B=await n();if(g.current=window.open(`${B.statusMessage}`,"oauthPopup",`width=500,height=600,left=${R},top=${Vr},resizable,scrollbars`),!g.current){c(!1);let C="Popup blocked. Please allow popups for this site.";h.current=C,r?.(),o?.(C);return}m.current=setInterval(()=>{if(g.current&&g.current.closed&&(m.current&&(clearInterval(m.current),m.current=null),!p.current)){let C="Authentication popup was closed";h.current=C,t?.(),o?.(C),c(!1)}},500)}catch(B){let C=B instanceof Error?B.message:"Google sign in failed";h.current=C,o?.(C),c(!1)}},[n,c,w,o,r,t]);return sr(()=>(window.addEventListener("message",w),()=>{window.removeEventListener("message",w)}),[w]),sr(()=>()=>{P()},[P,w]),{signIn:$r,isLoading:T,error:h.current}}import{v4 as Io}from"uuid";var we=async()=>{try{return await Po()}catch(e){return console.error("Error generating device fingerprint:",e),Io()}},Po=async()=>{let e=new Date().toISOString(),s=[navigator.userAgent,navigator.language,screen.width,screen.height,screen.colorDepth,Intl.DateTimeFormat().resolvedOptions().timeZone,navigator.platform,navigator.hardwareConcurrency,e].join("::"),r=new TextEncoder().encode(s),t=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(t)).map(a=>a.toString(16).padStart(2,"0")).join("")};var se=()=>typeof window>"u"?null:localStorage.getItem(U),ke=e=>{typeof window>"u"||localStorage.setItem(U,e)},ir=()=>{typeof window>"u"||localStorage.removeItem(U)},ie=async()=>{let e=se();return e||(e=await we(),ke(e)),e},ar=()=>typeof window>"u"?null:localStorage.getItem(L),ae=e=>{typeof window>"u"||localStorage.setItem(L,e)},cr=()=>{typeof window>"u"||localStorage.removeItem(L)},dr=()=>typeof window>"u"?null:localStorage.getItem(O),ur=e=>{typeof window>"u"||localStorage.setItem(O,e)},lr=()=>typeof window>"u"?null:localStorage.getItem(x),pr=e=>{typeof window>"u"||localStorage.setItem(x,e)},mr=()=>{typeof window>"u"||localStorage.removeItem(x)},fr=()=>typeof window>"u"?null:localStorage.getItem(_),gr=e=>{typeof window>"u"||localStorage.setItem(_,e)},hr=()=>{typeof window>"u"||localStorage.removeItem(_)},Ar=()=>{if(typeof window>"u")return null;let e=localStorage.getItem(E);if(!e)return null;try{return JSON.parse(e)}catch(s){return console.error("Failed to parse stored user data:",s),null}},vr=e=>{typeof window>"u"||localStorage.setItem(E,JSON.stringify(e))},Rr=()=>{typeof window>"u"||localStorage.removeItem(E)};import{useMyProfile as yr,useUpdateMyProfile as Cr,useSyncCheckin as Ir,useCancelUserRewardsRequest as Pr}from"@phygitallabs/api-core";import{UserSourceType as wr}from"@phygitallabs/api-core";import{useEffect as kr}from"react";import{useChipScanStory as Te}from"@phygitallabs/api-core";import{usePGLCoreService as Se}from"@phygitallabs/api-core";function Tr({token:e,id:s,onScanChipError:o}){let{updateHeaders:r}=Se();kr(()=>{if(e){let c={"Chip-Authorization":e};ae(e),r(c)}},[e,r]);let{data:t,isLoading:n,isError:i,isSuccess:a}=Te({token:e,id:s});return kr(()=>{i&&o?.()},[i,o]),t?{data:{externalUrl:t?.external_url,campaignDetail:t?.project,locationDetail:t?.location,scanCounter:t?.scan_counter,campaignId:t?.campaign_id,chipModelId:t?.chip_model_id,organizationId:t?.organization_id,projectId:t?.project_id,locationId:t?.location_id,chipUid:t?.uid},isLoading:n,isError:i,isSuccess:a}:{data:null,isLoading:n,isError:i,isSuccess:a}}import{useOneCampaign as ce,useUserCampaignAction as de,useOneUserCampaign as ue}from"@phygitallabs/api-core";import{CampaignState as Sr}from"@phygitallabs/api-core";var Ee=(t=>(t.CHECK_IN="check_in",t.CREATE_MEMORY="create_memory",t.FILL_FORM="fill_form",t.SHARE="share",t))(Ee||{});import{useManyLocations as le,useOneLocation as pe,useUserCampaignsCompletedLocation as me,useManyUserActionLocations as fe,locationQueryKeys as ge}from"@phygitallabs/api-core";var xe=e=>[...e].sort((s,o)=>(s.index??0)-(o.index??0)),_e=(e,s,o)=>e.filter(r=>r[s]===o);import{useGenerateThaocamvienCertificate as Er,useGenerateTemplateCertificate as xr,useGenerateFansipanCertificate as _r,useCreateCertificate as Ur,useCreateCertificateAnonymous as Lr,useCreateCertificateWithMask as Mr}from"@phygitallabs/generate-certificate";import{wrapTextWithFont as Or}from"@phygitallabs/generate-certificate";import Ae from"posthog-js";import{createContext as wo,useEffect as ko,useReducer as To}from"react";import{v4 as So}from"uuid";var br=()=>typeof window<"u";import{jsx as Uo}from"react/jsx-runtime";var he=wo(null);function Eo(){return So()}async function xo(e){try{let s=(await import("@openreplay/tracker")).default,o=e?.userIdEnabled&&e?.getUserId?e.getUserId:Eo,r={projectKey:e?.projectKey||process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY,ingestPoint:e?.ingestPoint,captureExceptions:e.captureExceptions??!0,capturePerformance:e.capturePerformance??!0,network:e.network||{capturePayload:!0,sanitizer:n=>n},console:e.console||{levels:["error","warn","log"]},obscureTextEmails:e.obscureTextEmails??!0,obscureTextNumbers:e.obscureTextNumbers??!1,obscureInputEmails:e.obscureInputEmails??!0,__DISABLE_SECURE_MODE:e.__DISABLE_SECURE_MODE??(typeof process<"u"&&process.env?.NODE_ENV==="development")},t=new s(r);if(e?.userIdEnabled){let n=o();t.setUserID(n),console.log("User ID set:",n)}return console.log("OpenReplay tracker initialized"),console.log("Project Key:",r.projectKey),console.log("Ingest Point:",r.ingestPoint),t}catch(s){throw console.error("Failed to create tracker:",s),s}}function _o(e,s){let{debug:o=!1}=e.config;switch(s.type){case"init":return!e.tracker&&br()?!e.config.projectKey&&!process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY?(console.warn(o,"Project key not found. Skipping session replay initialization."),e):{...e,tracker:xo(e.config)}:e;case"start":return e.tracker?Promise.resolve(e.tracker).then(r=>{r.start(),console.log(o,"Session replay tracker started")}).catch(r=>{console.error("Failed to start tracker:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;case"setUserId":return e.tracker?Promise.resolve(e.tracker).then(r=>{r.setUserID(s.payload),console.log(o,"User ID updated:",s.payload)}).catch(r=>{console.error("Failed to set user ID:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;case"setMetadata":return e.tracker?Promise.resolve(e.tracker).then(r=>{Object.entries(s.payload||{})?.forEach(([t,n])=>{r.setMetadata(t,n)}),console.log(o,"Metadata updated:",s.payload.metadata)}).catch(r=>{console.error("Failed to set metadata:",r)}):console.warn(o,"Tracker not initialized. Call initTracker() first."),e;default:return e}}var Ue=({children:e,config:s={}})=>{let[,o]=To(_o,{tracker:null,config:s}),r=()=>o({type:"init"}),t=()=>o({type:"start"}),n=a=>o({type:"setUserId",payload:a}),i=a=>o({type:"setMetadata",payload:a});return ko(()=>{r(),t()},[]),Uo(he.Provider,{value:{initTracker:r,startTracking:t,setUserId:n,setMetadata:i},children:e})};import{useContext as Lo}from"react";function Le(){let e=Lo(he);if(!e)throw new Error("useSessionReplay must be used within a SessionReplayProvider. Make sure your component is wrapped with <SessionReplayProvider>.");return e}var Mo=(e,s)=>{try{window.dataLayer=window.dataLayer||[],window.dataLayer.push({event:e,...s})}catch(o){console.error(o)}},Oo=(e,s)=>{if(typeof gtag!="function"){console.error("gtag is not a function");return}gtag("event",e,s)},bo=(e,s)=>{Ae.capture(e,s)};function Dr(){let{setUserId:e,setMetadata:s}=Le();return{trackEvent:(n,i,a)=>{a=a||["gtm"],a.includes("gtm")&&typeof window<"u"&&Mo(n,i),a.includes("ga")&&typeof gtag=="function"&&Oo(n,i),a.includes("posthog")&&typeof Ae=="function"&&bo(n,i)},trackUserIdentify:n=>{Ae.identify(n.email,{email:n.email,name:n.name,avatar:n.avatar,uid:n.uid}),e(n.id),s({user_email:n.email})},trackLogoutEvent:()=>{Ae.capture("user_signed_out")}}}import{useMemo as Ko}from"react";import{useEffect as Do,useState as No}from"react";import{PGLCoreServiceProvider as Go}from"@phygitallabs/api-core";import{RewardServiceProvider as Fo}from"@phygitallabs/reward";import{AchievementServiceProvider as Bo}from"@phygitallabs/achievement";import{GenerateCertificateServiceProvider as zo}from"@phygitallabs/generate-certificate";import{Fragment as Wo,jsx as G}from"react/jsx-runtime";var Nr=({children:e,queryClient:s,apiConfig:o={environment:"dev",version:"v1"}})=>{let{environment:r,version:t}=o,[n,i]=No(null);return Do(()=>{(async()=>{try{let c=await ie();i({queryClient:s,axiosConfig:{headers:{"Content-Type":"application/json","Device-UID":c}},responseInterceptors:{onFulfilled:h=>h,onRejected:async h=>Promise.reject(h)},requestInterceptors:{onFulfilled:h=>h,onRejected:h=>Promise.reject(h)},useDevTool:!0})}catch(c){console.error(c)}})()},[s]),n?G(Go,{...n,baseURL:`${y[r].API_BASE_URL}/${t}`,baseCoreURL:`${y[r].API_BASE_CORE_URL}/${t}`,children:G(Fo,{...n,baseURL:`${y[r].API_REWARD_URL}/v1`,children:G(Bo,{...n,baseURL:`${y[r].API_ACHIEVEMENT_URL}/${t}`,children:G(zo,{...n,baseURL:`${y[r].API_GENERATE_CERTIFICATE_URL}/v1`,children:e})})})}):G(Wo,{})};import{jsx as Me}from"react/jsx-runtime";var Gr=({children:e,queryClient:s,apiConfig:o})=>{let{environment:r}=o,t=Ko(()=>{let n=process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY;if(n)return{projectKey:n,ingestPoint:process.env.NEXT_PUBLIC_OPENREPLAY_INGEST_POINT,debug:process.env.NODE_ENV==="development",captureExceptions:!0,capturePerformance:!0,obscureTextEmails:!0,obscureInputEmails:!0}},[]);return Me(Ue,{config:t,children:Me(Nr,{queryClient:s,apiConfig:o,children:Me(N,{baseURL:`${y[r].API_BASE_URL}`,queryClient:s,children:e})})})};import{useManyAchievements as $o}from"@phygitallabs/achievement";import{useCreateModelGroupReward as Vo}from"@phygitallabs/reward";import{useEffect as qo,useMemo as Fr}from"react";function Ho(e,s){if(!s?.reward_models)return[];let o=s.reward_models;return e.map((r,t)=>{let n=o[t]?.[0]||null,i=r.subAchievementIds?.map((a,c)=>{let T=o[t*(r.subAchievementIds?.length||0)+c+1]?.[0]||null;return{id:a,reward_model:T}})||[];return{id:r.id,name:r.name,reward_model:n,subAchievements:i}})}var Zo=({campaignId:e})=>{let{data:s,isLoading:o}=$o({"filter.labels":{campaign_id:e},"filter.type":"group_mission","pagination.limit":200},{enabled:!!e}),r=Fr(()=>s?.data?s.data.map(c=>c.groupRewardId).filter(c=>c!==void 0):[],[s?.data]),{mutate:t,data:n,isPending:i}=Vo();return qo(()=>{r.length>0&&t({group_reward_ids:r})},[r,t]),{mappedAchievements:Fr(()=>!n?.data||!s?.data?[]:Ho(s.data,n.data),[n,s?.data]),isLoading:o||i}},ve=Zo;import{useSendEmail as Br}from"@phygitallabs/api-core";import{cn as zr,parse as Wr,fileToBase64 as Kr}from"@phygitallabs/helpers";d(Re,l);export{ee as ALLOWED_ORIGINS,Ve as AchievementRuleActionType,qe as AchievementServiceProvider,Ce as AchievementType,N as AuthProvider,X as CALLBACK_URL,Sr as CampaignState,He as CmentityRewardType,J as NotificationProvider,Ie as RewardClaimStatus,Gr as TapquestCoreProvider,Ee as TaskType,wr as UserSourceType,x as accessTokenKey,ie as checkDeviceUid,L as chipAuthTokenKey,zr as cn,S as convertSnakeToCamel,U as deviceUIDKey,Kr as fileToBase64,_e as filterLocationsByProperty,we as generateDeviceId,lr as getAccessToken,Ne as getActionsFromAchievementRule,ar as getChipAuthToken,se as getDeviceUid,De as getLocationIdsFromAchievementRule,fr as getRefreshToken,dr as getRetryAttemptsRefreshToken,Ar as getUserInfo,rr as httpMaxRetries,M as isAchievementCompleted,ge as locationQueryKeys,er as memoriesKey,Wr as parse,_ as refreshTokenKey,mr as removeAccessToken,cr as removeChipAuthToken,ir as removeDeviceUid,hr as removeRefreshToken,Rr as removeUserInfo,Xe as resetMemoriesQuery,O as retryAttemptsRefreshToken,pr as setAccessToken,ae as setChipAuthToken,ke as setDeviceUid,gr as setRefreshToken,ur as setRetryAttemptsRefreshToken,vr as setUserInfo,xe as sortLocationsByIndex,Ge as useAchievementProgress,ve as useAchivementPlusRewardModel,k as useAuth,ce as useCampaignDetail,Pr as useCancelUserRewardsRequest,Te as useChipScanStory,K as useClaimUserReward,Q as useClearUserRewardCache,Ur as useCreateCertificate,Lr as useCreateCertificateAnonymous,Mr as useCreateCertificateWithMask,Ye as useCreateMemory,j as useCreateModelGroupReward,q as useCreateRewardModel,Dr as useDataTracking,Z as useDeleteRewardModel,_r as useGenerateFansipanCertificate,xr as useGenerateTemplateCertificate,Er as useGenerateThaocamvienCertificate,V as useGetRewardModel,W as useGetUserRewards,ne as useGoogleLogin,Qe as useInfiniteMemories,$ as useListRewardModels,pe as useLocationDetail,me as useLocationProgress,le as useLocationsList,$e as useManyAchievementProgress,Fe as useManyAchievements,Ke as useManyAchievementsRewardModels,ze as useManyChildrenAchievements,je as useManyMemory,fe as useManyUserActionLocations,z as useManyUserRewards,yr as useMyProfile,We as useOneAchievement,Ze as useOneMemory,ue as useOneUserCampaign,Se as usePGLCoreService,Tr as useScanChip,Br as useSendEmail,Ir as useSyncCheckin,Cr as useUpdateMyProfile,H as useUpdateRewardModel,Je as useUploadMedia,Be as useUserAchievementAction,de as useUserCampaignAction,Y as useV1ListRewards,E as userInfoKey,Or as wrapTextWithFont};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../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/modules/auth/store/authStore.ts","../src/modules/auth/constants/index.ts","../src/modules/auth/utils/user.ts","../src/modules/auth/hooks/useTokenRefresher.ts","../src/modules/auth/hooks/useGoogleLogin.ts","../src/modules/auth/helpers/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/generate-certificate/helpers/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/modules/session-replay/providers/SessionReplayProvider.tsx","../src/modules/session-replay/utils/index.ts","../src/modules/session-replay/hooks/useSessionReplay.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["// 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 useListRewardModels,\n useGetRewardModel,\n useCreateRewardModel,\n useUpdateRewardModel,\n useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward\";","// 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 };\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 ?? null}\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 {\n AuthenticationProvider,\n useAuthenticationHeaders,\n tokenStorage,\n} from \"@phygitallabs/authentication\";\nimport { useEffect } from \"react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { transformProtoUserData } from \"../utils/user\";\nimport { userService } from \"@phygitallabs/api-core\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { useAchievementService } from \"@phygitallabs/achievement\";\nimport { useRewardService } from \"@phygitallabs/reward\";\nimport { useGenerateCertificateService } from \"@phygitallabs/generate-certificate\";\nimport { useTokenRefresher } from \"../hooks/useTokenRefresher\";\n\ninterface AuthProviderProps {\n children: React.ReactNode;\n baseURL: string;\n queryClient: QueryClient;\n}\n\n// Inner component that has access to the authentication context\nconst AuthStateManager = () => {\n const { updateHeaders } = useAuthenticationHeaders();\n\n const { updateHeaders: updateHeadersPGL, coreApi } = usePGLCoreService();\n const { updateHeaders: updateHeadersAchievement } = useAchievementService();\n const { updateHeaders: updateHeadersReward } = useRewardService();\n const { updateHeaders: updateHeadersGenerateCertificate } =\n useGenerateCertificateService();\n\n useEffect(() => {\n // Initialize the auth store to set isSignedIn based on persisted token\n useAuthStore.getState().actions.initialize();\n // Initial setup - set headers if token exists\n const token = tokenStorage.getAuthToken();\n if (token) {\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n // Sync user.accessToken with actual token from localStorage\n const { user } = useAuthStore.getState();\n if (user && user.accessToken !== token) {\n useAuthStore.getState().actions.setUser({\n ...user,\n accessToken: token,\n });\n }\n }\n\n let previousIsSignedIn = useAuthStore.getState().isSignedIn;\n\n const unsub = useAuthStore.subscribe(\n (state: any) => [state.isSignedIn, state.user],\n async ([isSignedIn]: [any]) => {\n // Only run when isSignedIn actually changes\n if (isSignedIn === previousIsSignedIn) {\n return;\n }\n\n previousIsSignedIn = isSignedIn as boolean;\n\n if (isSignedIn) {\n const token = tokenStorage.getAuthToken();\n\n if (token) {\n // Update API headers with the new token\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n try {\n // Fetch user profile when signed in\n const userApi = userService(coreApi);\n const userProfile = await userApi.getMyProfile();\n const transformedUserData = transformProtoUserData(\n userProfile,\n token\n );\n\n useAuthStore.getState().actions.setUser(transformedUserData);\n } catch (error) {\n useAuthStore.getState().actions.signOut();\n }\n }\n\n // Trigger auth state change event\n const { eventCallbacks, user } = useAuthStore.getState();\n eventCallbacks?.onAuthStateChange?.(user, true);\n } else {\n // Clear headers when logged out\n updateHeaders({});\n updateHeadersPGL({});\n updateHeadersAchievement({\n Authorization: ``,\n });\n updateHeadersReward({\n Authorization: ``,\n });\n updateHeadersGenerateCertificate({\n Authorization: ``,\n });\n\n // Trigger auth state change event\n const { eventCallbacks } = useAuthStore.getState();\n eventCallbacks?.onAuthStateChange?.(null, false);\n }\n }\n );\n\n // Listen for token changes (for refresh scenarios)\n const unsubTokenChange = tokenStorage.addTokenChangeListener(async () => {\n const { isSignedIn, user } = useAuthStore.getState();\n if (isSignedIn) {\n const token = tokenStorage.getAuthToken();\n if (token) {\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n // Sync user.accessToken with actual token from localStorage\n if (user && user.accessToken !== token) {\n useAuthStore.getState().actions.setUser({\n ...user,\n accessToken: token,\n });\n }\n } else {\n // Token was cleared, sign out\n useAuthStore.getState().actions.signOut();\n updateHeaders({});\n updateHeadersPGL({});\n updateHeadersAchievement({\n Authorization: ``,\n });\n updateHeadersReward({\n Authorization: ``,\n });\n updateHeadersGenerateCertificate({\n Authorization: ``,\n });\n }\n }\n });\n\n return () => {\n unsub();\n unsubTokenChange();\n };\n }, [\n updateHeaders,\n updateHeadersPGL,\n updateHeadersAchievement,\n updateHeadersReward,\n updateHeadersGenerateCertificate,\n coreApi,\n ]);\n\n return null;\n};\n\nconst TokenRefresher = () => {\n useTokenRefresher();\n return null;\n};\n\nexport const AuthProvider = ({\n children,\n baseURL,\n queryClient,\n}: AuthProviderProps) => {\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n };\n\n return (\n <AuthenticationProvider\n axiosConfig={axiosConfig}\n baseURL={baseURL}\n queryClient={queryClient}\n >\n <AuthStateManager />\n <TokenRefresher />\n {children}\n </AuthenticationProvider>\n );\n};\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport { UserData } from \"../types/user-data\";\nimport {\n createJSONStorage,\n devtools,\n persist,\n subscribeWithSelector,\n} from \"zustand/middleware\";\nimport { AuthEventCallbacks } from \"../types/auth\";\n\nimport {\n authService,\n ProtoSendVerifyCodeResponse,\n ProtoSignInResponse,\n ProtoSignUpResponse,\n ProtoVerifyEmailResponse,\n SendVerifyCodeRequest,\n verifyCodeService,\n VerifyEmailRequest,\n tokenStorage,\n ProtoRefreshTokenResponse,\n OAuthSignInResponse,\n ResetPasswordRequest,\n ProtoResetPasswordResponse,\n ChangePasswordRequest,\n ProtoChangePasswordResponse,\n} from \"@phygitallabs/authentication\";\n\nimport { CALLBACK_URL } from \"../constants\";\n\n// Cleanup functions interface\nexport interface AuthCleanupFunctions {\n clearQueryCache?: () => void;\n clearOrganization?: () => void;\n clearHeaders?: () => void;\n clearCustomData?: () => void;\n}\n\n// Simplified auth state interface\ninterface AuthState {\n // User data\n user: UserData | null;\n\n isSignedIn: boolean;\n isInitialized: boolean;\n\n // Single loading state\n isLoading: boolean;\n\n // Error state\n error: string | null;\n\n // Cleanup functions\n cleanupFunctions: AuthCleanupFunctions;\n\n // Event callbacks\n eventCallbacks: AuthEventCallbacks;\n}\n\n// Simplified actions interface\ninterface AuthActions {\n setCleanupFunctions: (\n cleanupFunctions: Partial<AuthCleanupFunctions>\n ) => void;\n\n // Event management\n addEventCallbacks: (callbacks: AuthEventCallbacks) => () => void;\n\n // Core auth actions\n signInWithEmail: (\n email: string,\n password: string,\n updateHeaders?: (headers: Record<string, string>) => void,\n updateAuthenticationHeaders?: (headers: Record<string, string>) => void\n ) => Promise<ProtoSignInResponse>;\n signInWithGoogle: () => Promise<OAuthSignInResponse>;\n signUpWithEmail: (\n email: string,\n password: string\n ) => Promise<ProtoSignUpResponse>;\n signOut: () => Promise<void>;\n sendPasswordResetEmail: (email: string) => Promise<void>;\n resetPassword: (\n data: ResetPasswordRequest\n ) => Promise<ProtoResetPasswordResponse>;\n changePassword: (\n data: ChangePasswordRequest\n ) => Promise<ProtoChangePasswordResponse>;\n verifyEmailCode: (\n data: VerifyEmailRequest\n ) => Promise<ProtoVerifyEmailResponse>;\n sendVerifyCode: (\n data: SendVerifyCodeRequest\n ) => Promise<ProtoSendVerifyCodeResponse>;\n refreshToken: (refreshToken?: string) => Promise<ProtoRefreshTokenResponse>;\n\n // Simple state management\n clearError: () => void;\n\n // Setters\n setUser: (user: UserData | null) => void;\n patchUser: (user: Partial<UserData>) => void;\n setIsSignedIn: (isSignedIn: boolean) => void;\n setIsInitialized: (isInitialized: boolean) => void;\n setIsLoading: (isLoading: boolean) => void;\n\n // Initialization\n initialize: () => void;\n syncAuthState: () => void;\n}\n\n// Store structure with actions grouped\ninterface AuthStoreState extends AuthState {\n actions: AuthActions;\n}\n\ntype AuthStore = AuthStoreState;\n\n// Initial state\nconst initialState: AuthState = {\n user: null,\n isSignedIn: false,\n isInitialized: false,\n isLoading: false,\n error: null,\n cleanupFunctions: {},\n eventCallbacks: {},\n};\n\n// Create the auth store\nexport const useAuthStore :any = create<AuthStore>()(\n devtools(\n persist(\n subscribeWithSelector(\n immer((set, get) => ({\n ...initialState,\n actions: {\n setIsLoading: (isLoading: boolean) =>\n set((state) => {\n state.isLoading = isLoading;\n }),\n\n setCleanupFunctions: (\n newCleanupFunctions: Partial<AuthCleanupFunctions>\n ) =>\n set((state) => {\n state.cleanupFunctions = {\n ...state.cleanupFunctions,\n ...newCleanupFunctions,\n };\n }),\n\n // Event management\n addEventCallbacks: (callbacks: AuthEventCallbacks) => {\n set((state) => {\n state.eventCallbacks = {\n ...state.eventCallbacks,\n ...callbacks,\n };\n });\n\n // Return cleanup function\n return () => {\n set((state) => {\n state.eventCallbacks = {\n ...state.eventCallbacks,\n ...callbacks,\n };\n });\n };\n },\n\n // Sign in with email and password\n signInWithEmail: async (email: string, password: string) => {\n const { eventCallbacks } = get();\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const response = await authService.signIn({\n email,\n password,\n });\n\n if (response?.data?.idToken && response?.data?.refreshToken) {\n // Store tokens in tokenStorage only\n tokenStorage.setTokens({\n idToken: response.data.idToken,\n refreshToken: response.data.refreshToken,\n });\n\n // Update auth state\n set((state) => {\n state.isSignedIn = true;\n });\n\n eventCallbacks.onLoginSuccess?.(response.data.idToken);\n }\n\n return response;\n } catch (error: any) {\n // Check if error has code 7 (email not verified)\n if (error?.response?.data?.code === 7) {\n // Return a special response for email verification needed\n return {\n data: undefined,\n message: \"Email verification required\",\n code: 7,\n };\n }\n\n const errorMessage =\n error instanceof Error ? error.message : \"Login failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLoginError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n // Sign in with Google\n signInWithGoogle: async () => {\n const { eventCallbacks } = get();\n try {\n //get current domain\n const currentDomain = CALLBACK_URL;\n\n const userData =\n await authService.getOAuthSignInUrl(currentDomain);\n return userData;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Google sign in failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLoginError?.(new Error(errorMessage));\n\n throw error;\n }\n },\n\n // Sign up with email and password\n signUpWithEmail: async (email: string, password: string) => {\n const { eventCallbacks } = get();\n\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const response = await authService.signUp({\n email,\n password,\n });\n\n if (response.data) {\n eventCallbacks.onSignupSuccess?.();\n }\n\n return response;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Signup failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onSignupError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n state.user = null;\n state.isSignedIn = false;\n });\n }\n },\n\n // Sign out\n signOut: async () => {\n const { eventCallbacks, cleanupFunctions } = get();\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n set((state) => {\n state.user = null;\n state.isSignedIn = false;\n state.error = null;\n });\n const isTokenExpired = tokenStorage.isTokenExpired();\n if (isTokenExpired) {\n tokenStorage.clearTokens();\n localStorage.clear();\n return;\n }\n const refreshToken = tokenStorage.getRefreshToken();\n if (refreshToken) {\n await authService.logout({ refreshToken });\n }\n\n // Clear tokenStorage first\n localStorage.clear();\n tokenStorage.clearTokens();\n\n // Execute default cleanup functions\n try {\n cleanupFunctions.clearQueryCache?.();\n cleanupFunctions.clearOrganization?.();\n cleanupFunctions.clearCustomData?.();\n cleanupFunctions.clearHeaders?.();\n } catch (cleanupError) {\n console.warn(\"Error during logout cleanup:\", cleanupError);\n // Don't fail logout if cleanup fails\n }\n\n // Call onLogoutSuccess callback\n eventCallbacks.onLogoutSuccess?.();\n\n // Update state AFTER callback to prevent AuthLayout interference\n } catch (error) {\n console.log(error);\n const errorMessage =\n error instanceof Error ? error.message : \"Logout failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLogoutError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n // Send password reset email\n sendPasswordResetEmail: async (email: string) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n await verifyCodeService.forgotPassword({\n email,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send reset email\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n resetPassword: async (data: ResetPasswordRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const resetPasswordResponse =\n await verifyCodeService.resetPassword(data);\n return resetPasswordResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to reset password\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n changePassword: async (data: ChangePasswordRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const changePasswordResponse =\n await verifyCodeService.changePassword(data);\n return changePasswordResponse;\n } catch (error) {\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n verifyEmailCode: async (data: VerifyEmailRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const verifyEmailResponse =\n await verifyCodeService.verifyEmail(data);\n return verifyEmailResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send reset email\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n sendVerifyCode: async (data: SendVerifyCodeRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const sendVerifyCodeResponse =\n await verifyCodeService.sendVerifyCode(data);\n return sendVerifyCodeResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send verify code\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n refreshToken: async (refreshToken?: string) => {\n const refreshTokenResponse = await authService.refreshToken({\n refreshToken:\n refreshToken ?? tokenStorage.getRefreshToken() ?? \"\",\n });\n return refreshTokenResponse;\n },\n\n // Clear error\n clearError: () =>\n set((state) => {\n state.error = null;\n }),\n\n setUser: (user: UserData | null) =>\n set((state) => {\n state.user = user;\n }),\n\n setIsSignedIn: (isSignedIn: boolean) =>\n set((state) => {\n state.isSignedIn = isSignedIn;\n }),\n\n setIsInitialized: (isInitialized: boolean) =>\n set((state) => {\n state.isInitialized = isInitialized;\n }),\n\n patchUser: (user: Partial<UserData>) =>\n set((state) => {\n if (state.user) {\n state.user = { ...state.user, ...user };\n } else {\n state.user = user as UserData;\n }\n }),\n\n // Initialize the store - check if user is already authenticated from tokenStorage\n initialize: () => {\n set((state) => {\n const token = tokenStorage.getAuthToken();\n state.isSignedIn = !!token;\n state.isInitialized = true;\n });\n },\n\n // Sync auth state from tokenStorage (called when axios interceptor updates tokens)\n syncAuthState: () => {\n set((state) => {\n const token = tokenStorage.getAuthToken();\n const wasSignedIn = state.isSignedIn;\n state.isSignedIn = !!token;\n\n // If auth state changed, trigger callbacks\n if (wasSignedIn !== state.isSignedIn) {\n if (state.isSignedIn) {\n state.eventCallbacks?.onAuthStateChange?.(state.user, true);\n } else {\n state.eventCallbacks?.onAuthStateChange?.(null, false);\n }\n }\n });\n },\n },\n }))\n ),\n {\n version: 1,\n name: \"auth-store\",\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => ({\n isSignedIn: state.isSignedIn,\n user: state.user,\n }),\n }\n )\n )\n);\n\nexport const useAuth = () => {\n const user = useAuthStore((state: any) => state.user);\n const isSignedIn = useAuthStore((state: any) => state.isSignedIn);\n const isInitialized = useAuthStore((state: any) => state.isInitialized);\n const isLoading = useAuthStore((state: any) => state.isLoading);\n const error = useAuthStore((state: any) => state.error);\n const actions = useAuthStore((state: any) => state.actions);\n\n return {\n user,\n isSignedIn,\n isInitialized,\n isLoading,\n error,\n ...actions,\n };\n};\n\n","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\nexport const CALLBACK_URL = \"https://s3-sgn10.fptcloud.com/nomion-assets/platform/callback.html\";\n\nexport const ALLOWED_ORIGINS = [\n \"https://s3-sgn10.fptcloud.com\",\n \"https://accounts.google.com/\",\n];","import { UserData, UserRole, UserType } from \"../types/user-data\";\nimport { UserModel } from \"@phygitallabs/api-core\";\nimport jwtDecode from \"jwt-decode\";\n\nexport const transformProtoUserData = (user: UserModel, accessToken: string): UserData => {\n const userData = { ...user } as UserData;\n let tokenDecoded: any = {};\n\n try {\n tokenDecoded = jwtDecode(accessToken);\n } catch (error) {\n console.warn(\"Failed to decode token in transformUserData:\", error);\n }\n\n userData.exp = tokenDecoded.exp || 0;\n userData.accessToken = accessToken || \"\";\n userData.roles = tokenDecoded?.roles || [UserRole.USER];\n userData.account_type = tokenDecoded?.account_type || UserType.C;\n userData.picture = user.picture || \"\";\n return userData;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAuth } from \"../store/authStore\";\nimport { tokenStorage } from \"@phygitallabs/authentication\";\n\nexport function useTokenRefresher() {\n const { refreshToken, signOut } = useAuth();\n\n const handleRefreshToken = async () => {\n try {\n const isTokenExpired = tokenStorage.isTokenExpired();\n if (!isTokenExpired) {\n return;\n }\n const newToken = await refreshToken();\n\n if(newToken.data?.idToken && newToken.data?.refreshToken){\n tokenStorage.setTokens({\n idToken: newToken.data?.idToken,\n refreshToken: newToken.data?.refreshToken,\n });\n }\n\n } catch (error) {\n console.error(\"Failed to refresh token:\", error);\n signOut();\n }\n };\n\n // React Query handles refetching on interval + focus\n useQuery({\n queryKey: [\"refresh-token\"],\n queryFn: () => handleRefreshToken(),\n refetchInterval: 30 * 60 * 1000, // every 30 minutes\n refetchIntervalInBackground: false, // even when tab is hidden\n refetchOnWindowFocus: true, // also refresh when user returns to tab\n retry: false, // don't retry repeatedly if refresh fails\n enabled: !!tokenStorage.getAuthToken(), // only run if logged in\n });\n}\n","import { useRef, useCallback, useEffect } from \"react\";\nimport { useAuth } from \"../store/authStore\";\nimport { tokenStorage } from \"@phygitallabs/authentication\";\nimport { ALLOWED_ORIGINS } from \"../constants\";\n\nexport interface UseGoogleLoginOptions {\n onSuccess?: () => void;\n onError?: (error: string) => void;\n onPopupBlocked?: () => void;\n onPopupClosed?: () => void;\n}\n\nexport interface UseGoogleLoginReturn {\n signIn: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useGoogleLogin(options: UseGoogleLoginOptions = {}): UseGoogleLoginReturn {\n const { onSuccess, onError, onPopupBlocked, onPopupClosed } = options;\n const { signInWithGoogle, refreshToken, setIsSignedIn, setIsLoading, isLoading } = useAuth();\n\n const popupRef = useRef<Window | null>(null);\n const gotDataRef = useRef(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const errorRef = useRef<string | null>(null);\n\n const handleTokenRefresh = useCallback(\n async (refresh: string) => {\n if (refresh) {\n try {\n const newToken = await refreshToken(refresh);\n if (newToken.data?.idToken && newToken.data?.refreshToken) {\n tokenStorage.setTokens({\n idToken: newToken.data.idToken,\n refreshToken: newToken.data.refreshToken,\n });\n\n setIsSignedIn(true);\n setIsLoading(false);\n onSuccess?.();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Token refresh failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n }\n }\n },\n [refreshToken, setIsSignedIn, setIsLoading, onSuccess, onError]\n );\n\n const cleanup = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n gotDataRef.current = false;\n }, []);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n // Allow specific origins for OAuth (adjust these based on your OAuth provider)\n const allowedOrigins = ALLOWED_ORIGINS.concat(window?.location?.origin);\n\n // Allow wildcard origin from callback.html (but validate message structure)\n if (event.origin !== \"*\" && !allowedOrigins.includes(event.origin as string)) {\n console.warn(\"Rejected message from untrusted origin:\", event.origin);\n return;\n }\n\n // Additional validation for message structure\n if (!event.data || typeof event.data !== \"object\") {\n console.warn(\"Invalid message data received\");\n return;\n }\n\n if (event.data.type === \"LOGIN_SUCCESS\") {\n const { refreshToken: refresh } = event.data;\n\n // Support both token formats from callback\n if (refresh) {\n handleTokenRefresh(refresh);\n }\n gotDataRef.current = true;\n cleanup();\n } else if (event.data.type === \"LOGIN_ERROR\") {\n const errorMessage = event.data.error || \"Login failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n gotDataRef.current = true;\n cleanup();\n }\n },\n [handleTokenRefresh, setIsLoading, cleanup, onError]\n );\n\n const signIn = useCallback(async (): Promise<void> => {\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n try {\n errorRef.current = null;\n setIsLoading(true);\n const response = await signInWithGoogle();\n\n popupRef.current = window.open(\n `${response.statusMessage}`,\n \"oauthPopup\",\n `width=${width},height=${height},left=${left},top=${top},resizable,scrollbars`\n );\n\n // Ensure popup opened successfully\n if (!popupRef.current) {\n setIsLoading(false);\n const error = \"Popup blocked. Please allow popups for this site.\";\n errorRef.current = error;\n onPopupBlocked?.();\n onError?.(error);\n return;\n }\n\n timerRef.current = setInterval(() => {\n if (popupRef.current && popupRef.current.closed) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n if (!gotDataRef.current) {\n const error = \"Authentication popup was closed\";\n errorRef.current = error;\n onPopupClosed?.();\n onError?.(error);\n setIsLoading(false);\n }\n }\n }, 500);\n } catch (error: any) {\n const errorMessage = error instanceof Error ? error.message : \"Google sign in failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n }\n }, [signInWithGoogle, setIsLoading, handleMessage, onError, onPopupBlocked, onPopupClosed]);\n\n useEffect(() => {\n window.addEventListener(\"message\", handleMessage);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n };\n }, [handleMessage]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup, handleMessage]);\n\n return {\n signIn,\n isLoading,\n error: errorRef.current,\n };\n}\n","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};","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 useCreateCertificate,\n useCreateCertificateAnonymous,\n useCreateCertificateWithMask,\n} from \"@phygitallabs/generate-certificate\";\n\nexport {\n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate,\n useCreateCertificate,\n useCreateCertificateAnonymous,\n useCreateCertificateWithMask,\n};\n","import { wrapTextWithFont } from \"@phygitallabs/generate-certificate\";\n\nexport { wrapTextWithFont };\n","import posthog from \"posthog-js\";\nimport { useSessionReplay } from \"../../../modules/session-replay\";\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 { setUserId, setMetadata } = useSessionReplay();\n\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 const trackUserIdentify = (userInfo: Record<string, any>) => {\n posthog.identify(userInfo.email, {\n email: userInfo.email,\n name: userInfo.name,\n avatar: userInfo.avatar,\n uid: userInfo.uid,\n });\n\n setUserId(userInfo.id);\n\n setMetadata({\n user_email: userInfo.email\n })\n }\n\n const trackLogoutEvent = () => {\n posthog.capture(\"user_signed_out\");\n }\n\n return {\n trackEvent,\n trackUserIdentify,\n trackLogoutEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { createContext, useEffect, useReducer } from \"react\";\nimport { v4 as uuidV4 } from \"uuid\";\n\nimport {\n SessionReplayProviderProps,\n TrackerState,\n TrackerAction,\n TrackerContextValue,\n OpenReplayConfig,\n} from \"../types\";\n\nimport {\n isBrowser\n} from \"../utils\";\n\nexport const TrackerContext = createContext<TrackerContextValue | null>(null);\n\nfunction defaultGetUserId(): string {\n return uuidV4();\n}\n\nasync function newTracker(config: OpenReplayConfig) {\n try {\n // Dynamic import for SSR compatibility\n const OpenReplay = (await import(\"@openreplay/tracker\")).default;\n\n // Get user ID function (custom or default UUID generator)\n const getUserId =\n config?.userIdEnabled && config?.getUserId\n ? config.getUserId\n : defaultGetUserId;\n\n // Build tracker configuration\n const trackerConfig: any = {\n projectKey:\n config?.projectKey || process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY,\n ingestPoint: config?.ingestPoint,\n // Capture options\n captureExceptions: config.captureExceptions ?? true,\n capturePerformance: config.capturePerformance ?? true,\n // Network tracking\n network: config.network || {\n capturePayload: true,\n sanitizer: (data: any) => data,\n },\n // Console tracking\n console: config.console || {\n levels: [\"error\", \"warn\", \"log\"],\n },\n // Privacy settings\n obscureTextEmails: config.obscureTextEmails ?? true,\n obscureTextNumbers: config.obscureTextNumbers ?? false,\n obscureInputEmails: config.obscureInputEmails ?? true,\n // Development mode\n __DISABLE_SECURE_MODE:\n config.__DISABLE_SECURE_MODE ??\n (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"development\"),\n };\n\n // Initialize tracker\n const tracker = new OpenReplay(trackerConfig);\n\n // Set user ID if enabled\n if (config?.userIdEnabled) {\n const userId = getUserId();\n tracker.setUserID(userId);\n console.log(\"User ID set:\", userId);\n }\n\n console.log(\"OpenReplay tracker initialized\");\n console.log(\"Project Key:\", trackerConfig.projectKey);\n console.log(\"Ingest Point:\", trackerConfig.ingestPoint);\n\n return tracker;\n } catch (error: any) {\n console.error(\"Failed to create tracker:\", error);\n throw error;\n }\n}\n\nfunction reducer(state: TrackerState, action: TrackerAction): TrackerState {\n const { debug = false } = state.config;\n\n switch (action.type) {\n case \"init\":\n // Only initialize if tracker doesn't exist and we're in browser\n if (!state.tracker && isBrowser()) {\n if (!state.config.projectKey && !process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY) {\n console.warn(\n debug,\n \"Project key not found. Skipping session replay initialization.\"\n );\n return state;\n }\n\n // Return state with tracker promise\n // The tracker will be created asynchronously\n return {\n ...state,\n tracker: newTracker(state.config),\n };\n }\n return state;\n\n case \"start\":\n // Start tracking if tracker exists\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n tracker.start();\n console.log(debug, \"Session replay tracker started\");\n })\n .catch((error) => {\n console.error(\"Failed to start tracker:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n case \"setUserId\":\n // Set or update user ID\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n tracker.setUserID(action.payload);\n console.log(debug, \"User ID updated:\", action.payload);\n })\n .catch((error) => {\n console.error(\"Failed to set user ID:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n // Set metadata\n case \"setMetadata\":\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n Object.entries(action.payload || {})?.forEach(([key, value]) => {\n tracker.setMetadata(key, value);\n });\n\n console.log(debug, \"Metadata updated:\", action.payload.metadata);\n })\n .catch((error) => {\n console.error(\"Failed to set metadata:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n default:\n return state;\n }\n}\n\nexport const SessionReplayProvider: React.FC<SessionReplayProviderProps> = ({\n children,\n config = {},\n}) => {\n const [, dispatch] = useReducer(reducer, {\n tracker: null,\n config,\n });\n\n const initTracker = () => dispatch({ type: \"init\" })\n const startTracking = () => dispatch({ type: \"start\" })\n const setUserId = (userId: string) => dispatch({ type: \"setUserId\", payload: userId })\n const setMetadata = (metadata: Record<string, any>) => dispatch({ type: \"setMetadata\", payload: metadata })\n\n // init and start tracker\n useEffect(() => {\n initTracker();\n startTracking();\n }, []);\n\n return <TrackerContext.Provider value={{\n initTracker,\n startTracking,\n setUserId,\n setMetadata\n }}>{children}</TrackerContext.Provider>;\n};\n\nexport default SessionReplayProvider;\n","import { getDeviceUid } from \"../../auth/helpers\";\n\nexport const getSessionUserId = (userId?: string): string | null => {\n if (userId) {\n return userId;\n }\n return getDeviceUid();\n};\n\nexport const isBrowser = (): boolean => {\n return typeof window !== \"undefined\";\n};\n","import { useContext } from \"react\";\nimport { TrackerContext } from \"../providers/SessionReplayProvider\";\nimport { TrackerContextValue } from \"../types\";\n\nexport function useSessionReplay(): TrackerContextValue {\n const context = useContext(TrackerContext);\n\n if (!context) {\n throw new Error(\n \"useSessionReplay must be used within a SessionReplayProvider. \" +\n \"Make sure your component is wrapped with <SessionReplayProvider>.\"\n );\n }\n\n return context;\n}\n","import React, { useMemo } from \"react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { AuthProvider } from \"../modules/auth\";\nimport serviceApiUrl from \"../constants/service\";\nimport { OpenReplayConfig, SessionReplayProvider } from \"../modules/session-replay\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n // authCallbacks\n}) => {\n const { environment } = apiConfig;\n\n const sessionReplayConfig: OpenReplayConfig | undefined = useMemo(() => {\n const projectKey = process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY;\n\n // Only configure if project key is provided\n if (!projectKey) {\n return undefined;\n }\n\n return {\n projectKey,\n ingestPoint: process.env.NEXT_PUBLIC_OPENREPLAY_INGEST_POINT,\n debug: process.env.NODE_ENV === \"development\",\n captureExceptions: true,\n capturePerformance: true,\n obscureTextEmails: true,\n obscureInputEmails: true,\n };\n }, []);\n\n return (\n <SessionReplayProvider config={sessionReplayConfig}>\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n >\n <AuthProvider\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}`}\n queryClient={queryClient}\n >\n {children}\n </AuthProvider>\n </ServicesProvider>\n </SessionReplayProvider>\n );\n};","import React, { useEffect, useState } 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 } from \"../modules/auth/helpers\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n}) => {\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\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) => Promise.reject(error),\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => config,\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 { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward\";\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":["index_exports","__export","ALLOWED_ORIGINS","AchievementRuleActionType","AchievementServiceProvider","AchievementType","AuthProvider","CALLBACK_URL","CampaignState","CmentityRewardType","NotificationProvider","RewardClaimStatus","TapquestCoreProvider","TaskType","UserSourceType","accessTokenKey","checkDeviceUid","chipAuthTokenKey","cn","convertSnakeToCamel","deviceUIDKey","fileToBase64","filterLocationsByProperty","generateDeviceId","getAccessToken","getActionsFromAchievementRule","getChipAuthToken","getDeviceUid","getLocationIdsFromAchievementRule","getRefreshToken","getRetryAttemptsRefreshToken","getUserInfo","httpMaxRetries","isAchievementCompleted","locationQueryKeys","memoriesKey","parse","refreshTokenKey","removeAccessToken","removeChipAuthToken","removeDeviceUid","removeRefreshToken","removeUserInfo","resetMemoriesQuery","retryAttemptsRefreshToken","setAccessToken","setChipAuthToken","setDeviceUid","setRefreshToken","setRetryAttemptsRefreshToken","setUserInfo","sortLocationsByIndex","useAchievementProgress","achivementPlusRewardModel_default","useAuth","useOneCampaign","useCancelUserRewardsRequest","useChipScanStory","useClaimUserReward","useClearUserRewardCache","useCreateCertificate","useCreateCertificateAnonymous","useCreateCertificateWithMask","useCreateMemory","useCreateModelGroupReward","useCreateRewardModel","useDataTracking","useDeleteRewardModel","useGenerateFansipanCertificate","useGenerateTemplateCertificate","useGenerateThaocamvienCertificate","useGetRewardModel","useGetUserRewards","useGoogleLogin","useInfiniteMemories","useListRewardModels","useOneLocation","useUserCampaignsCompletedLocation","useManyLocations","useManyAchievementProgress","useManyAchievements","useManyAchievementsRewardModels","useManyChildrenAchievements","useManyMemory","useManyUserActionLocations","useManyUserRewards","useMyProfile","useOneAchievement","useOneMemory","useOneUserCampaign","usePGLCoreService","useScanChip","useSendEmail","useSyncCheckin","useUpdateMyProfile","useUpdateRewardModel","useUploadMedia","useUserAchievementAction","useUserCampaignAction","useV1ListRewards","userInfoKey","wrapTextWithFont","useManyAchievementProgressCore","useManyAchievementProgressByDeviceCore","useAchievementProgress","useManyAchievements","useUserAchievementAction","useManyChildrenAchievements","useOneAchievement","useManyAchievementsRewardModels","getLocationIdsFromAchievementRule","achievement","locationIds","ruleList","rule","filterList","filter","getActionsFromAchievementRule","actions","isAchievementCompleted","convertSnakeToCamel","obj","item","converted","key","camelKey","_","letter","useManyAchievementProgress","params","options","isLoggedIn","queryParams","useManyAchievementProgressCore","data","item","isAchievementCompleted","useManyAchievementProgressByDeviceCore","convertSnakeToCamel","AchievementRuleActionType","AchievementServiceProvider","AchievementType","useManyUserRewards","useGetUserRewards","useClaimUserReward","useListRewardModels","useGetRewardModel","useCreateRewardModel","useUpdateRewardModel","useDeleteRewardModel","useCreateModelGroupReward","useClearUserRewardCache","useV1ListRewards","CmentityRewardType","RewardClaimStatus","notification_exports","__export","NotificationProvider","__reExport","notification_api_star","NotificationProviderApi","serviceApiUrl","service_default","jsx","NotificationProvider","children","autoConnect","environment","user","onWebSocketOpen","onWebSocketClose","onWebSocketMessage","webSocketUrl","service_default","NotificationProviderApi","__reExport","index_exports","notification_exports","useOneMemory","useManyMemory","useInfiniteMemories","useCreateMemory","useUploadMedia","resetMemoriesQuery","memoriesKey","AuthenticationProvider","useAuthenticationHeaders","tokenStorage","useEffect","create","immer","createJSONStorage","devtools","persist","subscribeWithSelector","authService","verifyCodeService","tokenStorage","userInfoKey","accessTokenKey","refreshTokenKey","httpMaxRetries","retryAttemptsRefreshToken","deviceUIDKey","chipAuthTokenKey","CALLBACK_URL","ALLOWED_ORIGINS","initialState","useAuthStore","create","devtools","persist","subscribeWithSelector","immer","set","get","isLoading","state","newCleanupFunctions","callbacks","email","password","eventCallbacks","response","authService","tokenStorage","error","errorMessage","currentDomain","CALLBACK_URL","cleanupFunctions","refreshToken","cleanupError","verifyCodeService","data","user","isSignedIn","isInitialized","token","wasSignedIn","createJSONStorage","useAuth","actions","jwtDecode","transformProtoUserData","user","accessToken","userData","tokenDecoded","error","userService","usePGLCoreService","useAchievementService","useRewardService","useGenerateCertificateService","useQuery","tokenStorage","useTokenRefresher","refreshToken","signOut","useAuth","handleRefreshToken","newToken","error","useQuery","jsx","jsxs","AuthStateManager","updateHeaders","useAuthenticationHeaders","updateHeadersPGL","coreApi","usePGLCoreService","updateHeadersAchievement","useAchievementService","updateHeadersReward","useRewardService","updateHeadersGenerateCertificate","useGenerateCertificateService","useEffect","useAuthStore","token","tokenStorage","user","previousIsSignedIn","unsub","state","isSignedIn","userProfile","userService","transformedUserData","transformProtoUserData","eventCallbacks","unsubTokenChange","TokenRefresher","useTokenRefresher","AuthProvider","children","baseURL","queryClient","AuthenticationProvider","useRef","useCallback","useEffect","tokenStorage","useGoogleLogin","options","onSuccess","onError","onPopupBlocked","onPopupClosed","signInWithGoogle","refreshToken","setIsSignedIn","setIsLoading","isLoading","useAuth","popupRef","useRef","gotDataRef","timerRef","errorRef","handleTokenRefresh","useCallback","refresh","newToken","tokenStorage","error","errorMessage","cleanup","handleMessage","event","allowedOrigins","ALLOWED_ORIGINS","signIn","left","top","response","useEffect","uuidv4","generateDeviceId","generateDeviceFingerprint","error","timestamp","fingerprintRaw","data","hashBuffer","b","getDeviceUid","deviceUIDKey","setDeviceUid","deviceId","removeDeviceUid","checkDeviceUid","deviceUID","generateDeviceId","getChipAuthToken","chipAuthTokenKey","setChipAuthToken","value","removeChipAuthToken","getRetryAttemptsRefreshToken","retryAttemptsRefreshToken","setRetryAttemptsRefreshToken","getAccessToken","accessTokenKey","setAccessToken","removeAccessToken","getRefreshToken","refreshTokenKey","setRefreshToken","removeRefreshToken","getUserInfo","userInfo","userInfoKey","error","setUserInfo","userData","removeUserInfo","useMyProfile","useUpdateMyProfile","useSyncCheckin","useCancelUserRewardsRequest","UserSourceType","useEffect","useChipScanStory","usePGLCoreService","useScanChip","token","id","onScanChipError","updateHeaders","usePGLCoreService","useEffect","header","setChipAuthToken","data","isLoading","isError","isSuccess","useChipScanStory","useOneCampaign","useUserCampaignAction","useOneUserCampaign","CampaignState","TaskType","useManyLocations","useOneLocation","useUserCampaignsCompletedLocation","useManyUserActionLocations","locationQueryKeys","sortLocationsByIndex","locations","a","b","filterLocationsByProperty","propertyName","value","location","useGenerateThaocamvienCertificate","useGenerateTemplateCertificate","useGenerateFansipanCertificate","useCreateCertificate","useCreateCertificateAnonymous","useCreateCertificateWithMask","wrapTextWithFont","posthog","createContext","useEffect","useReducer","uuidV4","isBrowser","jsx","TrackerContext","createContext","defaultGetUserId","uuidV4","newTracker","config","OpenReplay","getUserId","trackerConfig","data","tracker","userId","error","reducer","state","action","debug","isBrowser","key","value","SessionReplayProvider","children","dispatch","useReducer","initTracker","startTracking","setUserId","setMetadata","metadata","useEffect","useContext","useSessionReplay","context","useContext","TrackerContext","pushEventToDataLayer","event","data","error","pushEventToGA","eventName","eventData","pushEventToPosthog","posthog","useDataTracking","setUserId","setMetadata","useSessionReplay","useTools","userInfo","useMemo","useEffect","useState","PGLCoreServiceProvider","RewardServiceProvider","AchievementServiceProvider","GenerateCertificateServiceProvider","Fragment","jsx","ServicesProvider","children","queryClient","apiConfig","environment","version","commonServiceConfig","setCommonServiceConfig","useState","useEffect","deviceUid","checkDeviceUid","response","error","config","PGLCoreServiceProvider","service_default","RewardServiceProvider","AchievementServiceProvider","GenerateCertificateServiceProvider","jsx","TapquestCoreProvider","children","queryClient","apiConfig","environment","sessionReplayConfig","useMemo","projectKey","SessionReplayProvider","ServicesProvider","AuthProvider","service_default","useManyAchievements","useCreateModelGroupReward","useEffect","useMemo","buildMappedAchievements","achievements","groupRewardData","rewardModels","achievement","achievementIndex","parentReward","subAchievements","subId","subIndex","reward","useAchivementPlusRewardModel","campaignId","isLoadingAchievements","groupRewardIds","id","fetchGroupRewardModels","groupRewardModelsData","isPendingGroupRewardModels","achivementPlusRewardModel_default","useSendEmail","cn","parse","fileToBase64"]}
1
+ {"version":3,"sources":["../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/modules/auth/store/authStore.ts","../src/modules/auth/constants/index.ts","../src/modules/auth/utils/user.ts","../src/modules/auth/hooks/useTokenRefresher.ts","../src/modules/auth/hooks/useGoogleLogin.ts","../src/modules/auth/helpers/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/generate-certificate/helpers/index.ts","../src/modules/data-tracking/hooks/index.ts","../src/modules/session-replay/providers/SessionReplayProvider.tsx","../src/modules/session-replay/utils/index.ts","../src/modules/session-replay/hooks/useSessionReplay.ts","../src/providers/TapquestCoreProvider.tsx","../src/providers/ServicesProvider.tsx","../src/modules/achivementWithReward/hooks/achivementPlusRewardModel.ts","../src/modules/send-email/hooks/index.ts","../src/helper/helpers.ts"],"sourcesContent":["export * from \"./src\";","// 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 useListRewardModels,\n useGetRewardModel,\n useCreateRewardModel,\n useUpdateRewardModel,\n useDeleteRewardModel,\n useCreateModelGroupReward,\n useClearUserRewardCache,\n useV1ListRewards\n} from \"@phygitallabs/reward\";","// 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 };\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 ?? null}\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 {\n AuthenticationProvider,\n useAuthenticationHeaders,\n tokenStorage,\n} from \"@phygitallabs/authentication\";\nimport { useEffect } from \"react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { transformProtoUserData } from \"../utils/user\";\nimport { userService } from \"@phygitallabs/api-core\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { usePGLCoreService } from \"@phygitallabs/api-core\";\nimport { useAchievementService } from \"@phygitallabs/achievement\";\nimport { useRewardService } from \"@phygitallabs/reward\";\nimport { useGenerateCertificateService } from \"@phygitallabs/generate-certificate\";\nimport { useTokenRefresher } from \"../hooks/useTokenRefresher\";\n\ninterface AuthProviderProps {\n children: React.ReactNode;\n baseURL: string;\n queryClient: QueryClient;\n}\n\n// Inner component that has access to the authentication context\nconst AuthStateManager = () => {\n const { updateHeaders } = useAuthenticationHeaders();\n\n const { updateHeaders: updateHeadersPGL, coreApi } = usePGLCoreService();\n const { updateHeaders: updateHeadersAchievement } = useAchievementService();\n const { updateHeaders: updateHeadersReward } = useRewardService();\n const { updateHeaders: updateHeadersGenerateCertificate } =\n useGenerateCertificateService();\n\n useEffect(() => {\n // Initialize the auth store to set isSignedIn based on persisted token\n useAuthStore.getState().actions.initialize();\n // Initial setup - set headers if token exists\n const token = tokenStorage.getAuthToken();\n if (token) {\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n // Sync user.accessToken with actual token from localStorage\n const { user } = useAuthStore.getState();\n if (user && user.accessToken !== token) {\n useAuthStore.getState().actions.setUser({\n ...user,\n accessToken: token,\n });\n }\n }\n\n let previousIsSignedIn = useAuthStore.getState().isSignedIn;\n\n const unsub = useAuthStore.subscribe(\n (state: any) => [state.isSignedIn, state.user],\n async ([isSignedIn]: [any]) => {\n // Only run when isSignedIn actually changes\n if (isSignedIn === previousIsSignedIn) {\n return;\n }\n\n previousIsSignedIn = isSignedIn as boolean;\n\n if (isSignedIn) {\n const token = tokenStorage.getAuthToken();\n\n if (token) {\n // Update API headers with the new token\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n try {\n // Fetch user profile when signed in\n const userApi = userService(coreApi);\n const userProfile = await userApi.getMyProfile();\n const transformedUserData = transformProtoUserData(\n userProfile,\n token\n );\n\n useAuthStore.getState().actions.setUser(transformedUserData);\n } catch (error) {\n useAuthStore.getState().actions.signOut();\n }\n }\n\n // Trigger auth state change event\n const { eventCallbacks, user } = useAuthStore.getState();\n eventCallbacks?.onAuthStateChange?.(user, true);\n } else {\n // Clear headers when logged out\n updateHeaders({});\n updateHeadersPGL({});\n updateHeadersAchievement({\n Authorization: ``,\n });\n updateHeadersReward({\n Authorization: ``,\n });\n updateHeadersGenerateCertificate({\n Authorization: ``,\n });\n\n // Trigger auth state change event\n const { eventCallbacks } = useAuthStore.getState();\n eventCallbacks?.onAuthStateChange?.(null, false);\n }\n }\n );\n\n // Listen for token changes (for refresh scenarios)\n const unsubTokenChange = tokenStorage.addTokenChangeListener(async () => {\n const { isSignedIn, user } = useAuthStore.getState();\n if (isSignedIn) {\n const token = tokenStorage.getAuthToken();\n if (token) {\n updateHeaders({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersPGL({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersAchievement({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersReward({\n Authorization: `Bearer ${token}`,\n });\n updateHeadersGenerateCertificate({\n Authorization: `Bearer ${token}`,\n });\n\n // Sync user.accessToken with actual token from localStorage\n if (user && user.accessToken !== token) {\n useAuthStore.getState().actions.setUser({\n ...user,\n accessToken: token,\n });\n }\n } else {\n // Token was cleared, sign out\n useAuthStore.getState().actions.signOut();\n updateHeaders({});\n updateHeadersPGL({});\n updateHeadersAchievement({\n Authorization: ``,\n });\n updateHeadersReward({\n Authorization: ``,\n });\n updateHeadersGenerateCertificate({\n Authorization: ``,\n });\n }\n }\n });\n\n return () => {\n unsub();\n unsubTokenChange();\n };\n }, [\n updateHeaders,\n updateHeadersPGL,\n updateHeadersAchievement,\n updateHeadersReward,\n updateHeadersGenerateCertificate,\n coreApi,\n ]);\n\n return null;\n};\n\nconst TokenRefresher = () => {\n useTokenRefresher();\n return null;\n};\n\nexport const AuthProvider = ({\n children,\n baseURL,\n queryClient,\n}: AuthProviderProps) => {\n const axiosConfig = {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n };\n\n return (\n <AuthenticationProvider\n axiosConfig={axiosConfig}\n baseURL={baseURL}\n queryClient={queryClient}\n >\n <AuthStateManager />\n <TokenRefresher />\n {children}\n </AuthenticationProvider>\n );\n};\n","import { create } from \"zustand\";\nimport { immer } from \"zustand/middleware/immer\";\nimport { UserData } from \"../types/user-data\";\nimport {\n createJSONStorage,\n devtools,\n persist,\n subscribeWithSelector,\n} from \"zustand/middleware\";\nimport { AuthEventCallbacks } from \"../types/auth\";\n\nimport {\n authService,\n ProtoSendVerifyCodeResponse,\n ProtoSignInResponse,\n ProtoSignUpResponse,\n ProtoVerifyEmailResponse,\n SendVerifyCodeRequest,\n verifyCodeService,\n VerifyEmailRequest,\n tokenStorage,\n ProtoRefreshTokenResponse,\n OAuthSignInResponse,\n ResetPasswordRequest,\n ProtoResetPasswordResponse,\n ChangePasswordRequest,\n ProtoChangePasswordResponse,\n} from \"@phygitallabs/authentication\";\n\nimport { CALLBACK_URL } from \"../constants\";\n\n// Cleanup functions interface\nexport interface AuthCleanupFunctions {\n clearQueryCache?: () => void;\n clearOrganization?: () => void;\n clearHeaders?: () => void;\n clearCustomData?: () => void;\n}\n\n// Simplified auth state interface\ninterface AuthState {\n // User data\n user: UserData | null;\n\n isSignedIn: boolean;\n isInitialized: boolean;\n\n // Single loading state\n isLoading: boolean;\n\n // Error state\n error: string | null;\n\n // Cleanup functions\n cleanupFunctions: AuthCleanupFunctions;\n\n // Event callbacks\n eventCallbacks: AuthEventCallbacks;\n}\n\n// Simplified actions interface\ninterface AuthActions {\n setCleanupFunctions: (\n cleanupFunctions: Partial<AuthCleanupFunctions>\n ) => void;\n\n // Event management\n addEventCallbacks: (callbacks: AuthEventCallbacks) => () => void;\n\n // Core auth actions\n signInWithEmail: (\n email: string,\n password: string,\n updateHeaders?: (headers: Record<string, string>) => void,\n updateAuthenticationHeaders?: (headers: Record<string, string>) => void\n ) => Promise<ProtoSignInResponse>;\n signInWithGoogle: () => Promise<OAuthSignInResponse>;\n signUpWithEmail: (\n email: string,\n password: string\n ) => Promise<ProtoSignUpResponse>;\n signOut: () => Promise<void>;\n sendPasswordResetEmail: (email: string) => Promise<void>;\n resetPassword: (\n data: ResetPasswordRequest\n ) => Promise<ProtoResetPasswordResponse>;\n changePassword: (\n data: ChangePasswordRequest\n ) => Promise<ProtoChangePasswordResponse>;\n verifyEmailCode: (\n data: VerifyEmailRequest\n ) => Promise<ProtoVerifyEmailResponse>;\n sendVerifyCode: (\n data: SendVerifyCodeRequest\n ) => Promise<ProtoSendVerifyCodeResponse>;\n refreshToken: (refreshToken?: string) => Promise<ProtoRefreshTokenResponse>;\n\n // Simple state management\n clearError: () => void;\n\n // Setters\n setUser: (user: UserData | null) => void;\n patchUser: (user: Partial<UserData>) => void;\n setIsSignedIn: (isSignedIn: boolean) => void;\n setIsInitialized: (isInitialized: boolean) => void;\n setIsLoading: (isLoading: boolean) => void;\n\n // Initialization\n initialize: () => void;\n syncAuthState: () => void;\n}\n\n// Store structure with actions grouped\ninterface AuthStoreState extends AuthState {\n actions: AuthActions;\n}\n\ntype AuthStore = AuthStoreState;\n\n// Initial state\nconst initialState: AuthState = {\n user: null,\n isSignedIn: false,\n isInitialized: false,\n isLoading: false,\n error: null,\n cleanupFunctions: {},\n eventCallbacks: {},\n};\n\n// Create the auth store\nexport const useAuthStore :any = create<AuthStore>()(\n devtools(\n persist(\n subscribeWithSelector(\n immer((set, get) => ({\n ...initialState,\n actions: {\n setIsLoading: (isLoading: boolean) =>\n set((state) => {\n state.isLoading = isLoading;\n }),\n\n setCleanupFunctions: (\n newCleanupFunctions: Partial<AuthCleanupFunctions>\n ) =>\n set((state) => {\n state.cleanupFunctions = {\n ...state.cleanupFunctions,\n ...newCleanupFunctions,\n };\n }),\n\n // Event management\n addEventCallbacks: (callbacks: AuthEventCallbacks) => {\n set((state) => {\n state.eventCallbacks = {\n ...state.eventCallbacks,\n ...callbacks,\n };\n });\n\n // Return cleanup function\n return () => {\n set((state) => {\n state.eventCallbacks = {\n ...state.eventCallbacks,\n ...callbacks,\n };\n });\n };\n },\n\n // Sign in with email and password\n signInWithEmail: async (email: string, password: string) => {\n const { eventCallbacks } = get();\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const response = await authService.signIn({\n email,\n password,\n });\n\n if (response?.data?.idToken && response?.data?.refreshToken) {\n // Store tokens in tokenStorage only\n tokenStorage.setTokens({\n idToken: response.data.idToken,\n refreshToken: response.data.refreshToken,\n });\n\n // Update auth state\n set((state) => {\n state.isSignedIn = true;\n });\n\n eventCallbacks.onLoginSuccess?.(response.data.idToken);\n }\n\n return response;\n } catch (error: any) {\n // Check if error has code 7 (email not verified)\n if (error?.response?.data?.code === 7) {\n // Return a special response for email verification needed\n return {\n data: undefined,\n message: \"Email verification required\",\n code: 7,\n };\n }\n\n const errorMessage =\n error instanceof Error ? error.message : \"Login failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLoginError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n // Sign in with Google\n signInWithGoogle: async () => {\n const { eventCallbacks } = get();\n try {\n //get current domain\n const currentDomain = CALLBACK_URL;\n\n const userData =\n await authService.getOAuthSignInUrl(currentDomain);\n return userData;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Google sign in failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLoginError?.(new Error(errorMessage));\n\n throw error;\n }\n },\n\n // Sign up with email and password\n signUpWithEmail: async (email: string, password: string) => {\n const { eventCallbacks } = get();\n\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const response = await authService.signUp({\n email,\n password,\n });\n\n if (response.data) {\n eventCallbacks.onSignupSuccess?.();\n }\n\n return response;\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Signup failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onSignupError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n state.user = null;\n state.isSignedIn = false;\n });\n }\n },\n\n // Sign out\n signOut: async () => {\n const { eventCallbacks, cleanupFunctions } = get();\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n set((state) => {\n state.user = null;\n state.isSignedIn = false;\n state.error = null;\n });\n const isTokenExpired = tokenStorage.isTokenExpired();\n if (isTokenExpired) {\n tokenStorage.clearTokens();\n localStorage.clear();\n return;\n }\n const refreshToken = tokenStorage.getRefreshToken();\n if (refreshToken) {\n await authService.logout({ refreshToken });\n }\n\n // Clear tokenStorage first\n localStorage.clear();\n tokenStorage.clearTokens();\n\n // Execute default cleanup functions\n try {\n cleanupFunctions.clearQueryCache?.();\n cleanupFunctions.clearOrganization?.();\n cleanupFunctions.clearCustomData?.();\n cleanupFunctions.clearHeaders?.();\n } catch (cleanupError) {\n console.warn(\"Error during logout cleanup:\", cleanupError);\n // Don't fail logout if cleanup fails\n }\n\n // Call onLogoutSuccess callback\n eventCallbacks.onLogoutSuccess?.();\n\n // Update state AFTER callback to prevent AuthLayout interference\n } catch (error) {\n console.log(error);\n const errorMessage =\n error instanceof Error ? error.message : \"Logout failed\";\n\n set((state) => {\n state.error = errorMessage;\n });\n\n eventCallbacks.onLogoutError?.(new Error(errorMessage));\n\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n // Send password reset email\n sendPasswordResetEmail: async (email: string) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n await verifyCodeService.forgotPassword({\n email,\n });\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send reset email\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n resetPassword: async (data: ResetPasswordRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const resetPasswordResponse =\n await verifyCodeService.resetPassword(data);\n return resetPasswordResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to reset password\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n changePassword: async (data: ChangePasswordRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const changePasswordResponse =\n await verifyCodeService.changePassword(data);\n return changePasswordResponse;\n } catch (error) {\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n\n verifyEmailCode: async (data: VerifyEmailRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const verifyEmailResponse =\n await verifyCodeService.verifyEmail(data);\n return verifyEmailResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send reset email\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n sendVerifyCode: async (data: SendVerifyCodeRequest) => {\n set((state) => {\n state.isLoading = true;\n state.error = null;\n });\n\n try {\n const sendVerifyCodeResponse =\n await verifyCodeService.sendVerifyCode(data);\n return sendVerifyCodeResponse;\n } catch (error) {\n const errorMessage =\n error instanceof Error\n ? error.message\n : \"Failed to send verify code\";\n set((state) => {\n state.error = errorMessage;\n });\n throw error;\n } finally {\n set((state) => {\n state.isLoading = false;\n });\n }\n },\n refreshToken: async (refreshToken?: string) => {\n const refreshTokenResponse = await authService.refreshToken({\n refreshToken:\n refreshToken ?? tokenStorage.getRefreshToken() ?? \"\",\n });\n return refreshTokenResponse;\n },\n\n // Clear error\n clearError: () =>\n set((state) => {\n state.error = null;\n }),\n\n setUser: (user: UserData | null) =>\n set((state) => {\n state.user = user;\n }),\n\n setIsSignedIn: (isSignedIn: boolean) =>\n set((state) => {\n state.isSignedIn = isSignedIn;\n }),\n\n setIsInitialized: (isInitialized: boolean) =>\n set((state) => {\n state.isInitialized = isInitialized;\n }),\n\n patchUser: (user: Partial<UserData>) =>\n set((state) => {\n if (state.user) {\n state.user = { ...state.user, ...user };\n } else {\n state.user = user as UserData;\n }\n }),\n\n // Initialize the store - check if user is already authenticated from tokenStorage\n initialize: () => {\n set((state) => {\n const token = tokenStorage.getAuthToken();\n state.isSignedIn = !!token;\n state.isInitialized = true;\n });\n },\n\n // Sync auth state from tokenStorage (called when axios interceptor updates tokens)\n syncAuthState: () => {\n set((state) => {\n const token = tokenStorage.getAuthToken();\n const wasSignedIn = state.isSignedIn;\n state.isSignedIn = !!token;\n\n // If auth state changed, trigger callbacks\n if (wasSignedIn !== state.isSignedIn) {\n if (state.isSignedIn) {\n state.eventCallbacks?.onAuthStateChange?.(state.user, true);\n } else {\n state.eventCallbacks?.onAuthStateChange?.(null, false);\n }\n }\n });\n },\n },\n }))\n ),\n {\n version: 1,\n name: \"auth-store\",\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => ({\n isSignedIn: state.isSignedIn,\n user: state.user,\n }),\n }\n )\n )\n);\n\nexport const useAuth = () => {\n const user = useAuthStore((state: any) => state.user);\n const isSignedIn = useAuthStore((state: any) => state.isSignedIn);\n const isInitialized = useAuthStore((state: any) => state.isInitialized);\n const isLoading = useAuthStore((state: any) => state.isLoading);\n const error = useAuthStore((state: any) => state.error);\n const actions = useAuthStore((state: any) => state.actions);\n\n return {\n user,\n isSignedIn,\n isInitialized,\n isLoading,\n error,\n ...actions,\n };\n};\n\n","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\nexport const CALLBACK_URL = \"https://s3-sgn10.fptcloud.com/nomion-assets/platform/callback.html\";\n\nexport const ALLOWED_ORIGINS = [\n \"https://s3-sgn10.fptcloud.com\",\n \"https://accounts.google.com/\",\n];","import { UserData, UserRole, UserType } from \"../types/user-data\";\nimport { UserModel } from \"@phygitallabs/api-core\";\nimport jwtDecode from \"jwt-decode\";\n\nexport const transformProtoUserData = (user: UserModel, accessToken: string): UserData => {\n const userData = { ...user } as UserData;\n let tokenDecoded: any = {};\n\n try {\n tokenDecoded = jwtDecode(accessToken);\n } catch (error) {\n console.warn(\"Failed to decode token in transformUserData:\", error);\n }\n\n userData.exp = tokenDecoded.exp || 0;\n userData.accessToken = accessToken || \"\";\n userData.roles = tokenDecoded?.roles || [UserRole.USER];\n userData.account_type = tokenDecoded?.account_type || UserType.C;\n userData.picture = user.picture || \"\";\n return userData;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useAuth } from \"../store/authStore\";\nimport { tokenStorage } from \"@phygitallabs/authentication\";\n\nexport function useTokenRefresher() {\n const { refreshToken, signOut } = useAuth();\n\n const handleRefreshToken = async () => {\n try {\n const isTokenExpired = tokenStorage.isTokenExpired();\n if (!isTokenExpired) {\n return;\n }\n const newToken = await refreshToken();\n\n if(newToken.data?.idToken && newToken.data?.refreshToken){\n tokenStorage.setTokens({\n idToken: newToken.data?.idToken,\n refreshToken: newToken.data?.refreshToken,\n });\n }\n\n } catch (error) {\n console.error(\"Failed to refresh token:\", error);\n signOut();\n }\n };\n\n // React Query handles refetching on interval + focus\n useQuery({\n queryKey: [\"refresh-token\"],\n queryFn: () => handleRefreshToken(),\n refetchInterval: 30 * 60 * 1000, // every 30 minutes\n refetchIntervalInBackground: false, // even when tab is hidden\n refetchOnWindowFocus: true, // also refresh when user returns to tab\n retry: false, // don't retry repeatedly if refresh fails\n enabled: !!tokenStorage.getAuthToken(), // only run if logged in\n });\n}\n","import { useRef, useCallback, useEffect } from \"react\";\nimport { useAuth } from \"../store/authStore\";\nimport { tokenStorage } from \"@phygitallabs/authentication\";\nimport { ALLOWED_ORIGINS } from \"../constants\";\n\nexport interface UseGoogleLoginOptions {\n onSuccess?: () => void;\n onError?: (error: string) => void;\n onPopupBlocked?: () => void;\n onPopupClosed?: () => void;\n}\n\nexport interface UseGoogleLoginReturn {\n signIn: () => Promise<void>;\n isLoading: boolean;\n error: string | null;\n}\n\nexport function useGoogleLogin(options: UseGoogleLoginOptions = {}): UseGoogleLoginReturn {\n const { onSuccess, onError, onPopupBlocked, onPopupClosed } = options;\n const { signInWithGoogle, refreshToken, setIsSignedIn, setIsLoading, isLoading } = useAuth();\n\n const popupRef = useRef<Window | null>(null);\n const gotDataRef = useRef(false);\n const timerRef = useRef<NodeJS.Timeout | null>(null);\n const errorRef = useRef<string | null>(null);\n\n const handleTokenRefresh = useCallback(\n async (refresh: string) => {\n if (refresh) {\n try {\n const newToken = await refreshToken(refresh);\n if (newToken.data?.idToken && newToken.data?.refreshToken) {\n tokenStorage.setTokens({\n idToken: newToken.data.idToken,\n refreshToken: newToken.data.refreshToken,\n });\n\n setIsSignedIn(true);\n setIsLoading(false);\n onSuccess?.();\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : \"Token refresh failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n }\n }\n },\n [refreshToken, setIsSignedIn, setIsLoading, onSuccess, onError]\n );\n\n const cleanup = useCallback(() => {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n gotDataRef.current = false;\n }, []);\n\n const handleMessage = useCallback(\n (event: MessageEvent) => {\n // Allow specific origins for OAuth (adjust these based on your OAuth provider)\n const allowedOrigins = ALLOWED_ORIGINS.concat(window?.location?.origin);\n\n // Allow wildcard origin from callback.html (but validate message structure)\n if (event.origin !== \"*\" && !allowedOrigins.includes(event.origin as string)) {\n console.warn(\"Rejected message from untrusted origin:\", event.origin);\n return;\n }\n\n // Additional validation for message structure\n if (!event.data || typeof event.data !== \"object\") {\n console.warn(\"Invalid message data received\");\n return;\n }\n\n if (event.data.type === \"LOGIN_SUCCESS\") {\n const { refreshToken: refresh } = event.data;\n\n // Support both token formats from callback\n if (refresh) {\n handleTokenRefresh(refresh);\n }\n gotDataRef.current = true;\n cleanup();\n } else if (event.data.type === \"LOGIN_ERROR\") {\n const errorMessage = event.data.error || \"Login failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n gotDataRef.current = true;\n cleanup();\n }\n },\n [handleTokenRefresh, setIsLoading, cleanup, onError]\n );\n\n const signIn = useCallback(async (): Promise<void> => {\n const width = 500;\n const height = 600;\n const left = window.screenX + (window.outerWidth - width) / 2;\n const top = window.screenY + (window.outerHeight - height) / 2;\n\n try {\n errorRef.current = null;\n setIsLoading(true);\n const response = await signInWithGoogle();\n\n popupRef.current = window.open(\n `${response.statusMessage}`,\n \"oauthPopup\",\n `width=${width},height=${height},left=${left},top=${top},resizable,scrollbars`\n );\n\n // Ensure popup opened successfully\n if (!popupRef.current) {\n setIsLoading(false);\n const error = \"Popup blocked. Please allow popups for this site.\";\n errorRef.current = error;\n onPopupBlocked?.();\n onError?.(error);\n return;\n }\n\n timerRef.current = setInterval(() => {\n if (popupRef.current && popupRef.current.closed) {\n if (timerRef.current) {\n clearInterval(timerRef.current);\n timerRef.current = null;\n }\n if (!gotDataRef.current) {\n const error = \"Authentication popup was closed\";\n errorRef.current = error;\n onPopupClosed?.();\n onError?.(error);\n setIsLoading(false);\n }\n }\n }, 500);\n } catch (error: any) {\n const errorMessage = error instanceof Error ? error.message : \"Google sign in failed\";\n errorRef.current = errorMessage;\n onError?.(errorMessage);\n setIsLoading(false);\n }\n }, [signInWithGoogle, setIsLoading, handleMessage, onError, onPopupBlocked, onPopupClosed]);\n\n useEffect(() => {\n window.addEventListener(\"message\", handleMessage);\n return () => {\n window.removeEventListener(\"message\", handleMessage);\n };\n }, [handleMessage]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanup();\n };\n }, [cleanup, handleMessage]);\n\n return {\n signIn,\n isLoading,\n error: errorRef.current,\n };\n}\n","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};","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 useCreateCertificate,\n useCreateCertificateAnonymous,\n useCreateCertificateWithMask,\n} from \"@phygitallabs/generate-certificate\";\n\nexport {\n useGenerateThaocamvienCertificate,\n useGenerateTemplateCertificate,\n useGenerateFansipanCertificate,\n useCreateCertificate,\n useCreateCertificateAnonymous,\n useCreateCertificateWithMask,\n};\n","import { wrapTextWithFont } from \"@phygitallabs/generate-certificate\";\n\nexport { wrapTextWithFont };\n","import posthog from \"posthog-js\";\nimport { useSessionReplay } from \"../../../modules/session-replay\";\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 { setUserId, setMetadata } = useSessionReplay();\n\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 const trackUserIdentify = (userInfo: Record<string, any>) => {\n posthog.identify(userInfo.email, {\n email: userInfo.email,\n name: userInfo.name,\n avatar: userInfo.avatar,\n uid: userInfo.uid,\n });\n\n setUserId(userInfo.id);\n\n setMetadata({\n user_email: userInfo.email\n })\n }\n\n const trackLogoutEvent = () => {\n posthog.capture(\"user_signed_out\");\n }\n\n return {\n trackEvent,\n trackUserIdentify,\n trackLogoutEvent\n };\n}\n\nexport { useDataTracking };\n\n","import React, { createContext, useEffect, useReducer } from \"react\";\nimport { v4 as uuidV4 } from \"uuid\";\n\nimport {\n SessionReplayProviderProps,\n TrackerState,\n TrackerAction,\n TrackerContextValue,\n OpenReplayConfig,\n} from \"../types\";\n\nimport {\n isBrowser\n} from \"../utils\";\n\nexport const TrackerContext = createContext<TrackerContextValue | null>(null);\n\nfunction defaultGetUserId(): string {\n return uuidV4();\n}\n\nasync function newTracker(config: OpenReplayConfig) {\n try {\n // Dynamic import for SSR compatibility\n const OpenReplay = (await import(\"@openreplay/tracker\")).default;\n\n // Get user ID function (custom or default UUID generator)\n const getUserId =\n config?.userIdEnabled && config?.getUserId\n ? config.getUserId\n : defaultGetUserId;\n\n // Build tracker configuration\n const trackerConfig: any = {\n projectKey:\n config?.projectKey || process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY,\n ingestPoint: config?.ingestPoint,\n // Capture options\n captureExceptions: config.captureExceptions ?? true,\n capturePerformance: config.capturePerformance ?? true,\n // Network tracking\n network: config.network || {\n capturePayload: true,\n sanitizer: (data: any) => data,\n },\n // Console tracking\n console: config.console || {\n levels: [\"error\", \"warn\", \"log\"],\n },\n // Privacy settings\n obscureTextEmails: config.obscureTextEmails ?? true,\n obscureTextNumbers: config.obscureTextNumbers ?? false,\n obscureInputEmails: config.obscureInputEmails ?? true,\n // Development mode\n __DISABLE_SECURE_MODE:\n config.__DISABLE_SECURE_MODE ??\n (typeof process !== \"undefined\" && process.env?.NODE_ENV === \"development\"),\n };\n\n // Initialize tracker\n const tracker = new OpenReplay(trackerConfig);\n\n // Set user ID if enabled\n if (config?.userIdEnabled) {\n const userId = getUserId();\n tracker.setUserID(userId);\n console.log(\"User ID set:\", userId);\n }\n\n console.log(\"OpenReplay tracker initialized\");\n console.log(\"Project Key:\", trackerConfig.projectKey);\n console.log(\"Ingest Point:\", trackerConfig.ingestPoint);\n\n return tracker;\n } catch (error: any) {\n console.error(\"Failed to create tracker:\", error);\n throw error;\n }\n}\n\nfunction reducer(state: TrackerState, action: TrackerAction): TrackerState {\n const { debug = false } = state.config;\n\n switch (action.type) {\n case \"init\":\n // Only initialize if tracker doesn't exist and we're in browser\n if (!state.tracker && isBrowser()) {\n if (!state.config.projectKey && !process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY) {\n console.warn(\n debug,\n \"Project key not found. Skipping session replay initialization.\"\n );\n return state;\n }\n\n // Return state with tracker promise\n // The tracker will be created asynchronously\n return {\n ...state,\n tracker: newTracker(state.config),\n };\n }\n return state;\n\n case \"start\":\n // Start tracking if tracker exists\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n tracker.start();\n console.log(debug, \"Session replay tracker started\");\n })\n .catch((error) => {\n console.error(\"Failed to start tracker:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n case \"setUserId\":\n // Set or update user ID\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n tracker.setUserID(action.payload);\n console.log(debug, \"User ID updated:\", action.payload);\n })\n .catch((error) => {\n console.error(\"Failed to set user ID:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n // Set metadata\n case \"setMetadata\":\n if (state.tracker) {\n Promise.resolve(state.tracker)\n .then((tracker) => {\n Object.entries(action.payload || {})?.forEach(([key, value]) => {\n tracker.setMetadata(key, value);\n });\n\n console.log(debug, \"Metadata updated:\", action.payload.metadata);\n })\n .catch((error) => {\n console.error(\"Failed to set metadata:\", error);\n });\n } else {\n console.warn(debug, \"Tracker not initialized. Call initTracker() first.\");\n }\n return state;\n\n default:\n return state;\n }\n}\n\nexport const SessionReplayProvider: React.FC<SessionReplayProviderProps> = ({\n children,\n config = {},\n}) => {\n const [, dispatch] = useReducer(reducer, {\n tracker: null,\n config,\n });\n\n const initTracker = () => dispatch({ type: \"init\" })\n const startTracking = () => dispatch({ type: \"start\" })\n const setUserId = (userId: string) => dispatch({ type: \"setUserId\", payload: userId })\n const setMetadata = (metadata: Record<string, any>) => dispatch({ type: \"setMetadata\", payload: metadata })\n\n // init and start tracker\n useEffect(() => {\n initTracker();\n startTracking();\n }, []);\n\n return <TrackerContext.Provider value={{\n initTracker,\n startTracking,\n setUserId,\n setMetadata\n }}>{children}</TrackerContext.Provider>;\n};\n\nexport default SessionReplayProvider;\n","import { getDeviceUid } from \"../../auth/helpers\";\n\nexport const getSessionUserId = (userId?: string): string | null => {\n if (userId) {\n return userId;\n }\n return getDeviceUid();\n};\n\nexport const isBrowser = (): boolean => {\n return typeof window !== \"undefined\";\n};\n","import { useContext } from \"react\";\nimport { TrackerContext } from \"../providers/SessionReplayProvider\";\nimport { TrackerContextValue } from \"../types\";\n\nexport function useSessionReplay(): TrackerContextValue {\n const context = useContext(TrackerContext);\n\n if (!context) {\n throw new Error(\n \"useSessionReplay must be used within a SessionReplayProvider. \" +\n \"Make sure your component is wrapped with <SessionReplayProvider>.\"\n );\n }\n\n return context;\n}\n","import React, { useMemo } from \"react\";\n\nimport { ServicesProvider } from \"./ServicesProvider\";\nimport { APIConfig } from \"../types/service\";\nimport { QueryClient } from \"@tanstack/react-query\";\n\nimport { AuthProvider } from \"../modules/auth\";\nimport serviceApiUrl from \"../constants/service\";\nimport { OpenReplayConfig, SessionReplayProvider } from \"../modules/session-replay\";\n\ninterface TapquestCoreProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n}\n\nexport const TapquestCoreProvider: React.FC<TapquestCoreProviderProps> = ({\n children,\n queryClient,\n apiConfig,\n // authCallbacks\n}) => {\n const { environment } = apiConfig;\n\n const sessionReplayConfig: OpenReplayConfig | undefined = useMemo(() => {\n const projectKey = process.env.NEXT_PUBLIC_OPENREPLAY_PROJECT_KEY;\n\n // Only configure if project key is provided\n if (!projectKey) {\n return undefined;\n }\n\n return {\n projectKey,\n ingestPoint: process.env.NEXT_PUBLIC_OPENREPLAY_INGEST_POINT,\n debug: process.env.NODE_ENV === \"development\",\n captureExceptions: true,\n capturePerformance: true,\n obscureTextEmails: true,\n obscureInputEmails: true,\n };\n }, []);\n\n return (\n <SessionReplayProvider config={sessionReplayConfig}>\n <ServicesProvider\n queryClient={queryClient}\n apiConfig={apiConfig}\n >\n <AuthProvider\n baseURL={`${serviceApiUrl[environment].API_BASE_URL}`}\n queryClient={queryClient}\n >\n {children}\n </AuthProvider>\n </ServicesProvider>\n </SessionReplayProvider>\n );\n};","import React, { useEffect, useState } 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 } from \"../modules/auth/helpers\";\n\ninterface ServicesProviderProps {\n children: React.ReactNode;\n queryClient: QueryClient;\n apiConfig: APIConfig;\n}\n\nexport const ServicesProvider: React.FC<ServicesProviderProps> = ({\n children,\n queryClient,\n apiConfig = {\n environment: \"dev\",\n version: \"v1\"\n },\n}) => {\n const { environment, version } = apiConfig;\n const [commonServiceConfig, setCommonServiceConfig] = useState<ServiceConfig | null>(null);\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) => Promise.reject(error),\n })\n\n const requestInterceptors = ({\n onFulfilled: (config: any) => config,\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 { Achievement, useManyAchievements } from \"@phygitallabs/achievement\";\nimport { EntityRewardModel } from \"@phygitallabs/reward\";\nimport { useCreateModelGroupReward } from \"@phygitallabs/reward\";\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":["index_exports","__export","ALLOWED_ORIGINS","AchievementRuleActionType","AchievementServiceProvider","AchievementType","AuthProvider","CALLBACK_URL","CampaignState","CmentityRewardType","NotificationProvider","RewardClaimStatus","TapquestCoreProvider","TaskType","UserSourceType","accessTokenKey","checkDeviceUid","chipAuthTokenKey","cn","convertSnakeToCamel","deviceUIDKey","fileToBase64","filterLocationsByProperty","generateDeviceId","getAccessToken","getActionsFromAchievementRule","getChipAuthToken","getDeviceUid","getLocationIdsFromAchievementRule","getRefreshToken","getRetryAttemptsRefreshToken","getUserInfo","httpMaxRetries","isAchievementCompleted","locationQueryKeys","memoriesKey","parse","refreshTokenKey","removeAccessToken","removeChipAuthToken","removeDeviceUid","removeRefreshToken","removeUserInfo","resetMemoriesQuery","retryAttemptsRefreshToken","setAccessToken","setChipAuthToken","setDeviceUid","setRefreshToken","setRetryAttemptsRefreshToken","setUserInfo","sortLocationsByIndex","useAchievementProgress","achivementPlusRewardModel_default","useAuth","useOneCampaign","useCancelUserRewardsRequest","useChipScanStory","useClaimUserReward","useClearUserRewardCache","useCreateCertificate","useCreateCertificateAnonymous","useCreateCertificateWithMask","useCreateMemory","useCreateModelGroupReward","useCreateRewardModel","useDataTracking","useDeleteRewardModel","useGenerateFansipanCertificate","useGenerateTemplateCertificate","useGenerateThaocamvienCertificate","useGetRewardModel","useGetUserRewards","useGoogleLogin","useInfiniteMemories","useListRewardModels","useOneLocation","useUserCampaignsCompletedLocation","useManyLocations","useManyAchievementProgress","useManyAchievements","useManyAchievementsRewardModels","useManyChildrenAchievements","useManyMemory","useManyUserActionLocations","useManyUserRewards","useMyProfile","useOneAchievement","useOneMemory","useOneUserCampaign","usePGLCoreService","useScanChip","useSendEmail","useSyncCheckin","useUpdateMyProfile","useUpdateRewardModel","useUploadMedia","useUserAchievementAction","useUserCampaignAction","useV1ListRewards","userInfoKey","wrapTextWithFont","src_exports","__export","ALLOWED_ORIGINS","AchievementRuleActionType","AchievementServiceProvider","AchievementType","AuthProvider","CALLBACK_URL","CampaignState","CmentityRewardType","NotificationProvider","RewardClaimStatus","TapquestCoreProvider","TaskType","UserSourceType","accessTokenKey","checkDeviceUid","chipAuthTokenKey","cn","convertSnakeToCamel","deviceUIDKey","fileToBase64","filterLocationsByProperty","generateDeviceId","getAccessToken","getActionsFromAchievementRule","getChipAuthToken","getDeviceUid","getLocationIdsFromAchievementRule","getRefreshToken","getRetryAttemptsRefreshToken","getUserInfo","httpMaxRetries","isAchievementCompleted","locationQueryKeys","memoriesKey","parse","refreshTokenKey","removeAccessToken","removeChipAuthToken","removeDeviceUid","removeRefreshToken","removeUserInfo","resetMemoriesQuery","retryAttemptsRefreshToken","setAccessToken","setChipAuthToken","setDeviceUid","setRefreshToken","setRetryAttemptsRefreshToken","setUserInfo","sortLocationsByIndex","useAchievementProgress","achivementPlusRewardModel_default","useAuth","useOneCampaign","useCancelUserRewardsRequest","useChipScanStory","useClaimUserReward","useClearUserRewardCache","useCreateCertificate","useCreateCertificateAnonymous","useCreateCertificateWithMask","useCreateMemory","useCreateModelGroupReward","useCreateRewardModel","useDataTracking","useDeleteRewardModel","useGenerateFansipanCertificate","useGenerateTemplateCertificate","useGenerateThaocamvienCertificate","useGetRewardModel","useGetUserRewards","useGoogleLogin","useInfiniteMemories","useListRewardModels","useOneLocation","useUserCampaignsCompletedLocation","useManyLocations","useManyAchievementProgress","useManyAchievements","useManyAchievementsRewardModels","useManyChildrenAchievements","useManyMemory","useManyUserActionLocations","useManyUserRewards","useMyProfile","useOneAchievement","useOneMemory","useOneUserCampaign","usePGLCoreService","useScanChip","useSendEmail","useSyncCheckin","useUpdateMyProfile","useUpdateRewardModel","useUploadMedia","useUserAchievementAction","useUserCampaignAction","useV1ListRewards","userInfoKey","wrapTextWithFont","useManyAchievementProgressCore","useManyAchievementProgressByDeviceCore","useAchievementProgress","useManyAchievements","useUserAchievementAction","useManyChildrenAchievements","useOneAchievement","useManyAchievementsRewardModels","getLocationIdsFromAchievementRule","achievement","locationIds","ruleList","rule","filterList","filter","getActionsFromAchievementRule","actions","isAchievementCompleted","convertSnakeToCamel","obj","item","converted","key","camelKey","_","letter","useManyAchievementProgress","params","options","isLoggedIn","queryParams","useManyAchievementProgressCore","data","item","isAchievementCompleted","useManyAchievementProgressByDeviceCore","convertSnakeToCamel","AchievementRuleActionType","AchievementServiceProvider","AchievementType","useManyUserRewards","useGetUserRewards","useClaimUserReward","useListRewardModels","useGetRewardModel","useCreateRewardModel","useUpdateRewardModel","useDeleteRewardModel","useCreateModelGroupReward","useClearUserRewardCache","useV1ListRewards","CmentityRewardType","RewardClaimStatus","notification_exports","__export","NotificationProvider","__reExport","notification_api_star","NotificationProviderApi","serviceApiUrl","service_default","jsx","NotificationProvider","children","autoConnect","environment","user","onWebSocketOpen","onWebSocketClose","onWebSocketMessage","webSocketUrl","service_default","NotificationProviderApi","__reExport","src_exports","notification_exports","useOneMemory","useManyMemory","useInfiniteMemories","useCreateMemory","useUploadMedia","resetMemoriesQuery","memoriesKey","AuthenticationProvider","useAuthenticationHeaders","tokenStorage","useEffect","create","immer","createJSONStorage","devtools","persist","subscribeWithSelector","authService","verifyCodeService","tokenStorage","userInfoKey","accessTokenKey","refreshTokenKey","httpMaxRetries","retryAttemptsRefreshToken","deviceUIDKey","chipAuthTokenKey","CALLBACK_URL","ALLOWED_ORIGINS","initialState","useAuthStore","create","devtools","persist","subscribeWithSelector","immer","set","get","isLoading","state","newCleanupFunctions","callbacks","email","password","eventCallbacks","response","authService","tokenStorage","error","errorMessage","currentDomain","CALLBACK_URL","cleanupFunctions","refreshToken","cleanupError","verifyCodeService","data","user","isSignedIn","isInitialized","token","wasSignedIn","createJSONStorage","useAuth","actions","jwtDecode","transformProtoUserData","user","accessToken","userData","tokenDecoded","error","userService","usePGLCoreService","useAchievementService","useRewardService","useGenerateCertificateService","useQuery","tokenStorage","useTokenRefresher","refreshToken","signOut","useAuth","handleRefreshToken","newToken","error","useQuery","jsx","jsxs","AuthStateManager","updateHeaders","useAuthenticationHeaders","updateHeadersPGL","coreApi","usePGLCoreService","updateHeadersAchievement","useAchievementService","updateHeadersReward","useRewardService","updateHeadersGenerateCertificate","useGenerateCertificateService","useEffect","useAuthStore","token","tokenStorage","user","previousIsSignedIn","unsub","state","isSignedIn","userProfile","userService","transformedUserData","transformProtoUserData","eventCallbacks","unsubTokenChange","TokenRefresher","useTokenRefresher","AuthProvider","children","baseURL","queryClient","AuthenticationProvider","useRef","useCallback","useEffect","tokenStorage","useGoogleLogin","options","onSuccess","onError","onPopupBlocked","onPopupClosed","signInWithGoogle","refreshToken","setIsSignedIn","setIsLoading","isLoading","useAuth","popupRef","useRef","gotDataRef","timerRef","errorRef","handleTokenRefresh","useCallback","refresh","newToken","tokenStorage","error","errorMessage","cleanup","handleMessage","event","allowedOrigins","ALLOWED_ORIGINS","signIn","left","top","response","useEffect","uuidv4","generateDeviceId","generateDeviceFingerprint","error","timestamp","fingerprintRaw","data","hashBuffer","b","getDeviceUid","deviceUIDKey","setDeviceUid","deviceId","removeDeviceUid","checkDeviceUid","deviceUID","generateDeviceId","getChipAuthToken","chipAuthTokenKey","setChipAuthToken","value","removeChipAuthToken","getRetryAttemptsRefreshToken","retryAttemptsRefreshToken","setRetryAttemptsRefreshToken","getAccessToken","accessTokenKey","setAccessToken","removeAccessToken","getRefreshToken","refreshTokenKey","setRefreshToken","removeRefreshToken","getUserInfo","userInfo","userInfoKey","error","setUserInfo","userData","removeUserInfo","useMyProfile","useUpdateMyProfile","useSyncCheckin","useCancelUserRewardsRequest","UserSourceType","useEffect","useChipScanStory","usePGLCoreService","useScanChip","token","id","onScanChipError","updateHeaders","usePGLCoreService","useEffect","header","setChipAuthToken","data","isLoading","isError","isSuccess","useChipScanStory","useOneCampaign","useUserCampaignAction","useOneUserCampaign","CampaignState","TaskType","useManyLocations","useOneLocation","useUserCampaignsCompletedLocation","useManyUserActionLocations","locationQueryKeys","sortLocationsByIndex","locations","a","b","filterLocationsByProperty","propertyName","value","location","useGenerateThaocamvienCertificate","useGenerateTemplateCertificate","useGenerateFansipanCertificate","useCreateCertificate","useCreateCertificateAnonymous","useCreateCertificateWithMask","wrapTextWithFont","posthog","createContext","useEffect","useReducer","uuidV4","isBrowser","jsx","TrackerContext","createContext","defaultGetUserId","uuidV4","newTracker","config","OpenReplay","getUserId","trackerConfig","data","tracker","userId","error","reducer","state","action","debug","isBrowser","key","value","SessionReplayProvider","children","dispatch","useReducer","initTracker","startTracking","setUserId","setMetadata","metadata","useEffect","useContext","useSessionReplay","context","useContext","TrackerContext","pushEventToDataLayer","event","data","error","pushEventToGA","eventName","eventData","pushEventToPosthog","posthog","useDataTracking","setUserId","setMetadata","useSessionReplay","useTools","userInfo","useMemo","useEffect","useState","PGLCoreServiceProvider","RewardServiceProvider","AchievementServiceProvider","GenerateCertificateServiceProvider","Fragment","jsx","ServicesProvider","children","queryClient","apiConfig","environment","version","commonServiceConfig","setCommonServiceConfig","useState","useEffect","deviceUid","checkDeviceUid","response","error","config","PGLCoreServiceProvider","service_default","RewardServiceProvider","AchievementServiceProvider","GenerateCertificateServiceProvider","jsx","TapquestCoreProvider","children","queryClient","apiConfig","environment","sessionReplayConfig","useMemo","projectKey","SessionReplayProvider","ServicesProvider","AuthProvider","service_default","useManyAchievements","useCreateModelGroupReward","useEffect","useMemo","buildMappedAchievements","achievements","groupRewardData","rewardModels","achievement","achievementIndex","parentReward","subAchievements","subId","subIndex","reward","useAchivementPlusRewardModel","campaignId","isLoadingAchievements","groupRewardIds","id","fetchGroupRewardModels","groupRewardModelsData","isPendingGroupRewardModels","achivementPlusRewardModel_default","useSendEmail","cn","parse","fileToBase64","__reExport","index_exports","src_exports"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phygitallabs/tapquest-core",
3
- "version": "3.3.0",
3
+ "version": "4.0.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -8,8 +8,15 @@
8
8
  "main": "./dist/index.mjs",
9
9
  "module": "./dist/index.mjs",
10
10
  "types": "./dist/index.d.mts",
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.mjs",
14
+ "types": "./dist/index.d.mts"
15
+ },
16
+ "./package.json": "./package.json"
17
+ },
11
18
  "scripts": {
12
- "prepublishOnly": "npm run build",
19
+ "prepublishOnly": "bun run build",
13
20
  "build": "tsup",
14
21
  "dev": "tsup --watch"
15
22
  },
package/tsup.config.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { defineConfig } from "tsup";
2
2
 
3
3
  export default defineConfig({
4
- entry: ["src/index.ts"],
4
+ entry: ["index.ts"],
5
5
  format: ["esm"],
6
6
  outExtension: () => ({ js: '.mjs' }),
7
7
  dts: true,