flysoft-react-ui 0.1.15 → 0.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.
Files changed (58) hide show
  1. package/dist/components/utils/Badge.d.ts +3 -0
  2. package/dist/components/utils/Badge.d.ts.map +1 -1
  3. package/dist/components/utils/Badge.js +11 -4
  4. package/dist/docs/ApiClientDocs.d.ts +4 -0
  5. package/dist/docs/ApiClientDocs.d.ts.map +1 -0
  6. package/dist/docs/ApiClientDocs.js +66 -0
  7. package/dist/docs/BadgeDocs.d.ts +4 -0
  8. package/dist/docs/BadgeDocs.d.ts.map +1 -0
  9. package/dist/docs/BadgeDocs.js +7 -0
  10. package/dist/docs/DocsMenu.d.ts.map +1 -1
  11. package/dist/docs/DocsMenu.js +1 -1
  12. package/dist/docs/DocsRouter.d.ts.map +1 -1
  13. package/dist/docs/DocsRouter.js +3 -1
  14. package/dist/fontawesome/css/all.min.css +5 -0
  15. package/dist/fontawesome/webfonts/fa-brands-400.eot +0 -0
  16. package/dist/fontawesome/webfonts/fa-brands-400.svg +3717 -0
  17. package/dist/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  18. package/dist/fontawesome/webfonts/fa-brands-400.woff +0 -0
  19. package/dist/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  20. package/dist/fontawesome/webfonts/fa-duotone-900.eot +0 -0
  21. package/dist/fontawesome/webfonts/fa-duotone-900.svg +15328 -0
  22. package/dist/fontawesome/webfonts/fa-duotone-900.ttf +0 -0
  23. package/dist/fontawesome/webfonts/fa-duotone-900.woff +0 -0
  24. package/dist/fontawesome/webfonts/fa-duotone-900.woff2 +0 -0
  25. package/dist/fontawesome/webfonts/fa-light-300.eot +0 -0
  26. package/dist/fontawesome/webfonts/fa-light-300.svg +12423 -0
  27. package/dist/fontawesome/webfonts/fa-light-300.ttf +0 -0
  28. package/dist/fontawesome/webfonts/fa-light-300.woff +0 -0
  29. package/dist/fontawesome/webfonts/fa-light-300.woff2 +0 -0
  30. package/dist/fontawesome/webfonts/fa-regular-400.eot +0 -0
  31. package/dist/fontawesome/webfonts/fa-regular-400.svg +11323 -0
  32. package/dist/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  33. package/dist/fontawesome/webfonts/fa-regular-400.woff +0 -0
  34. package/dist/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  35. package/dist/fontawesome/webfonts/fa-solid-900.eot +0 -0
  36. package/dist/fontawesome/webfonts/fa-solid-900.svg +9653 -0
  37. package/dist/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  38. package/dist/fontawesome/webfonts/fa-solid-900.woff +0 -0
  39. package/dist/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  40. package/dist/hooks/index.d.ts +5 -0
  41. package/dist/hooks/index.d.ts.map +1 -1
  42. package/dist/hooks/index.js +3 -0
  43. package/dist/hooks/useApi.d.ts +27 -0
  44. package/dist/hooks/useApi.d.ts.map +1 -0
  45. package/dist/hooks/useApi.js +150 -0
  46. package/dist/hooks/useApiMutation.d.ts +22 -0
  47. package/dist/hooks/useApiMutation.d.ts.map +1 -0
  48. package/dist/hooks/useApiMutation.js +85 -0
  49. package/dist/index.css +1 -1
  50. package/dist/index.d.ts +1 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +2 -0
  53. package/dist/index.js.map +1 -1
  54. package/dist/main.js +1 -1
  55. package/dist/services/apiClient.d.ts +46 -0
  56. package/dist/services/apiClient.d.ts.map +1 -0
  57. package/dist/services/apiClient.js +187 -0
  58. package/package.json +3 -2
package/dist/main.js CHANGED
@@ -3,4 +3,4 @@ import { StrictMode } from "react";
3
3
  import { createRoot } from "react-dom/client";
