@duongthiu/onex-core 0.1.0 → 0.1.1

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 (190) hide show
  1. package/README.md +44 -65
  2. package/THEME_API.md +36 -33
  3. package/dist/api.js +14 -0
  4. package/dist/api.js.map +1 -0
  5. package/dist/api.mjs +5 -0
  6. package/dist/api.mjs.map +1 -0
  7. package/dist/auth.js +23 -0
  8. package/dist/auth.js.map +1 -0
  9. package/dist/auth.mjs +6 -0
  10. package/dist/auth.mjs.map +1 -0
  11. package/dist/blog.js +22 -0
  12. package/dist/blog.js.map +1 -0
  13. package/dist/blog.mjs +5 -0
  14. package/dist/blog.mjs.map +1 -0
  15. package/dist/cart.js +27 -0
  16. package/dist/cart.js.map +1 -0
  17. package/dist/cart.mjs +6 -0
  18. package/dist/cart.mjs.map +1 -0
  19. package/dist/chunk-2CSWHI3L.js +210 -0
  20. package/dist/chunk-2CSWHI3L.js.map +1 -0
  21. package/dist/chunk-2FGHIDUV.js +99 -0
  22. package/dist/chunk-2FGHIDUV.js.map +1 -0
  23. package/dist/chunk-2NMEKWO5.js +40 -0
  24. package/dist/chunk-2NMEKWO5.js.map +1 -0
  25. package/dist/chunk-43BVHGDT.mjs +131 -0
  26. package/dist/chunk-43BVHGDT.mjs.map +1 -0
  27. package/dist/chunk-4JVQJI3I.mjs +290 -0
  28. package/dist/chunk-4JVQJI3I.mjs.map +1 -0
  29. package/dist/chunk-5N2EKK5O.js +9550 -0
  30. package/dist/chunk-5N2EKK5O.js.map +1 -0
  31. package/dist/chunk-5T6NDVSN.js +76 -0
  32. package/dist/chunk-5T6NDVSN.js.map +1 -0
  33. package/dist/chunk-73AINNCI.mjs +201 -0
  34. package/dist/chunk-73AINNCI.mjs.map +1 -0
  35. package/dist/chunk-AIXBDAVP.mjs +61 -0
  36. package/dist/chunk-AIXBDAVP.mjs.map +1 -0
  37. package/dist/chunk-ALYN5HAC.js +210 -0
  38. package/dist/chunk-ALYN5HAC.js.map +1 -0
  39. package/dist/chunk-AREMJR3Q.js +36 -0
  40. package/dist/chunk-AREMJR3Q.js.map +1 -0
  41. package/dist/chunk-DXAI6XOI.mjs +33 -0
  42. package/dist/chunk-DXAI6XOI.mjs.map +1 -0
  43. package/dist/chunk-F5TFNWFJ.mjs +257 -0
  44. package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
  45. package/dist/chunk-FQ7FWUZN.js +265 -0
  46. package/dist/chunk-FQ7FWUZN.js.map +1 -0
  47. package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
  48. package/dist/chunk-J27VGXJH.js.map +1 -0
  49. package/dist/chunk-JZ46LLTZ.js +121 -0
  50. package/dist/chunk-JZ46LLTZ.js.map +1 -0
  51. package/dist/chunk-K24UHN6G.mjs +76 -0
  52. package/dist/chunk-K24UHN6G.mjs.map +1 -0
  53. package/dist/chunk-KCQGGU5R.mjs +344 -0
  54. package/dist/chunk-KCQGGU5R.mjs.map +1 -0
  55. package/dist/chunk-MT22NYKT.mjs +117 -0
  56. package/dist/chunk-MT22NYKT.mjs.map +1 -0
  57. package/dist/chunk-NDD472IZ.js +85 -0
  58. package/dist/chunk-NDD472IZ.js.map +1 -0
  59. package/dist/chunk-NHOIGGYU.mjs +833 -0
  60. package/dist/chunk-NHOIGGYU.mjs.map +1 -0
  61. package/dist/chunk-O3XR7TW3.mjs +12 -0
  62. package/dist/chunk-O3XR7TW3.mjs.map +1 -0
  63. package/dist/chunk-OAPYSC2X.mjs +206 -0
  64. package/dist/chunk-OAPYSC2X.mjs.map +1 -0
  65. package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
  66. package/dist/chunk-ONJREDYY.mjs.map +1 -0
  67. package/dist/chunk-OVT2LUAM.js +197 -0
  68. package/dist/chunk-OVT2LUAM.js.map +1 -0
  69. package/dist/chunk-OWNGNGKL.js +331 -0
  70. package/dist/chunk-OWNGNGKL.js.map +1 -0
  71. package/dist/chunk-P7SXNZSV.js +298 -0
  72. package/dist/chunk-P7SXNZSV.js.map +1 -0
  73. package/dist/chunk-PFJOL3HI.mjs +71 -0
  74. package/dist/chunk-PFJOL3HI.mjs.map +1 -0
  75. package/dist/chunk-PPULMWJ6.js +295 -0
  76. package/dist/chunk-PPULMWJ6.js.map +1 -0
  77. package/dist/chunk-RGIVKACG.js +359 -0
  78. package/dist/chunk-RGIVKACG.js.map +1 -0
  79. package/dist/chunk-RPP5K2LP.js +870 -0
  80. package/dist/chunk-RPP5K2LP.js.map +1 -0
  81. package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
  82. package/dist/chunk-RUCHWUD7.mjs.map +1 -0
  83. package/dist/chunk-SEVUIX4H.js +137 -0
  84. package/dist/chunk-SEVUIX4H.js.map +1 -0
  85. package/dist/chunk-SK2FSHFM.mjs +208 -0
  86. package/dist/chunk-SK2FSHFM.mjs.map +1 -0
  87. package/dist/chunk-T6EJ2GAV.mjs +294 -0
  88. package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
  89. package/dist/chunk-ULBDOFZI.mjs +302 -0
  90. package/dist/chunk-ULBDOFZI.mjs.map +1 -0
  91. package/dist/chunk-V3JIELNV.js +241 -0
  92. package/dist/chunk-V3JIELNV.js.map +1 -0
  93. package/dist/chunk-V5E2KWMA.mjs +238 -0
  94. package/dist/chunk-V5E2KWMA.mjs.map +1 -0
  95. package/dist/chunk-VJA3ER6A.js +14 -0
  96. package/dist/chunk-VJA3ER6A.js.map +1 -0
  97. package/dist/chunk-VLI7ULX5.js +66 -0
  98. package/dist/chunk-VLI7ULX5.js.map +1 -0
  99. package/dist/chunk-WFGS5OFH.mjs +189 -0
  100. package/dist/chunk-WFGS5OFH.mjs.map +1 -0
  101. package/dist/chunk-WVC5GP24.mjs +96 -0
  102. package/dist/chunk-WVC5GP24.mjs.map +1 -0
  103. package/dist/chunk-YOSPWY5K.mjs +36 -0
  104. package/dist/chunk-YOSPWY5K.mjs.map +1 -0
  105. package/dist/chunk-ZFFXXLX7.js +205 -0
  106. package/dist/chunk-ZFFXXLX7.js.map +1 -0
  107. package/dist/client.js +512 -249
  108. package/dist/client.mjs +21 -2
  109. package/dist/components.js +393 -0
  110. package/dist/components.js.map +1 -0
  111. package/dist/components.mjs +8 -0
  112. package/dist/components.mjs.map +1 -0
  113. package/dist/config.js +17 -0
  114. package/dist/config.js.map +1 -0
  115. package/dist/config.mjs +4 -0
  116. package/dist/config.mjs.map +1 -0
  117. package/dist/contact.js +22 -0
  118. package/dist/contact.js.map +1 -0
  119. package/dist/contact.mjs +5 -0
  120. package/dist/contact.mjs.map +1 -0
  121. package/dist/contexts.js +51 -0
  122. package/dist/contexts.js.map +1 -0
  123. package/dist/contexts.mjs +6 -0
  124. package/dist/contexts.mjs.map +1 -0
  125. package/dist/finance.js +26 -0
  126. package/dist/finance.js.map +1 -0
  127. package/dist/finance.mjs +5 -0
  128. package/dist/finance.mjs.map +1 -0
  129. package/dist/icons.js +15 -0
  130. package/dist/icons.js.map +1 -0
  131. package/dist/icons.mjs +4 -0
  132. package/dist/icons.mjs.map +1 -0
  133. package/dist/index.js +512 -249
  134. package/dist/index.js.map +1 -1
  135. package/dist/index.mjs +21 -2
  136. package/dist/index.mjs.map +1 -1
  137. package/dist/internal.js +1437 -0
  138. package/dist/internal.js.map +1 -0
  139. package/dist/internal.mjs +1404 -0
  140. package/dist/internal.mjs.map +1 -0
  141. package/dist/motion.js +51 -0
  142. package/dist/motion.js.map +1 -0
  143. package/dist/motion.mjs +38 -0
  144. package/dist/motion.mjs.map +1 -0
  145. package/dist/orders.js +22 -0
  146. package/dist/orders.js.map +1 -0
  147. package/dist/orders.mjs +5 -0
  148. package/dist/orders.mjs.map +1 -0
  149. package/dist/products.js +27 -0
  150. package/dist/products.js.map +1 -0
  151. package/dist/products.mjs +6 -0
  152. package/dist/products.mjs.map +1 -0
  153. package/dist/registry.js +44 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/registry.mjs +7 -0
  156. package/dist/registry.mjs.map +1 -0
  157. package/dist/renderers.js +51 -0
  158. package/dist/renderers.js.map +1 -0
  159. package/dist/renderers.mjs +6 -0
  160. package/dist/renderers.mjs.map +1 -0
  161. package/dist/server.js +11 -189
  162. package/dist/server.js.map +1 -1
  163. package/dist/server.mjs +3 -186
  164. package/dist/server.mjs.map +1 -1
  165. package/dist/types.js +37 -0
  166. package/dist/types.js.map +1 -0
  167. package/dist/types.mjs +4 -0
  168. package/dist/types.mjs.map +1 -0
  169. package/dist/utils.js +160 -0
  170. package/dist/utils.js.map +1 -0
  171. package/dist/utils.mjs +7 -0
  172. package/dist/utils.mjs.map +1 -0
  173. package/dist/wrappers.js +104 -0
  174. package/dist/wrappers.js.map +1 -0
  175. package/dist/wrappers.mjs +96 -0
  176. package/dist/wrappers.mjs.map +1 -0
  177. package/package.json +112 -9
  178. package/dist/api-vuL1Eg5L.d.mts +0 -2961
  179. package/dist/api-vuL1Eg5L.d.ts +0 -2961
  180. package/dist/chunk-3SZX6LHT.js.map +0 -1
  181. package/dist/chunk-7EON6Q4L.mjs.map +0 -1
  182. package/dist/chunk-WDY773GJ.js +0 -8308
  183. package/dist/chunk-WDY773GJ.js.map +0 -1
  184. package/dist/chunk-XE4EOKS4.mjs.map +0 -1
  185. package/dist/client.d.mts +0 -1461
  186. package/dist/client.d.ts +0 -1461
  187. package/dist/index.d.mts +0 -125
  188. package/dist/index.d.ts +0 -125
  189. package/dist/server.d.mts +0 -70
  190. package/dist/server.d.ts +0 -70
