sa2kit 2.0.1 → 2.0.2

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 (264) hide show
  1. package/README.md +1 -1
  2. package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
  3. package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
  4. package/dist/ConfigService-BxK06xP6.d.mts +262 -0
  5. package/dist/ConfigService-BxK06xP6.d.ts +262 -0
  6. package/dist/UniversalFileService-BpvbZitV.d.mts +139 -0
  7. package/dist/UniversalFileService-GsP6D3Rc.d.ts +139 -0
  8. package/dist/audioDetection/index.d.mts +449 -0
  9. package/dist/audioDetection/index.d.ts +449 -0
  10. package/dist/audioDetection/index.js +1244 -0
  11. package/dist/audioDetection/index.js.map +1 -0
  12. package/dist/audioDetection/index.mjs +1227 -0
  13. package/dist/audioDetection/index.mjs.map +1 -0
  14. package/dist/auth/legacy/core/index.d.mts +42 -0
  15. package/dist/auth/legacy/core/index.d.ts +42 -0
  16. package/dist/auth/legacy/core/index.js +242 -0
  17. package/dist/auth/legacy/core/index.js.map +1 -0
  18. package/dist/auth/legacy/core/index.mjs +226 -0
  19. package/dist/auth/legacy/core/index.mjs.map +1 -0
  20. package/dist/auth/legacy/db/index.d.mts +5 -0
  21. package/dist/auth/legacy/db/index.d.ts +5 -0
  22. package/dist/auth/legacy/db/index.js +261 -0
  23. package/dist/auth/legacy/db/index.js.map +1 -0
  24. package/dist/auth/legacy/db/index.mjs +250 -0
  25. package/dist/auth/legacy/db/index.mjs.map +1 -0
  26. package/dist/auth/legacy/index.d.mts +5 -0
  27. package/dist/auth/legacy/index.d.ts +5 -0
  28. package/dist/auth/legacy/index.js +1107 -0
  29. package/dist/auth/legacy/index.js.map +1 -0
  30. package/dist/auth/legacy/index.mjs +1086 -0
  31. package/dist/auth/legacy/index.mjs.map +1 -0
  32. package/dist/auth/legacy/logic/index.d.mts +9 -0
  33. package/dist/auth/legacy/logic/index.d.ts +9 -0
  34. package/dist/auth/legacy/logic/index.js +194 -0
  35. package/dist/auth/legacy/logic/index.js.map +1 -0
  36. package/dist/auth/legacy/logic/index.mjs +187 -0
  37. package/dist/auth/legacy/logic/index.mjs.map +1 -0
  38. package/dist/auth/legacy/miniapp/index.d.mts +5 -0
  39. package/dist/auth/legacy/miniapp/index.d.ts +5 -0
  40. package/dist/auth/legacy/miniapp/index.js +506 -0
  41. package/dist/auth/legacy/miniapp/index.js.map +1 -0
  42. package/dist/auth/legacy/miniapp/index.mjs +487 -0
  43. package/dist/auth/legacy/miniapp/index.mjs.map +1 -0
  44. package/dist/auth/legacy/routes/index.d.mts +53 -0
  45. package/dist/auth/legacy/routes/index.d.ts +53 -0
  46. package/dist/auth/legacy/routes/index.js +278 -0
  47. package/dist/auth/legacy/routes/index.js.map +1 -0
  48. package/dist/auth/legacy/routes/index.mjs +271 -0
  49. package/dist/auth/legacy/routes/index.mjs.map +1 -0
  50. package/dist/auth/legacy/schema/index.d.mts +401 -0
  51. package/dist/auth/legacy/schema/index.d.ts +401 -0
  52. package/dist/auth/legacy/schema/index.js +50 -0
  53. package/dist/auth/legacy/schema/index.js.map +1 -0
  54. package/dist/auth/legacy/schema/index.mjs +44 -0
  55. package/dist/auth/legacy/schema/index.mjs.map +1 -0
  56. package/dist/auth/legacy/server/index.d.mts +13 -0
  57. package/dist/auth/legacy/server/index.d.ts +13 -0
  58. package/dist/auth/legacy/server/index.js +21 -0
  59. package/dist/auth/legacy/server/index.js.map +1 -0
  60. package/dist/auth/legacy/server/index.mjs +19 -0
  61. package/dist/auth/legacy/server/index.mjs.map +1 -0
  62. package/dist/auth/legacy/services/index.d.mts +40 -0
  63. package/dist/auth/legacy/services/index.d.ts +40 -0
  64. package/dist/auth/legacy/services/index.js +258 -0
  65. package/dist/auth/legacy/services/index.js.map +1 -0
  66. package/dist/auth/legacy/services/index.mjs +252 -0
  67. package/dist/auth/legacy/services/index.mjs.map +1 -0
  68. package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
  69. package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
  70. package/dist/auth/legacy/ui/miniapp/index.js +298 -0
  71. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
  72. package/dist/auth/legacy/ui/miniapp/index.mjs +290 -0
  73. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
  74. package/dist/auth/legacy/ui/web/index.d.mts +22 -0
  75. package/dist/auth/legacy/ui/web/index.d.ts +22 -0
  76. package/dist/auth/legacy/ui/web/index.js +899 -0
  77. package/dist/auth/legacy/ui/web/index.js.map +1 -0
  78. package/dist/auth/legacy/ui/web/index.mjs +889 -0
  79. package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
  80. package/dist/auth/legacy/web/index.d.mts +5 -0
  81. package/dist/auth/legacy/web/index.d.ts +5 -0
  82. package/dist/auth/legacy/web/index.js +1107 -0
  83. package/dist/auth/legacy/web/index.js.map +1 -0
  84. package/dist/auth/legacy/web/index.mjs +1086 -0
  85. package/dist/auth/legacy/web/index.mjs.map +1 -0
  86. package/dist/auth/rn/index.d.mts +64 -0
  87. package/dist/auth/rn/index.d.ts +64 -0
  88. package/dist/auth/rn/index.js +765 -0
  89. package/dist/auth/rn/index.js.map +1 -0
  90. package/dist/auth/rn/index.mjs +754 -0
  91. package/dist/auth/rn/index.mjs.map +1 -0
  92. package/dist/base-api-client-ACKKt13v.d.mts +277 -0
  93. package/dist/base-api-client-ACKKt13v.d.ts +277 -0
  94. package/dist/boothVaultService-Cn4WPhjg.d.mts +83 -0
  95. package/dist/boothVaultService-Cn4WPhjg.d.ts +83 -0
  96. package/dist/business/index.d.mts +6 -0
  97. package/dist/business/index.d.ts +6 -0
  98. package/dist/business/index.js +1682 -0
  99. package/dist/business/index.js.map +1 -0
  100. package/dist/business/index.mjs +1675 -0
  101. package/dist/business/index.mjs.map +1 -0
  102. package/dist/calendar/index.d.mts +1325 -0
  103. package/dist/calendar/index.d.ts +1325 -0
  104. package/dist/calendar/index.js +5964 -0
  105. package/dist/calendar/index.js.map +1 -0
  106. package/dist/calendar/index.mjs +5878 -0
  107. package/dist/calendar/index.mjs.map +1 -0
  108. package/dist/components/index.d.mts +405 -0
  109. package/dist/components/index.d.ts +405 -0
  110. package/dist/components/index.js +2516 -0
  111. package/dist/components/index.js.map +1 -0
  112. package/dist/components/index.mjs +2396 -0
  113. package/dist/components/index.mjs.map +1 -0
  114. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  115. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  116. package/dist/festivalCard/index.d.mts +75 -0
  117. package/dist/festivalCard/index.d.ts +75 -0
  118. package/dist/festivalCard/index.js +1492 -0
  119. package/dist/festivalCard/index.js.map +1 -0
  120. package/dist/festivalCard/index.mjs +1475 -0
  121. package/dist/festivalCard/index.mjs.map +1 -0
  122. package/dist/festivalCard/server/index.d.mts +120 -0
  123. package/dist/festivalCard/server/index.d.ts +120 -0
  124. package/dist/festivalCard/server/index.js +272 -0
  125. package/dist/festivalCard/server/index.js.map +1 -0
  126. package/dist/festivalCard/server/index.mjs +265 -0
  127. package/dist/festivalCard/server/index.mjs.map +1 -0
  128. package/dist/festivalCardService-CZomuQ4E.d.mts +80 -0
  129. package/dist/festivalCardService-CZomuQ4E.d.ts +80 -0
  130. package/dist/index-1Ag7IBXN.d.ts +144 -0
  131. package/dist/index-DNKZ7-R_.d.mts +184 -0
  132. package/dist/index-DNKZ7-R_.d.ts +184 -0
  133. package/dist/index-DSel44Ke.d.mts +93 -0
  134. package/dist/index-DSel44Ke.d.ts +93 -0
  135. package/dist/index-DdeZSeTJ.d.mts +144 -0
  136. package/dist/index-DrPcMJPc.d.mts +250 -0
  137. package/dist/index-DrPcMJPc.d.ts +250 -0
  138. package/dist/index.d.mts +5333 -0
  139. package/dist/index.d.ts +5333 -0
  140. package/dist/index.js +18809 -0
  141. package/dist/index.js.map +1 -0
  142. package/dist/index.mjs +18533 -0
  143. package/dist/index.mjs.map +1 -0
  144. package/dist/mikuContest/ui/web/index.d.mts +2 -0
  145. package/dist/mikuContest/ui/web/index.d.ts +2 -0
  146. package/dist/mikuContest/ui/web/index.js +353 -0
  147. package/dist/mikuContest/ui/web/index.js.map +1 -0
  148. package/dist/mikuContest/ui/web/index.mjs +343 -0
  149. package/dist/mikuContest/ui/web/index.mjs.map +1 -0
  150. package/dist/mikuFireworks3D/index.d.mts +268 -0
  151. package/dist/mikuFireworks3D/index.d.ts +268 -0
  152. package/dist/mikuFireworks3D/index.js +1267 -0
  153. package/dist/mikuFireworks3D/index.js.map +1 -0
  154. package/dist/mikuFireworks3D/index.mjs +1228 -0
  155. package/dist/mikuFireworks3D/index.mjs.map +1 -0
  156. package/dist/mikuFusionGame/index.d.mts +117 -0
  157. package/dist/mikuFusionGame/index.d.ts +117 -0
  158. package/dist/mikuFusionGame/index.js +1208 -0
  159. package/dist/mikuFusionGame/index.js.map +1 -0
  160. package/dist/mikuFusionGame/index.mjs +1195 -0
  161. package/dist/mikuFusionGame/index.mjs.map +1 -0
  162. package/dist/mmd/admin/index.d.mts +487 -0
  163. package/dist/mmd/admin/index.d.ts +487 -0
  164. package/dist/mmd/admin/index.js +1058 -0
  165. package/dist/mmd/admin/index.js.map +1 -0
  166. package/dist/mmd/admin/index.mjs +1027 -0
  167. package/dist/mmd/admin/index.mjs.map +1 -0
  168. package/dist/mmd/index.d.mts +2467 -0
  169. package/dist/mmd/index.d.ts +2467 -0
  170. package/dist/mmd/index.js +10119 -0
  171. package/dist/mmd/index.js.map +1 -0
  172. package/dist/mmd/index.mjs +10028 -0
  173. package/dist/mmd/index.mjs.map +1 -0
  174. package/dist/mmd/server/index.d.mts +139 -0
  175. package/dist/mmd/server/index.d.ts +139 -0
  176. package/dist/mmd/server/index.js +424 -0
  177. package/dist/mmd/server/index.js.map +1 -0
  178. package/dist/mmd/server/index.mjs +404 -0
  179. package/dist/mmd/server/index.mjs.map +1 -0
  180. package/dist/music/index.d.mts +74 -0
  181. package/dist/music/index.d.ts +74 -0
  182. package/dist/music/index.js +830 -0
  183. package/dist/music/index.js.map +1 -0
  184. package/dist/music/index.mjs +809 -0
  185. package/dist/music/index.mjs.map +1 -0
  186. package/dist/music/server/index.d.mts +1 -0
  187. package/dist/music/server/index.d.ts +1 -0
  188. package/dist/music/server/index.js +194 -0
  189. package/dist/music/server/index.js.map +1 -0
  190. package/dist/music/server/index.mjs +182 -0
  191. package/dist/music/server/index.mjs.map +1 -0
  192. package/dist/navigation/index.d.mts +93 -0
  193. package/dist/navigation/index.d.ts +93 -0
  194. package/dist/navigation/index.js +453 -0
  195. package/dist/navigation/index.js.map +1 -0
  196. package/dist/navigation/index.mjs +443 -0
  197. package/dist/navigation/index.mjs.map +1 -0
  198. package/dist/portfolio/index.d.mts +66 -0
  199. package/dist/portfolio/index.d.ts +66 -0
  200. package/dist/portfolio/index.js +736 -0
  201. package/dist/portfolio/index.js.map +1 -0
  202. package/dist/portfolio/index.mjs +724 -0
  203. package/dist/portfolio/index.mjs.map +1 -0
  204. package/dist/qqbot/server/index.d.mts +216 -0
  205. package/dist/qqbot/server/index.d.ts +216 -0
  206. package/dist/qqbot/server/index.js +394 -0
  207. package/dist/qqbot/server/index.js.map +1 -0
  208. package/dist/qqbot/server/index.mjs +385 -0
  209. package/dist/qqbot/server/index.mjs.map +1 -0
  210. package/dist/qqbot/ui/web/index.d.mts +10 -0
  211. package/dist/qqbot/ui/web/index.d.ts +10 -0
  212. package/dist/qqbot/ui/web/index.js +105 -0
  213. package/dist/qqbot/ui/web/index.js.map +1 -0
  214. package/dist/qqbot/ui/web/index.mjs +99 -0
  215. package/dist/qqbot/ui/web/index.mjs.map +1 -0
  216. package/dist/screenReceiver/index.d.mts +86 -0
  217. package/dist/screenReceiver/index.d.ts +86 -0
  218. package/dist/screenReceiver/index.js +281 -0
  219. package/dist/screenReceiver/index.js.map +1 -0
  220. package/dist/screenReceiver/index.mjs +273 -0
  221. package/dist/screenReceiver/index.mjs.map +1 -0
  222. package/dist/testYourself/admin/index.d.mts +58 -0
  223. package/dist/testYourself/admin/index.d.ts +58 -0
  224. package/dist/testYourself/admin/index.js +1009 -0
  225. package/dist/testYourself/admin/index.js.map +1 -0
  226. package/dist/testYourself/admin/index.mjs +1002 -0
  227. package/dist/testYourself/admin/index.mjs.map +1 -0
  228. package/dist/testYourself/index.d.mts +53 -0
  229. package/dist/testYourself/index.d.ts +53 -0
  230. package/dist/testYourself/index.js +2551 -0
  231. package/dist/testYourself/index.js.map +1 -0
  232. package/dist/testYourself/index.mjs +2531 -0
  233. package/dist/testYourself/index.mjs.map +1 -0
  234. package/dist/testYourself/server/index.d.mts +1029 -0
  235. package/dist/testYourself/server/index.d.ts +1029 -0
  236. package/dist/testYourself/server/index.js +825 -0
  237. package/dist/testYourself/server/index.js.map +1 -0
  238. package/dist/testYourself/server/index.mjs +816 -0
  239. package/dist/testYourself/server/index.mjs.map +1 -0
  240. package/dist/types-BTiaMsBz.d.mts +292 -0
  241. package/dist/types-DyG3ZV9V.d.mts +270 -0
  242. package/dist/types-DyG3ZV9V.d.ts +270 -0
  243. package/dist/types-ERmJyjx8.d.ts +292 -0
  244. package/dist/types-HorDyIRv.d.mts +303 -0
  245. package/dist/types-HorDyIRv.d.ts +303 -0
  246. package/dist/vocaloidBooth/index.d.mts +64 -0
  247. package/dist/vocaloidBooth/index.d.ts +64 -0
  248. package/dist/vocaloidBooth/index.js +376 -0
  249. package/dist/vocaloidBooth/index.js.map +1 -0
  250. package/dist/vocaloidBooth/index.mjs +362 -0
  251. package/dist/vocaloidBooth/index.mjs.map +1 -0
  252. package/dist/vocaloidBooth/server/index.d.mts +111 -0
  253. package/dist/vocaloidBooth/server/index.d.ts +111 -0
  254. package/dist/vocaloidBooth/server/index.js +247 -0
  255. package/dist/vocaloidBooth/server/index.js.map +1 -0
  256. package/dist/vocaloidBooth/server/index.mjs +237 -0
  257. package/dist/vocaloidBooth/server/index.mjs.map +1 -0
  258. package/dist/vocaloidBooth/web/index.d.mts +3 -0
  259. package/dist/vocaloidBooth/web/index.d.ts +3 -0
  260. package/dist/vocaloidBooth/web/index.js +376 -0
  261. package/dist/vocaloidBooth/web/index.js.map +1 -0
  262. package/dist/vocaloidBooth/web/index.mjs +362 -0
  263. package/dist/vocaloidBooth/web/index.mjs.map +1 -0
  264. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/common/auth/client/types.ts","../../../src/common/auth/client/base-api-client.ts","../../../src/storage/adapters/react-native-adapter.ts","../../../src/request/adapters/react-native-adapter.ts","../../../src/common/auth/rn/client.ts","../../../src/business/auth-legacy/utils/authUtils.ts","../../../src/business/auth-legacy/rn/legacy-login.ts","../../../src/common/auth/hooks/useAuth.ts","../../../src/common/auth/components/LoginForm.tsx","../../../src/business/auth-legacy/rn/components/AccountLoginForm.tsx"],"names":["useState","React","useEffect","useCallback"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Auth Client - Types\n * API 客户端类型定义\n */\n\nimport type { UserRole, User, ApiResponse, AuthResponse } from '../types';\n\nexport type { UserRole, User, ApiResponse, AuthResponse };\n\n/**\n * 存储键名\n */\nexport const STORAGE_KEYS = {\n AUTH_TOKEN: 'auth_token',\n USER_DATA: 'user_data',\n} as const;\n\n/**\n * API 路由\n */\nexport const API_ROUTES = {\n AUTH: {\n LOGIN: '/auth/login',\n REGISTER: '/auth/register',\n LOGOUT: '/auth/logout',\n ME: '/auth/me',\n },\n} as const;\n\n","/**\n * Auth Client - Base API Client\n * 基础 API 客户端\n */\n\nimport type { StorageAdapter } from '../../storage';\nimport type { RequestAdapter, RequestConfig } from '../../request';\nimport { API_ROUTES, STORAGE_KEYS, type ApiResponse, type User, type AuthResponse } from './types';\nimport type { IAuthClient } from '../types';\n\n/**\n * 基础 API 客户端\n * 提供统一的 API 调用逻辑,通过适配器模式支持多平台\n *\n * @example\n * ```typescript\n * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';\n * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';\n * import { WebRequestAdapter } from '@qhr123/sa2kit/request';\n *\n * const apiClient = new BaseApiClient(\n * new WebStorageAdapter(),\n * new WebRequestAdapter(),\n * '/api'\n * );\n *\n * await apiClient.init();\n * const result = await apiClient.login('user@example.com', 'password');\n * ```\n */\nexport class BaseApiClient implements IAuthClient {\n private token: string | null = null;\n private user: User | null = null;\n\n constructor(\n private storage: StorageAdapter,\n private request: RequestAdapter,\n private baseUrl: string\n ) {}\n\n /**\n * 初始化 - 从存储中加载 token 和用户信息\n */\n async init(): Promise<void> {\n try {\n this.token = await this.storage.getItem(STORAGE_KEYS.AUTH_TOKEN);\n const userData = await this.storage.getItem(STORAGE_KEYS.USER_DATA);\n if (userData) {\n this.user = JSON.parse(userData);\n }\n } catch (error) {\n console.error('Failed to load auth data:', error);\n }\n }\n\n /**\n * 设置认证 token\n */\n async setToken(token: string | null): Promise<void> {\n this.token = token;\n if (token) {\n await this.storage.setItem(STORAGE_KEYS.AUTH_TOKEN, token);\n } else {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n }\n }\n\n /**\n * 设置用户信息\n */\n async setUser(user: User | null): Promise<void> {\n this.user = user;\n if (user) {\n await this.storage.setItem(STORAGE_KEYS.USER_DATA, JSON.stringify(user));\n } else {\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n }\n }\n\n /**\n * 获取当前 token\n */\n getToken(): string | null {\n return this.token;\n }\n\n /**\n * 获取当前用户\n */\n getUser(): User | null {\n return this.user;\n }\n\n /**\n * 检查是否已登录\n */\n async isAuthenticated(): Promise<boolean> {\n return !!this.token;\n }\n\n /**\n * 清除用户数据\n */\n async clearUserData(): Promise<void> {\n await this.storage.removeItem(STORAGE_KEYS.AUTH_TOKEN);\n await this.storage.removeItem(STORAGE_KEYS.USER_DATA);\n this.token = null;\n this.user = null;\n }\n\n /**\n * 发送请求的通用方法\n */\n private async sendRequest<T = any>(config: RequestConfig): Promise<ApiResponse<T>> {\n try {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...(config.headers || {}),\n };\n\n // 添加认证 token\n if (this.token) {\n headers['Authorization'] = 'Bearer ' + (this.token);\n }\n\n const response = await this.request.request<ApiResponse<T>>({\n ...config,\n url: (this.baseUrl) + (config.url),\n headers,\n });\n\n return response;\n } catch (error) {\n console.error('API request error:', error);\n return {\n success: false,\n error: error instanceof Error ? error.message : '网络错误,请重试',\n };\n }\n }\n\n // ==================== 认证相关 API ====================\n\n /**\n * 用户注册\n */\n async register(\n email: string,\n password: string,\n username: string\n ): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.REGISTER,\n method: 'POST',\n body: { email, password, username },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n }\n\n return response;\n }\n\n /**\n * 用户登录\n */\n async login(email: string, password: string): Promise<ApiResponse<AuthResponse>> {\n const response = await this.sendRequest<AuthResponse>({\n url: API_ROUTES.AUTH.LOGIN,\n method: 'POST',\n body: { email, password },\n });\n\n if (response.success && response.data) {\n await this.setToken(response.data.token);\n await this.setUser(response.data.user);\n\n // 触发自定义事件通知登录成功\n if (typeof window !== 'undefined') {\n window.dispatchEvent(\n new CustomEvent('user_login_success', {\n detail: {\n userId: response.data.user.id,\n email: response.data.user.email,\n role: response.data.user.role,\n },\n })\n );\n }\n }\n\n return response;\n }\n\n /**\n * 用户退出登录\n */\n async logout(): Promise<void> {\n await this.sendRequest<void>({\n url: API_ROUTES.AUTH.LOGOUT,\n method: 'POST',\n });\n\n // 无论成功与否,都清除本地数据\n await this.clearUserData();\n }\n\n /**\n * 获取当前用户信息\n */\n async getCurrentUser(): Promise<ApiResponse<User>> {\n const response = await this.sendRequest<any>({\n url: API_ROUTES.AUTH.ME,\n method: 'GET',\n });\n\n // 统一处理响应格式\n if (response.success && response.data) {\n const userData = response.data.user || response.data;\n await this.setUser(userData);\n return {\n ...response,\n data: userData,\n };\n }\n\n return response;\n }\n\n // ==================== 通用方法 ====================\n\n /**\n * 发送 GET 请求\n */\n async get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'GET', params });\n }\n\n /**\n * 发送 POST 请求\n */\n async post<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'POST', body });\n }\n\n /**\n * 发送 PUT 请求\n */\n async put<T = any>(url: string, body?: any): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'PUT', body });\n }\n\n /**\n * 发送 DELETE 请求\n */\n async delete<T = any>(url: string): Promise<ApiResponse<T>> {\n return this.sendRequest({ url, method: 'DELETE' });\n }\n}\n\n","/**\n * React Native 平台存储适配器 (AsyncStorage)\n */\n\nimport type { StorageAdapter } from '../types';\n\n// 动态导入 AsyncStorage(避免在非 RN 环境报错)\nlet AsyncStorage: any = null;\n\ntry {\n AsyncStorage = require('@react-native-async-storage/async-storage').default;\n} catch (e) {\n // AsyncStorage 不可用(非 React Native 环境)\n // 这是正常的,不需要警告\n}\n\nexport class ReactNativeStorageAdapter implements StorageAdapter {\n private listeners: Map<string, Set<(key: string, value: string | null) => void>> = new Map();\n\n async getItem(key: string): Promise<string | null> {\n if (!AsyncStorage) return null;\n\n try {\n return await AsyncStorage.getItem(key);\n } catch (error) {\n console.error('[ReactNativeStorage] Error getting item \"' + (key) + '\":', error);\n return null;\n }\n }\n\n async setItem(key: string, value: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.setItem(key, value);\n this.notifyListeners(key, value);\n } catch (error) {\n console.error('[ReactNativeStorage] Error setting item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async removeItem(key: string): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.removeItem(key);\n this.notifyListeners(key, null);\n } catch (error) {\n console.error('[ReactNativeStorage] Error removing item \"' + (key) + '\":', error);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (!AsyncStorage) {\n throw new Error('AsyncStorage is not available');\n }\n\n try {\n await AsyncStorage.clear();\n } catch (error) {\n console.error('[ReactNativeStorage] Error clearing storage:', error);\n throw error;\n }\n }\n\n addChangeListener(callback: (key: string, value: string | null) => void): () => void {\n // React Native 没有原生的跨实例存储监听,我们使用内存中的监听器\n if (!this.listeners.has('*')) {\n this.listeners.set('*', new Set());\n }\n\n this.listeners.get('*')!.add(callback);\n\n // 返回清理函数\n return () => {\n this.listeners.get('*')?.delete(callback);\n };\n }\n\n private notifyListeners(key: string, value: string | null): void {\n const globalListeners = this.listeners.get('*');\n if (globalListeners) {\n globalListeners.forEach((callback) => callback(key, value));\n }\n }\n}\n\n","import type { RequestAdapter, RequestConfig } from '../types/types';\n\n/**\n * React Native 请求适配器(fetch,不携带 Cookie)\n * 与 WebRequestAdapter 的区别:RN 跨域场景下 credentials:include 无效且易误导\n */\nexport class ReactNativeRequestAdapter implements RequestAdapter {\n async request<T = unknown>(config: RequestConfig): Promise<T> {\n const { url, method = 'GET', headers = {}, body, params } = config;\n\n let fullUrl = url;\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const qs = searchParams.toString();\n if (qs) {\n fullUrl += url.includes('?') ? `&${qs}` : `?${qs}`;\n }\n }\n\n const response = await fetch(fullUrl, {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers,\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n\n const data = (await response.json()) as T & { error?: string };\n if (!response.ok) {\n return {\n success: false,\n error:\n (data as { error?: string }).error ??\n `请求失败 (${response.status})`,\n } as T;\n }\n return data;\n }\n}\n","import { BaseApiClient } from '../client/base-api-client';\nimport { ReactNativeStorageAdapter } from '../../../storage/adapters/react-native-adapter';\nimport { ReactNativeRequestAdapter } from '../../../request/adapters/react-native-adapter';\n\nlet cached: BaseApiClient | null = null;\nlet cachedBase = '';\n\n/** 创建 RN 用 BaseApiClient(AsyncStorage + fetch,无 Cookie) */\nexport function createRnAuthClient(authApiBase: string): BaseApiClient {\n const base = authApiBase.replace(/\\/+$/, '');\n if (cached && cachedBase === base) {\n return cached;\n }\n const client = new BaseApiClient(\n new ReactNativeStorageAdapter(),\n new ReactNativeRequestAdapter(),\n base,\n );\n cached = client;\n cachedBase = base;\n return client;\n}\n\nexport async function initRnAuthClient(authApiBase: string): Promise<BaseApiClient> {\n const client = createRnAuthClient(authApiBase);\n await client.init();\n return client;\n}\n\n/** 切换认证根地址时清空单例缓存 */\nexport function resetRnAuthClientCache(): void {\n cached = null;\n cachedBase = '';\n}\n","import type { User } from '../types';\n\n/**\n * 验证手机号格式\n */\nexport function validatePhoneNumber(phone: string): boolean {\n return /^1[3-9]\\d{9}$/.test(phone);\n}\n\n/**\n * 验证密码强度(可扩展)\n */\nexport function validatePassword(password: string): { valid: boolean; message?: string } {\n if (!password) {\n return { valid: false, message: '密码不能为空' };\n }\n \n if (password.length < 6) {\n return { valid: false, message: '密码长度至少6位' };\n }\n \n return { valid: true };\n}\n\n/**\n * 生成安全的会话令牌\n */\nexport function generateSessionToken(): string {\n // 在实际环境中,应该使用更安全的随机数生成\n return Math.random().toString(36).substring(2) + \n Date.now().toString(36) + \n Math.random().toString(36).substring(2);\n}\n\n/**\n * 检查用户是否为管理员\n */\nexport function isAdmin(user: User | null): boolean {\n return user?.role === 'admin';\n}\n\n/**\n * 检查用户是否处于活跃状态\n */\nexport function isActiveUser(user: User | null): boolean {\n return user?.isActive === true;\n}\n\n/**\n * 格式化用户显示名称\n */\nexport function getUserDisplayName(user: User): string {\n return user.name || user.phone || '未知用户';\n}\n\n/**\n * 计算会话过期时间\n */\nexport function calculateSessionExpiry(days: number = 30): Date {\n return new Date(Date.now() + days * 24 * 60 * 60 * 1000);\n}\n\n/**\n * 检查会话是否过期\n */\nexport function isSessionExpired(expiresAt: Date): boolean {\n return new Date() > new Date(expiresAt);\n} ","import { validatePhoneNumber } from '../utils/authUtils';\nimport { ReactNativeRequestAdapter } from '../../../request/adapters/react-native-adapter';\n\nexport type LegacyPhoneLoginResult = {\n success: boolean;\n token?: string;\n message?: string;\n};\n\ntype LegacyLoginBody = {\n success?: boolean;\n message?: string;\n sessionToken?: string;\n data?: { sessionToken?: string };\n};\n\n/** profile-v1 等 legacy:POST {authApiBase}/auth/login { phone, password } */\nexport async function loginWithLegacyPhone(\n authApiBase: string,\n phone: string,\n password: string,\n): Promise<LegacyPhoneLoginResult> {\n const trimmedPhone = phone.trim();\n if (!trimmedPhone || !password) {\n return { success: false, message: '请填写手机号和密码' };\n }\n if (!validatePhoneNumber(trimmedPhone)) {\n return { success: false, message: '请输入正确的手机号' };\n }\n\n const base = authApiBase.replace(/\\/+$/, '');\n const adapter = new ReactNativeRequestAdapter();\n const data = await adapter.request<LegacyLoginBody>({\n url: `${base}/auth/login`,\n method: 'POST',\n body: { phone: trimmedPhone, password },\n });\n\n if (!data.success) {\n return {\n success: false,\n message: data.message ?? '登录失败',\n };\n }\n\n const token = data.sessionToken ?? data.data?.sessionToken;\n if (!token || token.length < 8) {\n return { success: false, message: '登录成功但未返回有效会话令牌' };\n }\n\n return { success: true, token };\n}\n\nexport function isPhoneAccount(account: string): boolean {\n return validatePhoneNumber(account.trim());\n}\n","'use client';\n\nimport { useState, useEffect, useCallback } from 'react';\nimport type { User, IAuthClient as BaseApiClient, AuthResult, UseAuthReturn } from '../types';\n\nexport type { User, BaseApiClient, AuthResult, UseAuthReturn };\n\nexport function useAuth(apiClient: BaseApiClient): UseAuthReturn {\n const [user, setUser] = useState<User | null>(null);\n const [isLoggedIn, setIsLoggedIn] = useState(false);\n const [loading, setLoading] = useState(false);\n const [checkingAuth, setCheckingAuth] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n /**\n * 检查认证状态\n */\n const checkAuthStatus = useCallback(async () => {\n try {\n setCheckingAuth(true);\n setError(null);\n\n const isAuth = await apiClient.isAuthenticated();\n\n if (isAuth) {\n // 验证 token 并获取用户信息\n const response = await apiClient.getCurrentUser();\n\n if (response.success && response.data) {\n setUser(response.data);\n setIsLoggedIn(true);\n } else {\n // Token 无效,清除登录状态\n await apiClient.clearUserData();\n setUser(null);\n setIsLoggedIn(false);\n }\n } else {\n setUser(null);\n setIsLoggedIn(false);\n }\n } catch (err) {\n console.error('检查登录状态失败:', err);\n setError(err instanceof Error ? err.message : '检查登录状态失败');\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setCheckingAuth(false);\n }\n }, [apiClient]);\n\n /**\n * 用户登录\n */\n const login = useCallback(\n async (email: string, password: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.login(email, password);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '登录失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '登录失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户注册\n */\n const register = useCallback(\n async (email: string, password: string, username: string): Promise<AuthResult> => {\n setLoading(true);\n setError(null);\n\n try {\n const response = await apiClient.register(email, password, username);\n\n if (response.success && response.data) {\n setUser(response.data.user);\n setIsLoggedIn(true);\n return { success: true };\n } else {\n const errorMsg = response.error || '注册失败';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : '注册失败,请重试';\n setError(errorMsg);\n return { success: false, error: errorMsg };\n } finally {\n setLoading(false);\n }\n },\n [apiClient]\n );\n\n /**\n * 用户登出\n */\n const logout = useCallback(async () => {\n setLoading(true);\n setError(null);\n\n try {\n await apiClient.logout();\n setUser(null);\n setIsLoggedIn(false);\n } catch (err) {\n console.error('登出失败:', err);\n setError(err instanceof Error ? err.message : '登出失败');\n // 即使登出失败,也清除本地状态\n setUser(null);\n setIsLoggedIn(false);\n } finally {\n setLoading(false);\n }\n }, [apiClient]);\n\n /**\n * 清除错误信息\n */\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n // 组件挂载时检查认证状态\n useEffect(() => {\n checkAuthStatus();\n }, [checkAuthStatus]);\n\n return {\n // 状态\n user,\n isLoggedIn,\n loading,\n checkingAuth,\n error,\n\n // 操作方法\n login,\n register,\n logout,\n refresh: checkAuthStatus,\n clearError,\n };\n}\n\n/**\n * 表单验证 Hook\n *\n * @example\n * ```typescript\n * const { values, errors, handleChange, handleBlur, validate } = useAuthForm({\n * email: '',\n * password: ''\n * })\n * ```\n */\nexport function useAuthForm<T extends Record<string, any>>(initialValues: T) {\n const [values, setValues] = useState<T>(initialValues);\n const [errors, setErrors] = useState<Partial<Record<keyof T, string>>>({});\n const [touched, setTouched] = useState<Partial<Record<keyof T, boolean>>>({});\n\n const handleChange = useCallback(\n (field: keyof T, value: any) => {\n setValues((prev: T) => ({ ...prev, [field]: value }));\n // 清除该字段的错误\n if (errors[field]) {\n setErrors((prev: Partial<Record<keyof T, string>>) => {\n const newErrors = { ...prev };\n delete newErrors[field];\n return newErrors;\n });\n }\n },\n [errors]\n );\n\n const handleBlur = useCallback((field: keyof T) => {\n setTouched((prev: Partial<Record<keyof T, boolean>>) => ({ ...prev, [field]: true }));\n }, []);\n\n const validate = useCallback(\n (validationRules: Partial<Record<keyof T, (value: any) => string | undefined>>) => {\n const newErrors: Partial<Record<keyof T, string>> = {};\n\n Object.keys(validationRules).forEach((key) => {\n const field = key as keyof T;\n const rule = validationRules[field];\n if (rule) {\n const error = rule(values[field]);\n if (error) {\n newErrors[field] = error;\n }\n }\n });\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n },\n [values]\n );\n\n const reset = useCallback(() => {\n setValues(initialValues);\n setErrors({});\n setTouched({});\n }, [initialValues]);\n\n return {\n values,\n errors,\n touched,\n handleChange,\n handleBlur,\n validate,\n reset,\n setValues,\n setErrors,\n };\n}\n\n","/**\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 * RN 账密登录表单:手机号 → legacy /auth/login;邮箱 → sa2kit LoginForm + BaseApiClient\n */\nimport React, { useCallback, useEffect, useState } from 'react';\nimport { LoginForm } from '../../../../common/auth/components/LoginForm';\nimport { initRnAuthClient, resetRnAuthClientCache } from '../../../../common/auth/rn/client';\nimport { isPhoneAccount, loginWithLegacyPhone } from '../legacy-login';\nimport type { RnAccountLoginFormProps } from '../types';\n\n// @ts-expect-error react-native 由宿主在运行时提供\nconst ReactNative = require('react-native') as typeof import('react-native');\nconst { ActivityIndicator, Pressable, Text, TextInput, View, StyleSheet } = ReactNative;\n\nconst defaultStyles = StyleSheet.create({\n label: { fontSize: 12, color: '#8b98a5', marginBottom: 6, marginTop: 12 },\n input: {\n borderWidth: 1,\n borderColor: 'rgba(255,255,255,0.12)',\n borderRadius: 10,\n paddingHorizontal: 12,\n paddingVertical: 10,\n color: '#e8edf2',\n backgroundColor: 'rgba(0,0,0,0.2)',\n fontSize: 15,\n },\n err: { color: '#f87171', marginTop: 10, fontSize: 14 },\n btn: {\n marginTop: 14,\n paddingVertical: 12,\n borderRadius: 10,\n alignItems: 'center',\n borderWidth: 1,\n borderColor: 'rgba(255,255,255,0.12)',\n backgroundColor: 'rgba(255,255,255,0.08)',\n },\n primary: { backgroundColor: '#3d9eff', borderColor: 'transparent' },\n disabled: { opacity: 0.6 },\n btnTextPrimary: { color: '#fff', fontSize: 15, fontWeight: '600' },\n centerInline: { paddingVertical: 24, alignItems: 'center' },\n});\n\nconst DEFAULT_LABELS = {\n authApiBase: '认证 API 根地址(含 /api)',\n phone: '手机号',\n email: '邮箱',\n password: '密码',\n submit: '登录',\n} as const;\n\nexport function RnAccountLoginForm({\n authApiBase,\n defaultAuthApiBase = '',\n onAuthApiBaseChange,\n submitting = false,\n error = '',\n onError,\n onSuccess,\n theme,\n labels: labelsProp,\n placeholders,\n}: RnAccountLoginFormProps) {\n const labels = { ...DEFAULT_LABELS, ...labelsProp };\n const [apiClient, setApiClient] = useState<\n Awaited<ReturnType<typeof initRnAuthClient>> | null\n >(null);\n const [account, setAccount] = useState('');\n const [password, setPassword] = useState('');\n const [useLegacyPhone, setUseLegacyPhone] = useState(true);\n\n useEffect(() => {\n let cancelled = false;\n const base = authApiBase.trim() || defaultAuthApiBase;\n if (!base) {\n setApiClient(null);\n return;\n }\n resetRnAuthClientCache();\n initRnAuthClient(base).then(c => {\n if (!cancelled) {\n setApiClient(c);\n }\n });\n return () => {\n cancelled = true;\n };\n }, [authApiBase, defaultAuthApiBase]);\n\n useEffect(() => {\n const trimmed = account.trim();\n if (!trimmed) {\n setUseLegacyPhone(true);\n return;\n }\n setUseLegacyPhone(isPhoneAccount(trimmed));\n }, [account]);\n\n const handleLegacySubmit = useCallback(async () => {\n const base = authApiBase.trim() || defaultAuthApiBase;\n onError?.('');\n const result = await loginWithLegacyPhone(base, account, password);\n if (!result.success || !result.token) {\n onError?.(result.message ?? '登录失败');\n return;\n }\n await onSuccess(result.token);\n }, [account, authApiBase, defaultAuthApiBase, onError, onSuccess, password]);\n\n const authApiField = onAuthApiBaseChange ? (\n <>\n <Text style={[defaultStyles.label, theme?.label]}>{labels.authApiBase}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={authApiBase}\n onChangeText={onAuthApiBaseChange}\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.authApiBase ?? defaultAuthApiBase}\n placeholderTextColor=\"#6b7a8a\"\n />\n </>\n ) : null;\n\n if (!apiClient) {\n return (\n <View style={[defaultStyles.centerInline, theme?.loadingContainer]}>\n <ActivityIndicator />\n </View>\n );\n }\n\n if (useLegacyPhone) {\n return (\n <>\n {authApiField}\n <Text style={[defaultStyles.label, theme?.label]}>{labels.phone}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={account}\n onChangeText={setAccount}\n keyboardType=\"phone-pad\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.phone ?? '13800138000'}\n placeholderTextColor=\"#6b7a8a\"\n />\n <Text style={[defaultStyles.label, theme?.label]}>{labels.password}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={password}\n onChangeText={setPassword}\n secureTextEntry\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.password ?? '密码'}\n placeholderTextColor=\"#6b7a8a\"\n />\n {error ? <Text style={[defaultStyles.err, theme?.error]}>{error}</Text> : null}\n <Pressable\n style={[\n defaultStyles.btn,\n defaultStyles.primary,\n theme?.button,\n theme?.buttonPrimary,\n submitting && (theme?.buttonDisabled ?? defaultStyles.disabled),\n ]}\n onPress={handleLegacySubmit}\n disabled={submitting}>\n {submitting ? (\n <ActivityIndicator color=\"#fff\" />\n ) : (\n <Text style={[defaultStyles.btnTextPrimary, theme?.buttonTextPrimary]}>\n {labels.submit}\n </Text>\n )}\n </Pressable>\n </>\n );\n }\n\n return (\n <>\n {authApiField}\n <LoginForm\n apiClient={apiClient}\n onSuccess={() => {\n const tok = apiClient.getToken();\n if (tok) {\n void onSuccess(tok);\n } else {\n onError?.('登录成功但未获取到令牌');\n }\n }}\n onError={msg => onError?.(msg)}>\n {({\n email,\n password: pwd,\n loading,\n error: formErr,\n handleEmailChange,\n handlePasswordChange,\n handleSubmit,\n }) => (\n <>\n <Text style={[defaultStyles.label, theme?.label]}>{labels.email}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={email}\n onChangeText={handleEmailChange}\n keyboardType=\"email-address\"\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.email ?? 'user@example.com'}\n placeholderTextColor=\"#6b7a8a\"\n />\n <Text style={[defaultStyles.label, theme?.label]}>{labels.password}</Text>\n <TextInput\n style={[defaultStyles.input, theme?.input, theme?.inputContainer]}\n value={pwd}\n onChangeText={handlePasswordChange}\n secureTextEntry\n autoCapitalize=\"none\"\n autoCorrect={false}\n placeholder={placeholders?.password ?? '密码'}\n placeholderTextColor=\"#6b7a8a\"\n />\n {(formErr || error) ? (\n <Text style={[defaultStyles.err, theme?.error]}>{formErr ?? error}</Text>\n ) : null}\n <Pressable\n style={[\n defaultStyles.btn,\n defaultStyles.primary,\n theme?.button,\n theme?.buttonPrimary,\n (loading || submitting) &&\n (theme?.buttonDisabled ?? defaultStyles.disabled),\n ]}\n onPress={() => handleSubmit()}\n disabled={loading || submitting}>\n {loading || submitting ? (\n <ActivityIndicator color=\"#fff\" />\n ) : (\n <Text style={[defaultStyles.btnTextPrimary, theme?.buttonTextPrimary]}>\n {labels.submit}\n </Text>\n )}\n </Pressable>\n </>\n )}\n </LoginForm>\n </>\n );\n}\n"]}
