@oxyhq/core 1.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.
Files changed (277) hide show
  1. package/README.md +50 -0
  2. package/dist/cjs/AuthManager.js +361 -0
  3. package/dist/cjs/CrossDomainAuth.js +258 -0
  4. package/dist/cjs/HttpService.js +618 -0
  5. package/dist/cjs/OxyServices.base.js +263 -0
  6. package/dist/cjs/OxyServices.errors.js +22 -0
  7. package/dist/cjs/OxyServices.js +63 -0
  8. package/dist/cjs/constants/version.js +16 -0
  9. package/dist/cjs/crypto/index.js +20 -0
  10. package/dist/cjs/crypto/keyManager.js +887 -0
  11. package/dist/cjs/crypto/polyfill.js +64 -0
  12. package/dist/cjs/crypto/recoveryPhrase.js +169 -0
  13. package/dist/cjs/crypto/signatureService.js +296 -0
  14. package/dist/cjs/i18n/index.js +73 -0
  15. package/dist/cjs/i18n/locales/ar-SA.json +120 -0
  16. package/dist/cjs/i18n/locales/ca-ES.json +120 -0
  17. package/dist/cjs/i18n/locales/de-DE.json +120 -0
  18. package/dist/cjs/i18n/locales/en-US.json +956 -0
  19. package/dist/cjs/i18n/locales/es-ES.json +944 -0
  20. package/dist/cjs/i18n/locales/fr-FR.json +120 -0
  21. package/dist/cjs/i18n/locales/it-IT.json +120 -0
  22. package/dist/cjs/i18n/locales/ja-JP.json +119 -0
  23. package/dist/cjs/i18n/locales/ko-KR.json +120 -0
  24. package/dist/cjs/i18n/locales/locales/ar-SA.json +120 -0
  25. package/dist/cjs/i18n/locales/locales/ca-ES.json +120 -0
  26. package/dist/cjs/i18n/locales/locales/de-DE.json +120 -0
  27. package/dist/cjs/i18n/locales/locales/en-US.json +956 -0
  28. package/dist/cjs/i18n/locales/locales/es-ES.json +944 -0
  29. package/dist/cjs/i18n/locales/locales/fr-FR.json +120 -0
  30. package/dist/cjs/i18n/locales/locales/it-IT.json +120 -0
  31. package/dist/cjs/i18n/locales/locales/ja-JP.json +119 -0
  32. package/dist/cjs/i18n/locales/locales/ko-KR.json +120 -0
  33. package/dist/cjs/i18n/locales/locales/pt-PT.json +120 -0
  34. package/dist/cjs/i18n/locales/locales/zh-CN.json +120 -0
  35. package/dist/cjs/i18n/locales/pt-PT.json +120 -0
  36. package/dist/cjs/i18n/locales/zh-CN.json +120 -0
  37. package/dist/cjs/index.js +153 -0
  38. package/dist/cjs/mixins/OxyServices.analytics.js +49 -0
  39. package/dist/cjs/mixins/OxyServices.assets.js +380 -0
  40. package/dist/cjs/mixins/OxyServices.auth.js +259 -0
  41. package/dist/cjs/mixins/OxyServices.developer.js +97 -0
  42. package/dist/cjs/mixins/OxyServices.devices.js +116 -0
  43. package/dist/cjs/mixins/OxyServices.features.js +309 -0
  44. package/dist/cjs/mixins/OxyServices.fedcm.js +435 -0
  45. package/dist/cjs/mixins/OxyServices.karma.js +108 -0
  46. package/dist/cjs/mixins/OxyServices.language.js +154 -0
  47. package/dist/cjs/mixins/OxyServices.location.js +43 -0
  48. package/dist/cjs/mixins/OxyServices.payment.js +158 -0
  49. package/dist/cjs/mixins/OxyServices.popup.js +371 -0
  50. package/dist/cjs/mixins/OxyServices.privacy.js +162 -0
  51. package/dist/cjs/mixins/OxyServices.redirect.js +345 -0
  52. package/dist/cjs/mixins/OxyServices.security.js +81 -0
  53. package/dist/cjs/mixins/OxyServices.user.js +355 -0
  54. package/dist/cjs/mixins/OxyServices.utility.js +156 -0
  55. package/dist/cjs/mixins/index.js +79 -0
  56. package/dist/cjs/mixins/mixinHelpers.js +53 -0
  57. package/dist/cjs/models/interfaces.js +20 -0
  58. package/dist/cjs/models/session.js +2 -0
  59. package/dist/cjs/shared/index.js +70 -0
  60. package/dist/cjs/shared/utils/colorUtils.js +153 -0
  61. package/dist/cjs/shared/utils/debugUtils.js +73 -0
  62. package/dist/cjs/shared/utils/errorUtils.js +183 -0
  63. package/dist/cjs/shared/utils/index.js +49 -0
  64. package/dist/cjs/shared/utils/networkUtils.js +183 -0
  65. package/dist/cjs/shared/utils/themeUtils.js +106 -0
  66. package/dist/cjs/utils/apiUtils.js +61 -0
  67. package/dist/cjs/utils/asyncUtils.js +194 -0
  68. package/dist/cjs/utils/cache.js +226 -0
  69. package/dist/cjs/utils/deviceManager.js +205 -0
  70. package/dist/cjs/utils/errorUtils.js +154 -0
  71. package/dist/cjs/utils/index.js +26 -0
  72. package/dist/cjs/utils/languageUtils.js +165 -0
  73. package/dist/cjs/utils/loggerUtils.js +126 -0
  74. package/dist/cjs/utils/platform.js +144 -0
  75. package/dist/cjs/utils/requestUtils.js +209 -0
  76. package/dist/cjs/utils/sessionUtils.js +181 -0
  77. package/dist/cjs/utils/validationUtils.js +173 -0
  78. package/dist/esm/AuthManager.js +356 -0
  79. package/dist/esm/CrossDomainAuth.js +253 -0
  80. package/dist/esm/HttpService.js +614 -0
  81. package/dist/esm/OxyServices.base.js +259 -0
  82. package/dist/esm/OxyServices.errors.js +17 -0
  83. package/dist/esm/OxyServices.js +59 -0
  84. package/dist/esm/constants/version.js +13 -0
  85. package/dist/esm/crypto/index.js +13 -0
  86. package/dist/esm/crypto/keyManager.js +850 -0
  87. package/dist/esm/crypto/polyfill.js +61 -0
  88. package/dist/esm/crypto/recoveryPhrase.js +132 -0
  89. package/dist/esm/crypto/signatureService.js +259 -0
  90. package/dist/esm/i18n/index.js +69 -0
  91. package/dist/esm/i18n/locales/ar-SA.json +120 -0
  92. package/dist/esm/i18n/locales/ca-ES.json +120 -0
  93. package/dist/esm/i18n/locales/de-DE.json +120 -0
  94. package/dist/esm/i18n/locales/en-US.json +956 -0
  95. package/dist/esm/i18n/locales/es-ES.json +944 -0
  96. package/dist/esm/i18n/locales/fr-FR.json +120 -0
  97. package/dist/esm/i18n/locales/it-IT.json +120 -0
  98. package/dist/esm/i18n/locales/ja-JP.json +119 -0
  99. package/dist/esm/i18n/locales/ko-KR.json +120 -0
  100. package/dist/esm/i18n/locales/locales/ar-SA.json +120 -0
  101. package/dist/esm/i18n/locales/locales/ca-ES.json +120 -0
  102. package/dist/esm/i18n/locales/locales/de-DE.json +120 -0
  103. package/dist/esm/i18n/locales/locales/en-US.json +956 -0
  104. package/dist/esm/i18n/locales/locales/es-ES.json +944 -0
  105. package/dist/esm/i18n/locales/locales/fr-FR.json +120 -0
  106. package/dist/esm/i18n/locales/locales/it-IT.json +120 -0
  107. package/dist/esm/i18n/locales/locales/ja-JP.json +119 -0
  108. package/dist/esm/i18n/locales/locales/ko-KR.json +120 -0
  109. package/dist/esm/i18n/locales/locales/pt-PT.json +120 -0
  110. package/dist/esm/i18n/locales/locales/zh-CN.json +120 -0
  111. package/dist/esm/i18n/locales/pt-PT.json +120 -0
  112. package/dist/esm/i18n/locales/zh-CN.json +120 -0
  113. package/dist/esm/index.js +55 -0
  114. package/dist/esm/mixins/OxyServices.analytics.js +46 -0
  115. package/dist/esm/mixins/OxyServices.assets.js +377 -0
  116. package/dist/esm/mixins/OxyServices.auth.js +256 -0
  117. package/dist/esm/mixins/OxyServices.developer.js +94 -0
  118. package/dist/esm/mixins/OxyServices.devices.js +113 -0
  119. package/dist/esm/mixins/OxyServices.features.js +306 -0
  120. package/dist/esm/mixins/OxyServices.fedcm.js +433 -0
  121. package/dist/esm/mixins/OxyServices.karma.js +105 -0
  122. package/dist/esm/mixins/OxyServices.language.js +118 -0
  123. package/dist/esm/mixins/OxyServices.location.js +40 -0
  124. package/dist/esm/mixins/OxyServices.payment.js +155 -0
  125. package/dist/esm/mixins/OxyServices.popup.js +369 -0
  126. package/dist/esm/mixins/OxyServices.privacy.js +159 -0
  127. package/dist/esm/mixins/OxyServices.redirect.js +343 -0
  128. package/dist/esm/mixins/OxyServices.security.js +78 -0
  129. package/dist/esm/mixins/OxyServices.user.js +352 -0
  130. package/dist/esm/mixins/OxyServices.utility.js +153 -0
  131. package/dist/esm/mixins/index.js +76 -0
  132. package/dist/esm/mixins/mixinHelpers.js +48 -0
  133. package/dist/esm/models/interfaces.js +17 -0
  134. package/dist/esm/models/session.js +1 -0
  135. package/dist/esm/shared/index.js +31 -0
  136. package/dist/esm/shared/utils/colorUtils.js +143 -0
  137. package/dist/esm/shared/utils/debugUtils.js +65 -0
  138. package/dist/esm/shared/utils/errorUtils.js +170 -0
  139. package/dist/esm/shared/utils/index.js +15 -0
  140. package/dist/esm/shared/utils/networkUtils.js +173 -0
  141. package/dist/esm/shared/utils/themeUtils.js +98 -0
  142. package/dist/esm/utils/apiUtils.js +55 -0
  143. package/dist/esm/utils/asyncUtils.js +179 -0
  144. package/dist/esm/utils/cache.js +218 -0
  145. package/dist/esm/utils/deviceManager.js +168 -0
  146. package/dist/esm/utils/errorUtils.js +146 -0
  147. package/dist/esm/utils/index.js +7 -0
  148. package/dist/esm/utils/languageUtils.js +158 -0
  149. package/dist/esm/utils/loggerUtils.js +115 -0
  150. package/dist/esm/utils/platform.js +102 -0
  151. package/dist/esm/utils/requestUtils.js +203 -0
  152. package/dist/esm/utils/sessionUtils.js +171 -0
  153. package/dist/esm/utils/validationUtils.js +153 -0
  154. package/dist/types/AuthManager.d.ts +143 -0
  155. package/dist/types/CrossDomainAuth.d.ts +160 -0
  156. package/dist/types/HttpService.d.ts +163 -0
  157. package/dist/types/OxyServices.base.d.ts +126 -0
  158. package/dist/types/OxyServices.d.ts +81 -0
  159. package/dist/types/OxyServices.errors.d.ts +11 -0
  160. package/dist/types/constants/version.d.ts +13 -0
  161. package/dist/types/crypto/index.d.ts +11 -0
  162. package/dist/types/crypto/keyManager.d.ts +189 -0
  163. package/dist/types/crypto/polyfill.d.ts +11 -0
  164. package/dist/types/crypto/recoveryPhrase.d.ts +58 -0
  165. package/dist/types/crypto/signatureService.d.ts +86 -0
  166. package/dist/types/i18n/index.d.ts +3 -0
  167. package/dist/types/index.d.ts +50 -0
  168. package/dist/types/mixins/OxyServices.analytics.d.ts +66 -0
  169. package/dist/types/mixins/OxyServices.assets.d.ts +135 -0
  170. package/dist/types/mixins/OxyServices.auth.d.ts +186 -0
  171. package/dist/types/mixins/OxyServices.developer.d.ts +99 -0
  172. package/dist/types/mixins/OxyServices.devices.d.ts +96 -0
  173. package/dist/types/mixins/OxyServices.features.d.ts +228 -0
  174. package/dist/types/mixins/OxyServices.fedcm.d.ts +200 -0
  175. package/dist/types/mixins/OxyServices.karma.d.ts +85 -0
  176. package/dist/types/mixins/OxyServices.language.d.ts +81 -0
  177. package/dist/types/mixins/OxyServices.location.d.ts +64 -0
  178. package/dist/types/mixins/OxyServices.payment.d.ts +111 -0
  179. package/dist/types/mixins/OxyServices.popup.d.ts +205 -0
  180. package/dist/types/mixins/OxyServices.privacy.d.ts +122 -0
  181. package/dist/types/mixins/OxyServices.redirect.d.ts +245 -0
  182. package/dist/types/mixins/OxyServices.security.d.ts +78 -0
  183. package/dist/types/mixins/OxyServices.user.d.ts +182 -0
  184. package/dist/types/mixins/OxyServices.utility.d.ts +93 -0
  185. package/dist/types/mixins/index.d.ts +30 -0
  186. package/dist/types/mixins/mixinHelpers.d.ts +31 -0
  187. package/dist/types/models/interfaces.d.ts +415 -0
  188. package/dist/types/models/session.d.ts +27 -0
  189. package/dist/types/shared/index.d.ts +28 -0
  190. package/dist/types/shared/utils/colorUtils.d.ts +104 -0
  191. package/dist/types/shared/utils/debugUtils.d.ts +48 -0
  192. package/dist/types/shared/utils/errorUtils.d.ts +97 -0
  193. package/dist/types/shared/utils/index.d.ts +13 -0
  194. package/dist/types/shared/utils/networkUtils.d.ts +139 -0
  195. package/dist/types/shared/utils/themeUtils.d.ts +90 -0
  196. package/dist/types/utils/apiUtils.d.ts +53 -0
  197. package/dist/types/utils/asyncUtils.d.ts +58 -0
  198. package/dist/types/utils/cache.d.ts +127 -0
  199. package/dist/types/utils/deviceManager.d.ts +65 -0
  200. package/dist/types/utils/errorUtils.d.ts +46 -0
  201. package/dist/types/utils/index.d.ts +6 -0
  202. package/dist/types/utils/languageUtils.d.ts +37 -0
  203. package/dist/types/utils/loggerUtils.d.ts +48 -0
  204. package/dist/types/utils/platform.d.ts +40 -0
  205. package/dist/types/utils/requestUtils.d.ts +123 -0
  206. package/dist/types/utils/sessionUtils.d.ts +54 -0
  207. package/dist/types/utils/validationUtils.d.ts +85 -0
  208. package/package.json +84 -0
  209. package/src/AuthManager.ts +436 -0
  210. package/src/CrossDomainAuth.ts +307 -0
  211. package/src/HttpService.ts +752 -0
  212. package/src/OxyServices.base.ts +334 -0
  213. package/src/OxyServices.errors.ts +26 -0
  214. package/src/OxyServices.ts +129 -0
  215. package/src/constants/version.ts +15 -0
  216. package/src/crypto/index.ts +25 -0
  217. package/src/crypto/keyManager.ts +962 -0
  218. package/src/crypto/polyfill.ts +70 -0
  219. package/src/crypto/recoveryPhrase.ts +166 -0
  220. package/src/crypto/signatureService.ts +323 -0
  221. package/src/i18n/index.ts +75 -0
  222. package/src/i18n/locales/ar-SA.json +120 -0
  223. package/src/i18n/locales/ca-ES.json +120 -0
  224. package/src/i18n/locales/de-DE.json +120 -0
  225. package/src/i18n/locales/en-US.json +956 -0
  226. package/src/i18n/locales/es-ES.json +944 -0
  227. package/src/i18n/locales/fr-FR.json +120 -0
  228. package/src/i18n/locales/it-IT.json +120 -0
  229. package/src/i18n/locales/ja-JP.json +119 -0
  230. package/src/i18n/locales/ko-KR.json +120 -0
  231. package/src/i18n/locales/pt-PT.json +120 -0
  232. package/src/i18n/locales/zh-CN.json +120 -0
  233. package/src/index.ts +153 -0
  234. package/src/mixins/OxyServices.analytics.ts +53 -0
  235. package/src/mixins/OxyServices.assets.ts +412 -0
  236. package/src/mixins/OxyServices.auth.ts +358 -0
  237. package/src/mixins/OxyServices.developer.ts +114 -0
  238. package/src/mixins/OxyServices.devices.ts +119 -0
  239. package/src/mixins/OxyServices.features.ts +428 -0
  240. package/src/mixins/OxyServices.fedcm.ts +494 -0
  241. package/src/mixins/OxyServices.karma.ts +111 -0
  242. package/src/mixins/OxyServices.language.ts +127 -0
  243. package/src/mixins/OxyServices.location.ts +46 -0
  244. package/src/mixins/OxyServices.payment.ts +163 -0
  245. package/src/mixins/OxyServices.popup.ts +443 -0
  246. package/src/mixins/OxyServices.privacy.ts +182 -0
  247. package/src/mixins/OxyServices.redirect.ts +397 -0
  248. package/src/mixins/OxyServices.security.ts +103 -0
  249. package/src/mixins/OxyServices.user.ts +392 -0
  250. package/src/mixins/OxyServices.utility.ts +191 -0
  251. package/src/mixins/index.ts +91 -0
  252. package/src/mixins/mixinHelpers.ts +69 -0
  253. package/src/models/interfaces.ts +511 -0
  254. package/src/models/session.ts +30 -0
  255. package/src/shared/index.ts +82 -0
  256. package/src/shared/utils/colorUtils.ts +155 -0
  257. package/src/shared/utils/debugUtils.ts +73 -0
  258. package/src/shared/utils/errorUtils.ts +181 -0
  259. package/src/shared/utils/index.ts +59 -0
  260. package/src/shared/utils/networkUtils.ts +248 -0
  261. package/src/shared/utils/themeUtils.ts +115 -0
  262. package/src/types/bip39.d.ts +32 -0
  263. package/src/types/buffer.d.ts +97 -0
  264. package/src/types/color.d.ts +20 -0
  265. package/src/types/elliptic.d.ts +62 -0
  266. package/src/utils/apiUtils.ts +88 -0
  267. package/src/utils/asyncUtils.ts +252 -0
  268. package/src/utils/cache.ts +264 -0
  269. package/src/utils/deviceManager.ts +198 -0
  270. package/src/utils/errorUtils.ts +216 -0
  271. package/src/utils/index.ts +21 -0
  272. package/src/utils/languageUtils.ts +174 -0
  273. package/src/utils/loggerUtils.ts +153 -0
  274. package/src/utils/platform.ts +117 -0
  275. package/src/utils/requestUtils.ts +237 -0
  276. package/src/utils/sessionUtils.ts +206 -0
  277. package/src/utils/validationUtils.ts +174 -0