@@ -0,0 +1,137 @@
1
+ "use client";
2
+ 'use strict';
3
+
4
+ var chunk2NMEKWO5_js = require('./chunk-2NMEKWO5.js');
5
+ var axios = require('axios');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
10
+
11
+ var ApiClient = class {
12
+ constructor(config) {
13
+ this.memoryToken = null;
14
+ this.config = chunk2NMEKWO5_js.__spreadValues({
15
+ tokenStorage: "localStorage",
16
+ tokenKey: "auth_token"
17
+ }, config);
18
+ this.client = axios__default.default.create({
19
+ baseURL: config.baseURL,
20
+ headers: chunk2NMEKWO5_js.__spreadValues({
21
+ "Content-Type": "application/json"
22
+ }, config.headers),
23
+ timeout: 3e4
24
+ // 30 seconds
25
+ });
26
+ this.setupInterceptors();
27
+ }
28
+ setupInterceptors() {
29
+ this.client.interceptors.request.use(
30
+ (config) => {
31
+ const token = this.getToken();
32
+ if (token) {
33
+ config.headers.Authorization = `Bearer ${token}`;
34
+ }
35
+ return config;
36
+ },
37
+ (error) => {
38
+ return Promise.reject(error);
39
+ }
40
+ );
41
+ this.client.interceptors.response.use(
42
+ (response) => response,
43
+ (error) => {
44
+ var _a, _b, _c, _d, _e;
45
+ if (((_a = error.response) == null ? void 0 : _a.status) === 401) {
46
+ this.clearToken();
47
+ (_c = (_b = this.config).onUnauthorized) == null ? void 0 : _c.call(_b);
48
+ }
49
+ const message = ((_e = (_d = error.response) == null ? void 0 : _d.data) == null ? void 0 : _e.message) || error.message || "An error occurred";
50
+ return Promise.reject(new Error(message));
51
+ }
52
+ );
53
+ }
54
+ /**
55
+ * GET request
56
+ */
57
+ async get(url, params) {
58
+ const response = await this.client.get(url, { params });
59
+ return response.data.data;
60
+ }
61
+ /**
62
+ * POST request
63
+ */
64
+ async post(url, data) {
65
+ const response = await this.client.post(url, data);
66
+ return response.data.data;
67
+ }
68
+ /**
69
+ * PUT request
70
+ */
71
+ async put(url, data) {
72
+ const response = await this.client.put(url, data);
73
+ return response.data.data;
74
+ }
75
+ /**
76
+ * PATCH request
77
+ */
78
+ async patch(url, data) {
79
+ const response = await this.client.patch(url, data);
80
+ return response.data.data;
81
+ }
82
+ /**
83
+ * DELETE request
84
+ */
85
+ async delete(url) {
86
+ const response = await this.client.delete(url);
87
+ return response.data.data;
88
+ }
89
+ /**
90
+ * Set authentication token
91
+ */
92
+ setToken(token) {
93
+ if (this.config.tokenStorage === "localStorage") {
94
+ if (typeof window !== "undefined") {
95
+ localStorage.setItem(this.config.tokenKey, token);
96
+ }
97
+ } else if (this.config.tokenStorage === "memory") {
98
+ this.memoryToken = token;
99
+ }
100
+ }
101
+ /**
102
+ * Get authentication token
103
+ */
104
+ getToken() {
105
+ if (this.config.tokenStorage === "localStorage") {
106
+ if (typeof window !== "undefined") {
107
+ return localStorage.getItem(this.config.tokenKey);
108
+ }
109
+ return null;
110
+ } else if (this.config.tokenStorage === "memory") {
111
+ return this.memoryToken;
112
+ }
113
+ return null;
114
+ }
115
+ /**
116
+ * Clear authentication token
117
+ */
118
+ clearToken() {
119
+ if (this.config.tokenStorage === "localStorage") {
120
+ if (typeof window !== "undefined") {
121
+ localStorage.removeItem(this.config.tokenKey);
122
+ }
123
+ } else if (this.config.tokenStorage === "memory") {
124
+ this.memoryToken = null;
125
+ }
126
+ }
127
+ /**
128
+ * Check if user is authenticated
129
+ */
130
+ isAuthenticated() {
131
+ return !!this.getToken();
132
+ }
133
+ };
134
+
135
+ exports.ApiClient = ApiClient;
136
+ //# sourceMappingURL=chunk-SEVUIX4H.js.map
137
+ //# sourceMappingURL=chunk-SEVUIX4H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/client.ts"],"names":["__spreadValues","axios"],"mappings":"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","file":"chunk-SEVUIX4H.js","sourcesContent":["/**\n * API Client\n * HTTP client with authentication, interceptors, and error handling\n */\n\nimport axios, { AxiosInstance, AxiosError } from \"axios\";\n\nexport interface ApiConfig {\n baseURL: string;\n tokenStorage?: \"localStorage\" | \"cookie\" | \"memory\";\n tokenKey?: string;\n onUnauthorized?: () => void;\n headers?: Record<string, string>;\n}\n\nexport interface ApiResponse<T = unknown> {\n data: T;\n message?: string;\n success: boolean;\n}\n\nexport class ApiClient {\n private client: AxiosInstance;\n private config: ApiConfig;\n private memoryToken: string | null = null;\n\n constructor(config: ApiConfig) {\n this.config = {\n tokenStorage: \"localStorage\",\n tokenKey: \"auth_token\",\n ...config,\n };\n\n this.client = axios.create({\n baseURL: config.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n },\n timeout: 30000, // 30 seconds\n });\n\n this.setupInterceptors();\n }\n\n private setupInterceptors() {\n // Request interceptor - add auth token\n this.client.interceptors.request.use(\n (config) => {\n const token = this.getToken();\n if (token) {\n config.headers.Authorization = `Bearer ${token}`;\n }\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n // Response interceptor - handle errors\n this.client.interceptors.response.use(\n (response) => response,\n (error: AxiosError<ApiResponse>) => {\n // Handle 401 Unauthorized\n if (error.response?.status === 401) {\n this.clearToken();\n this.config.onUnauthorized?.();\n }\n\n // Transform error\n const message =\n error.response?.data?.message || error.message || \"An error occurred\";\n\n return Promise.reject(new Error(message));\n }\n );\n }\n\n /**\n * GET request\n */\n async get<T>(url: string, params?: Record<string, unknown>): Promise<T> {\n const response = await this.client.get<ApiResponse<T>>(url, { params });\n return response.data.data;\n }\n\n /**\n * POST request\n */\n async post<T>(url: string, data?: unknown): Promise<T> {\n const response = await this.client.post<ApiResponse<T>>(url, data);\n return response.data.data;\n }\n\n /**\n * PUT request\n */\n async put<T>(url: string, data?: unknown): Promise<T> {\n const response = await this.client.put<ApiResponse<T>>(url, data);\n return response.data.data;\n }\n\n /**\n * PATCH request\n */\n async patch<T>(url: string, data?: unknown): Promise<T> {\n const response = await this.client.patch<ApiResponse<T>>(url, data);\n return response.data.data;\n }\n\n /**\n * DELETE request\n */\n async delete<T>(url: string): Promise<T> {\n const response = await this.client.delete<ApiResponse<T>>(url);\n return response.data.data;\n }\n\n /**\n * Set authentication token\n */\n setToken(token: string): void {\n if (this.config.tokenStorage === \"localStorage\") {\n if (typeof window !== \"undefined\") {\n localStorage.setItem(this.config.tokenKey!, token);\n }\n } else if (this.config.tokenStorage === \"memory\") {\n this.memoryToken = token;\n }\n // TODO: Implement cookie storage\n }\n\n /**\n * Get authentication token\n */\n getToken(): string | null {\n if (this.config.tokenStorage === \"localStorage\") {\n if (typeof window !== \"undefined\") {\n return localStorage.getItem(this.config.tokenKey!);\n }\n return null;\n } else if (this.config.tokenStorage === \"memory\") {\n return this.memoryToken;\n }\n return null;\n }\n\n /**\n * Clear authentication token\n */\n clearToken(): void {\n if (this.config.tokenStorage === \"localStorage\") {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(this.config.tokenKey!);\n }\n } else if (this.config.tokenStorage === \"memory\") {\n this.memoryToken = null;\n }\n }\n\n /**\n * Check if user is authenticated\n */\n isAuthenticated(): boolean {\n return !!this.getToken();\n }\n}\n"]}
@@ -0,0 +1,208 @@
1
+ "use client";
2
+ // src/features/auth/auth-service.ts
3
+ var AuthService = class {
4
+ constructor(api) {
5
+ this.api = api;
6
+ }
7
+ /**
8
+ * Transform Cognito UserAttributes to User object
9
+ */
10
+ transformUserInfo(userInfo, tokens) {
11
+ const getAttribute = (name) => {
12
+ var _a, _b;
13
+ return (_b = (_a = userInfo.UserAttributes) == null ? void 0 : _a.find((attr) => attr.Name === name)) == null ? void 0 : _b.Value;
14
+ };
15
+ return {
16
+ id: getAttribute("sub") || "",
17
+ email: getAttribute("email") || "",
18
+ name: getAttribute("name") || "",
19
+ phone_number: getAttribute("phone_number"),
20
+ avatar: getAttribute("picture"),
21
+ address: getAttribute("address"),
22
+ ward: getAttribute("custom:ward"),
23
+ district: getAttribute("custom:district"),
24
+ city: getAttribute("custom:city"),
25
+ province_code: getAttribute("custom:province_code"),
26
+ district_code: getAttribute("custom:district_code"),
27
+ ward_code: getAttribute("custom:ward_code")
28
+ };
29
+ }
30
+ /**
31
+ * Login with username and password
32
+ */
33
+ async login(credentials) {
34
+ const tokenResponse = await this.api.post(
35
+ "/auth/login",
36
+ credentials
37
+ );
38
+ this.api.setToken(tokenResponse.AccessToken);
39
+ this.storeTokens(tokenResponse);
40
+ const userInfo = await this.api.get("/auth/user_info");
41
+ const user = this.transformUserInfo(userInfo, tokenResponse);
42
+ if (typeof window !== "undefined") {
43
+ localStorage.setItem("customer_id", user.id);
44
+ }
45
+ return user;
46
+ }
47
+ /**
48
+ * Signup with username, email, password, and name
49
+ */
50
+ async signup(data) {
51
+ return await this.api.post("/auth/register", data);
52
+ }
53
+ /**
54
+ * Logout current user
55
+ */
56
+ async logout() {
57
+ try {
58
+ this.api.clearToken();
59
+ this.clearTokens();
60
+ } catch (error) {
61
+ this.api.clearToken();
62
+ this.clearTokens();
63
+ }
64
+ }
65
+ /**
66
+ * Send forgot password email
67
+ */
68
+ async forgotPassword(data) {
69
+ return await this.api.post("/auth/forgot", data);
70
+ }
71
+ /**
72
+ * Reset password with code
73
+ */
74
+ async resetPassword(data) {
75
+ return await this.api.post("/auth/new_password", data);
76
+ }
77
+ /**
78
+ * Verify code (email verification, 2FA, etc.)
79
+ */
80
+ async verifyCode(data) {
81
+ return await this.api.post("/auth/confirm", data);
82
+ }
83
+ /**
84
+ * Verify code for password reset
85
+ */
86
+ async verifyCodeReset(data) {
87
+ return await this.api.post(
88
+ "/auth/confirm_reset_password_code",
89
+ data
90
+ );
91
+ }
92
+ /**
93
+ * Resend verification code
94
+ */
95
+ async resendCode(data) {
96
+ return await this.api.post("/auth/resend_code", data);
97
+ }
98
+ /**
99
+ * Get current user
100
+ */
101
+ async getCurrentUser() {
102
+ try {
103
+ const accessToken = this.getAccessToken();
104
+ if (!accessToken) {
105
+ return null;
106
+ }
107
+ const userInfo = await this.api.get("/auth/user_info");
108
+ const tokens = this.getTokens();
109
+ if (!tokens) {
110
+ return null;
111
+ }
112
+ return this.transformUserInfo(userInfo, tokens);
113
+ } catch (e) {
114
+ return null;
115
+ }
116
+ }
117
+ /**
118
+ * Update user profile
119
+ */
120
+ async updateProfile(data) {
121
+ const payload = {};
122
+ if (data.name) payload.name = data.name;
123
+ if (data.phone_number) payload.phone_number = data.phone_number;
124
+ if (data.address) payload.address = data.address;
125
+ if (data.avatar) payload.picture = data.avatar;
126
+ if (data.ward) payload["custom:ward"] = data.ward;
127
+ if (data.district) payload["custom:district"] = data.district;
128
+ if (data.city) payload["custom:city"] = data.city;
129
+ if (data.province_code)
130
+ payload["custom:province_code"] = data.province_code;
131
+ if (data.district_code)
132
+ payload["custom:district_code"] = data.district_code;
133
+ if (data.ward_code) payload["custom:ward_code"] = data.ward_code;
134
+ return await this.api.post("/auth/user_info", payload);
135
+ }
136
+ /**
137
+ * Change password
138
+ */
139
+ async changePassword(data) {
140
+ return await this.api.post(
141
+ "/auth/change_password",
142
+ data
143
+ );
144
+ }
145
+ /**
146
+ * Refresh access token
147
+ */
148
+ async refreshToken() {
149
+ const tokens = this.getTokens();
150
+ if (!(tokens == null ? void 0 : tokens.RefreshToken)) {
151
+ throw new Error("No refresh token available");
152
+ }
153
+ const newTokens = await this.api.post("/auth/refresh", {
154
+ refresh_token: tokens.RefreshToken
155
+ });
156
+ this.storeTokens(newTokens);
157
+ this.api.setToken(newTokens.AccessToken);
158
+ return newTokens;
159
+ }
160
+ /**
161
+ * Store tokens in localStorage
162
+ * @private
163
+ */
164
+ storeTokens(tokens) {
165
+ if (typeof window !== "undefined") {
166
+ localStorage.setItem("auth_tokens", JSON.stringify(tokens));
167
+ }
168
+ }
169
+ /**
170
+ * Get tokens from localStorage
171
+ * @private
172
+ */
173
+ getTokens() {
174
+ if (typeof window !== "undefined") {
175
+ const stored = localStorage.getItem("auth_tokens");
176
+ if (stored) {
177
+ try {
178
+ return JSON.parse(stored);
179
+ } catch (e) {
180
+ return null;
181
+ }
182
+ }
183
+ }
184
+ return null;
185
+ }
186
+ /**
187
+ * Get access token
188
+ * @private
189
+ */
190
+ getAccessToken() {
191
+ const tokens = this.getTokens();
192
+ return (tokens == null ? void 0 : tokens.AccessToken) || null;
193
+ }
194
+ /**
195
+ * Clear all tokens
196
+ * @private
197
+ */
198
+ clearTokens() {
199
+ if (typeof window !== "undefined") {
200
+ localStorage.removeItem("auth_tokens");
201
+ localStorage.removeItem("customer_id");
202
+ }
203
+ }
204
+ };
205
+
206
+ export { AuthService };
207
+ //# sourceMappingURL=chunk-SK2FSHFM.mjs.map
208
+ //# sourceMappingURL=chunk-SK2FSHFM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/features/auth/auth-service.ts"],"names":[],"mappings":"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","file":"chunk-SK2FSHFM.mjs","sourcesContent":["/**\n * Auth Service\n * Handles all authentication-related API calls\n * Compatible with AWS Cognito-based backend\n */\n\nimport { ApiClient } from \"../../api/client\";\nimport type {\n User,\n LoginCredentials,\n SignupData,\n TokenData,\n UserInfoResponse,\n UserAttribute,\n ForgotPasswordData,\n ResetPasswordData,\n VerifyCodeData,\n ResendCodeData,\n ChangePasswordData,\n} from \"./types\";\n\nexport class AuthService {\n constructor(private api: ApiClient) {}\n\n /**\n * Transform Cognito UserAttributes to User object\n */\n private transformUserInfo(\n userInfo: UserInfoResponse,\n tokens: TokenData\n ): User {\n const getAttribute = (name: string): string | undefined => {\n return userInfo.UserAttributes?.find((attr) => attr.Name === name)?.Value;\n };\n\n return {\n id: getAttribute(\"sub\") || \"\",\n email: getAttribute(\"email\") || \"\",\n name: getAttribute(\"name\") || \"\",\n phone_number: getAttribute(\"phone_number\"),\n avatar: getAttribute(\"picture\"),\n address: getAttribute(\"address\"),\n ward: getAttribute(\"custom:ward\"),\n district: getAttribute(\"custom:district\"),\n city: getAttribute(\"custom:city\"),\n province_code: getAttribute(\"custom:province_code\"),\n district_code: getAttribute(\"custom:district_code\"),\n ward_code: getAttribute(\"custom:ward_code\"),\n };\n }\n\n /**\n * Login with username and password\n */\n async login(credentials: LoginCredentials): Promise<User> {\n // Call login endpoint\n const tokenResponse = await this.api.post<TokenData>(\n \"/auth/login\",\n credentials\n );\n\n // Store tokens\n this.api.setToken(tokenResponse.AccessToken);\n this.storeTokens(tokenResponse);\n\n // Get user info\n const userInfo = await this.api.get<UserInfoResponse>(\"/auth/user_info\");\n\n // Transform and return user\n const user = this.transformUserInfo(userInfo, tokenResponse);\n\n // Store customer_id for order history\n if (typeof window !== \"undefined\") {\n localStorage.setItem(\"customer_id\", user.id);\n }\n\n return user;\n }\n\n /**\n * Signup with username, email, password, and name\n */\n async signup(data: SignupData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\"/auth/register\", data);\n }\n\n /**\n * Logout current user\n */\n async logout(): Promise<void> {\n try {\n // No logout endpoint in current API, just clear tokens\n this.api.clearToken();\n this.clearTokens();\n } catch (error) {\n // Always clear tokens even if API call fails\n this.api.clearToken();\n this.clearTokens();\n }\n }\n\n /**\n * Send forgot password email\n */\n async forgotPassword(data: ForgotPasswordData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\"/auth/forgot\", data);\n }\n\n /**\n * Reset password with code\n */\n async resetPassword(data: ResetPasswordData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\"/auth/new_password\", data);\n }\n\n /**\n * Verify code (email verification, 2FA, etc.)\n */\n async verifyCode(data: VerifyCodeData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\"/auth/confirm\", data);\n }\n\n /**\n * Verify code for password reset\n */\n async verifyCodeReset(\n data: VerifyCodeData\n ): Promise<{ session: string; message?: string }> {\n return await this.api.post<{ session: string; message?: string }>(\n \"/auth/confirm_reset_password_code\",\n data\n );\n }\n\n /**\n * Resend verification code\n */\n async resendCode(data: ResendCodeData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\"/auth/resend_code\", data);\n }\n\n /**\n * Get current user\n */\n async getCurrentUser(): Promise<User | null> {\n try {\n // Check if we have tokens\n const accessToken = this.getAccessToken();\n if (!accessToken) {\n return null;\n }\n\n // Get user info from API\n const userInfo = await this.api.get<UserInfoResponse>(\"/auth/user_info\");\n\n // Get tokens from storage\n const tokens = this.getTokens();\n if (!tokens) {\n return null;\n }\n\n return this.transformUserInfo(userInfo, tokens);\n } catch {\n return null;\n }\n }\n\n /**\n * Update user profile\n */\n async updateProfile(data: Partial<User>): Promise<{ message: string }> {\n // Transform User fields to Cognito attributes format\n const payload: Record<string, string> = {};\n\n if (data.name) payload.name = data.name;\n if (data.phone_number) payload.phone_number = data.phone_number;\n if (data.address) payload.address = data.address;\n if (data.avatar) payload.picture = data.avatar;\n if (data.ward) payload[\"custom:ward\"] = data.ward;\n if (data.district) payload[\"custom:district\"] = data.district;\n if (data.city) payload[\"custom:city\"] = data.city;\n if (data.province_code)\n payload[\"custom:province_code\"] = data.province_code;\n if (data.district_code)\n payload[\"custom:district_code\"] = data.district_code;\n if (data.ward_code) payload[\"custom:ward_code\"] = data.ward_code;\n\n return await this.api.post<{ message: string }>(\"/auth/user_info\", payload);\n }\n\n /**\n * Change password\n */\n async changePassword(data: ChangePasswordData): Promise<{ message: string }> {\n return await this.api.post<{ message: string }>(\n \"/auth/change_password\",\n data\n );\n }\n\n /**\n * Refresh access token\n */\n async refreshToken(): Promise<TokenData> {\n const tokens = this.getTokens();\n if (!tokens?.RefreshToken) {\n throw new Error(\"No refresh token available\");\n }\n\n const newTokens = await this.api.post<TokenData>(\"/auth/refresh\", {\n refresh_token: tokens.RefreshToken,\n });\n\n this.storeTokens(newTokens);\n this.api.setToken(newTokens.AccessToken);\n\n return newTokens;\n }\n\n /**\n * Store tokens in localStorage\n * @private\n */\n private storeTokens(tokens: TokenData): void {\n if (typeof window !== \"undefined\") {\n localStorage.setItem(\"auth_tokens\", JSON.stringify(tokens));\n }\n }\n\n /**\n * Get tokens from localStorage\n * @private\n */\n private getTokens(): TokenData | null {\n if (typeof window !== \"undefined\") {\n const stored = localStorage.getItem(\"auth_tokens\");\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch {\n return null;\n }\n }\n }\n return null;\n }\n\n /**\n * Get access token\n * @private\n */\n private getAccessToken(): string | null {\n const tokens = this.getTokens();\n return tokens?.AccessToken || null;\n }\n\n /**\n * Clear all tokens\n * @private\n */\n private clearTokens(): void {\n if (typeof window !== \"undefined\") {\n localStorage.removeItem(\"auth_tokens\");\n localStorage.removeItem(\"customer_id\");\n }\n }\n}\n"]}
@@ -0,0 +1,294 @@
1
+ "use client";
2
+ import { create } from 'zustand';
3
+
4
+ // src/features/orders/use-orders.ts
5
+ var ordersService = null;
6
+ var useOrders = create((set) => ({
7
+ // Initial state
8
+ orders: [],
9
+ currentOrder: null,
10
+ isLoading: false,
11
+ error: null,
12
+ total: 0,
13
+ totalPages: 0,
14
+ currentPage: 1,
15
+ /**
16
+ * Create a new order (public)
17
+ */
18
+ createOrder: async (data) => {
19
+ if (!ordersService) {
20
+ throw new Error(
21
+ "Orders service not initialized. Call initializeOnex() first."
22
+ );
23
+ }
24
+ set({ isLoading: true, error: null });
25
+ try {
26
+ const order = await ordersService.createOrder(data);
27
+ set({ currentOrder: order, isLoading: false });
28
+ return order;
29
+ } catch (error) {
30
+ set({ error: error.message, isLoading: false });
31
+ throw error;
32
+ }
33
+ },
34
+ /**
35
+ * Create a private order (authenticated)
36
+ */
37
+ createPrivateOrder: async (data) => {
38
+ if (!ordersService) {
39
+ throw new Error(
40
+ "Orders service not initialized. Call initializeOnex() first."
41
+ );
42
+ }
43
+ set({ isLoading: true, error: null });
44
+ try {
45
+ const order = await ordersService.createPrivateOrder(data);
46
+ set({ currentOrder: order, isLoading: false });
47
+ return order;
48
+ } catch (error) {
49
+ set({ error: error.message, isLoading: false });
50
+ throw error;
51
+ }
52
+ },
53
+ /**
54
+ * Fetch orders list
55
+ */
56
+ fetchOrders: async (params) => {
57
+ if (!ordersService) {
58
+ throw new Error(
59
+ "Orders service not initialized. Call initializeOnex() first."
60
+ );
61
+ }
62
+ set({ isLoading: true, error: null });
63
+ try {
64
+ const response = await ordersService.getOrders(params);
65
+ set({
66
+ orders: response.items,
67
+ total: response.total,
68
+ totalPages: response.totalPages,
69
+ currentPage: response.page,
70
+ isLoading: false
71
+ });
72
+ } catch (error) {
73
+ set({ error: error.message, isLoading: false });
74
+ }
75
+ },
76
+ /**
77
+ * Fetch order history for authenticated user
78
+ */
79
+ fetchOrderHistory: async (params) => {
80
+ if (!ordersService) {
81
+ throw new Error(
82
+ "Orders service not initialized. Call initializeOnex() first."
83
+ );
84
+ }
85
+ set({ isLoading: true, error: null });
86
+ try {
87
+ const response = await ordersService.getOrderHistory(params);
88
+ set({
89
+ orders: response.items,
90
+ total: response.total,
91
+ totalPages: response.totalPages,
92
+ currentPage: response.page,
93
+ isLoading: false
94
+ });
95
+ } catch (error) {
96
+ set({ error: error.message, isLoading: false });
97
+ }
98
+ },
99
+ /**
100
+ * Fetch order by ID
101
+ */
102
+ fetchOrderById: async (orderId) => {
103
+ if (!ordersService) {
104
+ throw new Error(
105
+ "Orders service not initialized. Call initializeOnex() first."
106
+ );
107
+ }
108
+ set({ isLoading: true, error: null });
109
+ try {
110
+ const order = await ordersService.getOrderById(orderId);
111
+ set({ currentOrder: order, isLoading: false });
112
+ } catch (error) {
113
+ set({ error: error.message, isLoading: false });
114
+ }
115
+ },
116
+ /**
117
+ * Fetch order by order number
118
+ */
119
+ fetchOrderByNumber: async (orderNumber) => {
120
+ if (!ordersService) {
121
+ throw new Error(
122
+ "Orders service not initialized. Call initializeOnex() first."
123
+ );
124
+ }
125
+ set({ isLoading: true, error: null });
126
+ try {
127
+ const order = await ordersService.getOrderByNumber(orderNumber);
128
+ set({ currentOrder: order, isLoading: false });
129
+ } catch (error) {
130
+ set({ error: error.message, isLoading: false });
131
+ }
132
+ },
133
+ /**
134
+ * Update order status
135
+ */
136
+ updateOrderStatus: async (orderId, status) => {
137
+ if (!ordersService) {
138
+ throw new Error(
139
+ "Orders service not initialized. Call initializeOnex() first."
140
+ );
141
+ }
142
+ set({ isLoading: true, error: null });
143
+ try {
144
+ const order = await ordersService.updateOrderStatus(orderId, status);
145
+ set((state) => {
146
+ var _a;
147
+ return {
148
+ currentOrder: ((_a = state.currentOrder) == null ? void 0 : _a.id) === orderId ? order : state.currentOrder,
149
+ orders: state.orders.map((o) => o.id === orderId ? order : o),
150
+ isLoading: false
151
+ };
152
+ });
153
+ } catch (error) {
154
+ set({ error: error.message, isLoading: false });
155
+ }
156
+ },
157
+ /**
158
+ * Cancel order
159
+ */
160
+ cancelOrder: async (orderId) => {
161
+ if (!ordersService) {
162
+ throw new Error(
163
+ "Orders service not initialized. Call initializeOnex() first."
164
+ );
165
+ }
166
+ set({ isLoading: true, error: null });
167
+ try {
168
+ const order = await ordersService.cancelOrder(orderId);
169
+ set((state) => {
170
+ var _a;
171
+ return {
172
+ currentOrder: ((_a = state.currentOrder) == null ? void 0 : _a.id) === orderId ? order : state.currentOrder,
173
+ orders: state.orders.map((o) => o.id === orderId ? order : o),
174
+ isLoading: false
175
+ };
176
+ });
177
+ } catch (error) {
178
+ set({ error: error.message, isLoading: false });
179
+ }
180
+ },
181
+ /**
182
+ * Pay for order
183
+ */
184
+ payOrder: async (orderId, paymentData) => {
185
+ if (!ordersService) {
186
+ throw new Error(
187
+ "Orders service not initialized. Call initializeOnex() first."
188
+ );
189
+ }
190
+ set({ isLoading: true, error: null });
191
+ try {
192
+ const order = await ordersService.payOrder(orderId, paymentData);
193
+ set((state) => {
194
+ var _a;
195
+ return {
196
+ currentOrder: ((_a = state.currentOrder) == null ? void 0 : _a.id) === orderId ? order : state.currentOrder,
197
+ orders: state.orders.map((o) => o.id === orderId ? order : o),
198
+ isLoading: false
199
+ };
200
+ });
201
+ } catch (error) {
202
+ set({ error: error.message, isLoading: false });
203
+ }
204
+ },
205
+ /**
206
+ * Clear error
207
+ */
208
+ clearError: () => {
209
+ set({ error: null });
210
+ },
211
+ /**
212
+ * Clear current order
213
+ */
214
+ clearCurrentOrder: () => {
215
+ set({ currentOrder: null });
216
+ }
217
+ }));
218
+ function initializeOrdersService(service) {
219
+ ordersService = service;
220
+ }
221
+
222
+ // src/features/orders/orders-service.ts
223
+ var OrdersService = class {
224
+ constructor(api) {
225
+ this.api = api;
226
+ }
227
+ /**
228
+ * Create a new order (public - no auth required)
229
+ */
230
+ async createOrder(data) {
231
+ return await this.api.post("/orders", data);
232
+ }
233
+ /**
234
+ * Create a private order (requires authentication)
235
+ */
236
+ async createPrivateOrder(data) {
237
+ return await this.api.post("/orders/private", data);
238
+ }
239
+ /**
240
+ * Get order by ID
241
+ */
242
+ async getOrderById(orderId) {
243
+ return await this.api.get(`/orders/${orderId}`);
244
+ }
245
+ /**
246
+ * Get order by order number
247
+ */
248
+ async getOrderByNumber(orderNumber) {
249
+ return await this.api.get(`/orders/number/${orderNumber}`);
250
+ }
251
+ /**
252
+ * Get order history for authenticated user
253
+ */
254
+ async getOrderHistory(params) {
255
+ return await this.api.get(
256
+ "/orders/history",
257
+ params
258
+ );
259
+ }
260
+ /**
261
+ * Get all orders (with pagination)
262
+ */
263
+ async getOrders(params) {
264
+ return await this.api.get(
265
+ "/orders",
266
+ params
267
+ );
268
+ }
269
+ /**
270
+ * Update order status
271
+ */
272
+ async updateOrderStatus(orderId, status) {
273
+ return await this.api.put(`/orders/${orderId}/status`, { status });
274
+ }
275
+ /**
276
+ * Cancel order
277
+ */
278
+ async cancelOrder(orderId) {
279
+ return await this.api.put(`/orders/${orderId}/cancel`, {});
280
+ }
281
+ /**
282
+ * Pay for order
283
+ */
284
+ async payOrder(orderId, paymentData) {
285
+ return await this.api.post(
286
+ `/orders/${orderId}/pay`,
287
+ paymentData || {}
288
+ );
289
+ }
290
+ };
291
+
292
+ export { OrdersService, initializeOrdersService, useOrders };
293
+ //# sourceMappingURL=chunk-T6EJ2GAV.mjs.map
294
+ //# sourceMappingURL=chunk-T6EJ2GAV.mjs.map