@@ -0,0 +1,277 @@
1
+ /**
2
+ * 请求配置接口
3
+ */
4
+ interface RequestConfig {
5
+ /** 请求 URL */
6
+ url: string;
7
+ /** HTTP 方法 */
8
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
9
+ /** 请求头 */
10
+ headers?: Record<string, string>;
11
+ /** 请求体 */
12
+ body?: any;
13
+ /** 查询参数 */
14
+ params?: Record<string, any>;
15
+ }
16
+ /**
17
+ * 请求适配器接口
18
+ * 用于抽象不同平台的网络请求实现
19
+ * - Mobile/Desktop: fetch API
20
+ * - Miniapp: Taro.request
21
+ */
22
+ interface RequestAdapter {
23
+ /**
24
+ * 发送 HTTP 请求
25
+ * @param config 请求配置
26
+ * @returns 响应数据
27
+ */
28
+ request<T = any>(config: RequestConfig): Promise<T>;
29
+ }
30
+
31
+ /**
32
+ * 存储适配器类型定义
33
+ */
34
+ /**
35
+ * 存储适配器接口
36
+ * 用于抽象不同平台的本地存储实现
37
+ */
38
+ interface StorageAdapter {
39
+ /**
40
+ * 获取存储的值
41
+ * @param key 存储键
42
+ * @returns 存储的值,不存在则返回 null
43
+ */
44
+ getItem(key: string): Promise<string | null>;
45
+ /**
46
+ * 设置存储的值
47
+ * @param key 存储键
48
+ * @param value 要存储的值
49
+ */
50
+ setItem(key: string, value: string): Promise<void>;
51
+ /**
52
+ * 删除存储的值
53
+ * @param key 存储键
54
+ */
55
+ removeItem(key: string): Promise<void>;
56
+ /**
57
+ * 清空所有存储(可选)
58
+ */
59
+ clear?(): Promise<void>;
60
+ /**
61
+ * 监听存储变化(可选,部分平台支持)
62
+ */
63
+ addChangeListener?(callback: (key: string, value: string | null) => void): () => void;
64
+ /**
65
+ * 移除存储变化监听器(可选)
66
+ */
67
+ removeChangeListener?(callback: (key: string, value: string | null) => void): void;
68
+ }
69
+ /**
70
+ * 存储事件
71
+ */
72
+ interface StorageChangeEvent {
73
+ key: string;
74
+ value: any;
75
+ oldValue?: any;
76
+ }
77
+
78
+ /**
79
+ * 类型定义
80
+ */
81
+ type UserRole = 'USER' | 'ADMIN' | 'SUPER_ADMIN';
82
+
83
+ /**
84
+ * Auth 模块类型定义
85
+ * Auth Module Types
86
+ */
87
+
88
+ /**
89
+ * 用户基础信息(核心字段)
90
+ * Base User Information
91
+ */
92
+ interface BaseUser {
93
+ id: string;
94
+ email: string;
95
+ username: string;
96
+ role: UserRole;
97
+ }
98
+ /**
99
+ * 扩展用户信息(可选字段)
100
+ * Extended User Information
101
+ */
102
+ interface User extends BaseUser {
103
+ nickname?: string;
104
+ avatar?: string;
105
+ createdAt?: string;
106
+ updatedAt?: string;
107
+ [key: string]: any;
108
+ }
109
+ /**
110
+ * 登录表单数据
111
+ * Login Form Data
112
+ */
113
+ interface LoginForm {
114
+ email: string;
115
+ password: string;
116
+ rememberMe?: boolean;
117
+ }
118
+ /**
119
+ * 注册表单数据
120
+ * Register Form Data
121
+ */
122
+ interface RegisterForm {
123
+ email: string;
124
+ username: string;
125
+ password: string;
126
+ confirmPassword?: string;
127
+ nickname?: string;
128
+ }
129
+ /**
130
+ * API 响应类型
131
+ */
132
+ interface ApiResponse<T = any> {
133
+ success: boolean;
134
+ data?: T;
135
+ error?: string;
136
+ message?: string;
137
+ }
138
+ /**
139
+ * 认证响应类型
140
+ */
141
+ interface AuthResponse {
142
+ user: User;
143
+ token: string;
144
+ }
145
+ /**
146
+ * API 客户端基础接口
147
+ */
148
+ interface IAuthClient {
149
+ isAuthenticated(): Promise<boolean>;
150
+ getCurrentUser(): Promise<ApiResponse<User>>;
151
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
152
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
153
+ logout(): Promise<void>;
154
+ clearUserData(): Promise<void>;
155
+ }
156
+ /**
157
+ * 认证操作结果接口
158
+ */
159
+ interface AuthResult {
160
+ success: boolean;
161
+ error?: string;
162
+ }
163
+ /**
164
+ * useAuth Hook 返回值接口
165
+ */
166
+ interface UseAuthReturn {
167
+ user: User | null;
168
+ isLoggedIn: boolean;
169
+ loading: boolean;
170
+ checkingAuth: boolean;
171
+ error: string | null;
172
+ login: (email: string, password: string) => Promise<AuthResult>;
173
+ register: (email: string, password: string, username: string) => Promise<AuthResult>;
174
+ logout: () => Promise<void>;
175
+ refresh: () => Promise<void>;
176
+ clearError: () => void;
177
+ }
178
+
179
+ /**
180
+ * Auth Client - Base API Client
181
+ * 基础 API 客户端
182
+ */
183
+
184
+ /**
185
+ * 基础 API 客户端
186
+ * 提供统一的 API 调用逻辑,通过适配器模式支持多平台
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
191
+ * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
192
+ * import { WebRequestAdapter } from '@qhr123/sa2kit/request';
193
+ *
194
+ * const apiClient = new BaseApiClient(
195
+ * new WebStorageAdapter(),
196
+ * new WebRequestAdapter(),
197
+ * '/api'
198
+ * );
199
+ *
200
+ * await apiClient.init();
201
+ * const result = await apiClient.login('user@example.com', 'password');
202
+ * ```
203
+ */
204
+ declare class BaseApiClient implements IAuthClient {
205
+ private storage;
206
+ private request;
207
+ private baseUrl;
208
+ private token;
209
+ private user;
210
+ constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
211
+ /**
212
+ * 初始化 - 从存储中加载 token 和用户信息
213
+ */
214
+ init(): Promise<void>;
215
+ /**
216
+ * 设置认证 token
217
+ */
218
+ setToken(token: string | null): Promise<void>;
219
+ /**
220
+ * 设置用户信息
221
+ */
222
+ setUser(user: User | null): Promise<void>;
223
+ /**
224
+ * 获取当前 token
225
+ */
226
+ getToken(): string | null;
227
+ /**
228
+ * 获取当前用户
229
+ */
230
+ getUser(): User | null;
231
+ /**
232
+ * 检查是否已登录
233
+ */
234
+ isAuthenticated(): Promise<boolean>;
235
+ /**
236
+ * 清除用户数据
237
+ */
238
+ clearUserData(): Promise<void>;
239
+ /**
240
+ * 发送请求的通用方法
241
+ */
242
+ private sendRequest;
243
+ /**
244
+ * 用户注册
245
+ */
246
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
247
+ /**
248
+ * 用户登录
249
+ */
250
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
251
+ /**
252
+ * 用户退出登录
253
+ */
254
+ logout(): Promise<void>;
255
+ /**
256
+ * 获取当前用户信息
257
+ */
258
+ getCurrentUser(): Promise<ApiResponse<User>>;
259
+ /**
260
+ * 发送 GET 请求
261
+ */
262
+ get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
263
+ /**
264
+ * 发送 POST 请求
265
+ */
266
+ post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
267
+ /**
268
+ * 发送 PUT 请求
269
+ */
270
+ put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
271
+ /**
272
+ * 发送 DELETE 请求
273
+ */
274
+ delete<T = any>(url: string): Promise<ApiResponse<T>>;
275
+ }
276
+
277
+ export { type ApiResponse as A, BaseApiClient as B, type IAuthClient as I, type LoginForm as L, type RequestAdapter as R, type StorageAdapter as S, type UseAuthReturn as U, type RequestConfig as a, type StorageChangeEvent as b, type AuthResponse as c, type AuthResult as d, type BaseUser as e, type RegisterForm as f, type User as g, type UserRole as h };
@@ -0,0 +1,277 @@
1
+ /**
2
+ * 请求配置接口
3
+ */
4
+ interface RequestConfig {
5
+ /** 请求 URL */
6
+ url: string;
7
+ /** HTTP 方法 */
8
+ method?: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH';
9
+ /** 请求头 */
10
+ headers?: Record<string, string>;
11
+ /** 请求体 */
12
+ body?: any;
13
+ /** 查询参数 */
14
+ params?: Record<string, any>;
15
+ }
16
+ /**
17
+ * 请求适配器接口
18
+ * 用于抽象不同平台的网络请求实现
19
+ * - Mobile/Desktop: fetch API
20
+ * - Miniapp: Taro.request
21
+ */
22
+ interface RequestAdapter {
23
+ /**
24
+ * 发送 HTTP 请求
25
+ * @param config 请求配置
26
+ * @returns 响应数据
27
+ */
28
+ request<T = any>(config: RequestConfig): Promise<T>;
29
+ }
30
+
31
+ /**
32
+ * 存储适配器类型定义
33
+ */
34
+ /**
35
+ * 存储适配器接口
36
+ * 用于抽象不同平台的本地存储实现
37
+ */
38
+ interface StorageAdapter {
39
+ /**
40
+ * 获取存储的值
41
+ * @param key 存储键
42
+ * @returns 存储的值,不存在则返回 null
43
+ */
44
+ getItem(key: string): Promise<string | null>;
45
+ /**
46
+ * 设置存储的值
47
+ * @param key 存储键
48
+ * @param value 要存储的值
49
+ */
50
+ setItem(key: string, value: string): Promise<void>;
51
+ /**
52
+ * 删除存储的值
53
+ * @param key 存储键
54
+ */
55
+ removeItem(key: string): Promise<void>;
56
+ /**
57
+ * 清空所有存储(可选)
58
+ */
59
+ clear?(): Promise<void>;
60
+ /**
61
+ * 监听存储变化(可选,部分平台支持)
62
+ */
63
+ addChangeListener?(callback: (key: string, value: string | null) => void): () => void;
64
+ /**
65
+ * 移除存储变化监听器(可选)
66
+ */
67
+ removeChangeListener?(callback: (key: string, value: string | null) => void): void;
68
+ }
69
+ /**
70
+ * 存储事件
71
+ */
72
+ interface StorageChangeEvent {
73
+ key: string;
74
+ value: any;
75
+ oldValue?: any;
76
+ }
77
+
78
+ /**
79
+ * 类型定义
80
+ */
81
+ type UserRole = 'USER' | 'ADMIN' | 'SUPER_ADMIN';
82
+
83
+ /**
84
+ * Auth 模块类型定义
85
+ * Auth Module Types
86
+ */
87
+
88
+ /**
89
+ * 用户基础信息(核心字段)
90
+ * Base User Information
91
+ */
92
+ interface BaseUser {
93
+ id: string;
94
+ email: string;
95
+ username: string;
96
+ role: UserRole;
97
+ }
98
+ /**
99
+ * 扩展用户信息(可选字段)
100
+ * Extended User Information
101
+ */
102
+ interface User extends BaseUser {
103
+ nickname?: string;
104
+ avatar?: string;
105
+ createdAt?: string;
106
+ updatedAt?: string;
107
+ [key: string]: any;
108
+ }
109
+ /**
110
+ * 登录表单数据
111
+ * Login Form Data
112
+ */
113
+ interface LoginForm {
114
+ email: string;
115
+ password: string;
116
+ rememberMe?: boolean;
117
+ }
118
+ /**
119
+ * 注册表单数据
120
+ * Register Form Data
121
+ */
122
+ interface RegisterForm {
123
+ email: string;
124
+ username: string;
125
+ password: string;
126
+ confirmPassword?: string;
127
+ nickname?: string;
128
+ }
129
+ /**
130
+ * API 响应类型
131
+ */
132
+ interface ApiResponse<T = any> {
133
+ success: boolean;
134
+ data?: T;
135
+ error?: string;
136
+ message?: string;
137
+ }
138
+ /**
139
+ * 认证响应类型
140
+ */
141
+ interface AuthResponse {
142
+ user: User;
143
+ token: string;
144
+ }
145
+ /**
146
+ * API 客户端基础接口
147
+ */
148
+ interface IAuthClient {
149
+ isAuthenticated(): Promise<boolean>;
150
+ getCurrentUser(): Promise<ApiResponse<User>>;
151
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
152
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
153
+ logout(): Promise<void>;
154
+ clearUserData(): Promise<void>;
155
+ }
156
+ /**
157
+ * 认证操作结果接口
158
+ */
159
+ interface AuthResult {
160
+ success: boolean;
161
+ error?: string;
162
+ }
163
+ /**
164
+ * useAuth Hook 返回值接口
165
+ */
166
+ interface UseAuthReturn {
167
+ user: User | null;
168
+ isLoggedIn: boolean;
169
+ loading: boolean;
170
+ checkingAuth: boolean;
171
+ error: string | null;
172
+ login: (email: string, password: string) => Promise<AuthResult>;
173
+ register: (email: string, password: string, username: string) => Promise<AuthResult>;
174
+ logout: () => Promise<void>;
175
+ refresh: () => Promise<void>;
176
+ clearError: () => void;
177
+ }
178
+
179
+ /**
180
+ * Auth Client - Base API Client
181
+ * 基础 API 客户端
182
+ */
183
+
184
+ /**
185
+ * 基础 API 客户端
186
+ * 提供统一的 API 调用逻辑,通过适配器模式支持多平台
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * import { BaseApiClient } from '@qhr123/sa2kit/auth/client';
191
+ * import { WebStorageAdapter } from '@qhr123/sa2kit/storage';
192
+ * import { WebRequestAdapter } from '@qhr123/sa2kit/request';
193
+ *
194
+ * const apiClient = new BaseApiClient(
195
+ * new WebStorageAdapter(),
196
+ * new WebRequestAdapter(),
197
+ * '/api'
198
+ * );
199
+ *
200
+ * await apiClient.init();
201
+ * const result = await apiClient.login('user@example.com', 'password');
202
+ * ```
203
+ */
204
+ declare class BaseApiClient implements IAuthClient {
205
+ private storage;
206
+ private request;
207
+ private baseUrl;
208
+ private token;
209
+ private user;
210
+ constructor(storage: StorageAdapter, request: RequestAdapter, baseUrl: string);
211
+ /**
212
+ * 初始化 - 从存储中加载 token 和用户信息
213
+ */
214
+ init(): Promise<void>;
215
+ /**
216
+ * 设置认证 token
217
+ */
218
+ setToken(token: string | null): Promise<void>;
219
+ /**
220
+ * 设置用户信息
221
+ */
222
+ setUser(user: User | null): Promise<void>;
223
+ /**
224
+ * 获取当前 token
225
+ */
226
+ getToken(): string | null;
227
+ /**
228
+ * 获取当前用户
229
+ */
230
+ getUser(): User | null;
231
+ /**
232
+ * 检查是否已登录
233
+ */
234
+ isAuthenticated(): Promise<boolean>;
235
+ /**
236
+ * 清除用户数据
237
+ */
238
+ clearUserData(): Promise<void>;
239
+ /**
240
+ * 发送请求的通用方法
241
+ */
242
+ private sendRequest;
243
+ /**
244
+ * 用户注册
245
+ */
246
+ register(email: string, password: string, username: string): Promise<ApiResponse<AuthResponse>>;
247
+ /**
248
+ * 用户登录
249
+ */
250
+ login(email: string, password: string): Promise<ApiResponse<AuthResponse>>;
251
+ /**
252
+ * 用户退出登录
253
+ */
254
+ logout(): Promise<void>;
255
+ /**
256
+ * 获取当前用户信息
257
+ */
258
+ getCurrentUser(): Promise<ApiResponse<User>>;
259
+ /**
260
+ * 发送 GET 请求
261
+ */
262
+ get<T = any>(url: string, params?: Record<string, any>): Promise<ApiResponse<T>>;
263
+ /**
264
+ * 发送 POST 请求
265
+ */
266
+ post<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
267
+ /**
268
+ * 发送 PUT 请求
269
+ */
270
+ put<T = any>(url: string, body?: any): Promise<ApiResponse<T>>;
271
+ /**
272
+ * 发送 DELETE 请求
273
+ */
274
+ delete<T = any>(url: string): Promise<ApiResponse<T>>;
275
+ }
276
+
277
+ export { type ApiResponse as A, BaseApiClient as B, type IAuthClient as I, type LoginForm as L, type RequestAdapter as R, type StorageAdapter as S, type UseAuthReturn as U, type RequestConfig as a, type StorageChangeEvent as b, type AuthResponse as c, type AuthResult as d, type BaseUser as e, type RegisterForm as f, type User as g, type UserRole as h };