create-lumen 1.1.4 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -34
- package/package.json +5 -1
- package/src/configure.js +6 -2
- package/src/css.js +71 -24
- package/src/dependencies.js +15 -6
- package/src/injector.js +116 -24
- package/src/main.js +3 -1
- package/src/readme.js +64 -22
- package/templates/architectures/component-based/src/App.jsx +6 -3
- package/templates/architectures/component-based/src/App.tsx +6 -3
- package/templates/architectures/component-based/src/components/common/Button.jsx +5 -2
- package/templates/architectures/component-based/src/components/common/Button.tsx +5 -2
- package/templates/architectures/component-based/src/hooks/useApp.js +10 -0
- package/templates/architectures/component-based/src/hooks/useApp.ts +10 -0
- package/templates/architectures/component-based/src/layouts/MainLayout.jsx +12 -4
- package/templates/architectures/component-based/src/layouts/MainLayout.tsx +12 -4
- package/templates/architectures/component-based/src/pages/Home/Home.jsx +6 -1
- package/templates/architectures/component-based/src/pages/Home/Home.tsx +6 -1
- package/templates/architectures/component-based/src/providers/AppProvider.jsx +20 -0
- package/templates/architectures/component-based/src/providers/AppProvider.tsx +24 -0
- package/templates/architectures/component-based/src/providers/appcontext.js +3 -0
- package/templates/architectures/component-based/src/{context/app-context.ts → providers/appcontext.ts} +1 -3
- package/templates/architectures/{feature-based → component-based}/src/types/index.js +7 -0
- package/templates/architectures/{feature-based → component-based}/src/types/index.ts +5 -0
- package/templates/architectures/feature-based/main.jsx +1 -1
- package/templates/architectures/feature-based/main.tsx +1 -1
- package/templates/architectures/feature-based/scripts/create-feature.mjs +2 -2
- package/templates/architectures/feature-based/src/app/App.jsx +15 -4
- package/templates/architectures/feature-based/src/app/App.tsx +15 -4
- package/templates/architectures/feature-based/src/app/contexts/themecontext.js +3 -0
- package/templates/architectures/feature-based/src/app/contexts/themecontext.ts +8 -0
- package/templates/architectures/feature-based/src/app/hooks/useTheme.js +10 -0
- package/templates/architectures/feature-based/src/app/hooks/useTheme.ts +10 -0
- package/templates/architectures/feature-based/src/app/providers/ThemeProvider.jsx +18 -1
- package/templates/architectures/feature-based/src/app/providers/ThemeProvider.tsx +19 -2
- package/templates/architectures/feature-based/src/features/home/pages/HomePage.jsx +18 -4
- package/templates/architectures/feature-based/src/features/home/pages/HomePage.tsx +18 -4
- package/templates/architectures/feature-based/src/shared/components/ui/Button.jsx +31 -0
- package/templates/architectures/feature-based/src/shared/components/ui/Button.tsx +36 -0
- package/templates/architectures/feature-based/src/shared/layouts/.gitkeep +0 -0
- package/templates/architectures/feature-based/src/shared/stores/.gitkeep +0 -0
- package/templates/architectures/feature-based/src/shared/styles/.gitkeep +0 -0
- package/templates/architectures/feature-based/src/shared/types/index.js +20 -0
- package/templates/architectures/feature-based/src/shared/types/index.ts +16 -0
- package/templates/conditional/axios/component-based/src/config/axios.config.js +7 -0
- package/templates/conditional/axios/component-based/src/config/axios.config.ts +7 -0
- package/templates/conditional/axios/component-based/src/services/axios.client.js +24 -0
- package/templates/conditional/axios/component-based/src/services/axios.client.ts +24 -0
- package/templates/conditional/axios/component-based/src/services/user.service.js +33 -0
- package/templates/conditional/axios/component-based/src/services/user.service.ts +29 -0
- package/templates/conditional/axios/feature-based/src/features/home/services/user.service.js +33 -0
- package/templates/conditional/axios/feature-based/src/features/home/services/user.service.ts +29 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.client.js +24 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.client.ts +24 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.config.js +7 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/api.config.ts +7 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/index.js +1 -0
- package/templates/conditional/axios/feature-based/src/shared/lib/axios/index.ts +1 -0
- package/templates/conditional/fetch/component-based/src/config/api.config.js +7 -0
- package/templates/conditional/fetch/component-based/src/config/api.config.ts +7 -0
- package/templates/conditional/fetch/component-based/src/services/api.client.js +51 -0
- package/templates/conditional/fetch/component-based/src/services/api.client.ts +55 -0
- package/templates/conditional/fetch/component-based/src/services/user.service.js +33 -0
- package/templates/conditional/fetch/component-based/src/services/user.service.ts +29 -0
- package/templates/conditional/fetch/feature-based/src/features/home/services/user.service.js +33 -0
- package/templates/conditional/fetch/feature-based/src/features/home/services/user.service.ts +29 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/api.client.js +51 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/api.client.ts +55 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/api.config.js +7 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/api.config.ts +7 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/index.js +1 -0
- package/templates/conditional/fetch/feature-based/src/shared/api/index.ts +1 -0
- package/templates/conditional/icons/huge/component-based/bootstrap/src/pages/Home/Home.jsx +20 -0
- package/templates/conditional/icons/huge/component-based/bootstrap/src/pages/Home/Home.tsx +20 -0
- package/templates/conditional/icons/huge/component-based/src/pages/Home/Home.jsx +24 -8
- package/templates/conditional/icons/huge/component-based/src/pages/Home/Home.tsx +24 -8
- package/templates/conditional/icons/huge/component-based/tailwind/src/pages/Home/Home.jsx +20 -0
- package/templates/conditional/icons/huge/component-based/tailwind/src/pages/Home/Home.tsx +20 -0
- package/templates/conditional/icons/huge/feature-based/bootstrap/src/features/home/pages/HomePage.jsx +20 -0
- package/templates/conditional/icons/huge/feature-based/bootstrap/src/features/home/pages/HomePage.tsx +20 -0
- package/templates/conditional/icons/huge/feature-based/src/features/home/pages/HomePage.jsx +25 -9
- package/templates/conditional/icons/huge/feature-based/src/features/home/pages/HomePage.tsx +25 -9
- package/templates/conditional/icons/huge/feature-based/tailwind/src/features/home/pages/HomePage.jsx +20 -0
- package/templates/conditional/icons/huge/feature-based/tailwind/src/features/home/pages/HomePage.tsx +20 -0
- package/templates/conditional/icons/lucide/component-based/bootstrap/src/pages/Home/Home.jsx +19 -0
- package/templates/conditional/icons/lucide/component-based/bootstrap/src/pages/Home/Home.tsx +19 -0
- package/templates/conditional/icons/lucide/component-based/src/pages/Home/Home.jsx +24 -8
- package/templates/conditional/icons/lucide/component-based/src/pages/Home/Home.tsx +24 -8
- package/templates/conditional/icons/lucide/component-based/tailwind/src/pages/Home/Home.jsx +19 -0
- package/templates/conditional/icons/lucide/component-based/tailwind/src/pages/Home/Home.tsx +19 -0
- package/templates/conditional/icons/lucide/feature-based/bootstrap/src/features/home/pages/HomePage.jsx +19 -0
- package/templates/conditional/icons/lucide/feature-based/bootstrap/src/features/home/pages/HomePage.tsx +19 -0
- package/templates/conditional/icons/lucide/feature-based/src/features/home/pages/HomePage.jsx +25 -9
- package/templates/conditional/icons/lucide/feature-based/src/features/home/pages/HomePage.tsx +25 -9
- package/templates/conditional/icons/lucide/feature-based/tailwind/src/features/home/pages/HomePage.jsx +19 -0
- package/templates/conditional/icons/lucide/feature-based/tailwind/src/features/home/pages/HomePage.tsx +19 -0
- package/templates/conditional/router/component-based/bootstrap/src/layouts/MainLayout.jsx +17 -0
- package/templates/conditional/router/component-based/bootstrap/src/layouts/MainLayout.tsx +17 -0
- package/templates/conditional/router/component-based/src/App.jsx +4 -4
- package/templates/conditional/router/component-based/src/App.tsx +4 -4
- package/templates/conditional/router/component-based/src/layouts/MainLayout.jsx +39 -0
- package/templates/conditional/router/component-based/src/layouts/MainLayout.tsx +39 -0
- package/templates/conditional/router/component-based/src/router/guards/AuthGuard.jsx +8 -0
- package/templates/conditional/router/component-based/src/router/guards/AuthGuard.tsx +14 -0
- package/templates/conditional/router/component-based/src/router/guards/GuestGuard.jsx +8 -0
- package/templates/conditional/router/component-based/src/router/guards/GuestGuard.tsx +14 -0
- package/templates/conditional/router/component-based/src/router/index.jsx +44 -0
- package/templates/conditional/router/component-based/src/router/index.tsx +44 -0
- package/templates/conditional/router/component-based/tailwind/src/layouts/MainLayout.jsx +17 -0
- package/templates/conditional/router/component-based/tailwind/src/layouts/MainLayout.tsx +17 -0
- package/templates/conditional/router/feature-based/bootstrap/src/shared/layouts/RootLayout.jsx +9 -0
- package/templates/conditional/router/feature-based/bootstrap/src/shared/layouts/RootLayout.tsx +9 -0
- package/templates/conditional/router/feature-based/src/app/App.jsx +6 -1
- package/templates/conditional/router/feature-based/src/app/App.tsx +6 -1
- package/templates/conditional/router/feature-based/src/app/router/guards/AuthGuard.jsx +8 -0
- package/templates/conditional/router/feature-based/src/app/router/guards/AuthGuard.tsx +14 -0
- package/templates/conditional/router/feature-based/src/app/router/guards/RoleGuard.jsx +8 -0
- package/templates/conditional/router/feature-based/src/app/router/guards/RoleGuard.tsx +15 -0
- package/templates/conditional/router/feature-based/src/app/router/index.jsx +16 -0
- package/templates/conditional/router/feature-based/src/app/router/index.tsx +16 -0
- package/templates/conditional/router/feature-based/src/app/router/routes/auth.routes.jsx +18 -0
- package/templates/conditional/router/feature-based/src/app/router/routes/auth.routes.tsx +18 -0
- package/templates/conditional/router/feature-based/src/app/router/routes/home.routes.jsx +8 -0
- package/templates/conditional/router/feature-based/src/app/router/routes/home.routes.tsx +8 -0
- package/templates/conditional/router/feature-based/src/shared/layouts/RootLayout.jsx +17 -0
- package/templates/conditional/router/feature-based/src/shared/layouts/RootLayout.tsx +17 -0
- package/templates/conditional/router/feature-based/tailwind/src/shared/layouts/RootLayout.jsx +9 -0
- package/templates/conditional/router/feature-based/tailwind/src/shared/layouts/RootLayout.tsx +9 -0
- package/templates/conditional/state/redux/feature-based/src/app/providers/StoreProvider.jsx +1 -1
- package/templates/conditional/state/redux/feature-based/src/app/providers/StoreProvider.tsx +1 -1
- package/templates/css/bootstrap/src/themes.css +14 -0
- package/templates/css/component-styles/bootstrap/component-based/src/components/common/Button.jsx +17 -0
- package/templates/css/component-styles/bootstrap/component-based/src/components/common/Button.tsx +22 -0
- package/templates/css/component-styles/bootstrap/component-based/src/layouts/MainLayout.jsx +15 -0
- package/templates/css/component-styles/bootstrap/component-based/src/layouts/MainLayout.tsx +19 -0
- package/templates/css/component-styles/bootstrap/component-based/src/pages/Home/Home.jsx +13 -0
- package/templates/css/component-styles/bootstrap/component-based/src/pages/Home/Home.tsx +13 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/app/App.jsx +9 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/app/App.tsx +9 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/features/home/pages/HomePage.jsx +13 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/features/home/pages/HomePage.tsx +13 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/shared/components/ui/Button.jsx +17 -0
- package/templates/css/component-styles/bootstrap/feature-based/src/shared/components/ui/Button.tsx +22 -0
- package/templates/{architectures/feature-based/src/components/ui → css/component-styles/tailwind/component-based/src/components/common}/Button.jsx +1 -1
- package/templates/{architectures/feature-based/src/components/ui → css/component-styles/tailwind/component-based/src/components/common}/Button.tsx +1 -1
- package/templates/css/component-styles/tailwind/component-based/src/layouts/MainLayout.jsx +15 -0
- package/templates/css/component-styles/tailwind/component-based/src/layouts/MainLayout.tsx +19 -0
- package/templates/css/component-styles/tailwind/component-based/src/pages/Home/Home.jsx +13 -0
- package/templates/css/component-styles/tailwind/component-based/src/pages/Home/Home.tsx +13 -0
- package/templates/css/component-styles/tailwind/feature-based/src/app/App.jsx +9 -0
- package/templates/css/component-styles/tailwind/feature-based/src/app/App.tsx +9 -0
- package/templates/css/component-styles/tailwind/feature-based/src/features/home/pages/HomePage.jsx +13 -0
- package/templates/css/component-styles/tailwind/feature-based/src/features/home/pages/HomePage.tsx +13 -0
- package/templates/css/component-styles/tailwind/feature-based/src/shared/components/ui/Button.jsx +21 -0
- package/templates/css/component-styles/tailwind/feature-based/src/shared/components/ui/Button.tsx +26 -0
- package/templates/css/none/src/{index.css → main.css} +2 -0
- package/templates/css/none/src/themes.css +19 -0
- package/templates/css/tailwind/src/themes.css +9 -0
- package/templates/architectures/component-based/src/config/constants.js +0 -1
- package/templates/architectures/component-based/src/config/constants.ts +0 -1
- package/templates/architectures/component-based/src/config/routes.js +0 -7
- package/templates/architectures/component-based/src/config/routes.ts +0 -7
- package/templates/architectures/component-based/src/context/AppContext.jsx +0 -12
- package/templates/architectures/component-based/src/context/AppContext.tsx +0 -18
- package/templates/architectures/component-based/src/context/app-context.js +0 -5
- package/templates/architectures/component-based/src/hooks/index.js +0 -1
- package/templates/architectures/component-based/src/hooks/index.ts +0 -1
- package/templates/architectures/component-based/src/layouts/index.js +0 -1
- package/templates/architectures/component-based/src/layouts/index.ts +0 -1
- package/templates/architectures/component-based/src/styles/globals.css +0 -7
- package/templates/architectures/component-based/src/utils/index.js +0 -1
- package/templates/architectures/component-based/src/utils/index.ts +0 -1
- package/templates/architectures/feature-based/src/config/constants.js +0 -1
- package/templates/architectures/feature-based/src/config/constants.ts +0 -1
- package/templates/architectures/feature-based/src/hooks/index.js +0 -1
- package/templates/architectures/feature-based/src/hooks/index.ts +0 -1
- package/templates/architectures/feature-based/src/utils/index.js +0 -1
- package/templates/architectures/feature-based/src/utils/index.ts +0 -1
- package/templates/conditional/axios/component-based/src/services/axios.jsx +0 -19
- package/templates/conditional/axios/component-based/src/services/axios.ts +0 -19
- package/templates/conditional/axios/component-based/src/services/index.js +0 -1
- package/templates/conditional/axios/component-based/src/services/index.ts +0 -1
- package/templates/conditional/axios/feature-based/src/lib/axios.jsx +0 -19
- package/templates/conditional/axios/feature-based/src/lib/axios.ts +0 -19
- package/templates/conditional/axios/feature-based/src/lib/index.js +0 -1
- package/templates/conditional/axios/feature-based/src/lib/index.ts +0 -1
- package/templates/conditional/fetch/component-based/src/services/api.jsx +0 -27
- package/templates/conditional/fetch/component-based/src/services/api.ts +0 -27
- package/templates/conditional/fetch/component-based/src/services/index.js +0 -1
- package/templates/conditional/fetch/component-based/src/services/index.ts +0 -1
- package/templates/conditional/fetch/feature-based/src/lib/api.jsx +0 -27
- package/templates/conditional/fetch/feature-based/src/lib/api.ts +0 -27
- package/templates/conditional/fetch/feature-based/src/lib/index.js +0 -1
- package/templates/conditional/fetch/feature-based/src/lib/index.ts +0 -1
- package/templates/conditional/router/component-based/src/routes/index.jsx +0 -12
- package/templates/conditional/router/component-based/src/routes/index.tsx +0 -12
- package/templates/conditional/router/feature-based/src/app/router.jsx +0 -13
- package/templates/conditional/router/feature-based/src/app/router.tsx +0 -13
- package/templates/css/tailwind/src/index.css +0 -1
- /package/templates/architectures/component-based/src/{components/layout → config}/.gitkeep +0 -0
- /package/templates/architectures/{feature-based/src/features/home/interfaces → component-based/src/providers}/.gitkeep +0 -0
- /package/templates/architectures/{feature-based/src/lib → component-based/src/styles}/.gitkeep +0 -0
- /package/templates/architectures/feature-based/src/{stores → features/home/types}/.gitkeep +0 -0
- /package/templates/architectures/feature-based/src/{components → shared/components}/ui/index.js +0 -0
- /package/templates/architectures/feature-based/src/{components → shared/components}/ui/index.ts +0 -0
- /package/templates/architectures/feature-based/src/{hooks → shared/hooks}/useLocalStorage.jsx +0 -0
- /package/templates/architectures/feature-based/src/{hooks → shared/hooks}/useLocalStorage.ts +0 -0
- /package/templates/architectures/feature-based/src/{utils → shared/utils}/cn.jsx +0 -0
- /package/templates/architectures/feature-based/src/{utils → shared/utils}/cn.ts +0 -0
- /package/templates/conditional/state/redux/component-based/src/{context → providers}/StoreProvider.jsx +0 -0
- /package/templates/conditional/state/redux/component-based/src/{context → providers}/StoreProvider.tsx +0 -0
- /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/hooks.js +0 -0
- /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/hooks.ts +0 -0
- /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/index.js +0 -0
- /package/templates/conditional/state/redux/feature-based/src/{stores → shared/stores}/index.ts +0 -0
- /package/templates/css/bootstrap/src/{index.css → globals.css} +0 -0
- /package/templates/{architectures/feature-based/src/styles → css/tailwind/src}/globals.css +0 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { axiosConfig } from "@/config/axios.config";
|
|
3
|
+
|
|
4
|
+
const api = axios.create(axiosConfig);
|
|
5
|
+
|
|
6
|
+
api.interceptors.request.use((config) => {
|
|
7
|
+
const token = localStorage.getItem("access_token");
|
|
8
|
+
if (token) {
|
|
9
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
10
|
+
}
|
|
11
|
+
return config;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
api.interceptors.response.use(
|
|
15
|
+
(response) => response,
|
|
16
|
+
(error) => {
|
|
17
|
+
if (error.response?.status === 401) {
|
|
18
|
+
localStorage.removeItem("access_token");
|
|
19
|
+
}
|
|
20
|
+
return Promise.reject(error);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export default api;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { axiosConfig } from "@/config/axios.config";
|
|
3
|
+
|
|
4
|
+
const api = axios.create(axiosConfig);
|
|
5
|
+
|
|
6
|
+
api.interceptors.request.use((config) => {
|
|
7
|
+
const token = localStorage.getItem("access_token");
|
|
8
|
+
if (token) {
|
|
9
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
10
|
+
}
|
|
11
|
+
return config;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
api.interceptors.response.use(
|
|
15
|
+
(response) => response,
|
|
16
|
+
(error) => {
|
|
17
|
+
if (error.response?.status === 401) {
|
|
18
|
+
localStorage.removeItem("access_token");
|
|
19
|
+
}
|
|
20
|
+
return Promise.reject(error);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export default api;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("@/types").ApiResponse} ApiResponse
|
|
3
|
+
* @typedef {import("@/types").CreateUserPayload} CreateUserPayload
|
|
4
|
+
* @typedef {import("@/types").User} User
|
|
5
|
+
*/
|
|
6
|
+
import api from "@/services/axios.client";
|
|
7
|
+
|
|
8
|
+
export const userService = {
|
|
9
|
+
async getAll() {
|
|
10
|
+
const { data } = await api.get("/users");
|
|
11
|
+
return data;
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async getById(id) {
|
|
15
|
+
const { data } = await api.get(`/users/${id}`);
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
async create(payload) {
|
|
20
|
+
const { data } = await api.post("/users", payload);
|
|
21
|
+
return data;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
async update(id, payload) {
|
|
25
|
+
const { data } = await api.put(`/users/${id}`, payload);
|
|
26
|
+
return data;
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async remove(id) {
|
|
30
|
+
const { data } = await api.delete(`/users/${id}`);
|
|
31
|
+
return data;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import api from "@/services/axios.client";
|
|
2
|
+
import type { ApiResponse, CreateUserPayload, User } from "@/types";
|
|
3
|
+
|
|
4
|
+
export const userService = {
|
|
5
|
+
async getAll(): Promise<ApiResponse<User[]>> {
|
|
6
|
+
const { data } = await api.get<ApiResponse<User[]>>("/users");
|
|
7
|
+
return data;
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
async getById(id: string): Promise<ApiResponse<User>> {
|
|
11
|
+
const { data } = await api.get<ApiResponse<User>>(`/users/${id}`);
|
|
12
|
+
return data;
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
async create(payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
16
|
+
const { data } = await api.post<ApiResponse<User>>("/users", payload);
|
|
17
|
+
return data;
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
async update(id: string, payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
21
|
+
const { data } = await api.put<ApiResponse<User>>(`/users/${id}`, payload);
|
|
22
|
+
return data;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async remove(id: string): Promise<ApiResponse<null>> {
|
|
26
|
+
const { data } = await api.delete<ApiResponse<null>>(`/users/${id}`);
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("@/shared/types").ApiResponse} ApiResponse
|
|
3
|
+
* @typedef {import("@/shared/types").CreateUserPayload} CreateUserPayload
|
|
4
|
+
* @typedef {import("@/shared/types").User} User
|
|
5
|
+
*/
|
|
6
|
+
import { api } from "@/shared/lib/axios";
|
|
7
|
+
|
|
8
|
+
export const userService = {
|
|
9
|
+
async getAll() {
|
|
10
|
+
const { data } = await api.get("/users");
|
|
11
|
+
return data;
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async getById(id) {
|
|
15
|
+
const { data } = await api.get(`/users/${id}`);
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
async create(payload) {
|
|
20
|
+
const { data } = await api.post("/users", payload);
|
|
21
|
+
return data;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
async update(id, payload) {
|
|
25
|
+
const { data } = await api.put(`/users/${id}`, payload);
|
|
26
|
+
return data;
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async remove(id) {
|
|
30
|
+
const { data } = await api.delete(`/users/${id}`);
|
|
31
|
+
return data;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { api } from "@/shared/lib/axios";
|
|
2
|
+
import type { ApiResponse, CreateUserPayload, User } from "@/shared/types";
|
|
3
|
+
|
|
4
|
+
export const userService = {
|
|
5
|
+
async getAll(): Promise<ApiResponse<User[]>> {
|
|
6
|
+
const { data } = await api.get<ApiResponse<User[]>>("/users");
|
|
7
|
+
return data;
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
async getById(id: string): Promise<ApiResponse<User>> {
|
|
11
|
+
const { data } = await api.get<ApiResponse<User>>(`/users/${id}`);
|
|
12
|
+
return data;
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
async create(payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
16
|
+
const { data } = await api.post<ApiResponse<User>>("/users", payload);
|
|
17
|
+
return data;
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
async update(id: string, payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
21
|
+
const { data } = await api.put<ApiResponse<User>>(`/users/${id}`, payload);
|
|
22
|
+
return data;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async remove(id: string): Promise<ApiResponse<null>> {
|
|
26
|
+
const { data } = await api.delete<ApiResponse<null>>(`/users/${id}`);
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { axiosConfig } from "./api.config";
|
|
3
|
+
|
|
4
|
+
const api = axios.create(axiosConfig);
|
|
5
|
+
|
|
6
|
+
api.interceptors.request.use((config) => {
|
|
7
|
+
const token = localStorage.getItem("access_token");
|
|
8
|
+
if (token) {
|
|
9
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
10
|
+
}
|
|
11
|
+
return config;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
api.interceptors.response.use(
|
|
15
|
+
(response) => response,
|
|
16
|
+
(error) => {
|
|
17
|
+
if (error.response?.status === 401) {
|
|
18
|
+
localStorage.removeItem("access_token");
|
|
19
|
+
}
|
|
20
|
+
return Promise.reject(error);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export default api;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { axiosConfig } from "./api.config";
|
|
3
|
+
|
|
4
|
+
const api = axios.create(axiosConfig);
|
|
5
|
+
|
|
6
|
+
api.interceptors.request.use((config) => {
|
|
7
|
+
const token = localStorage.getItem("access_token");
|
|
8
|
+
if (token) {
|
|
9
|
+
config.headers.Authorization = `Bearer ${token}`;
|
|
10
|
+
}
|
|
11
|
+
return config;
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
api.interceptors.response.use(
|
|
15
|
+
(response) => response,
|
|
16
|
+
(error) => {
|
|
17
|
+
if (error.response?.status === 401) {
|
|
18
|
+
localStorage.removeItem("access_token");
|
|
19
|
+
}
|
|
20
|
+
return Promise.reject(error);
|
|
21
|
+
},
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
export default api;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as api } from "./api.client";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as api } from "./api.client";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { apiConfig } from "@/config/api.config";
|
|
2
|
+
|
|
3
|
+
async function request(endpoint, options = {}) {
|
|
4
|
+
const token = localStorage.getItem("access_token");
|
|
5
|
+
|
|
6
|
+
const headers = {
|
|
7
|
+
"Content-Type": "application/json",
|
|
8
|
+
...options.headers,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
if (token) {
|
|
12
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const response = await fetch(`${apiConfig.baseURL}${endpoint}`, {
|
|
16
|
+
...options,
|
|
17
|
+
headers,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (response.status === 401) {
|
|
21
|
+
localStorage.removeItem("access_token");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const data = await response.json();
|
|
29
|
+
|
|
30
|
+
return { data };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const api = {
|
|
34
|
+
get(endpoint) {
|
|
35
|
+
return request(endpoint);
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
post(endpoint, body) {
|
|
39
|
+
return request(endpoint, { method: "POST", body: JSON.stringify(body) });
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
put(endpoint, body) {
|
|
43
|
+
return request(endpoint, { method: "PUT", body: JSON.stringify(body) });
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
delete(endpoint) {
|
|
47
|
+
return request(endpoint, { method: "DELETE" });
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default api;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { apiConfig } from "@/config/api.config";
|
|
2
|
+
|
|
3
|
+
type FetchOptions = Omit<RequestInit, "headers"> & {
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
async function request<T>(endpoint: string, options: FetchOptions = {}): Promise<{ data: T }> {
|
|
8
|
+
const token = localStorage.getItem("access_token");
|
|
9
|
+
|
|
10
|
+
const headers: Record<string, string> = {
|
|
11
|
+
"Content-Type": "application/json",
|
|
12
|
+
...options.headers,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
if (token) {
|
|
16
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const response = await fetch(`${apiConfig.baseURL}${endpoint}`, {
|
|
20
|
+
...options,
|
|
21
|
+
headers,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (response.status === 401) {
|
|
25
|
+
localStorage.removeItem("access_token");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const data = (await response.json()) as T;
|
|
33
|
+
|
|
34
|
+
return { data };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const api = {
|
|
38
|
+
get<T>(endpoint: string): Promise<{ data: T }> {
|
|
39
|
+
return request<T>(endpoint);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
post<T>(endpoint: string, body?: unknown): Promise<{ data: T }> {
|
|
43
|
+
return request<T>(endpoint, { method: "POST", body: JSON.stringify(body) });
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
put<T>(endpoint: string, body?: unknown): Promise<{ data: T }> {
|
|
47
|
+
return request<T>(endpoint, { method: "PUT", body: JSON.stringify(body) });
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
delete<T>(endpoint: string): Promise<{ data: T }> {
|
|
51
|
+
return request<T>(endpoint, { method: "DELETE" });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default api;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("@/types").ApiResponse} ApiResponse
|
|
3
|
+
* @typedef {import("@/types").CreateUserPayload} CreateUserPayload
|
|
4
|
+
* @typedef {import("@/types").User} User
|
|
5
|
+
*/
|
|
6
|
+
import api from "@/services/api.client";
|
|
7
|
+
|
|
8
|
+
export const userService = {
|
|
9
|
+
async getAll() {
|
|
10
|
+
const { data } = await api.get("/users");
|
|
11
|
+
return data;
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async getById(id) {
|
|
15
|
+
const { data } = await api.get(`/users/${id}`);
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
async create(payload) {
|
|
20
|
+
const { data } = await api.post("/users", payload);
|
|
21
|
+
return data;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
async update(id, payload) {
|
|
25
|
+
const { data } = await api.put(`/users/${id}`, payload);
|
|
26
|
+
return data;
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async remove(id) {
|
|
30
|
+
const { data } = await api.delete(`/users/${id}`);
|
|
31
|
+
return data;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import api from "@/services/api.client";
|
|
2
|
+
import type { ApiResponse, CreateUserPayload, User } from "@/types";
|
|
3
|
+
|
|
4
|
+
export const userService = {
|
|
5
|
+
async getAll(): Promise<ApiResponse<User[]>> {
|
|
6
|
+
const { data } = await api.get<ApiResponse<User[]>>("/users");
|
|
7
|
+
return data;
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
async getById(id: string): Promise<ApiResponse<User>> {
|
|
11
|
+
const { data } = await api.get<ApiResponse<User>>(`/users/${id}`);
|
|
12
|
+
return data;
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
async create(payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
16
|
+
const { data } = await api.post<ApiResponse<User>>("/users", payload);
|
|
17
|
+
return data;
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
async update(id: string, payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
21
|
+
const { data } = await api.put<ApiResponse<User>>(`/users/${id}`, payload);
|
|
22
|
+
return data;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async remove(id: string): Promise<ApiResponse<null>> {
|
|
26
|
+
const { data } = await api.delete<ApiResponse<null>>(`/users/${id}`);
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @typedef {import("@/shared/types").ApiResponse} ApiResponse
|
|
3
|
+
* @typedef {import("@/shared/types").CreateUserPayload} CreateUserPayload
|
|
4
|
+
* @typedef {import("@/shared/types").User} User
|
|
5
|
+
*/
|
|
6
|
+
import { api } from "@/shared/api";
|
|
7
|
+
|
|
8
|
+
export const userService = {
|
|
9
|
+
async getAll() {
|
|
10
|
+
const { data } = await api.get("/users");
|
|
11
|
+
return data;
|
|
12
|
+
},
|
|
13
|
+
|
|
14
|
+
async getById(id) {
|
|
15
|
+
const { data } = await api.get(`/users/${id}`);
|
|
16
|
+
return data;
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
async create(payload) {
|
|
20
|
+
const { data } = await api.post("/users", payload);
|
|
21
|
+
return data;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
async update(id, payload) {
|
|
25
|
+
const { data } = await api.put(`/users/${id}`, payload);
|
|
26
|
+
return data;
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
async remove(id) {
|
|
30
|
+
const { data } = await api.delete(`/users/${id}`);
|
|
31
|
+
return data;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { api } from "@/shared/api";
|
|
2
|
+
import type { ApiResponse, CreateUserPayload, User } from "@/shared/types";
|
|
3
|
+
|
|
4
|
+
export const userService = {
|
|
5
|
+
async getAll(): Promise<ApiResponse<User[]>> {
|
|
6
|
+
const { data } = await api.get<ApiResponse<User[]>>("/users");
|
|
7
|
+
return data;
|
|
8
|
+
},
|
|
9
|
+
|
|
10
|
+
async getById(id: string): Promise<ApiResponse<User>> {
|
|
11
|
+
const { data } = await api.get<ApiResponse<User>>(`/users/${id}`);
|
|
12
|
+
return data;
|
|
13
|
+
},
|
|
14
|
+
|
|
15
|
+
async create(payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
16
|
+
const { data } = await api.post<ApiResponse<User>>("/users", payload);
|
|
17
|
+
return data;
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
async update(id: string, payload: CreateUserPayload): Promise<ApiResponse<User>> {
|
|
21
|
+
const { data } = await api.put<ApiResponse<User>>(`/users/${id}`, payload);
|
|
22
|
+
return data;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async remove(id: string): Promise<ApiResponse<null>> {
|
|
26
|
+
const { data } = await api.delete<ApiResponse<null>>(`/users/${id}`);
|
|
27
|
+
return data;
|
|
28
|
+
},
|
|
29
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { apiConfig } from "./api.config";
|
|
2
|
+
|
|
3
|
+
async function request(endpoint, options = {}) {
|
|
4
|
+
const token = localStorage.getItem("access_token");
|
|
5
|
+
|
|
6
|
+
const headers = {
|
|
7
|
+
"Content-Type": "application/json",
|
|
8
|
+
...options.headers,
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
if (token) {
|
|
12
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const response = await fetch(`${apiConfig.baseURL}${endpoint}`, {
|
|
16
|
+
...options,
|
|
17
|
+
headers,
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
if (response.status === 401) {
|
|
21
|
+
localStorage.removeItem("access_token");
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (!response.ok) {
|
|
25
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
const data = await response.json();
|
|
29
|
+
|
|
30
|
+
return { data };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const api = {
|
|
34
|
+
get(endpoint) {
|
|
35
|
+
return request(endpoint);
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
post(endpoint, body) {
|
|
39
|
+
return request(endpoint, { method: "POST", body: JSON.stringify(body) });
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
put(endpoint, body) {
|
|
43
|
+
return request(endpoint, { method: "PUT", body: JSON.stringify(body) });
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
delete(endpoint) {
|
|
47
|
+
return request(endpoint, { method: "DELETE" });
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export default api;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { apiConfig } from "./api.config";
|
|
2
|
+
|
|
3
|
+
type FetchOptions = Omit<RequestInit, "headers"> & {
|
|
4
|
+
headers?: Record<string, string>;
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
async function request<T>(endpoint: string, options: FetchOptions = {}): Promise<{ data: T }> {
|
|
8
|
+
const token = localStorage.getItem("access_token");
|
|
9
|
+
|
|
10
|
+
const headers: Record<string, string> = {
|
|
11
|
+
"Content-Type": "application/json",
|
|
12
|
+
...options.headers,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
if (token) {
|
|
16
|
+
headers["Authorization"] = `Bearer ${token}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const response = await fetch(`${apiConfig.baseURL}${endpoint}`, {
|
|
20
|
+
...options,
|
|
21
|
+
headers,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
if (response.status === 401) {
|
|
25
|
+
localStorage.removeItem("access_token");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const data = (await response.json()) as T;
|
|
33
|
+
|
|
34
|
+
return { data };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const api = {
|
|
38
|
+
get<T>(endpoint: string): Promise<{ data: T }> {
|
|
39
|
+
return request<T>(endpoint);
|
|
40
|
+
},
|
|
41
|
+
|
|
42
|
+
post<T>(endpoint: string, body?: unknown): Promise<{ data: T }> {
|
|
43
|
+
return request<T>(endpoint, { method: "POST", body: JSON.stringify(body) });
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
put<T>(endpoint: string, body?: unknown): Promise<{ data: T }> {
|
|
47
|
+
return request<T>(endpoint, { method: "PUT", body: JSON.stringify(body) });
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
delete<T>(endpoint: string): Promise<{ data: T }> {
|
|
51
|
+
return request<T>(endpoint, { method: "DELETE" });
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export default api;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as api } from "./api.client";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as api } from "./api.client";
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HugeiconsIcon } from "@hugeicons/react";
|
|
2
|
+
import { Sun01Icon, Moon01Icon, Github01Icon } from "@hugeicons/core-free-icons";
|
|
3
|
+
import { Button } from "@/components/common";
|
|
4
|
+
|
|
5
|
+
export function HomePage() {
|
|
6
|
+
return (
|
|
7
|
+
<div className="text-center">
|
|
8
|
+
<div className="d-flex justify-content-center gap-3 mb-4">
|
|
9
|
+
<HugeiconsIcon icon={Sun01Icon} style={{ width: 32, height: 32 }} className="text-warning" />
|
|
10
|
+
<HugeiconsIcon icon={Moon01Icon} style={{ width: 32, height: 32 }} className="text-primary" />
|
|
11
|
+
<HugeiconsIcon icon={Github01Icon} style={{ width: 32, height: 32 }} className="text-dark" />
|
|
12
|
+
</div>
|
|
13
|
+
<h1 className="h1 fw-bold text-dark mb-4">Welcome to Lumen</h1>
|
|
14
|
+
<p className="text-muted mb-5">
|
|
15
|
+
Your React + Vite project is ready. Start building!
|
|
16
|
+
</p>
|
|
17
|
+
<Button>Get Started</Button>
|
|
18
|
+
</div>
|
|
19
|
+
);
|
|
20
|
+
}
|