4
4
  import { BrowserRouter } from "react-router-dom";
5
5
  import App from "./App";
6
- createRoot(document.getElementById("root")).render(_jsx(StrictMode, { children: _jsx(BrowserRouter, { children: _jsx(App, {}) }) }));
6
+ createRoot(document.getElementById("root")).render(_jsx(StrictMode, { children: _jsx(BrowserRouter, { future: { v7_startTransition: true, v7_relativeSplatPath: true }, children: _jsx(App, {}) }) }));
@@ -0,0 +1,46 @@
1
+ import type { AxiosRequestConfig } from "axios";
2
+ export type HttpMethod = "get" | "post" | "put" | "delete" | "patch";
3
+ export interface AppApiError {
4
+ message: string;
5
+ code?: string;
6
+ status?: number;
7
+ details?: unknown;
8
+ originalError?: unknown;
9
+ }
10
+ export interface ApiClientConfig {
11
+ baseURL?: string;
12
+ timeout?: number;
13
+ headers?: Record<string, string>;
14
+ }
15
+ export interface RequestOptions<TBody = unknown, TParams = Record<string, unknown>> {
16
+ url: string;
17
+ params?: TParams;
18
+ data?: TBody;
19
+ headers?: Record<string, string>;
20
+ config?: AxiosRequestConfig;
21
+ }
22
+ type TokenProvider = () => string | undefined;
23
+ export declare class ApiClient {
24
+ private readonly instance;
25
+ private tokenProvider?;
26
+ constructor(config?: ApiClientConfig);
27
+ private setupInterceptors;
28
+ setTokenProvider(provider: TokenProvider | undefined): void;
29
+ clearTokenProvider(): void;
30
+ updateDefaults(config: ApiClientConfig): void;
31
+ get<TResponse, TParams = Record<string, unknown>>(options: RequestOptions<never, TParams>): Promise<TResponse>;
32
+ delete<TResponse, TParams = Record<string, unknown>>(options: RequestOptions<never, TParams>): Promise<TResponse>;
33
+ post<TResponse, TBody = unknown, TParams = Record<string, unknown>>(options: RequestOptions<TBody, TParams>): Promise<TResponse>;
34
+ put<TResponse, TBody = unknown, TParams = Record<string, unknown>>(options: RequestOptions<TBody, TParams>): Promise<TResponse>;
35
+ patch<TResponse, TBody = unknown, TParams = Record<string, unknown>>(options: RequestOptions<TBody, TParams>): Promise<TResponse>;
36
+ private transformResponse;
37
+ private ensureAppApiError;
38
+ private isAppApiError;
39
+ private toAppApiError;
40
+ }
41
+ export declare const apiClient: ApiClient;
42
+ export declare const createApiClient: (config?: ApiClientConfig) => ApiClient;
43
+ export declare const setApiClientTokenProvider: (provider: TokenProvider | undefined) => void;
44
+ export declare const clearApiClientTokenProvider: () => void;
45
+ export {};
46
+ //# sourceMappingURL=apiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiClient.d.ts","sourceRoot":"","sources":["../../src/services/apiClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,kBAAkB,EAGnB,MAAM,OAAO,CAAC;AAEf,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;AAErE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc,CAC7B,KAAK,GAAG,OAAO,EACf,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAEjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,KAAK,aAAa,GAAG,MAAM,MAAM,GAAG,SAAS,CAAC;AAoB9C,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAE1B,MAAM,CAAC,EAAE,eAAe;IAcpC,OAAO,CAAC,iBAAiB;IAwBzB,gBAAgB,CAAC,QAAQ,EAAE,aAAa,GAAG,SAAS;IAIpD,kBAAkB;IAIlB,cAAc,CAAC,MAAM,EAAE,eAAe;IAehC,GAAG,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpD,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC;IAaf,MAAM,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC;IAaf,IAAI,CACR,SAAS,EACT,KAAK,GAAG,OAAO,EACf,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAaxD,GAAG,CACP,SAAS,EACT,KAAK,GAAG,OAAO,EACf,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAaxD,KAAK,CACT,SAAS,EACT,KAAK,GAAG,OAAO,EACf,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC;IAa9D,OAAO,CAAC,iBAAiB;IAMzB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,aAAa;CAiCtB;AAID,eAAO,MAAM,SAAS,WAAe,CAAC;AAEtC,eAAO,MAAM,eAAe,GAAI,SAAS,eAAe,cAA0B,CAAC;AAEnF,eAAO,MAAM,yBAAyB,GAAI,UAAU,aAAa,GAAG,SAAS,SAE5E,CAAC;AAEF,eAAO,MAAM,2BAA2B,YAEvC,CAAC"}
@@ -0,0 +1,187 @@
1
+ import axios from "axios";
2
+ const DEFAULT_CONFIG = {
3
+ baseURL: "/api",
4
+ timeout: 15000,
5
+ };
6
+ const isObject = (value) => typeof value === "object" && value !== null;
7
+ const extractErrorData = (error) => {
8
+ if (isObject(error.response?.data)) {
9
+ return error.response?.data;
10
+ }
11
+ if (typeof error.response?.data === "string") {
12
+ return { message: error.response?.data };
13
+ }
14
+ return {};
15
+ };
16
+ export class ApiClient {
17
+ instance;
18
+ tokenProvider;
19
+ constructor(config) {
20
+ this.instance = axios.create({
21
+ baseURL: config?.baseURL ?? DEFAULT_CONFIG.baseURL,
22
+ timeout: config?.timeout ?? DEFAULT_CONFIG.timeout,
23
+ headers: {
24
+ "Content-Type": "application/json",
25
+ Accept: "application/json",
26
+ ...config?.headers,
27
+ },
28
+ });
29
+ this.setupInterceptors();
30
+ }
31
+ setupInterceptors() {
32
+ this.instance.interceptors.request.use((requestConfig) => {
33
+ const token = this.tokenProvider?.();
34
+ if (token) {
35
+ if (requestConfig.headers && "set" in requestConfig.headers) {
36
+ requestConfig.headers.set?.("Authorization", `Bearer ${token}`);
37
+ }
38
+ else {
39
+ const existingHeaders = requestConfig.headers ?? {};
40
+ requestConfig.headers = {
41
+ ...existingHeaders,
42
+ Authorization: `Bearer ${token}`,
43
+ };
44
+ }
45
+ }
46
+ return requestConfig;
47
+ });
48
+ this.instance.interceptors.response.use((response) => response, (error) => Promise.reject(this.toAppApiError(error)));
49
+ }
50
+ setTokenProvider(provider) {
51
+ this.tokenProvider = provider;
52
+ }
53
+ clearTokenProvider() {
54
+ this.tokenProvider = undefined;
55
+ }
56
+ updateDefaults(config) {
57
+ if (config.baseURL) {
58
+ this.instance.defaults.baseURL = config.baseURL;
59
+ }
60
+ if (config.timeout) {
61
+ this.instance.defaults.timeout = config.timeout;
62
+ }
63
+ if (config.headers) {
64
+ this.instance.defaults.headers = {
65
+ ...this.instance.defaults.headers,
66
+ ...config.headers,
67
+ };
68
+ }
69
+ }
70
+ async get(options) {
71
+ try {
72
+ const response = await this.instance.get(options.url, {
73
+ params: options.params,
74
+ headers: options.headers,
75
+ ...options.config,
76
+ });
77
+ return this.transformResponse(response);
78
+ }
79
+ catch (error) {
80
+ throw this.ensureAppApiError(error);
81
+ }
82
+ }
83
+ async delete(options) {
84
+ try {
85
+ const response = await this.instance.delete(options.url, {
86
+ params: options.params,
87
+ headers: options.headers,
88
+ ...options.config,
89
+ });
90
+ return this.transformResponse(response);
91
+ }
92
+ catch (error) {
93
+ throw this.ensureAppApiError(error);
94
+ }
95
+ }
96
+ async post(options) {
97
+ try {
98
+ const response = await this.instance.post(options.url, options.data, {
99
+ params: options.params,
100
+ headers: options.headers,
101
+ ...options.config,
102
+ });
103
+ return this.transformResponse(response);
104
+ }
105
+ catch (error) {
106
+ throw this.ensureAppApiError(error);
107
+ }
108
+ }
109
+ async put(options) {
110
+ try {
111
+ const response = await this.instance.put(options.url, options.data, {
112
+ params: options.params,
113
+ headers: options.headers,
114
+ ...options.config,
115
+ });
116
+ return this.transformResponse(response);
117
+ }
118
+ catch (error) {
119
+ throw this.ensureAppApiError(error);
120
+ }
121
+ }
122
+ async patch(options) {
123
+ try {
124
+ const response = await this.instance.patch(options.url, options.data, {
125
+ params: options.params,
126
+ headers: options.headers,
127
+ ...options.config,
128
+ });
129
+ return this.transformResponse(response);
130
+ }
131
+ catch (error) {
132
+ throw this.ensureAppApiError(error);
133
+ }
134
+ }
135
+ transformResponse(response) {
136
+ return response.data;
137
+ }
138
+ ensureAppApiError(error) {
139
+ if (this.isAppApiError(error)) {
140
+ return error;
141
+ }
142
+ return this.toAppApiError(error);
143
+ }
144
+ isAppApiError(error) {
145
+ return (isObject(error) &&
146
+ typeof error.message === "string" &&
147
+ ("code" in error || "status" in error || "details" in error));
148
+ }
149
+ toAppApiError(error) {
150
+ if (axios.isAxiosError(error)) {
151
+ const extracted = extractErrorData(error);
152
+ return {
153
+ message: extracted.message ??
154
+ error.message ??
155
+ "Unexpected API error",
156
+ code: extracted.code ??
157
+ error.code ??
158
+ "API_ERROR",
159
+ status: error.response?.status ?? error.status,
160
+ details: extracted,
161
+ originalError: error,
162
+ };
163
+ }
164
+ if (error instanceof Error) {
165
+ return {
166
+ message: error.message,
167
+ code: "UNKNOWN_ERROR",
168
+ details: undefined,
169
+ originalError: error,
170
+ };
171
+ }
172
+ return {
173
+ message: "Unexpected error",
174
+ code: "UNKNOWN_ERROR",
175
+ details: error,
176
+ };
177
+ }
178
+ }
179
+ const sharedClient = new ApiClient();
180
+ export const apiClient = sharedClient;
181
+ export const createApiClient = (config) => new ApiClient(config);
182
+ export const setApiClientTokenProvider = (provider) => {
183
+ sharedClient.setTokenProvider(provider);
184
+ };
185
+ export const clearApiClientTokenProvider = () => {
186
+ sharedClient.clearTokenProvider();
187
+ };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "flysoft-react-ui",
3
3
  "private": false,
4
- "version": "0.1.15",
4
+ "version": "0.2.0",
5
5
  "type": "module",
6
6
  "description": "A modern React UI component library with Tailwind CSS, TypeScript, and FontAwesome 5. Includes forms, layouts, themes, and templates for rapid development.",
7
7
  "keywords": [
@@ -64,6 +64,7 @@
64
64
  },
65
65
  "dependencies": {
66
66
  "@tailwindcss/vite": "^4.1.12",
67
+ "axios": "^1.13.2",
67
68
  "tailwindcss": "^4.1.12"
68
69
  },
69
70
  "devDependencies": {
@@ -77,9 +78,9 @@
77
78
  "eslint-plugin-react-hooks": "^5.2.0",
78
79
  "eslint-plugin-react-refresh": "^0.4.20",
79
80
  "globals": "^16.3.0",
80
- "react-router-dom": "^6.30.1",
81
81
  "react": "^19.1.1",
82
82
  "react-dom": "^19.1.1",
83
+ "react-router-dom": "^6.30.1",
83
84
  "typescript": "~5.8.3",
84
85
  "typescript-eslint": "^8.39.1",
85
86
  "vite": "^7.1.2",