@@ -0,0 +1,428 @@
1
+ /**
2
+ * Features Methods Mixin
3
+ *
4
+ * Provides methods for various features:
5
+ * - Feedback submission
6
+ * - Subscription plans
7
+ * - Saves/Collections
8
+ * - User history
9
+ * - FAQ
10
+ * - User stats
11
+ * - Achievements
12
+ */
13
+ import type { OxyServicesBase } from '../OxyServices.base';
14
+ import { CACHE_TIMES } from './mixinHelpers';
15
+
16
+ // Types
17
+ export interface FeedbackPayload {
18
+ type: 'bug' | 'feature' | 'general' | 'support';
19
+ title: string;
20
+ description: string;
21
+ priority: 'low' | 'medium' | 'high' | 'critical';
22
+ category: string;
23
+ contactEmail?: string;
24
+ systemInfo?: {
25
+ platform: string;
26
+ version: string;
27
+ appVersion: string;
28
+ userId?: string;
29
+ username?: string;
30
+ timestamp: string;
31
+ };
32
+ }
33
+
34
+ export interface FeedbackResult {
35
+ id: string;
36
+ status: string;
37
+ createdAt: string;
38
+ }
39
+
40
+ export interface SubscriptionPlan {
41
+ id: string;
42
+ name: string;
43
+ description: string;
44
+ price: number;
45
+ currency: string;
46
+ interval: 'month' | 'year';
47
+ features: string[];
48
+ }
49
+
50
+ export interface SubscriptionResult {
51
+ subscriptionId: string;
52
+ status: string;
53
+ currentPeriodEnd: string;
54
+ }
55
+
56
+ export interface SavedItem {
57
+ id: string;
58
+ itemId: string;
59
+ itemType: string;
60
+ title: string;
61
+ createdAt: string;
62
+ }
63
+
64
+ export interface Collection {
65
+ id: string;
66
+ name: string;
67
+ description?: string;
68
+ itemCount: number;
69
+ createdAt: string;
70
+ }
71
+
72
+ export interface UserStats {
73
+ postCount: number;
74
+ commentCount: number;
75
+ followerCount: number;
76
+ followingCount: number;
77
+ karmaScore?: number;
78
+ }
79
+
80
+ export interface HistoryItem {
81
+ id: string;
82
+ type: string;
83
+ title: string;
84
+ timestamp: string;
85
+ metadata?: Record<string, any>;
86
+ }
87
+
88
+ export interface FAQ {
89
+ id: string;
90
+ question: string;
91
+ answer: string;
92
+ category: string;
93
+ }
94
+
95
+ export interface Achievement {
96
+ id: string;
97
+ name: string;
98
+ description: string;
99
+ icon: string;
100
+ unlockedAt?: string;
101
+ }
102
+
103
+ export function OxyServicesFeaturesMixin<T extends typeof OxyServicesBase>(Base: T) {
104
+ return class extends Base {
105
+ constructor(...args: any[]) {
106
+ super(...(args as [any]));
107
+ }
108
+
109
+ // ==================
110
+ // FEEDBACK METHODS
111
+ // ==================
112
+
113
+ /**
114
+ * Submit user feedback
115
+ */
116
+ async submitFeedback(payload: FeedbackPayload): Promise<FeedbackResult> {
117
+ try {
118
+ return await this.makeRequest<FeedbackResult>('POST', '/api/feedback', payload, {
119
+ cache: false,
120
+ });
121
+ } catch (error) {
122
+ throw this.handleError(error);
123
+ }
124
+ }
125
+
126
+ // ==================
127
+ // SUBSCRIPTION METHODS
128
+ // ==================
129
+
130
+ /**
131
+ * Get available subscription plans
132
+ */
133
+ async getSubscriptionPlans(): Promise<SubscriptionPlan[]> {
134
+ try {
135
+ return await this.makeRequest<SubscriptionPlan[]>('GET', '/api/subscriptions/plans', undefined, {
136
+ cache: true,
137
+ cacheTTL: CACHE_TIMES.LONG,
138
+ });
139
+ } catch (error) {
140
+ throw this.handleError(error);
141
+ }
142
+ }
143
+
144
+ /**
145
+ * Get individual purchasable features
146
+ */
147
+ async getIndividualFeatures(): Promise<any[]> {
148
+ try {
149
+ return await this.makeRequest<any[]>('GET', '/api/subscriptions/features', undefined, {
150
+ cache: true,
151
+ cacheTTL: CACHE_TIMES.LONG,
152
+ });
153
+ } catch (error) {
154
+ throw this.handleError(error);
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Subscribe to a plan
160
+ */
161
+ async subscribe(planId: string, paymentMethodId?: string): Promise<SubscriptionResult> {
162
+ return this.withAuthRetry(async () => {
163
+ return await this.makeRequest<SubscriptionResult>('POST', '/api/subscriptions/subscribe', {
164
+ planId,
165
+ paymentMethodId,
166
+ }, { cache: false });
167
+ }, 'subscribe');
168
+ }
169
+
170
+ /**
171
+ * Subscribe to an individual feature
172
+ */
173
+ async subscribeToFeature(featureId: string, paymentMethodId?: string): Promise<SubscriptionResult> {
174
+ return this.withAuthRetry(async () => {
175
+ return await this.makeRequest<SubscriptionResult>('POST', '/api/subscriptions/features/subscribe', {
176
+ featureId,
177
+ paymentMethodId,
178
+ }, { cache: false });
179
+ }, 'subscribeToFeature');
180
+ }
181
+
182
+ /**
183
+ * Cancel subscription
184
+ */
185
+ async cancelSubscription(subscriptionId: string): Promise<void> {
186
+ return this.withAuthRetry(async () => {
187
+ await this.makeRequest('POST', `/api/subscriptions/${subscriptionId}/cancel`, undefined, {
188
+ cache: false,
189
+ });
190
+ }, 'cancelSubscription');
191
+ }
192
+
193
+ /**
194
+ * Reactivate subscription
195
+ */
196
+ async reactivateSubscription(subscriptionId: string): Promise<void> {
197
+ return this.withAuthRetry(async () => {
198
+ await this.makeRequest('POST', `/api/subscriptions/${subscriptionId}/reactivate`, undefined, {
199
+ cache: false,
200
+ });
201
+ }, 'reactivateSubscription');
202
+ }
203
+
204
+ /**
205
+ * Get current user's subscription
206
+ */
207
+ async getCurrentSubscription(): Promise<SubscriptionResult | null> {
208
+ return this.withAuthRetry(async () => {
209
+ try {
210
+ return await this.makeRequest<SubscriptionResult>('GET', '/api/subscriptions/current', undefined, {
211
+ cache: true,
212
+ cacheTTL: CACHE_TIMES.SHORT,
213
+ });
214
+ } catch (error: any) {
215
+ if (error.status === 404) return null;
216
+ throw error;
217
+ }
218
+ }, 'getCurrentSubscription');
219
+ }
220
+
221
+ // ==================
222
+ // SAVES/COLLECTIONS
223
+ // ==================
224
+
225
+ /**
226
+ * Get user's saved items
227
+ */
228
+ async getSavedItems(userId?: string): Promise<SavedItem[]> {
229
+ return this.withAuthRetry(async () => {
230
+ const endpoint = userId ? `/api/users/${userId}/saves` : '/api/saves';
231
+ return await this.makeRequest<SavedItem[]>('GET', endpoint, undefined, {
232
+ cache: true,
233
+ cacheTTL: CACHE_TIMES.SHORT,
234
+ });
235
+ }, 'getSavedItems');
236
+ }
237
+
238
+ /**
239
+ * Get user's collections
240
+ */
241
+ async getCollections(userId?: string): Promise<Collection[]> {
242
+ return this.withAuthRetry(async () => {
243
+ const endpoint = userId ? `/api/users/${userId}/collections` : '/api/collections';
244
+ return await this.makeRequest<Collection[]>('GET', endpoint, undefined, {
245
+ cache: true,
246
+ cacheTTL: CACHE_TIMES.SHORT,
247
+ });
248
+ }, 'getCollections');
249
+ }
250
+
251
+ /**
252
+ * Save an item
253
+ */
254
+ async saveItem(itemId: string, itemType: string, collectionId?: string): Promise<SavedItem> {
255
+ return this.withAuthRetry(async () => {
256
+ return await this.makeRequest<SavedItem>('POST', '/api/saves', {
257
+ itemId,
258
+ itemType,
259
+ collectionId,
260
+ }, { cache: false });
261
+ }, 'saveItem');
262
+ }
263
+
264
+ /**
265
+ * Remove an item from saves
266
+ */
267
+ async removeSavedItem(saveId: string): Promise<void> {
268
+ return this.withAuthRetry(async () => {
269
+ await this.makeRequest('DELETE', `/api/saves/${saveId}`, undefined, { cache: false });
270
+ }, 'removeSavedItem');
271
+ }
272
+
273
+ /**
274
+ * Create a collection
275
+ */
276
+ async createCollection(name: string, description?: string): Promise<Collection> {
277
+ return this.withAuthRetry(async () => {
278
+ return await this.makeRequest<Collection>('POST', '/api/collections', {
279
+ name,
280
+ description,
281
+ }, { cache: false });
282
+ }, 'createCollection');
283
+ }
284
+
285
+ /**
286
+ * Delete a collection
287
+ */
288
+ async deleteCollection(collectionId: string): Promise<void> {
289
+ return this.withAuthRetry(async () => {
290
+ await this.makeRequest('DELETE', `/api/collections/${collectionId}`, undefined, { cache: false });
291
+ }, 'deleteCollection');
292
+ }
293
+
294
+ // ==================
295
+ // USER STATS
296
+ // ==================
297
+
298
+ /**
299
+ * Get user statistics
300
+ */
301
+ async getUserStats(userId: string): Promise<UserStats> {
302
+ try {
303
+ return await this.makeRequest<UserStats>('GET', `/api/users/${userId}/stats`, undefined, {
304
+ cache: true,
305
+ cacheTTL: CACHE_TIMES.MEDIUM,
306
+ });
307
+ } catch (error) {
308
+ throw this.handleError(error);
309
+ }
310
+ }
311
+
312
+ // ==================
313
+ // HISTORY
314
+ // ==================
315
+
316
+ /**
317
+ * Get user history
318
+ */
319
+ async getUserHistory(userId?: string, limit?: number, offset?: number): Promise<HistoryItem[]> {
320
+ return this.withAuthRetry(async () => {
321
+ const params: any = {};
322
+ if (limit) params.limit = limit;
323
+ if (offset) params.offset = offset;
324
+
325
+ const endpoint = userId ? `/api/users/${userId}/history` : '/api/history';
326
+ return await this.makeRequest<HistoryItem[]>('GET', endpoint, params, {
327
+ cache: true,
328
+ cacheTTL: CACHE_TIMES.SHORT,
329
+ });
330
+ }, 'getUserHistory');
331
+ }
332
+
333
+ /**
334
+ * Clear user history
335
+ */
336
+ async clearUserHistory(): Promise<void> {
337
+ return this.withAuthRetry(async () => {
338
+ await this.makeRequest('DELETE', '/api/history', undefined, { cache: false });
339
+ }, 'clearUserHistory');
340
+ }
341
+
342
+ /**
343
+ * Delete a history item
344
+ */
345
+ async deleteHistoryItem(itemId: string): Promise<void> {
346
+ return this.withAuthRetry(async () => {
347
+ await this.makeRequest('DELETE', `/api/history/${itemId}`, undefined, { cache: false });
348
+ }, 'deleteHistoryItem');
349
+ }
350
+
351
+ // ==================
352
+ // FAQ
353
+ // ==================
354
+
355
+ /**
356
+ * Get FAQs
357
+ */
358
+ async getFAQs(category?: string): Promise<FAQ[]> {
359
+ try {
360
+ const params = category ? { category } : undefined;
361
+ return await this.makeRequest<FAQ[]>('GET', '/api/faqs', params, {
362
+ cache: true,
363
+ cacheTTL: CACHE_TIMES.LONG,
364
+ });
365
+ } catch (error) {
366
+ throw this.handleError(error);
367
+ }
368
+ }
369
+
370
+ /**
371
+ * Search FAQs
372
+ */
373
+ async searchFAQs(query: string): Promise<FAQ[]> {
374
+ try {
375
+ return await this.makeRequest<FAQ[]>('GET', '/api/faqs/search', { query }, {
376
+ cache: true,
377
+ cacheTTL: CACHE_TIMES.MEDIUM,
378
+ });
379
+ } catch (error) {
380
+ throw this.handleError(error);
381
+ }
382
+ }
383
+
384
+ // ==================
385
+ // ACHIEVEMENTS
386
+ // ==================
387
+
388
+ /**
389
+ * Get user achievements
390
+ */
391
+ async getUserAchievements(userId?: string): Promise<Achievement[]> {
392
+ return this.withAuthRetry(async () => {
393
+ const endpoint = userId ? `/api/users/${userId}/achievements` : '/api/achievements';
394
+ return await this.makeRequest<Achievement[]>('GET', endpoint, undefined, {
395
+ cache: true,
396
+ cacheTTL: CACHE_TIMES.MEDIUM,
397
+ });
398
+ }, 'getUserAchievements');
399
+ }
400
+
401
+ /**
402
+ * Get all available achievements
403
+ */
404
+ async getAllAchievements(): Promise<Achievement[]> {
405
+ try {
406
+ return await this.makeRequest<Achievement[]>('GET', '/api/achievements/all', undefined, {
407
+ cache: true,
408
+ cacheTTL: CACHE_TIMES.LONG,
409
+ });
410
+ } catch (error) {
411
+ throw this.handleError(error);
412
+ }
413
+ }
414
+
415
+ // ==================
416
+ // ACCOUNT
417
+ // ==================
418
+
419
+ /**
420
+ * Delete user account (requires password confirmation)
421
+ */
422
+ async deleteAccount(password: string): Promise<void> {
423
+ return this.withAuthRetry(async () => {
424
+ await this.makeRequest('DELETE', '/api/account', { password }, { cache: false });
425
+ }, 'deleteAccount');
426
+ }
427
+ };
428
+ }