@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.
- package/README.md +44 -65
- package/THEME_API.md +36 -33
- package/dist/api.js +14 -0
- package/dist/api.js.map +1 -0
- package/dist/api.mjs +5 -0
- package/dist/api.mjs.map +1 -0
- package/dist/auth.js +23 -0
- package/dist/auth.js.map +1 -0
- package/dist/auth.mjs +6 -0
- package/dist/auth.mjs.map +1 -0
- package/dist/blog.js +22 -0
- package/dist/blog.js.map +1 -0
- package/dist/blog.mjs +5 -0
- package/dist/blog.mjs.map +1 -0
- package/dist/cart.js +27 -0
- package/dist/cart.js.map +1 -0
- package/dist/cart.mjs +6 -0
- package/dist/cart.mjs.map +1 -0
- package/dist/chunk-2CSWHI3L.js +210 -0
- package/dist/chunk-2CSWHI3L.js.map +1 -0
- package/dist/chunk-2FGHIDUV.js +99 -0
- package/dist/chunk-2FGHIDUV.js.map +1 -0
- package/dist/chunk-2NMEKWO5.js +40 -0
- package/dist/chunk-2NMEKWO5.js.map +1 -0
- package/dist/chunk-43BVHGDT.mjs +131 -0
- package/dist/chunk-43BVHGDT.mjs.map +1 -0
- package/dist/chunk-4JVQJI3I.mjs +290 -0
- package/dist/chunk-4JVQJI3I.mjs.map +1 -0
- package/dist/chunk-5N2EKK5O.js +9550 -0
- package/dist/chunk-5N2EKK5O.js.map +1 -0
- package/dist/chunk-5T6NDVSN.js +76 -0
- package/dist/chunk-5T6NDVSN.js.map +1 -0
- package/dist/chunk-73AINNCI.mjs +201 -0
- package/dist/chunk-73AINNCI.mjs.map +1 -0
- package/dist/chunk-AIXBDAVP.mjs +61 -0
- package/dist/chunk-AIXBDAVP.mjs.map +1 -0
- package/dist/chunk-ALYN5HAC.js +210 -0
- package/dist/chunk-ALYN5HAC.js.map +1 -0
- package/dist/chunk-AREMJR3Q.js +36 -0
- package/dist/chunk-AREMJR3Q.js.map +1 -0
- package/dist/chunk-DXAI6XOI.mjs +33 -0
- package/dist/chunk-DXAI6XOI.mjs.map +1 -0
- package/dist/chunk-F5TFNWFJ.mjs +257 -0
- package/dist/chunk-F5TFNWFJ.mjs.map +1 -0
- package/dist/chunk-FQ7FWUZN.js +265 -0
- package/dist/chunk-FQ7FWUZN.js.map +1 -0
- package/dist/{chunk-3SZX6LHT.js → chunk-J27VGXJH.js} +2 -24
- package/dist/chunk-J27VGXJH.js.map +1 -0
- package/dist/chunk-JZ46LLTZ.js +121 -0
- package/dist/chunk-JZ46LLTZ.js.map +1 -0
- package/dist/chunk-K24UHN6G.mjs +76 -0
- package/dist/chunk-K24UHN6G.mjs.map +1 -0
- package/dist/chunk-KCQGGU5R.mjs +344 -0
- package/dist/chunk-KCQGGU5R.mjs.map +1 -0
- package/dist/chunk-MT22NYKT.mjs +117 -0
- package/dist/chunk-MT22NYKT.mjs.map +1 -0
- package/dist/chunk-NDD472IZ.js +85 -0
- package/dist/chunk-NDD472IZ.js.map +1 -0
- package/dist/chunk-NHOIGGYU.mjs +833 -0
- package/dist/chunk-NHOIGGYU.mjs.map +1 -0
- package/dist/chunk-O3XR7TW3.mjs +12 -0
- package/dist/chunk-O3XR7TW3.mjs.map +1 -0
- package/dist/chunk-OAPYSC2X.mjs +206 -0
- package/dist/chunk-OAPYSC2X.mjs.map +1 -0
- package/dist/{chunk-XE4EOKS4.mjs → chunk-ONJREDYY.mjs} +3 -23
- package/dist/chunk-ONJREDYY.mjs.map +1 -0
- package/dist/chunk-OVT2LUAM.js +197 -0
- package/dist/chunk-OVT2LUAM.js.map +1 -0
- package/dist/chunk-OWNGNGKL.js +331 -0
- package/dist/chunk-OWNGNGKL.js.map +1 -0
- package/dist/chunk-P7SXNZSV.js +298 -0
- package/dist/chunk-P7SXNZSV.js.map +1 -0
- package/dist/chunk-PFJOL3HI.mjs +71 -0
- package/dist/chunk-PFJOL3HI.mjs.map +1 -0
- package/dist/chunk-PPULMWJ6.js +295 -0
- package/dist/chunk-PPULMWJ6.js.map +1 -0
- package/dist/chunk-RGIVKACG.js +359 -0
- package/dist/chunk-RGIVKACG.js.map +1 -0
- package/dist/chunk-RPP5K2LP.js +870 -0
- package/dist/chunk-RPP5K2LP.js.map +1 -0
- package/dist/{chunk-7EON6Q4L.mjs → chunk-RUCHWUD7.mjs} +7651 -6370
- package/dist/chunk-RUCHWUD7.mjs.map +1 -0
- package/dist/chunk-SEVUIX4H.js +137 -0
- package/dist/chunk-SEVUIX4H.js.map +1 -0
- package/dist/chunk-SK2FSHFM.mjs +208 -0
- package/dist/chunk-SK2FSHFM.mjs.map +1 -0
- package/dist/chunk-T6EJ2GAV.mjs +294 -0
- package/dist/chunk-T6EJ2GAV.mjs.map +1 -0
- package/dist/chunk-ULBDOFZI.mjs +302 -0
- package/dist/chunk-ULBDOFZI.mjs.map +1 -0
- package/dist/chunk-V3JIELNV.js +241 -0
- package/dist/chunk-V3JIELNV.js.map +1 -0
- package/dist/chunk-V5E2KWMA.mjs +238 -0
- package/dist/chunk-V5E2KWMA.mjs.map +1 -0
- package/dist/chunk-VJA3ER6A.js +14 -0
- package/dist/chunk-VJA3ER6A.js.map +1 -0
- package/dist/chunk-VLI7ULX5.js +66 -0
- package/dist/chunk-VLI7ULX5.js.map +1 -0
- package/dist/chunk-WFGS5OFH.mjs +189 -0
- package/dist/chunk-WFGS5OFH.mjs.map +1 -0
- package/dist/chunk-WVC5GP24.mjs +96 -0
- package/dist/chunk-WVC5GP24.mjs.map +1 -0
- package/dist/chunk-YOSPWY5K.mjs +36 -0
- package/dist/chunk-YOSPWY5K.mjs.map +1 -0
- package/dist/chunk-ZFFXXLX7.js +205 -0
- package/dist/chunk-ZFFXXLX7.js.map +1 -0
- package/dist/client.js +512 -249
- package/dist/client.mjs +21 -2
- package/dist/components.js +393 -0
- package/dist/components.js.map +1 -0
- package/dist/components.mjs +8 -0
- package/dist/components.mjs.map +1 -0
- package/dist/config.js +17 -0
- package/dist/config.js.map +1 -0
- package/dist/config.mjs +4 -0
- package/dist/config.mjs.map +1 -0
- package/dist/contact.js +22 -0
- package/dist/contact.js.map +1 -0
- package/dist/contact.mjs +5 -0
- package/dist/contact.mjs.map +1 -0
- package/dist/contexts.js +51 -0
- package/dist/contexts.js.map +1 -0
- package/dist/contexts.mjs +6 -0
- package/dist/contexts.mjs.map +1 -0
- package/dist/finance.js +26 -0
- package/dist/finance.js.map +1 -0
- package/dist/finance.mjs +5 -0
- package/dist/finance.mjs.map +1 -0
- package/dist/icons.js +15 -0
- package/dist/icons.js.map +1 -0
- package/dist/icons.mjs +4 -0
- package/dist/icons.mjs.map +1 -0
- package/dist/index.js +512 -249
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -2
- package/dist/index.mjs.map +1 -1
- package/dist/internal.js +1437 -0
- package/dist/internal.js.map +1 -0
- package/dist/internal.mjs +1404 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/motion.js +51 -0
- package/dist/motion.js.map +1 -0
- package/dist/motion.mjs +38 -0
- package/dist/motion.mjs.map +1 -0
- package/dist/orders.js +22 -0
- package/dist/orders.js.map +1 -0
- package/dist/orders.mjs +5 -0
- package/dist/orders.mjs.map +1 -0
- package/dist/products.js +27 -0
- package/dist/products.js.map +1 -0
- package/dist/products.mjs +6 -0
- package/dist/products.mjs.map +1 -0
- package/dist/registry.js +44 -0
- package/dist/registry.js.map +1 -0
- package/dist/registry.mjs +7 -0
- package/dist/registry.mjs.map +1 -0
- package/dist/renderers.js +51 -0
- package/dist/renderers.js.map +1 -0
- package/dist/renderers.mjs +6 -0
- package/dist/renderers.mjs.map +1 -0
- package/dist/server.js +11 -189
- package/dist/server.js.map +1 -1
- package/dist/server.mjs +3 -186
- package/dist/server.mjs.map +1 -1
- package/dist/types.js +37 -0
- package/dist/types.js.map +1 -0
- package/dist/types.mjs +4 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.js +160 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.mjs +7 -0
- package/dist/utils.mjs.map +1 -0
- package/dist/wrappers.js +104 -0
- package/dist/wrappers.js.map +1 -0
- package/dist/wrappers.mjs +96 -0
- package/dist/wrappers.mjs.map +1 -0
- package/package.json +112 -9
- package/dist/api-vuL1Eg5L.d.mts +0 -2961
- package/dist/api-vuL1Eg5L.d.ts +0 -2961
- package/dist/chunk-3SZX6LHT.js.map +0 -1
- package/dist/chunk-7EON6Q4L.mjs.map +0 -1
- package/dist/chunk-WDY773GJ.js +0 -8308
- package/dist/chunk-WDY773GJ.js.map +0 -1
- package/dist/chunk-XE4EOKS4.mjs.map +0 -1
- package/dist/client.d.mts +0 -1461
- package/dist/client.d.ts +0 -1461
- package/dist/index.d.mts +0 -125
- package/dist/index.d.ts +0 -125
- package/dist/server.d.mts +0 -70
- 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
|