sa2kit 1.0.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/LICENSE +22 -0
- package/README.md +298 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js +15 -0
- package/dist/AliyunOSSProvider-7JLMJDXK.js.map +1 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs +6 -0
- package/dist/AliyunOSSProvider-GQMSDJGZ.mjs.map +1 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs +6 -0
- package/dist/LocalStorageProvider-FVLLHBHO.mjs.map +1 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js +15 -0
- package/dist/LocalStorageProvider-NBNHHWLY.js.map +1 -0
- package/dist/analytics/index.d.mts +1084 -0
- package/dist/analytics/index.d.ts +1084 -0
- package/dist/analytics/index.js +2595 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics/index.mjs +2518 -0
- package/dist/analytics/index.mjs.map +1 -0
- package/dist/analytics/server/index.d.mts +499 -0
- package/dist/analytics/server/index.d.ts +499 -0
- package/dist/analytics/server/index.js +529 -0
- package/dist/analytics/server/index.js.map +1 -0
- package/dist/analytics/server/index.mjs +525 -0
- package/dist/analytics/server/index.mjs.map +1 -0
- package/dist/auth/client/index.d.mts +104 -0
- package/dist/auth/client/index.d.ts +104 -0
- package/dist/auth/client/index.js +21 -0
- package/dist/auth/client/index.js.map +1 -0
- package/dist/auth/client/index.mjs +4 -0
- package/dist/auth/client/index.mjs.map +1 -0
- package/dist/auth/components/index.d.mts +82 -0
- package/dist/auth/components/index.d.ts +82 -0
- package/dist/auth/components/index.js +93 -0
- package/dist/auth/components/index.js.map +1 -0
- package/dist/auth/components/index.mjs +86 -0
- package/dist/auth/components/index.mjs.map +1 -0
- package/dist/auth/hooks/index.d.mts +2 -0
- package/dist/auth/hooks/index.d.ts +2 -0
- package/dist/auth/hooks/index.js +17 -0
- package/dist/auth/hooks/index.js.map +1 -0
- package/dist/auth/hooks/index.mjs +4 -0
- package/dist/auth/hooks/index.mjs.map +1 -0
- package/dist/auth/index.d.mts +15 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.js +110 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/index.mjs +9 -0
- package/dist/auth/index.mjs.map +1 -0
- package/dist/auth/middleware/index.d.mts +75 -0
- package/dist/auth/middleware/index.d.ts +75 -0
- package/dist/auth/middleware/index.js +15 -0
- package/dist/auth/middleware/index.js.map +1 -0
- package/dist/auth/middleware/index.mjs +6 -0
- package/dist/auth/middleware/index.mjs.map +1 -0
- package/dist/auth/routes/index.d.mts +163 -0
- package/dist/auth/routes/index.d.ts +163 -0
- package/dist/auth/routes/index.js +27 -0
- package/dist/auth/routes/index.js.map +1 -0
- package/dist/auth/routes/index.mjs +6 -0
- package/dist/auth/routes/index.mjs.map +1 -0
- package/dist/auth/schema/index.d.mts +789 -0
- package/dist/auth/schema/index.d.ts +789 -0
- package/dist/auth/schema/index.js +41 -0
- package/dist/auth/schema/index.js.map +1 -0
- package/dist/auth/schema/index.mjs +4 -0
- package/dist/auth/schema/index.mjs.map +1 -0
- package/dist/auth/services/index.d.mts +47 -0
- package/dist/auth/services/index.d.ts +47 -0
- package/dist/auth/services/index.js +34 -0
- package/dist/auth/services/index.js.map +1 -0
- package/dist/auth/services/index.mjs +5 -0
- package/dist/auth/services/index.mjs.map +1 -0
- package/dist/chunk-3RFBUDRA.js +507 -0
- package/dist/chunk-3RFBUDRA.js.map +1 -0
- package/dist/chunk-3XG5OHFD.mjs +37 -0
- package/dist/chunk-3XG5OHFD.mjs.map +1 -0
- package/dist/chunk-6BL3AZGD.js +285 -0
- package/dist/chunk-6BL3AZGD.js.map +1 -0
- package/dist/chunk-6FNUWAIV.js +394 -0
- package/dist/chunk-6FNUWAIV.js.map +1 -0
- package/dist/chunk-6PRFP5EG.js +171 -0
- package/dist/chunk-6PRFP5EG.js.map +1 -0
- package/dist/chunk-6VHWOPRR.mjs +90 -0
- package/dist/chunk-6VHWOPRR.mjs.map +1 -0
- package/dist/chunk-AIKEVVDR.mjs +122 -0
- package/dist/chunk-AIKEVVDR.mjs.map +1 -0
- package/dist/chunk-APY57REU.js +300 -0
- package/dist/chunk-APY57REU.js.map +1 -0
- package/dist/chunk-BJTO5JO5.mjs +10 -0
- package/dist/chunk-BJTO5JO5.mjs.map +1 -0
- package/dist/chunk-C64RY2OW.mjs +295 -0
- package/dist/chunk-C64RY2OW.mjs.map +1 -0
- package/dist/chunk-DGUM43GV.js +12 -0
- package/dist/chunk-DGUM43GV.js.map +1 -0
- package/dist/chunk-FV3FNHQY.js +92 -0
- package/dist/chunk-FV3FNHQY.js.map +1 -0
- package/dist/chunk-GSTLV3MB.mjs +316 -0
- package/dist/chunk-GSTLV3MB.mjs.map +1 -0
- package/dist/chunk-HEMA7SWK.mjs +212 -0
- package/dist/chunk-HEMA7SWK.mjs.map +1 -0
- package/dist/chunk-HWJ34NL6.js +43 -0
- package/dist/chunk-HWJ34NL6.js.map +1 -0
- package/dist/chunk-HXFFYNIF.mjs +385 -0
- package/dist/chunk-HXFFYNIF.mjs.map +1 -0
- package/dist/chunk-KGRQNEIR.mjs +183 -0
- package/dist/chunk-KGRQNEIR.mjs.map +1 -0
- package/dist/chunk-KH6RQ4J5.js +28 -0
- package/dist/chunk-KH6RQ4J5.js.map +1 -0
- package/dist/chunk-KQGP6BTS.mjs +165 -0
- package/dist/chunk-KQGP6BTS.mjs.map +1 -0
- package/dist/chunk-NMF4ANIC.js +365 -0
- package/dist/chunk-NMF4ANIC.js.map +1 -0
- package/dist/chunk-O26VCNS3.js +216 -0
- package/dist/chunk-O26VCNS3.js.map +1 -0
- package/dist/chunk-OLHGZXN3.mjs +86 -0
- package/dist/chunk-OLHGZXN3.mjs.map +1 -0
- package/dist/chunk-QU5OT4DF.js +88 -0
- package/dist/chunk-QU5OT4DF.js.map +1 -0
- package/dist/chunk-RCNNVNLT.mjs +356 -0
- package/dist/chunk-RCNNVNLT.mjs.map +1 -0
- package/dist/chunk-ROEYW4A7.js +186 -0
- package/dist/chunk-ROEYW4A7.js.map +1 -0
- package/dist/chunk-SVWQN2LR.js +131 -0
- package/dist/chunk-SVWQN2LR.js.map +1 -0
- package/dist/chunk-TKCYPDWU.js +338 -0
- package/dist/chunk-TKCYPDWU.js.map +1 -0
- package/dist/chunk-U2L6V7KD.mjs +273 -0
- package/dist/chunk-U2L6V7KD.mjs.map +1 -0
- package/dist/chunk-YVBU7QDJ.mjs +505 -0
- package/dist/chunk-YVBU7QDJ.mjs.map +1 -0
- package/dist/chunk-ZGVB35L2.mjs +25 -0
- package/dist/chunk-ZGVB35L2.mjs.map +1 -0
- package/dist/config/index.d.mts +64 -0
- package/dist/config/index.d.ts +64 -0
- package/dist/config/index.js +136 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +128 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/drizzle-auth-service-Bxlovhv8.d.ts +145 -0
- package/dist/drizzle-auth-service-DZY2F1sv.d.mts +145 -0
- package/dist/enums-Dume-V5Y.d.mts +16 -0
- package/dist/enums-Dume-V5Y.d.ts +16 -0
- package/dist/i18n/index.d.mts +416 -0
- package/dist/i18n/index.d.ts +416 -0
- package/dist/i18n/index.js +671 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/index.mjs +650 -0
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/index-8VoHap_4.d.mts +105 -0
- package/dist/index-8VoHap_4.d.ts +105 -0
- package/dist/index.d.mts +4 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +84 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +7 -0
- package/dist/index.mjs.map +1 -0
- package/dist/logger/index.d.mts +125 -0
- package/dist/logger/index.d.ts +125 -0
- package/dist/logger/index.js +29 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/index.mjs +4 -0
- package/dist/logger/index.mjs.map +1 -0
- package/dist/request/index.d.mts +51 -0
- package/dist/request/index.d.ts +51 -0
- package/dist/request/index.js +85 -0
- package/dist/request/index.js.map +1 -0
- package/dist/request/index.mjs +82 -0
- package/dist/request/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +74 -0
- package/dist/storage/index.d.ts +74 -0
- package/dist/storage/index.js +46 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/index.mjs +5 -0
- package/dist/storage/index.mjs.map +1 -0
- package/dist/types-BINlP9MK.d.mts +286 -0
- package/dist/types-BINlP9MK.d.ts +286 -0
- package/dist/types-BaZccpvk.d.mts +48 -0
- package/dist/types-BaZccpvk.d.ts +48 -0
- package/dist/types-CbTsi9CZ.d.mts +31 -0
- package/dist/types-CbTsi9CZ.d.ts +31 -0
- package/dist/types-CoGG1rNV.d.mts +258 -0
- package/dist/types-CoGG1rNV.d.ts +258 -0
- package/dist/types-DAxQ1MeY.d.ts +70 -0
- package/dist/types-DT8LVCvE.d.mts +70 -0
- package/dist/types-DW9qar-w.d.mts +52 -0
- package/dist/types-DW9qar-w.d.ts +52 -0
- package/dist/universalExport/index.d.mts +235 -0
- package/dist/universalExport/index.d.ts +235 -0
- package/dist/universalExport/index.js +621 -0
- package/dist/universalExport/index.js.map +1 -0
- package/dist/universalExport/index.mjs +580 -0
- package/dist/universalExport/index.mjs.map +1 -0
- package/dist/universalExport/server/index.d.mts +429 -0
- package/dist/universalExport/server/index.d.ts +429 -0
- package/dist/universalExport/server/index.js +263 -0
- package/dist/universalExport/server/index.js.map +1 -0
- package/dist/universalExport/server/index.mjs +242 -0
- package/dist/universalExport/server/index.mjs.map +1 -0
- package/dist/universalFile/index.d.mts +310 -0
- package/dist/universalFile/index.d.ts +310 -0
- package/dist/universalFile/index.js +811 -0
- package/dist/universalFile/index.js.map +1 -0
- package/dist/universalFile/index.mjs +736 -0
- package/dist/universalFile/index.mjs.map +1 -0
- package/dist/universalFile/server/index.d.mts +2428 -0
- package/dist/universalFile/server/index.d.ts +2428 -0
- package/dist/universalFile/server/index.js +4578 -0
- package/dist/universalFile/server/index.js.map +1 -0
- package/dist/universalFile/server/index.mjs +4518 -0
- package/dist/universalFile/server/index.mjs.map +1 -0
- package/dist/useElectronStorage-Dj0rcorG.d.mts +65 -0
- package/dist/useElectronStorage-DwnNfIhl.d.ts +65 -0
- package/dist/utils/index.d.mts +188 -0
- package/dist/utils/index.d.ts +188 -0
- package/dist/utils/index.js +42 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +5 -0
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +220 -0
- package/tailwind.animations.js +34 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { S as StorageAdapter } from '../../types-BaZccpvk.mjs';
|
|
2
|
+
import { R as RequestAdapter } from '../../types-CbTsi9CZ.mjs';
|
|
3
|
+
import { U as User, a as ApiResponse, b as AuthResponse } from '../../types-DW9qar-w.mjs';
|
|
4
|
+
export { A as API_ROUTES, S as STORAGE_KEYS } from '../../types-DW9qar-w.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Auth Client - Base API Client
|
|
8
|
+
* 基础 API 客户端
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 基础 API 客户端
|
|
13
|
+
* 提供统一的 API 调用逻辑,通过适配器模式支持多平台
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
|
|
18
|
+
* import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
|
|
19
|
+
* import { WebRequestAdapter } from '@qhr123/sa2kit/request';
|
|
20
|
+
*
|
|
21
|
+
* const apiClient = new BaseApiClient(
|
|
22
|
+
* new WebStorageAdapter(),
|
|
23
|
+
* new WebRequestAdapter(),
|
|
24
|
+
* '/api'
|
|
25
|
+
* );
|
|
26
|
+
*
|
|
27
|
+
* await apiClient.init();
|
|
28
|
+
* const result = await apiClient.login('user@example.com', 'password');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare class BaseApiClient {
|
|
32
|
+
private storage;
|
|
33
|
+
private request;
|
|
34
|
+
private baseUrl;
|
|
35
|
+
private token;
|
|
36
|
+
private user;
|
|
37
|
+
constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
|
|
38
|
+
/**
|
|
39
|
+
* 初始化 - 从存储中加载 token 和用户信息
|
|
40
|
+
*/
|
|
41
|
+
init(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* 设置认证 token
|
|
44
|
+
*/
|
|
45
|
+
setToken(token: string | null): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 设置用户信息
|
|
48
|
+
*/
|
|
49
|
+
setUser(user: User | null): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* 获取当前 token
|
|
52
|
+
*/
|
|
53
|
+
getToken(): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* 获取当前用户
|
|
56
|
+
*/
|
|
57
|
+
getUser(): User | null;
|
|
58
|
+
/**
|
|
59
|
+
* 检查是否已登录
|
|
60
|
+
*/
|
|
61
|
+
isAuthenticated(): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* 清除用户数据
|
|
64
|
+
*/
|
|
65
|
+
clearUserData(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* 发送请求的通用方法
|
|
68
|
+
*/
|
|
69
|
+
private sendRequest;
|
|
70
|
+
/**
|
|
71
|
+
* 用户注册
|
|
72
|
+
*/
|
|
73
|
+
register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
|
|
74
|
+
/**
|
|
75
|
+
* 用户登录
|
|
76
|
+
*/
|
|
77
|
+
login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
|
|
78
|
+
/**
|
|
79
|
+
* 用户退出登录
|
|
80
|
+
*/
|
|
81
|
+
logout(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* 获取当前用户信息
|
|
84
|
+
*/
|
|
85
|
+
getCurrentUser(): Promise<ApiResponse<User>>;
|
|
86
|
+
/**
|
|
87
|
+
* 发送 GET 请求
|
|
88
|
+
*/
|
|
89
|
+
get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
|
|
90
|
+
/**
|
|
91
|
+
* 发送 POST 请求
|
|
92
|
+
*/
|
|
93
|
+
post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
|
|
94
|
+
/**
|
|
95
|
+
* 发送 PUT 请求
|
|
96
|
+
*/
|
|
97
|
+
put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
|
|
98
|
+
/**
|
|
99
|
+
* 发送 DELETE 请求
|
|
100
|
+
*/
|
|
101
|
+
delete<T = any>(url: string): Promise<ApiResponse<T>>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { ApiResponse, AuthResponse, BaseApiClient, User };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { S as StorageAdapter } from '../../types-BaZccpvk.js';
|
|
2
|
+
import { R as RequestAdapter } from '../../types-CbTsi9CZ.js';
|
|
3
|
+
import { U as User, a as ApiResponse, b as AuthResponse } from '../../types-DW9qar-w.js';
|
|
4
|
+
export { A as API_ROUTES, S as STORAGE_KEYS } from '../../types-DW9qar-w.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Auth Client - Base API Client
|
|
8
|
+
* 基础 API 客户端
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* 基础 API 客户端
|
|
13
|
+
* 提供统一的 API 调用逻辑,通过适配器模式支持多平台
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
|
|
18
|
+
* import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
|
|
19
|
+
* import { WebRequestAdapter } from '@qhr123/sa2kit/request';
|
|
20
|
+
*
|
|
21
|
+
* const apiClient = new BaseApiClient(
|
|
22
|
+
* new WebStorageAdapter(),
|
|
23
|
+
* new WebRequestAdapter(),
|
|
24
|
+
* '/api'
|
|
25
|
+
* );
|
|
26
|
+
*
|
|
27
|
+
* await apiClient.init();
|
|
28
|
+
* const result = await apiClient.login('user@example.com', 'password');
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
declare class BaseApiClient {
|
|
32
|
+
private storage;
|
|
33
|
+
private request;
|
|
34
|
+
private baseUrl;
|
|
35
|
+
private token;
|
|
36
|
+
private user;
|
|
37
|
+
constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
|
|
38
|
+
/**
|
|
39
|
+
* 初始化 - 从存储中加载 token 和用户信息
|
|
40
|
+
*/
|
|
41
|
+
init(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* 设置认证 token
|
|
44
|
+
*/
|
|
45
|
+
setToken(token: string | null): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* 设置用户信息
|
|
48
|
+
*/
|
|
49
|
+
setUser(user: User | null): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* 获取当前 token
|
|
52
|
+
*/
|
|
53
|
+
getToken(): string | null;
|
|
54
|
+
/**
|
|
55
|
+
* 获取当前用户
|
|
56
|
+
*/
|
|
57
|
+
getUser(): User | null;
|
|
58
|
+
/**
|
|
59
|
+
* 检查是否已登录
|
|
60
|
+
*/
|
|
61
|
+
isAuthenticated(): Promise<boolean>;
|
|
62
|
+
/**
|
|
63
|
+
* 清除用户数据
|
|
64
|
+
*/
|
|
65
|
+
clearUserData(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* 发送请求的通用方法
|
|
68
|
+
*/
|
|
69
|
+
private sendRequest;
|
|
70
|
+
/**
|
|
71
|
+
* 用户注册
|
|
72
|
+
*/
|
|
73
|
+
register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
|
|
74
|
+
/**
|
|
75
|
+
* 用户登录
|
|
76
|
+
*/
|
|
77
|
+
login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
|
|
78
|
+
/**
|
|
79
|
+
* 用户退出登录
|
|
80
|
+
*/
|
|
81
|
+
logout(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* 获取当前用户信息
|
|
84
|
+
*/
|
|
85
|
+
getCurrentUser(): Promise<ApiResponse<User>>;
|
|
86
|
+
/**
|
|
87
|
+
* 发送 GET 请求
|
|
88
|
+
*/
|
|
89
|
+
get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
|
|
90
|
+
/**
|
|
91
|
+
* 发送 POST 请求
|
|
92
|
+
*/
|
|
93
|
+
post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
|
|
94
|
+
/**
|
|
95
|
+
* 发送 PUT 请求
|
|
96
|
+
*/
|
|
97
|
+
put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
|
|
98
|
+
/**
|
|
99
|
+
* 发送 DELETE 请求
|
|
100
|
+
*/
|
|
101
|
+
delete<T = any>(url: string): Promise<ApiResponse<T>>;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { ApiResponse, AuthResponse, BaseApiClient, User };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkO26VCNS3_js = require('../../chunk-O26VCNS3.js');
|
|
4
|
+
require('../../chunk-DGUM43GV.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "API_ROUTES", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkO26VCNS3_js.API_ROUTES; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "BaseApiClient", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkO26VCNS3_js.BaseApiClient; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "STORAGE_KEYS", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunkO26VCNS3_js.STORAGE_KEYS; }
|
|
19
|
+
});
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { H as HeadlessLoginFormProps, a as HeadlessRegisterFormProps } from '../../types-DT8LVCvE.mjs';
|
|
3
|
+
export { B as BaseFormProps, L as LoginFormState, R as RegisterFormState } from '../../types-DT8LVCvE.mjs';
|
|
4
|
+
import '../../types-DW9qar-w.mjs';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Auth Components - LoginForm (Headless)
|
|
8
|
+
* 无样式的登录表单组件
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Headless 登录表单组件
|
|
13
|
+
*
|
|
14
|
+
* 提供登录逻辑但不包含任何 UI 样式,
|
|
15
|
+
* 使用 render props 模式让用户完全控制 UI
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <LoginForm apiClient={apiClient}>
|
|
20
|
+
* {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (
|
|
21
|
+
* <form onSubmit={handleSubmit}>
|
|
22
|
+
* <input
|
|
23
|
+
* value={email}
|
|
24
|
+
* onChange={(e) => handleEmailChange(e.target.value)}
|
|
25
|
+
* />
|
|
26
|
+
* <input
|
|
27
|
+
* type="password"
|
|
28
|
+
* value={password}
|
|
29
|
+
* onChange={(e) => handlePasswordChange(e.target.value)}
|
|
30
|
+
* />
|
|
31
|
+
* {error && <div>{error}</div>}
|
|
32
|
+
* <button disabled={loading}>
|
|
33
|
+
* {loading ? '登录中...' : '登录'}
|
|
34
|
+
* </button>
|
|
35
|
+
* </form>
|
|
36
|
+
* )}
|
|
37
|
+
* </LoginForm>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps): React__default.JSX.Element;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Auth Components - RegisterForm (Headless)
|
|
44
|
+
* 无样式的注册表单组件
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Headless 注册表单组件
|
|
49
|
+
*
|
|
50
|
+
* 提供注册逻辑但不包含任何 UI 样式,
|
|
51
|
+
* 使用 render props 模式让用户完全控制 UI
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <RegisterForm apiClient={apiClient}>
|
|
56
|
+
* {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (
|
|
57
|
+
* <form onSubmit={handleSubmit}>
|
|
58
|
+
* <input
|
|
59
|
+
* value={email}
|
|
60
|
+
* onChange={(e) => handleEmailChange(e.target.value)}
|
|
61
|
+
* />
|
|
62
|
+
* <input
|
|
63
|
+
* value={username}
|
|
64
|
+
* onChange={(e) => handleUsernameChange(e.target.value)}
|
|
65
|
+
* />
|
|
66
|
+
* <input
|
|
67
|
+
* type="password"
|
|
68
|
+
* value={password}
|
|
69
|
+
* onChange={(e) => handlePasswordChange(e.target.value)}
|
|
70
|
+
* />
|
|
71
|
+
* {error && <div>{error}</div>}
|
|
72
|
+
* <button disabled={loading}>
|
|
73
|
+
* {loading ? '注册中...' : '注册'}
|
|
74
|
+
* </button>
|
|
75
|
+
* </form>
|
|
76
|
+
* )}
|
|
77
|
+
* </RegisterForm>
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
declare function RegisterForm({ apiClient, onSuccess, onError, children, }: HeadlessRegisterFormProps): React__default.JSX.Element;
|
|
81
|
+
|
|
82
|
+
export { HeadlessLoginFormProps, HeadlessRegisterFormProps, LoginForm, RegisterForm };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import React__default from 'react';
|
|
2
|
+
import { H as HeadlessLoginFormProps, a as HeadlessRegisterFormProps } from '../../types-DAxQ1MeY.js';
|
|
3
|
+
export { B as BaseFormProps, L as LoginFormState, R as RegisterFormState } from '../../types-DAxQ1MeY.js';
|
|
4
|
+
import '../../types-DW9qar-w.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Auth Components - LoginForm (Headless)
|
|
8
|
+
* 无样式的登录表单组件
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Headless 登录表单组件
|
|
13
|
+
*
|
|
14
|
+
* 提供登录逻辑但不包含任何 UI 样式,
|
|
15
|
+
* 使用 render props 模式让用户完全控制 UI
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <LoginForm apiClient={apiClient}>
|
|
20
|
+
* {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (
|
|
21
|
+
* <form onSubmit={handleSubmit}>
|
|
22
|
+
* <input
|
|
23
|
+
* value={email}
|
|
24
|
+
* onChange={(e) => handleEmailChange(e.target.value)}
|
|
25
|
+
* />
|
|
26
|
+
* <input
|
|
27
|
+
* type="password"
|
|
28
|
+
* value={password}
|
|
29
|
+
* onChange={(e) => handlePasswordChange(e.target.value)}
|
|
30
|
+
* />
|
|
31
|
+
* {error && <div>{error}</div>}
|
|
32
|
+
* <button disabled={loading}>
|
|
33
|
+
* {loading ? '登录中...' : '登录'}
|
|
34
|
+
* </button>
|
|
35
|
+
* </form>
|
|
36
|
+
* )}
|
|
37
|
+
* </LoginForm>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
declare function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps): React__default.JSX.Element;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Auth Components - RegisterForm (Headless)
|
|
44
|
+
* 无样式的注册表单组件
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Headless 注册表单组件
|
|
49
|
+
*
|
|
50
|
+
* 提供注册逻辑但不包含任何 UI 样式,
|
|
51
|
+
* 使用 render props 模式让用户完全控制 UI
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <RegisterForm apiClient={apiClient}>
|
|
56
|
+
* {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (
|
|
57
|
+
* <form onSubmit={handleSubmit}>
|
|
58
|
+
* <input
|
|
59
|
+
* value={email}
|
|
60
|
+
* onChange={(e) => handleEmailChange(e.target.value)}
|
|
61
|
+
* />
|
|
62
|
+
* <input
|
|
63
|
+
* value={username}
|
|
64
|
+
* onChange={(e) => handleUsernameChange(e.target.value)}
|
|
65
|
+
* />
|
|
66
|
+
* <input
|
|
67
|
+
* type="password"
|
|
68
|
+
* value={password}
|
|
69
|
+
* onChange={(e) => handlePasswordChange(e.target.value)}
|
|
70
|
+
* />
|
|
71
|
+
* {error && <div>{error}</div>}
|
|
72
|
+
* <button disabled={loading}>
|
|
73
|
+
* {loading ? '注册中...' : '注册'}
|
|
74
|
+
* </button>
|
|
75
|
+
* </form>
|
|
76
|
+
* )}
|
|
77
|
+
* </RegisterForm>
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
declare function RegisterForm({ apiClient, onSuccess, onError, children, }: HeadlessRegisterFormProps): React__default.JSX.Element;
|
|
81
|
+
|
|
82
|
+
export { HeadlessLoginFormProps, HeadlessRegisterFormProps, LoginForm, RegisterForm };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkROEYW4A7_js = require('../../chunk-ROEYW4A7.js');
|
|
4
|
+
require('../../chunk-DGUM43GV.js');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
10
|
+
|
|
11
|
+
function LoginForm({ apiClient, onSuccess, onError, children }) {
|
|
12
|
+
const { login, loading, error: authError, clearError } = chunkROEYW4A7_js.useAuth(apiClient);
|
|
13
|
+
const [email, setEmail] = React.useState("");
|
|
14
|
+
const [password, setPassword] = React.useState("");
|
|
15
|
+
const handleSubmit = async (e) => {
|
|
16
|
+
if (e) {
|
|
17
|
+
e.preventDefault();
|
|
18
|
+
}
|
|
19
|
+
clearError();
|
|
20
|
+
const result = await login(email, password);
|
|
21
|
+
if (result.success) {
|
|
22
|
+
const currentUser = apiClient.getUser();
|
|
23
|
+
if (currentUser) {
|
|
24
|
+
onSuccess?.(currentUser);
|
|
25
|
+
}
|
|
26
|
+
} else {
|
|
27
|
+
onError?.(result.error || "\u767B\u5F55\u5931\u8D25");
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const state = {
|
|
31
|
+
email,
|
|
32
|
+
password,
|
|
33
|
+
loading,
|
|
34
|
+
error: authError,
|
|
35
|
+
handleEmailChange: setEmail,
|
|
36
|
+
handlePasswordChange: setPassword,
|
|
37
|
+
handleSubmit
|
|
38
|
+
};
|
|
39
|
+
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, children(state));
|
|
40
|
+
}
|
|
41
|
+
function RegisterForm({
|
|
42
|
+
apiClient,
|
|
43
|
+
onSuccess,
|
|
44
|
+
onError,
|
|
45
|
+
children
|
|
46
|
+
}) {
|
|
47
|
+
const { register, loading, error: authError, clearError } = chunkROEYW4A7_js.useAuth(apiClient);
|
|
48
|
+
const [email, setEmail] = React.useState("");
|
|
49
|
+
const [password, setPassword] = React.useState("");
|
|
50
|
+
const [username, setUsername] = React.useState("");
|
|
51
|
+
const handleSubmit = async (e) => {
|
|
52
|
+
if (e) {
|
|
53
|
+
e.preventDefault();
|
|
54
|
+
}
|
|
55
|
+
clearError();
|
|
56
|
+
if (!email || !password || !username) {
|
|
57
|
+
const errorMsg = "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5";
|
|
58
|
+
onError?.(errorMsg);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (password.length < 6) {
|
|
62
|
+
const errorMsg = "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D";
|
|
63
|
+
onError?.(errorMsg);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const result = await register(email, password, username);
|
|
67
|
+
if (result.success) {
|
|
68
|
+
const currentUser = apiClient.getUser();
|
|
69
|
+
if (currentUser) {
|
|
70
|
+
onSuccess?.(currentUser);
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
onError?.(result.error || "\u6CE8\u518C\u5931\u8D25");
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
const state = {
|
|
77
|
+
email,
|
|
78
|
+
password,
|
|
79
|
+
username,
|
|
80
|
+
loading,
|
|
81
|
+
error: authError,
|
|
82
|
+
handleEmailChange: setEmail,
|
|
83
|
+
handlePasswordChange: setPassword,
|
|
84
|
+
handleUsernameChange: setUsername,
|
|
85
|
+
handleSubmit
|
|
86
|
+
};
|
|
87
|
+
return /* @__PURE__ */ React__default.default.createElement(React__default.default.Fragment, null, children(state));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
exports.LoginForm = LoginForm;
|
|
91
|
+
exports.RegisterForm = RegisterForm;
|
|
92
|
+
//# sourceMappingURL=index.js.map
|
|
93
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/components/LoginForm.tsx","../../../src/auth/components/RegisterForm.tsx"],"names":["useAuth","useState","React"],"mappings":";;;;;;;;;;AAsCO,SAAS,UAAU,EAAE,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,UAAS,EAA2B;AAC7F,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,UAAA,EAAW,GAAIA,yBAAQ,SAAS,CAAA;AAC1E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAwB;AAClD,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB;AAEA,IAAA,UAAA,EAAW;AAEX,IAAA,MAAM,MAAA,GAAS,MAAM,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAE1C,IAAA,IAAI,OAAO,OAAA,EAAS;AAElB,MAAA,MAAM,WAAA,GAAc,UAAU,OAAA,EAAQ;AACtC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,SAAA,GAAY,WAAW,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,MAAA,CAAO,SAAS,0BAAM,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAAwB;AAAA,IAC5B,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,iBAAA,EAAmB,QAAA;AAAA,IACnB,oBAAA,EAAsB,WAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,uBAAOC,sBAAA,CAAA,aAAA,CAAAA,sBAAA,CAAA,QAAA,EAAA,IAAA,EAAG,QAAA,CAAS,KAAK,CAAE,CAAA;AAC5B;AChCO,SAAS,YAAA,CAAa;AAAA,EAC3B,SAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,UAAU,OAAA,EAAS,KAAA,EAAO,WAAW,UAAA,EAAW,GAAIF,yBAAQ,SAAS,CAAA;AAC7E,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAIC,eAAS,EAAE,CAAA;AACrC,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAC3C,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAIA,eAAS,EAAE,CAAA;AAE3C,EAAA,MAAM,YAAA,GAAe,OAAO,CAAA,KAAwB;AAClD,IAAA,IAAI,CAAA,EAAG;AACL,MAAA,CAAA,CAAE,cAAA,EAAe;AAAA,IACnB;AAEA,IAAA,UAAA,EAAW;AAGX,IAAA,IAAI,CAAC,KAAA,IAAS,CAAC,QAAA,IAAY,CAAC,QAAA,EAAU;AACpC,MAAA,MAAM,QAAA,GAAW,4CAAA;AACjB,MAAA,OAAA,GAAU,QAAQ,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,QAAA,GAAW,qDAAA;AACjB,MAAA,OAAA,GAAU,QAAQ,CAAA;AAClB,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,KAAA,EAAO,UAAU,QAAQ,CAAA;AAEvD,IAAA,IAAI,OAAO,OAAA,EAAS;AAElB,MAAA,MAAM,WAAA,GAAc,UAAU,OAAA,EAAQ;AACtC,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,SAAA,GAAY,WAAW,CAAA;AAAA,MACzB;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAA,GAAU,MAAA,CAAO,SAAS,0BAAM,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,KAAA,GAA2B;AAAA,IAC/B,KAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA,EAAO,SAAA;AAAA,IACP,iBAAA,EAAmB,QAAA;AAAA,IACnB,oBAAA,EAAsB,WAAA;AAAA,IACtB,oBAAA,EAAsB,WAAA;AAAA,IACtB;AAAA,GACF;AAEA,EAAA,uBAAOC,sBAAAA,CAAA,aAAA,CAAAA,uBAAA,QAAA,EAAA,IAAA,EAAG,QAAA,CAAS,KAAK,CAAE,CAAA;AAC5B","file":"index.js","sourcesContent":["/**\n * Auth Components - LoginForm (Headless)\n * 无样式的登录表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessLoginFormProps, LoginFormState } from './types';\n\n/**\n * Headless 登录表单组件\n *\n * 提供登录逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <LoginForm apiClient={apiClient}>\n * {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * type=\"password\"\n * value={password}\n * onChange={(e) => handlePasswordChange(e.target.value)}\n * />\n * {error && <div>{error}</div>}\n * <button disabled={loading}>\n * {loading ? '登录中...' : '登录'}\n * </button>\n * </form>\n * )}\n * </LoginForm>\n * ```\n */\nexport function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps) {\n const { login, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n const result = await login(email, password);\n\n if (result.success) {\n // 登录成功后 user 会自动更新到 state\n const currentUser = apiClient.getUser();\n if (currentUser) {\n onSuccess?.(currentUser);\n }\n } else {\n onError?.(result.error || '登录失败');\n }\n };\n\n const state: LoginFormState = {\n email,\n password,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n","/**\n * Auth Components - RegisterForm (Headless)\n * 无样式的注册表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessRegisterFormProps, RegisterFormState } from './types';\n\n/**\n * Headless 注册表单组件\n *\n * 提供注册逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <RegisterForm apiClient={apiClient}>\n * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * value={username}\n * onChange={(e) => handleUsernameChange(e.target.value)}\n * />\n * <input\n * type=\"password\"\n * value={password}\n * onChange={(e) => handlePasswordChange(e.target.value)}\n * />\n * {error && <div>{error}</div>}\n * <button disabled={loading}>\n * {loading ? '注册中...' : '注册'}\n * </button>\n * </form>\n * )}\n * </RegisterForm>\n * ```\n */\nexport function RegisterForm({\n apiClient,\n onSuccess,\n onError,\n children,\n}: HeadlessRegisterFormProps) {\n const { register, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [username, setUsername] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n // 基础验证\n if (!email || !password || !username) {\n const errorMsg = '请填写所有字段';\n onError?.(errorMsg);\n return;\n }\n\n if (password.length < 6) {\n const errorMsg = '密码长度至少为 6 位';\n onError?.(errorMsg);\n return;\n }\n\n const result = await register(email, password, username);\n\n if (result.success) {\n // 注册成功后 user 会自动更新到 state\n const currentUser = apiClient.getUser();\n if (currentUser) {\n onSuccess?.(currentUser);\n }\n } else {\n onError?.(result.error || '注册失败');\n }\n };\n\n const state: RegisterFormState = {\n email,\n password,\n username,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleUsernameChange: setUsername,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { useAuth } from '../../chunk-KGRQNEIR.mjs';
|
|
2
|
+
import '../../chunk-BJTO5JO5.mjs';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
|
|
5
|
+
function LoginForm({ apiClient, onSuccess, onError, children }) {
|
|
6
|
+
const { login, loading, error: authError, clearError } = useAuth(apiClient);
|
|
7
|
+
const [email, setEmail] = useState("");
|
|
8
|
+
const [password, setPassword] = useState("");
|
|
9
|
+
const handleSubmit = async (e) => {
|
|
10
|
+
if (e) {
|
|
11
|
+
e.preventDefault();
|
|
12
|
+
}
|
|
13
|
+
clearError();
|
|
14
|
+
const result = await login(email, password);
|
|
15
|
+
if (result.success) {
|
|
16
|
+
const currentUser = apiClient.getUser();
|
|
17
|
+
if (currentUser) {
|
|
18
|
+
onSuccess?.(currentUser);
|
|
19
|
+
}
|
|
20
|
+
} else {
|
|
21
|
+
onError?.(result.error || "\u767B\u5F55\u5931\u8D25");
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const state = {
|
|
25
|
+
email,
|
|
26
|
+
password,
|
|
27
|
+
loading,
|
|
28
|
+
error: authError,
|
|
29
|
+
handleEmailChange: setEmail,
|
|
30
|
+
handlePasswordChange: setPassword,
|
|
31
|
+
handleSubmit
|
|
32
|
+
};
|
|
33
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, children(state));
|
|
34
|
+
}
|
|
35
|
+
function RegisterForm({
|
|
36
|
+
apiClient,
|
|
37
|
+
onSuccess,
|
|
38
|
+
onError,
|
|
39
|
+
children
|
|
40
|
+
}) {
|
|
41
|
+
const { register, loading, error: authError, clearError } = useAuth(apiClient);
|
|
42
|
+
const [email, setEmail] = useState("");
|
|
43
|
+
const [password, setPassword] = useState("");
|
|
44
|
+
const [username, setUsername] = useState("");
|
|
45
|
+
const handleSubmit = async (e) => {
|
|
46
|
+
if (e) {
|
|
47
|
+
e.preventDefault();
|
|
48
|
+
}
|
|
49
|
+
clearError();
|
|
50
|
+
if (!email || !password || !username) {
|
|
51
|
+
const errorMsg = "\u8BF7\u586B\u5199\u6240\u6709\u5B57\u6BB5";
|
|
52
|
+
onError?.(errorMsg);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (password.length < 6) {
|
|
56
|
+
const errorMsg = "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C11\u4E3A 6 \u4F4D";
|
|
57
|
+
onError?.(errorMsg);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
const result = await register(email, password, username);
|
|
61
|
+
if (result.success) {
|
|
62
|
+
const currentUser = apiClient.getUser();
|
|
63
|
+
if (currentUser) {
|
|
64
|
+
onSuccess?.(currentUser);
|
|
65
|
+
}
|
|
66
|
+
} else {
|
|
67
|
+
onError?.(result.error || "\u6CE8\u518C\u5931\u8D25");
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const state = {
|
|
71
|
+
email,
|
|
72
|
+
password,
|
|
73
|
+
username,
|
|
74
|
+
loading,
|
|
75
|
+
error: authError,
|
|
76
|
+
handleEmailChange: setEmail,
|
|
77
|
+
handlePasswordChange: setPassword,
|
|
78
|
+
handleUsernameChange: setUsername,
|
|
79
|
+
handleSubmit
|
|
80
|
+
};
|
|
81
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, children(state));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { LoginForm, RegisterForm };
|
|
85
|
+
//# sourceMappingURL=index.mjs.map
|
|
86
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/auth/components/LoginForm.tsx","../../../src/auth/components/RegisterForm.tsx"],"names":["useState","React"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Auth Components - LoginForm (Headless)\n * 无样式的登录表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessLoginFormProps, LoginFormState } from './types';\n\n/**\n * Headless 登录表单组件\n *\n * 提供登录逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <LoginForm apiClient={apiClient}>\n * {({ email, password, loading, error, handleEmailChange, handlePasswordChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * type=\"password\"\n * value={password}\n * onChange={(e) => handlePasswordChange(e.target.value)}\n * />\n * {error && <div>{error}</div>}\n * <button disabled={loading}>\n * {loading ? '登录中...' : '登录'}\n * </button>\n * </form>\n * )}\n * </LoginForm>\n * ```\n */\nexport function LoginForm({ apiClient, onSuccess, onError, children }: HeadlessLoginFormProps) {\n const { login, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n const result = await login(email, password);\n\n if (result.success) {\n // 登录成功后 user 会自动更新到 state\n const currentUser = apiClient.getUser();\n if (currentUser) {\n onSuccess?.(currentUser);\n }\n } else {\n onError?.(result.error || '登录失败');\n }\n };\n\n const state: LoginFormState = {\n email,\n password,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n","/**\n * Auth Components - RegisterForm (Headless)\n * 无样式的注册表单组件\n */\n\nimport React, { useState } from 'react';\nimport { useAuth } from '../hooks';\nimport type { HeadlessRegisterFormProps, RegisterFormState } from './types';\n\n/**\n * Headless 注册表单组件\n *\n * 提供注册逻辑但不包含任何 UI 样式,\n * 使用 render props 模式让用户完全控制 UI\n *\n * @example\n * ```tsx\n * <RegisterForm apiClient={apiClient}>\n * {({ email, password, username, loading, error, handleEmailChange, handlePasswordChange, handleUsernameChange, handleSubmit }) => (\n * <form onSubmit={handleSubmit}>\n * <input\n * value={email}\n * onChange={(e) => handleEmailChange(e.target.value)}\n * />\n * <input\n * value={username}\n * onChange={(e) => handleUsernameChange(e.target.value)}\n * />\n * <input\n * type=\"password\"\n * value={password}\n * onChange={(e) => handlePasswordChange(e.target.value)}\n * />\n * {error && <div>{error}</div>}\n * <button disabled={loading}>\n * {loading ? '注册中...' : '注册'}\n * </button>\n * </form>\n * )}\n * </RegisterForm>\n * ```\n */\nexport function RegisterForm({\n apiClient,\n onSuccess,\n onError,\n children,\n}: HeadlessRegisterFormProps) {\n const { register, loading, error: authError, clearError } = useAuth(apiClient);\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [username, setUsername] = useState('');\n\n const handleSubmit = async (e?: React.FormEvent) => {\n if (e) {\n e.preventDefault();\n }\n\n clearError();\n\n // 基础验证\n if (!email || !password || !username) {\n const errorMsg = '请填写所有字段';\n onError?.(errorMsg);\n return;\n }\n\n if (password.length < 6) {\n const errorMsg = '密码长度至少为 6 位';\n onError?.(errorMsg);\n return;\n }\n\n const result = await register(email, password, username);\n\n if (result.success) {\n // 注册成功后 user 会自动更新到 state\n const currentUser = apiClient.getUser();\n if (currentUser) {\n onSuccess?.(currentUser);\n }\n } else {\n onError?.(result.error || '注册失败');\n }\n };\n\n const state: RegisterFormState = {\n email,\n password,\n username,\n loading,\n error: authError,\n handleEmailChange: setEmail,\n handlePasswordChange: setPassword,\n handleUsernameChange: setUsername,\n handleSubmit,\n };\n\n return <>{children(state)}</>;\n}\n\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkROEYW4A7_js = require('../../chunk-ROEYW4A7.js');
|
|
4
|
+
require('../../chunk-DGUM43GV.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "useAuth", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunkROEYW4A7_js.useAuth; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "useAuthForm", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunkROEYW4A7_js.useAuthForm; }
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
|