@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,210 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var zustand = require('zustand');
|
|
5
|
+
|
|
6
|
+
// src/features/blog/use-blog.ts
|
|
7
|
+
var blogService = null;
|
|
8
|
+
var useBlog = zustand.create((set) => ({
|
|
9
|
+
// Initial state
|
|
10
|
+
blogs: [],
|
|
11
|
+
currentBlog: null,
|
|
12
|
+
categories: [],
|
|
13
|
+
tags: [],
|
|
14
|
+
isLoading: false,
|
|
15
|
+
error: null,
|
|
16
|
+
total: 0,
|
|
17
|
+
totalPages: 0,
|
|
18
|
+
currentPage: 1,
|
|
19
|
+
/**
|
|
20
|
+
* Fetch blogs list
|
|
21
|
+
*/
|
|
22
|
+
fetchBlogs: async (params) => {
|
|
23
|
+
if (!blogService) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
set({ isLoading: true, error: null });
|
|
29
|
+
try {
|
|
30
|
+
const response = await blogService.getBlogs(params);
|
|
31
|
+
set({
|
|
32
|
+
blogs: response.items,
|
|
33
|
+
total: response.total,
|
|
34
|
+
totalPages: Math.ceil(response.total / response.limit),
|
|
35
|
+
currentPage: response.page,
|
|
36
|
+
isLoading: false
|
|
37
|
+
});
|
|
38
|
+
} catch (error) {
|
|
39
|
+
set({ error: error.message, isLoading: false });
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Fetch blog by ID
|
|
44
|
+
*/
|
|
45
|
+
fetchBlogById: async (blogId) => {
|
|
46
|
+
if (!blogService) {
|
|
47
|
+
throw new Error(
|
|
48
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
set({ isLoading: true, error: null });
|
|
52
|
+
try {
|
|
53
|
+
const blog = await blogService.getBlogById(blogId);
|
|
54
|
+
set({ currentBlog: blog, isLoading: false });
|
|
55
|
+
} catch (error) {
|
|
56
|
+
set({ error: error.message, isLoading: false });
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
/**
|
|
60
|
+
* Fetch blog by slug
|
|
61
|
+
*/
|
|
62
|
+
fetchBlogBySlug: async (slug) => {
|
|
63
|
+
if (!blogService) {
|
|
64
|
+
throw new Error(
|
|
65
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
set({ isLoading: true, error: null });
|
|
69
|
+
try {
|
|
70
|
+
const blog = await blogService.getBlogBySlug(slug);
|
|
71
|
+
set({ currentBlog: blog, isLoading: false });
|
|
72
|
+
} catch (error) {
|
|
73
|
+
set({ error: error.message, isLoading: false });
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
/**
|
|
77
|
+
* Fetch blog categories
|
|
78
|
+
*/
|
|
79
|
+
fetchCategories: async () => {
|
|
80
|
+
if (!blogService) {
|
|
81
|
+
throw new Error(
|
|
82
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
set({ isLoading: true, error: null });
|
|
86
|
+
try {
|
|
87
|
+
const categories = await blogService.getCategories();
|
|
88
|
+
set({ categories, isLoading: false });
|
|
89
|
+
} catch (error) {
|
|
90
|
+
set({ error: error.message, isLoading: false });
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
/**
|
|
94
|
+
* Fetch blogs by category
|
|
95
|
+
*/
|
|
96
|
+
fetchBlogsByCategory: async (categoryId, params) => {
|
|
97
|
+
if (!blogService) {
|
|
98
|
+
throw new Error(
|
|
99
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
set({ isLoading: true, error: null });
|
|
103
|
+
try {
|
|
104
|
+
const response = await blogService.getBlogsByCategory(categoryId, params);
|
|
105
|
+
set({
|
|
106
|
+
blogs: response.items,
|
|
107
|
+
total: response.total,
|
|
108
|
+
totalPages: Math.ceil(response.total / response.limit),
|
|
109
|
+
currentPage: response.page,
|
|
110
|
+
isLoading: false
|
|
111
|
+
});
|
|
112
|
+
} catch (error) {
|
|
113
|
+
set({ error: error.message, isLoading: false });
|
|
114
|
+
}
|
|
115
|
+
},
|
|
116
|
+
/**
|
|
117
|
+
* Fetch blog tags
|
|
118
|
+
*/
|
|
119
|
+
fetchTags: async () => {
|
|
120
|
+
if (!blogService) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
"Blog service not initialized. Call initializeOnex() first."
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
set({ isLoading: true, error: null });
|
|
126
|
+
try {
|
|
127
|
+
const tags = await blogService.getTags();
|
|
128
|
+
set({ tags, isLoading: false });
|
|
129
|
+
} catch (error) {
|
|
130
|
+
set({ error: error.message, isLoading: false });
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
/**
|
|
134
|
+
* Clear error
|
|
135
|
+
*/
|
|
136
|
+
clearError: () => {
|
|
137
|
+
set({ error: null });
|
|
138
|
+
},
|
|
139
|
+
/**
|
|
140
|
+
* Clear current blog
|
|
141
|
+
*/
|
|
142
|
+
clearCurrentBlog: () => {
|
|
143
|
+
set({ currentBlog: null });
|
|
144
|
+
}
|
|
145
|
+
}));
|
|
146
|
+
function initializeBlogService(service) {
|
|
147
|
+
blogService = service;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// src/features/blog/blog-service.ts
|
|
151
|
+
var BlogService = class {
|
|
152
|
+
constructor(api, companyId) {
|
|
153
|
+
this.api = api;
|
|
154
|
+
this.companyId = companyId;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Get list of blogs
|
|
158
|
+
*/
|
|
159
|
+
async getBlogs(params) {
|
|
160
|
+
const endpoint = `/blog/public/${this.companyId}/blogs`;
|
|
161
|
+
return await this.api.get(
|
|
162
|
+
endpoint,
|
|
163
|
+
params
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Get blog by ID
|
|
168
|
+
*/
|
|
169
|
+
async getBlogById(blogId) {
|
|
170
|
+
const endpoint = `/blog/public/${this.companyId}/blogs/${blogId}`;
|
|
171
|
+
return await this.api.get(endpoint);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get blog by slug
|
|
175
|
+
*/
|
|
176
|
+
async getBlogBySlug(slug) {
|
|
177
|
+
const endpoint = `/blog/public/${this.companyId}/blogs/slug/${slug}`;
|
|
178
|
+
return await this.api.get(endpoint);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Get blog categories
|
|
182
|
+
*/
|
|
183
|
+
async getCategories() {
|
|
184
|
+
const endpoint = `/blog/public/${this.companyId}/categories`;
|
|
185
|
+
return await this.api.get(endpoint);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get blogs by category
|
|
189
|
+
*/
|
|
190
|
+
async getBlogsByCategory(categoryId, params) {
|
|
191
|
+
const endpoint = `/blog/public/${this.companyId}/blogs/category/${categoryId}`;
|
|
192
|
+
return await this.api.get(
|
|
193
|
+
endpoint,
|
|
194
|
+
params
|
|
195
|
+
);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get blog tags
|
|
199
|
+
*/
|
|
200
|
+
async getTags() {
|
|
201
|
+
const endpoint = `/blog/public/${this.companyId}/blog_tags`;
|
|
202
|
+
return await this.api.get(endpoint);
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
exports.BlogService = BlogService;
|
|
207
|
+
exports.initializeBlogService = initializeBlogService;
|
|
208
|
+
exports.useBlog = useBlog;
|
|
209
|
+
//# sourceMappingURL=chunk-2CSWHI3L.js.map
|
|
210
|
+
//# sourceMappingURL=chunk-2CSWHI3L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/features/blog/use-blog.ts","../src/features/blog/blog-service.ts"],"names":["create"],"mappings":";;;;;AAmCA,IAAI,WAAA,GAAkC,IAAA;AAE/B,IAAM,OAAA,GAAUA,cAAA,CAAkB,CAAC,GAAA,MAAS;AAAA;AAAA,EAEjD,OAAO,EAAC;AAAA,EACR,WAAA,EAAa,IAAA;AAAA,EACb,YAAY,EAAC;AAAA,EACb,MAAM,EAAC;AAAA,EACP,SAAA,EAAW,KAAA;AAAA,EACX,KAAA,EAAO,IAAA;AAAA,EACP,KAAA,EAAO,CAAA;AAAA,EACP,UAAA,EAAY,CAAA;AAAA,EACZ,WAAA,EAAa,CAAA;AAAA;AAAA;AAAA;AAAA,EAKb,UAAA,EAAY,OAAO,MAAA,KAAW;AAC5B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,QAAA,CAAS,MAAM,CAAA;AAClD,MAAA,GAAA,CAAI;AAAA,QACF,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,YAAY,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAA,GAAQ,SAAS,KAAK,CAAA;AAAA,QACrD,aAAa,QAAA,CAAS,IAAA;AAAA,QACtB,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,EAAe,OAAO,MAAA,KAAW;AAC/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,WAAA,CAAY,MAAM,CAAA;AACjD,MAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,EAAiB,OAAO,IAAA,KAAS;AAC/B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,aAAA,CAAc,IAAI,CAAA;AACjD,MAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,SAAA,EAAW,OAAO,CAAA;AAAA,IAC7C,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,YAAY;AAC3B,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,aAAA,EAAc;AACnD,MAAA,GAAA,CAAI,EAAE,UAAA,EAAY,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,IACtC,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAA,EAAsB,OAAO,UAAA,EAAY,MAAA,KAAW;AAClD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,WAAA,CAAY,kBAAA,CAAmB,YAAY,MAAM,CAAA;AACxE,MAAA,GAAA,CAAI;AAAA,QACF,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,OAAO,QAAA,CAAS,KAAA;AAAA,QAChB,YAAY,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,KAAA,GAAQ,SAAS,KAAK,CAAA;AAAA,QACrD,aAAa,QAAA,CAAS,IAAA;AAAA,QACtB,SAAA,EAAW;AAAA,OACZ,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,YAAY;AACrB,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,GAAA,CAAI,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACpC,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,OAAA,EAAQ;AACvC,MAAA,GAAA,CAAI,EAAE,IAAA,EAAM,SAAA,EAAW,KAAA,EAAO,CAAA;AAAA,IAChC,SAAS,KAAA,EAAO;AACd,MAAA,GAAA,CAAI,EAAE,KAAA,EAAQ,KAAA,CAAgB,OAAA,EAAS,SAAA,EAAW,OAAO,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY,MAAM;AAChB,IAAA,GAAA,CAAI,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EACrB,CAAA;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,MAAM;AACtB,IAAA,GAAA,CAAI,EAAE,WAAA,EAAa,IAAA,EAAM,CAAA;AAAA,EAC3B;AACF,CAAA,CAAE;AAMK,SAAS,sBAAsB,OAAA,EAA4B;AAChE,EAAA,WAAA,GAAc,OAAA;AAChB;;;ACvLO,IAAM,cAAN,MAAkB;AAAA,EACvB,WAAA,CACU,KACA,SAAA,EACR;AAFQ,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,SAAA,GAAA,SAAA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,SAAS,MAAA,EAAoD;AACjE,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,MAAA,CAAA;AAC/C,IAAA,OAAO,MAAM,KAAK,GAAA,CAAI,GAAA;AAAA,MACpB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,YAAY,MAAA,EAA+B;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,UAAU,MAAM,CAAA,CAAA;AAC/D,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAU,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,IAAA,EAA6B;AAC/C,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,eAAe,IAAI,CAAA,CAAA;AAClE,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAU,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAA,GAAyC;AAC7C,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,WAAA,CAAA;AAC/C,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAoB,QAAQ,CAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAAA,CACJ,UAAA,EACA,MAAA,EAC2B;AAC3B,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,mBAAmB,UAAU,CAAA,CAAA;AAC5E,IAAA,OAAO,MAAM,KAAK,GAAA,CAAI,GAAA;AAAA,MACpB,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAA6B;AACjC,IAAA,MAAM,QAAA,GAAW,CAAA,aAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,UAAA,CAAA;AAC/C,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAc,QAAQ,CAAA;AAAA,EAC9C;AACF","file":"chunk-2CSWHI3L.js","sourcesContent":["/**\n * Blog Hook\n * Zustand store for blog state and actions\n */\n\nimport { create } from \"zustand\";\nimport { BlogService } from \"./blog-service\";\nimport type { Blog, BlogListParams, BlogCategory } from \"./types\";\n\ninterface BlogState {\n // State\n blogs: Blog[];\n currentBlog: Blog | null;\n categories: BlogCategory[];\n tags: string[];\n isLoading: boolean;\n error: string | null;\n total: number;\n totalPages: number;\n currentPage: number;\n\n // Actions\n fetchBlogs: (params?: BlogListParams) => Promise<void>;\n fetchBlogById: (blogId: string) => Promise<void>;\n fetchBlogBySlug: (slug: string) => Promise<void>;\n fetchCategories: () => Promise<void>;\n fetchBlogsByCategory: (\n categoryId: string,\n params?: BlogListParams\n ) => Promise<void>;\n fetchTags: () => Promise<void>;\n clearError: () => void;\n clearCurrentBlog: () => void;\n}\n\nlet blogService: BlogService | null = null;\n\nexport const useBlog = create<BlogState>((set) => ({\n // Initial state\n blogs: [],\n currentBlog: null,\n categories: [],\n tags: [],\n isLoading: false,\n error: null,\n total: 0,\n totalPages: 0,\n currentPage: 1,\n\n /**\n * Fetch blogs list\n */\n fetchBlogs: async (params) => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const response = await blogService.getBlogs(params);\n set({\n blogs: response.items,\n total: response.total,\n totalPages: Math.ceil(response.total / response.limit),\n currentPage: response.page,\n isLoading: false,\n });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch blog by ID\n */\n fetchBlogById: async (blogId) => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const blog = await blogService.getBlogById(blogId);\n set({ currentBlog: blog, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch blog by slug\n */\n fetchBlogBySlug: async (slug) => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const blog = await blogService.getBlogBySlug(slug);\n set({ currentBlog: blog, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch blog categories\n */\n fetchCategories: async () => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const categories = await blogService.getCategories();\n set({ categories, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch blogs by category\n */\n fetchBlogsByCategory: async (categoryId, params) => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const response = await blogService.getBlogsByCategory(categoryId, params);\n set({\n blogs: response.items,\n total: response.total,\n totalPages: Math.ceil(response.total / response.limit),\n currentPage: response.page,\n isLoading: false,\n });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Fetch blog tags\n */\n fetchTags: async () => {\n if (!blogService) {\n throw new Error(\n \"Blog service not initialized. Call initializeOnex() first.\"\n );\n }\n\n set({ isLoading: true, error: null });\n try {\n const tags = await blogService.getTags();\n set({ tags, isLoading: false });\n } catch (error) {\n set({ error: (error as Error).message, isLoading: false });\n }\n },\n\n /**\n * Clear error\n */\n clearError: () => {\n set({ error: null });\n },\n\n /**\n * Clear current blog\n */\n clearCurrentBlog: () => {\n set({ currentBlog: null });\n },\n}));\n\n/**\n * Initialize blog service\n * @internal Called by initializeOnex()\n */\nexport function initializeBlogService(service: BlogService): void {\n blogService = service;\n}\n","/**\n * Blog Service\n * Handles blog-related API calls\n */\n\nimport { ApiClient } from \"../../api/client\";\nimport type {\n Blog,\n BlogListResponse,\n BlogListParams,\n BlogCategory,\n} from \"./types\";\n\nexport class BlogService {\n constructor(\n private api: ApiClient,\n private companyId: string\n ) {}\n\n /**\n * Get list of blogs\n */\n async getBlogs(params?: BlogListParams): Promise<BlogListResponse> {\n const endpoint = `/blog/public/${this.companyId}/blogs`;\n return await this.api.get<BlogListResponse>(\n endpoint,\n params as Record<string, unknown>\n );\n }\n\n /**\n * Get blog by ID\n */\n async getBlogById(blogId: string): Promise<Blog> {\n const endpoint = `/blog/public/${this.companyId}/blogs/${blogId}`;\n return await this.api.get<Blog>(endpoint);\n }\n\n /**\n * Get blog by slug\n */\n async getBlogBySlug(slug: string): Promise<Blog> {\n const endpoint = `/blog/public/${this.companyId}/blogs/slug/${slug}`;\n return await this.api.get<Blog>(endpoint);\n }\n\n /**\n * Get blog categories\n */\n async getCategories(): Promise<BlogCategory[]> {\n const endpoint = `/blog/public/${this.companyId}/categories`;\n return await this.api.get<BlogCategory[]>(endpoint);\n }\n\n /**\n * Get blogs by category\n */\n async getBlogsByCategory(\n categoryId: string,\n params?: BlogListParams\n ): Promise<BlogListResponse> {\n const endpoint = `/blog/public/${this.companyId}/blogs/category/${categoryId}`;\n return await this.api.get<BlogListResponse>(\n endpoint,\n params as Record<string, unknown>\n );\n }\n\n /**\n * Get blog tags\n */\n async getTags(): Promise<string[]> {\n const endpoint = `/blog/public/${this.companyId}/blog_tags`;\n return await this.api.get<string[]>(endpoint);\n }\n}\n"]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var chunk2NMEKWO5_js = require('./chunk-2NMEKWO5.js');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
|
|
8
|
+
var CartContext = react.createContext(void 0);
|
|
9
|
+
var CART_STORAGE_KEY = "onex-cart";
|
|
10
|
+
function getInitialCart() {
|
|
11
|
+
if (typeof window === "undefined") return [];
|
|
12
|
+
try {
|
|
13
|
+
const savedCart = localStorage.getItem(CART_STORAGE_KEY);
|
|
14
|
+
if (savedCart) {
|
|
15
|
+
return JSON.parse(savedCart);
|
|
16
|
+
}
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error(
|
|
19
|
+
"[CartContext] Failed to load cart from localStorage:",
|
|
20
|
+
error
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
return [];
|
|
24
|
+
}
|
|
25
|
+
function CartProvider({ children }) {
|
|
26
|
+
const [items, setItems] = react.useState(() => getInitialCart());
|
|
27
|
+
react.useEffect(() => {
|
|
28
|
+
localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(items));
|
|
29
|
+
}, [items]);
|
|
30
|
+
const addItem = (newItem) => {
|
|
31
|
+
setItems((currentItems) => {
|
|
32
|
+
const existingItem = currentItems.find(
|
|
33
|
+
(item) => item.productId === newItem.productId && (item.size || "") === (newItem.size || "") && (item.color || "") === (newItem.color || "") && (item.locationId || "") === (newItem.locationId || "")
|
|
34
|
+
);
|
|
35
|
+
if (existingItem) {
|
|
36
|
+
return currentItems.map(
|
|
37
|
+
(item) => item.id === existingItem.id ? chunk2NMEKWO5_js.__spreadProps(chunk2NMEKWO5_js.__spreadValues({}, item), { quantity: item.quantity + 1 }) : item
|
|
38
|
+
);
|
|
39
|
+
} else {
|
|
40
|
+
return [
|
|
41
|
+
...currentItems,
|
|
42
|
+
chunk2NMEKWO5_js.__spreadProps(chunk2NMEKWO5_js.__spreadValues({}, newItem), {
|
|
43
|
+
id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
|
|
44
|
+
quantity: 1
|
|
45
|
+
})
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
const removeItem = (id) => {
|
|
51
|
+
setItems((currentItems) => currentItems.filter((item) => item.id !== id));
|
|
52
|
+
};
|
|
53
|
+
const updateQuantity = (id, quantity) => {
|
|
54
|
+
if (quantity < 1) {
|
|
55
|
+
removeItem(id);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
setItems(
|
|
59
|
+
(currentItems) => currentItems.map(
|
|
60
|
+
(item) => item.id === id ? chunk2NMEKWO5_js.__spreadProps(chunk2NMEKWO5_js.__spreadValues({}, item), { quantity }) : item
|
|
61
|
+
)
|
|
62
|
+
);
|
|
63
|
+
};
|
|
64
|
+
const clearCart = () => {
|
|
65
|
+
setItems([]);
|
|
66
|
+
};
|
|
67
|
+
const itemCount = items.reduce((sum, item) => sum + item.quantity, 0);
|
|
68
|
+
const subtotal = items.reduce(
|
|
69
|
+
(sum, item) => sum + item.price * item.quantity,
|
|
70
|
+
0
|
|
71
|
+
);
|
|
72
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
+
CartContext.Provider,
|
|
74
|
+
{
|
|
75
|
+
value: {
|
|
76
|
+
items,
|
|
77
|
+
addItem,
|
|
78
|
+
removeItem,
|
|
79
|
+
updateQuantity,
|
|
80
|
+
clearCart,
|
|
81
|
+
itemCount,
|
|
82
|
+
subtotal
|
|
83
|
+
},
|
|
84
|
+
children
|
|
85
|
+
}
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
function useCart() {
|
|
89
|
+
const context = react.useContext(CartContext);
|
|
90
|
+
if (context === void 0) {
|
|
91
|
+
throw new Error("useCart must be used within a CartProvider");
|
|
92
|
+
}
|
|
93
|
+
return context;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
exports.CartProvider = CartProvider;
|
|
97
|
+
exports.useCart = useCart;
|
|
98
|
+
//# sourceMappingURL=chunk-2FGHIDUV.js.map
|
|
99
|
+
//# sourceMappingURL=chunk-2FGHIDUV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/contexts/cart-context.tsx"],"names":["createContext","useState","useEffect","__spreadProps","__spreadValues","jsx","useContext"],"mappings":"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","file":"chunk-2FGHIDUV.js","sourcesContent":["\"use client\";\n\n/**\n * Cart Context\n * Full shopping cart functionality with localStorage persistence\n * Supports product variants (size, color, SKU, location)\n */\n\nimport React, { createContext, useContext, useState, useEffect } from \"react\";\nimport type { CartItem, CartContextType } from \"../types\";\n\nconst CartContext = createContext<CartContextType | undefined>(undefined);\n\nconst CART_STORAGE_KEY = \"onex-cart\";\n\n/**\n * Load cart from localStorage (client-side only)\n */\nfunction getInitialCart(): CartItem[] {\n if (typeof window === \"undefined\") return [];\n\n try {\n const savedCart = localStorage.getItem(CART_STORAGE_KEY);\n if (savedCart) {\n return JSON.parse(savedCart);\n }\n } catch (error) {\n console.error(\n \"[CartContext] Failed to load cart from localStorage:\",\n error\n );\n }\n return [];\n}\n\nexport function CartProvider({ children }: { children: React.ReactNode }) {\n // Use lazy initialization to load from localStorage\n const [items, setItems] = useState<CartItem[]>(() => getInitialCart());\n\n // Save cart to localStorage whenever it changes\n useEffect(() => {\n localStorage.setItem(CART_STORAGE_KEY, JSON.stringify(items));\n }, [items]);\n\n /**\n * Add item to cart\n * Checks for duplicates based on productId, size, color, and locationId\n */\n const addItem = (newItem: Omit<CartItem, \"id\" | \"quantity\">) => {\n setItems((currentItems) => {\n // Check if item already exists (same product, size, color, and location)\n const existingItem = currentItems.find(\n (item) =>\n item.productId === newItem.productId &&\n (item.size || \"\") === (newItem.size || \"\") &&\n (item.color || \"\") === (newItem.color || \"\") &&\n (item.locationId || \"\") === (newItem.locationId || \"\")\n );\n\n if (existingItem) {\n // Increase quantity\n return currentItems.map((item) =>\n item.id === existingItem.id\n ? { ...item, quantity: item.quantity + 1 }\n : item\n );\n } else {\n // Add new item\n return [\n ...currentItems,\n {\n ...newItem,\n id: `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n quantity: 1,\n },\n ];\n }\n });\n };\n\n /**\n * Remove item from cart by ID\n */\n const removeItem = (id: string) => {\n setItems((currentItems) => currentItems.filter((item) => item.id !== id));\n };\n\n /**\n * Update item quantity\n * Removes item if quantity < 1\n */\n const updateQuantity = (id: string, quantity: number) => {\n if (quantity < 1) {\n removeItem(id);\n return;\n }\n\n setItems((currentItems) =>\n currentItems.map((item) =>\n item.id === id ? { ...item, quantity } : item\n )\n );\n };\n\n /**\n * Clear all items from cart\n */\n const clearCart = () => {\n setItems([]);\n };\n\n // Calculate totals\n const itemCount = items.reduce((sum, item) => sum + item.quantity, 0);\n const subtotal = items.reduce(\n (sum, item) => sum + item.price * item.quantity,\n 0\n );\n\n return (\n <CartContext.Provider\n value={{\n items,\n addItem,\n removeItem,\n updateQuantity,\n clearCart,\n itemCount,\n subtotal,\n }}\n >\n {children}\n </CartContext.Provider>\n );\n}\n\n/**\n * Hook to access cart context\n */\nexport function useCart() {\n const context = useContext(CartContext);\n if (context === undefined) {\n throw new Error(\"useCart must be used within a CartProvider\");\n }\n return context;\n}\n\n// Re-export types for convenience\nexport type { CartItem, CartContextType };\n"]}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __defProps = Object.defineProperties;
|
|
6
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
+
var __spreadValues = (a, b) => {
|
|
12
|
+
for (var prop in b || (b = {}))
|
|
13
|
+
if (__hasOwnProp.call(b, prop))
|
|
14
|
+
__defNormalProp(a, prop, b[prop]);
|
|
15
|
+
if (__getOwnPropSymbols)
|
|
16
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
+
if (__propIsEnum.call(b, prop))
|
|
18
|
+
__defNormalProp(a, prop, b[prop]);
|
|
19
|
+
}
|
|
20
|
+
return a;
|
|
21
|
+
};
|
|
22
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
|
+
var __objRest = (source, exclude) => {
|
|
24
|
+
var target = {};
|
|
25
|
+
for (var prop in source)
|
|
26
|
+
if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
|
|
27
|
+
target[prop] = source[prop];
|
|
28
|
+
if (source != null && __getOwnPropSymbols)
|
|
29
|
+
for (var prop of __getOwnPropSymbols(source)) {
|
|
30
|
+
if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
|
|
31
|
+
target[prop] = source[prop];
|
|
32
|
+
}
|
|
33
|
+
return target;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.__objRest = __objRest;
|
|
37
|
+
exports.__spreadProps = __spreadProps;
|
|
38
|
+
exports.__spreadValues = __spreadValues;
|
|
39
|
+
//# sourceMappingURL=chunk-2NMEKWO5.js.map
|
|
40
|
+
//# sourceMappingURL=chunk-2NMEKWO5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-2NMEKWO5.js"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { __spreadValues } from './chunk-YOSPWY5K.mjs';
|
|
3
|
+
import axios from 'axios';
|
|
4
|
+
|
|
5
|
+
var ApiClient = class {
|
|
6
|
+
constructor(config) {
|
|
7
|
+
this.memoryToken = null;
|
|
8
|
+
this.config = __spreadValues({
|
|
9
|
+
tokenStorage: "localStorage",
|
|
10
|
+
tokenKey: "auth_token"
|
|
11
|
+
}, config);
|
|
12
|
+
this.client = axios.create({
|
|
13
|
+
baseURL: config.baseURL,
|
|
14
|
+
headers: __spreadValues({
|
|
15
|
+
"Content-Type": "application/json"
|
|
16
|
+
}, config.headers),
|
|
17
|
+
timeout: 3e4
|
|
18
|
+
// 30 seconds
|
|
19
|
+
});
|
|
20
|
+
this.setupInterceptors();
|
|
21
|
+
}
|
|
22
|
+
setupInterceptors() {
|
|
23
|
+
this.client.interceptors.request.use(
|
|
24
|
+
(config) => {
|
|
25
|
+
const token = this.getToken();
|
|
26
|
+
if (token) {
|
|
27
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
28
|
+
}
|
|
29
|
+
return config;
|
|
30
|
+
},
|
|
31
|
+
(error) => {
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
this.client.interceptors.response.use(
|
|
36
|
+
(response) => response,
|
|
37
|
+
(error) => {
|
|
38
|
+
var _a, _b, _c, _d, _e;
|
|
39
|
+
if (((_a = error.response) == null ? void 0 : _a.status) === 401) {
|
|
40
|
+
this.clearToken();
|
|
41
|
+
(_c = (_b = this.config).onUnauthorized) == null ? void 0 : _c.call(_b);
|
|
42
|
+
}
|
|
43
|
+
const message = ((_e = (_d = error.response) == null ? void 0 : _d.data) == null ? void 0 : _e.message) || error.message || "An error occurred";
|
|
44
|
+
return Promise.reject(new Error(message));
|
|
45
|
+
}
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* GET request
|
|
50
|
+
*/
|
|
51
|
+
async get(url, params) {
|
|
52
|
+
const response = await this.client.get(url, { params });
|
|
53
|
+
return response.data.data;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* POST request
|
|
57
|
+
*/
|
|
58
|
+
async post(url, data) {
|
|
59
|
+
const response = await this.client.post(url, data);
|
|
60
|
+
return response.data.data;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* PUT request
|
|
64
|
+
*/
|
|
65
|
+
async put(url, data) {
|
|
66
|
+
const response = await this.client.put(url, data);
|
|
67
|
+
return response.data.data;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* PATCH request
|
|
71
|
+
*/
|
|
72
|
+
async patch(url, data) {
|
|
73
|
+
const response = await this.client.patch(url, data);
|
|
74
|
+
return response.data.data;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* DELETE request
|
|
78
|
+
*/
|
|
79
|
+
async delete(url) {
|
|
80
|
+
const response = await this.client.delete(url);
|
|
81
|
+
return response.data.data;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Set authentication token
|
|
85
|
+
*/
|
|
86
|
+
setToken(token) {
|
|
87
|
+
if (this.config.tokenStorage === "localStorage") {
|
|
88
|
+
if (typeof window !== "undefined") {
|
|
89
|
+
localStorage.setItem(this.config.tokenKey, token);
|
|
90
|
+
}
|
|
91
|
+
} else if (this.config.tokenStorage === "memory") {
|
|
92
|
+
this.memoryToken = token;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Get authentication token
|
|
97
|
+
*/
|
|
98
|
+
getToken() {
|
|
99
|
+
if (this.config.tokenStorage === "localStorage") {
|
|
100
|
+
if (typeof window !== "undefined") {
|
|
101
|
+
return localStorage.getItem(this.config.tokenKey);
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
} else if (this.config.tokenStorage === "memory") {
|
|
105
|
+
return this.memoryToken;
|
|
106
|
+
}
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Clear authentication token
|
|
111
|
+
*/
|
|
112
|
+
clearToken() {
|
|
113
|
+
if (this.config.tokenStorage === "localStorage") {
|
|
114
|
+
if (typeof window !== "undefined") {
|
|
115
|
+
localStorage.removeItem(this.config.tokenKey);
|
|
116
|
+
}
|
|
117
|
+
} else if (this.config.tokenStorage === "memory") {
|
|
118
|
+
this.memoryToken = null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Check if user is authenticated
|
|
123
|
+
*/
|
|
124
|
+
isAuthenticated() {
|
|
125
|
+
return !!this.getToken();
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
export { ApiClient };
|
|
130
|
+
//# sourceMappingURL=chunk-43BVHGDT.mjs.map
|
|
131
|
+
//# sourceMappingURL=chunk-43BVHGDT.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api/client.ts"],"names":[],"mappings":"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","file":"chunk-43BVHGDT.mjs","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"]}
|