sa2kit 2.0.3 → 3.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.
Files changed (348) hide show
  1. package/README.md +1 -1
  2. package/dist/{UniversalFileService-GsP6D3Rc.d.ts → UniversalFileService-CC4d3wkc.d.ts} +2 -2
  3. package/dist/{UniversalFileService-BpvbZitV.d.mts → UniversalFileService-CzAE_G4V.d.mts} +2 -2
  4. package/dist/auth/client/index.d.mts +8 -27
  5. package/dist/auth/client/index.d.ts +8 -27
  6. package/dist/auth/client/index.js +9 -4
  7. package/dist/auth/client/index.mjs +2 -1
  8. package/dist/auth/components/index.d.mts +8 -225
  9. package/dist/auth/components/index.d.ts +8 -225
  10. package/dist/auth/components/index.js +62 -319
  11. package/dist/auth/components/index.js.map +1 -1
  12. package/dist/auth/components/index.mjs +6 -316
  13. package/dist/auth/components/index.mjs.map +1 -1
  14. package/dist/auth/hooks/index.d.mts +11 -29
  15. package/dist/auth/hooks/index.d.ts +11 -29
  16. package/dist/auth/hooks/index.js +14 -3
  17. package/dist/auth/hooks/index.mjs +4 -1
  18. package/dist/auth/index.d.mts +17 -14
  19. package/dist/auth/index.d.ts +17 -14
  20. package/dist/auth/index.js +51 -90
  21. package/dist/auth/index.mjs +8 -7
  22. package/dist/auth/rn/index.d.mts +3087 -18
  23. package/dist/auth/rn/index.d.ts +3087 -18
  24. package/dist/auth/rn/index.js +396 -477
  25. package/dist/auth/rn/index.js.map +1 -1
  26. package/dist/auth/rn/index.mjs +384 -475
  27. package/dist/auth/rn/index.mjs.map +1 -1
  28. package/dist/auth/schema/index.d.mts +3 -788
  29. package/dist/auth/schema/index.d.ts +3 -788
  30. package/dist/auth/schema/index.js +17 -9
  31. package/dist/auth/schema/index.mjs +1 -1
  32. package/dist/auth/services/index.d.mts +1 -48
  33. package/dist/auth/services/index.d.ts +1 -48
  34. package/dist/auth/services/index.js +3 -20
  35. package/dist/auth/services/index.mjs +1 -2
  36. package/dist/{base-api-client-B3wZZoaH.d.ts → base-api-client-BpmcQt4Q.d.ts} +1 -1
  37. package/dist/{base-api-client-ACKKt13v.d.mts → base-api-client-CFIhZK4C.d.mts} +1 -1
  38. package/dist/{base-api-client-ACKKt13v.d.ts → base-api-client-CFIhZK4C.d.ts} +1 -1
  39. package/dist/{base-api-client-DrL35Ea2.d.mts → base-api-client-DXLsq2yz.d.mts} +1 -1
  40. package/dist/business/index.d.mts +1 -5
  41. package/dist/business/index.d.ts +1 -5
  42. package/dist/business/index.js +34 -1135
  43. package/dist/business/index.js.map +1 -1
  44. package/dist/business/index.mjs +5 -1105
  45. package/dist/business/index.mjs.map +1 -1
  46. package/dist/calendar/routes/index.d.mts +74 -1
  47. package/dist/calendar/routes/index.d.ts +74 -1
  48. package/dist/calendar/routes/index.js +186 -97
  49. package/dist/calendar/routes/index.js.map +1 -1
  50. package/dist/calendar/routes/index.mjs +178 -99
  51. package/dist/calendar/routes/index.mjs.map +1 -1
  52. package/dist/{chunk-IIVNHQEI.mjs → chunk-5GBDDXYL.mjs} +4 -3
  53. package/dist/chunk-5GBDDXYL.mjs.map +1 -0
  54. package/dist/chunk-7E3J7VAD.mjs +3 -0
  55. package/dist/chunk-7E3J7VAD.mjs.map +1 -0
  56. package/dist/chunk-B3CZ3HXJ.mjs +126 -0
  57. package/dist/chunk-B3CZ3HXJ.mjs.map +1 -0
  58. package/dist/chunk-CAYOQDBR.js +78 -0
  59. package/dist/chunk-CAYOQDBR.js.map +1 -0
  60. package/dist/{chunk-PTMSDNGO.mjs → chunk-CX2GHCAI.mjs} +4 -75
  61. package/dist/chunk-CX2GHCAI.mjs.map +1 -0
  62. package/dist/chunk-EBHPTFG6.mjs +82 -0
  63. package/dist/chunk-EBHPTFG6.mjs.map +1 -0
  64. package/dist/chunk-FOQEQWX5.js +4 -0
  65. package/dist/chunk-FOQEQWX5.js.map +1 -0
  66. package/dist/{chunk-YGI7UU2D.mjs → chunk-G4NFB2QA.mjs} +2 -2
  67. package/dist/chunk-G4NFB2QA.mjs.map +1 -0
  68. package/dist/chunk-G5HJGXGC.mjs +39 -0
  69. package/dist/chunk-G5HJGXGC.mjs.map +1 -0
  70. package/dist/{chunk-GSNGCENJ.js → chunk-GQZHGSRR.js} +2 -39
  71. package/dist/chunk-GQZHGSRR.js.map +1 -0
  72. package/dist/chunk-GS7XLKET.js +41 -0
  73. package/dist/chunk-GS7XLKET.js.map +1 -0
  74. package/dist/{chunk-7B5SI4OF.mjs → chunk-IBWDBBX5.mjs} +4 -3
  75. package/dist/chunk-IBWDBBX5.mjs.map +1 -0
  76. package/dist/chunk-IS7O4LPI.js +146 -0
  77. package/dist/chunk-IS7O4LPI.js.map +1 -0
  78. package/dist/chunk-LGHUCQIU.js +93 -0
  79. package/dist/chunk-LGHUCQIU.js.map +1 -0
  80. package/dist/chunk-LHJKLUM7.mjs +18 -0
  81. package/dist/chunk-LHJKLUM7.mjs.map +1 -0
  82. package/dist/chunk-LKBIVQBT.mjs +34 -0
  83. package/dist/chunk-LKBIVQBT.mjs.map +1 -0
  84. package/dist/chunk-MIDXG6LS.js +32 -0
  85. package/dist/chunk-MIDXG6LS.js.map +1 -0
  86. package/dist/chunk-MWSAH7ZG.mjs +42 -0
  87. package/dist/chunk-MWSAH7ZG.mjs.map +1 -0
  88. package/dist/{chunk-HCI6JQOU.mjs → chunk-MZOGYD4N.mjs} +7 -4
  89. package/dist/chunk-MZOGYD4N.mjs.map +1 -0
  90. package/dist/chunk-NDGHXVGS.js +25 -0
  91. package/dist/chunk-NDGHXVGS.js.map +1 -0
  92. package/dist/chunk-Q5VFBPMG.mjs +76 -0
  93. package/dist/chunk-Q5VFBPMG.mjs.map +1 -0
  94. package/dist/chunk-QDUBO567.js +1148 -0
  95. package/dist/chunk-QDUBO567.js.map +1 -0
  96. package/dist/{chunk-3CSCIRQY.js → chunk-QP5N3ER6.js} +6 -5
  97. package/dist/chunk-QP5N3ER6.js.map +1 -0
  98. package/dist/chunk-RWCD2CAD.mjs +1132 -0
  99. package/dist/chunk-RWCD2CAD.mjs.map +1 -0
  100. package/dist/{chunk-VQ54PUQV.js → chunk-S37OK2QG.js} +2 -2
  101. package/dist/chunk-S37OK2QG.js.map +1 -0
  102. package/dist/chunk-S3PUP7N4.js +20 -0
  103. package/dist/chunk-S3PUP7N4.js.map +1 -0
  104. package/dist/{chunk-QQ2WFYOD.js → chunk-S6YSGVWD.js} +4 -76
  105. package/dist/chunk-S6YSGVWD.js.map +1 -0
  106. package/dist/chunk-SFDJNKWC.js +22 -0
  107. package/dist/chunk-SFDJNKWC.js.map +1 -0
  108. package/dist/chunk-TTYCVBIQ.mjs +144 -0
  109. package/dist/chunk-TTYCVBIQ.mjs.map +1 -0
  110. package/dist/{chunk-HBF4HPRK.js → chunk-TXMX6PZR.js} +7 -3
  111. package/dist/chunk-TXMX6PZR.js.map +1 -0
  112. package/dist/chunk-VHN7PF5I.js +20 -0
  113. package/dist/chunk-VHN7PF5I.js.map +1 -0
  114. package/dist/chunk-VJNDOYEC.js +41 -0
  115. package/dist/chunk-VJNDOYEC.js.map +1 -0
  116. package/dist/chunk-XBZIS3MV.mjs +13 -0
  117. package/dist/chunk-XBZIS3MV.mjs.map +1 -0
  118. package/dist/chunk-XFOZ56FB.mjs +20 -0
  119. package/dist/chunk-XFOZ56FB.mjs.map +1 -0
  120. package/dist/chunk-Z23HAXHL.js +136 -0
  121. package/dist/chunk-Z23HAXHL.js.map +1 -0
  122. package/dist/chunk-ZF7DKR5A.mjs +26 -0
  123. package/dist/chunk-ZF7DKR5A.mjs.map +1 -0
  124. package/dist/common/auth/client/index.d.mts +3239 -0
  125. package/dist/common/auth/client/index.d.ts +3239 -0
  126. package/dist/common/auth/client/index.js +26 -0
  127. package/dist/common/auth/client/index.mjs +5 -0
  128. package/dist/common/auth/components/index.d.mts +374 -0
  129. package/dist/common/auth/components/index.d.ts +374 -0
  130. package/dist/common/auth/components/index.js +70 -0
  131. package/dist/common/auth/components/index.mjs +9 -0
  132. package/dist/common/auth/hooks/index.d.mts +75 -0
  133. package/dist/common/auth/hooks/index.d.ts +75 -0
  134. package/dist/common/auth/hooks/index.js +28 -0
  135. package/dist/common/auth/hooks/index.js.map +1 -0
  136. package/dist/common/auth/hooks/index.mjs +7 -0
  137. package/dist/common/auth/hooks/index.mjs.map +1 -0
  138. package/dist/common/auth/index.d.mts +14 -6
  139. package/dist/common/auth/index.d.ts +14 -6
  140. package/dist/common/auth/index.js +17 -8
  141. package/dist/common/auth/index.mjs +4 -3
  142. package/dist/common/auth/react/index.d.mts +3056 -0
  143. package/dist/common/auth/react/index.d.ts +3056 -0
  144. package/dist/common/auth/react/index.js +31 -0
  145. package/dist/common/auth/react/index.js.map +1 -0
  146. package/dist/common/auth/react/index.mjs +21 -0
  147. package/dist/common/auth/react/index.mjs.map +1 -0
  148. package/dist/common/auth/rn/index.d.mts +3138 -0
  149. package/dist/common/auth/rn/index.d.ts +3138 -0
  150. package/dist/common/auth/rn/index.js +348 -0
  151. package/dist/common/auth/rn/index.js.map +1 -0
  152. package/dist/common/auth/rn/index.mjs +327 -0
  153. package/dist/common/auth/rn/index.mjs.map +1 -0
  154. package/dist/common/auth/schema/index.d.mts +1479 -0
  155. package/dist/common/auth/schema/index.d.ts +1479 -0
  156. package/dist/common/auth/schema/index.js +49 -0
  157. package/dist/common/auth/schema/index.js.map +1 -0
  158. package/dist/common/auth/schema/index.mjs +4 -0
  159. package/dist/common/auth/schema/index.mjs.map +1 -0
  160. package/dist/common/auth/server/index.d.mts +7 -30
  161. package/dist/common/auth/server/index.d.ts +7 -30
  162. package/dist/common/auth/server/index.js +36 -79
  163. package/dist/common/auth/server/index.mjs +2 -5
  164. package/dist/common/auth/services/index.d.mts +14 -0
  165. package/dist/common/auth/services/index.d.ts +14 -0
  166. package/dist/common/auth/services/index.js +17 -0
  167. package/dist/common/auth/services/index.js.map +1 -0
  168. package/dist/common/auth/services/index.mjs +4 -0
  169. package/dist/common/auth/services/index.mjs.map +1 -0
  170. package/dist/common/index.d.mts +13 -5
  171. package/dist/common/index.d.ts +13 -5
  172. package/dist/common/index.js +19 -16
  173. package/dist/common/index.mjs +11 -8
  174. package/dist/common/request/index.js +5 -4
  175. package/dist/common/request/index.mjs +3 -2
  176. package/dist/common/storage/index.js +13 -12
  177. package/dist/common/storage/index.mjs +3 -2
  178. package/dist/festivalCard/index.d.mts +3 -3
  179. package/dist/festivalCard/index.d.ts +3 -3
  180. package/dist/festivalCard/routes/index.d.mts +1 -1
  181. package/dist/festivalCard/routes/index.d.ts +1 -1
  182. package/dist/festivalCard/server/index.d.mts +2 -2
  183. package/dist/festivalCard/server/index.d.ts +2 -2
  184. package/dist/{festivalCardService-BFCRhJrq.d.ts → festivalCardService-B3GsnNpV.d.ts} +1 -1
  185. package/dist/{festivalCardService-GriR2VMc.d.mts → festivalCardService-CWhrLNE9.d.mts} +1 -1
  186. package/dist/{index-DPYkrKZf.d.mts → index-BcjDRcKp.d.mts} +11 -6
  187. package/dist/{index-Bnh6VqFv.d.ts → index-BlpXrrTy.d.ts} +11 -6
  188. package/dist/{index-1Ag7IBXN.d.ts → index-DZ5iJtNO.d.mts} +2 -44
  189. package/dist/{index-DdeZSeTJ.d.mts → index-DZ5iJtNO.d.ts} +2 -44
  190. package/dist/index.d.mts +6296 -40
  191. package/dist/index.d.ts +6296 -40
  192. package/dist/index.js +1378 -2508
  193. package/dist/index.js.map +1 -1
  194. package/dist/index.mjs +1073 -2203
  195. package/dist/index.mjs.map +1 -1
  196. package/dist/mmd/admin/index.d.mts +1 -1
  197. package/dist/mmd/admin/index.d.ts +1 -1
  198. package/dist/mmd/index.d.mts +1 -1
  199. package/dist/mmd/index.d.ts +1 -1
  200. package/dist/mmd/server/index.d.mts +3 -3
  201. package/dist/mmd/server/index.d.ts +3 -3
  202. package/dist/request/index.js +4 -3
  203. package/dist/request/index.mjs +2 -1
  204. package/dist/session-BCXvGCnm.d.mts +81 -0
  205. package/dist/session-BCXvGCnm.d.ts +81 -0
  206. package/dist/storage/index.js +12 -11
  207. package/dist/storage/index.mjs +2 -1
  208. package/dist/{types-DyG3ZV9V.d.mts → types-B6B210gX.d.mts} +1 -1
  209. package/dist/{types-DyG3ZV9V.d.ts → types-B6B210gX.d.ts} +1 -1
  210. package/dist/{types-BTiaMsBz.d.mts → types-Bdnte5EN.d.mts} +1 -1
  211. package/dist/{types-tQfupO6d.d.mts → types-Cs0CLvrH.d.mts} +1 -1
  212. package/dist/{types-tQfupO6d.d.ts → types-Cs0CLvrH.d.ts} +1 -1
  213. package/dist/{types-ERmJyjx8.d.ts → types-_rFX1atk.d.ts} +1 -1
  214. package/dist/types.legacy-J-j-_ig_.d.mts +25 -0
  215. package/dist/types.legacy-J-j-_ig_.d.ts +25 -0
  216. package/dist/useAuthActions-7S5dL7Oh.d.mts +77 -0
  217. package/dist/useAuthActions-7S5dL7Oh.d.ts +77 -0
  218. package/dist/vocaloidBooth/server/index.d.mts +3 -3
  219. package/dist/vocaloidBooth/server/index.d.ts +3 -3
  220. package/package.json +59 -76
  221. package/dist/auth/legacy/core/index.d.mts +0 -42
  222. package/dist/auth/legacy/core/index.d.ts +0 -42
  223. package/dist/auth/legacy/core/index.js +0 -242
  224. package/dist/auth/legacy/core/index.js.map +0 -1
  225. package/dist/auth/legacy/core/index.mjs +0 -226
  226. package/dist/auth/legacy/core/index.mjs.map +0 -1
  227. package/dist/auth/legacy/db/index.d.mts +0 -5
  228. package/dist/auth/legacy/db/index.d.ts +0 -5
  229. package/dist/auth/legacy/db/index.js +0 -261
  230. package/dist/auth/legacy/db/index.js.map +0 -1
  231. package/dist/auth/legacy/db/index.mjs +0 -250
  232. package/dist/auth/legacy/db/index.mjs.map +0 -1
  233. package/dist/auth/legacy/index.d.mts +0 -5
  234. package/dist/auth/legacy/index.d.ts +0 -5
  235. package/dist/auth/legacy/index.js +0 -1107
  236. package/dist/auth/legacy/index.js.map +0 -1
  237. package/dist/auth/legacy/index.mjs +0 -1086
  238. package/dist/auth/legacy/index.mjs.map +0 -1
  239. package/dist/auth/legacy/logic/index.d.mts +0 -9
  240. package/dist/auth/legacy/logic/index.d.ts +0 -9
  241. package/dist/auth/legacy/logic/index.js +0 -194
  242. package/dist/auth/legacy/logic/index.js.map +0 -1
  243. package/dist/auth/legacy/logic/index.mjs +0 -187
  244. package/dist/auth/legacy/logic/index.mjs.map +0 -1
  245. package/dist/auth/legacy/miniapp/index.d.mts +0 -5
  246. package/dist/auth/legacy/miniapp/index.d.ts +0 -5
  247. package/dist/auth/legacy/miniapp/index.js +0 -506
  248. package/dist/auth/legacy/miniapp/index.js.map +0 -1
  249. package/dist/auth/legacy/miniapp/index.mjs +0 -487
  250. package/dist/auth/legacy/miniapp/index.mjs.map +0 -1
  251. package/dist/auth/legacy/routes/index.d.mts +0 -53
  252. package/dist/auth/legacy/routes/index.d.ts +0 -53
  253. package/dist/auth/legacy/routes/index.js +0 -278
  254. package/dist/auth/legacy/routes/index.js.map +0 -1
  255. package/dist/auth/legacy/routes/index.mjs +0 -271
  256. package/dist/auth/legacy/routes/index.mjs.map +0 -1
  257. package/dist/auth/legacy/schema/index.d.mts +0 -401
  258. package/dist/auth/legacy/schema/index.d.ts +0 -401
  259. package/dist/auth/legacy/schema/index.js +0 -50
  260. package/dist/auth/legacy/schema/index.js.map +0 -1
  261. package/dist/auth/legacy/schema/index.mjs +0 -44
  262. package/dist/auth/legacy/schema/index.mjs.map +0 -1
  263. package/dist/auth/legacy/server/index.d.mts +0 -13
  264. package/dist/auth/legacy/server/index.d.ts +0 -13
  265. package/dist/auth/legacy/server/index.js +0 -21
  266. package/dist/auth/legacy/server/index.js.map +0 -1
  267. package/dist/auth/legacy/server/index.mjs +0 -19
  268. package/dist/auth/legacy/server/index.mjs.map +0 -1
  269. package/dist/auth/legacy/services/index.d.mts +0 -40
  270. package/dist/auth/legacy/services/index.d.ts +0 -40
  271. package/dist/auth/legacy/services/index.js +0 -258
  272. package/dist/auth/legacy/services/index.js.map +0 -1
  273. package/dist/auth/legacy/services/index.mjs +0 -252
  274. package/dist/auth/legacy/services/index.mjs.map +0 -1
  275. package/dist/auth/legacy/ui/miniapp/index.d.mts +0 -10
  276. package/dist/auth/legacy/ui/miniapp/index.d.ts +0 -10
  277. package/dist/auth/legacy/ui/miniapp/index.js +0 -298
  278. package/dist/auth/legacy/ui/miniapp/index.js.map +0 -1
  279. package/dist/auth/legacy/ui/miniapp/index.mjs +0 -290
  280. package/dist/auth/legacy/ui/miniapp/index.mjs.map +0 -1
  281. package/dist/auth/legacy/ui/web/index.d.mts +0 -22
  282. package/dist/auth/legacy/ui/web/index.d.ts +0 -22
  283. package/dist/auth/legacy/ui/web/index.js +0 -899
  284. package/dist/auth/legacy/ui/web/index.js.map +0 -1
  285. package/dist/auth/legacy/ui/web/index.mjs +0 -889
  286. package/dist/auth/legacy/ui/web/index.mjs.map +0 -1
  287. package/dist/auth/legacy/web/index.d.mts +0 -5
  288. package/dist/auth/legacy/web/index.d.ts +0 -5
  289. package/dist/auth/legacy/web/index.js +0 -1107
  290. package/dist/auth/legacy/web/index.js.map +0 -1
  291. package/dist/auth/legacy/web/index.mjs +0 -1086
  292. package/dist/auth/legacy/web/index.mjs.map +0 -1
  293. package/dist/auth/middleware/index.d.mts +0 -75
  294. package/dist/auth/middleware/index.d.ts +0 -75
  295. package/dist/auth/middleware/index.js +0 -15
  296. package/dist/auth/middleware/index.mjs +0 -6
  297. package/dist/auth/routes/index.d.mts +0 -261
  298. package/dist/auth/routes/index.d.ts +0 -261
  299. package/dist/auth/routes/index.js +0 -59
  300. package/dist/auth/routes/index.mjs +0 -6
  301. package/dist/chunk-37HYTHEC.mjs +0 -90
  302. package/dist/chunk-37HYTHEC.mjs.map +0 -1
  303. package/dist/chunk-3CSCIRQY.js.map +0 -1
  304. package/dist/chunk-5WV35FPV.js +0 -131
  305. package/dist/chunk-5WV35FPV.js.map +0 -1
  306. package/dist/chunk-7B5SI4OF.mjs.map +0 -1
  307. package/dist/chunk-DCRD5CZB.js +0 -573
  308. package/dist/chunk-DCRD5CZB.js.map +0 -1
  309. package/dist/chunk-DDX4JKFS.js +0 -19
  310. package/dist/chunk-DDX4JKFS.js.map +0 -1
  311. package/dist/chunk-DV6M7MFP.js +0 -283
  312. package/dist/chunk-DV6M7MFP.js.map +0 -1
  313. package/dist/chunk-EQXPL7TN.mjs +0 -78
  314. package/dist/chunk-EQXPL7TN.mjs.map +0 -1
  315. package/dist/chunk-GSNGCENJ.js.map +0 -1
  316. package/dist/chunk-HBF4HPRK.js.map +0 -1
  317. package/dist/chunk-HCI6JQOU.mjs.map +0 -1
  318. package/dist/chunk-I44HXJ3X.mjs +0 -17
  319. package/dist/chunk-I44HXJ3X.mjs.map +0 -1
  320. package/dist/chunk-IIVNHQEI.mjs.map +0 -1
  321. package/dist/chunk-IJ4YYWE3.mjs +0 -122
  322. package/dist/chunk-IJ4YYWE3.mjs.map +0 -1
  323. package/dist/chunk-J4BEIZUC.js +0 -92
  324. package/dist/chunk-J4BEIZUC.js.map +0 -1
  325. package/dist/chunk-OKPWFVXC.js +0 -24
  326. package/dist/chunk-OKPWFVXC.js.map +0 -1
  327. package/dist/chunk-PNOTQAYK.mjs +0 -560
  328. package/dist/chunk-PNOTQAYK.mjs.map +0 -1
  329. package/dist/chunk-PTMSDNGO.mjs.map +0 -1
  330. package/dist/chunk-Q2IAL7YV.js +0 -36
  331. package/dist/chunk-Q2IAL7YV.js.map +0 -1
  332. package/dist/chunk-QQ2WFYOD.js.map +0 -1
  333. package/dist/chunk-VQ54PUQV.js.map +0 -1
  334. package/dist/chunk-W5JEGA76.mjs +0 -33
  335. package/dist/chunk-W5JEGA76.mjs.map +0 -1
  336. package/dist/chunk-YGI7UU2D.mjs.map +0 -1
  337. package/dist/chunk-ZCLQSI5F.mjs +0 -271
  338. package/dist/chunk-ZCLQSI5F.mjs.map +0 -1
  339. package/dist/drizzle-auth-service-D-pljzCD.d.mts +0 -145
  340. package/dist/drizzle-auth-service-D3qryE_I.d.ts +0 -145
  341. package/dist/index-DNKZ7-R_.d.mts +0 -184
  342. package/dist/index-DNKZ7-R_.d.ts +0 -184
  343. package/dist/types-C5vUWf9u.d.ts +0 -70
  344. package/dist/types-IYCqCk2g.d.mts +0 -70
  345. /package/dist/{auth/middleware → common/auth/client}/index.js.map +0 -0
  346. /package/dist/{auth/middleware → common/auth/client}/index.mjs.map +0 -0
  347. /package/dist/{auth/routes → common/auth/components}/index.js.map +0 -0
  348. /package/dist/{auth/routes → common/auth/components}/index.mjs.map +0 -0
@@ -1,6 +1,4 @@
1
- import React5, { createContext, useState, useRef, useCallback, useEffect, useContext, useMemo } from 'react';
2
- import { createPortal } from 'react-dom';
3
- import { X, Phone, Lock, EyeOff, Eye, User, LogOut, LogIn } from 'lucide-react';
1
+ import React, { useMemo, useRef, useState, useEffect, useCallback } from 'react';
4
2
 
5
3
  var __defProp = Object.defineProperty;
6
4
  var __export = (target, all) => {
@@ -8,1104 +6,6 @@ var __export = (target, all) => {
8
6
  __defProp(target, name, { get: all[name], enumerable: true });
9
7
  };
10
8
 
11
- // src/business/auth-legacy/index.ts
12
- var auth_legacy_exports = {};
13
- __export(auth_legacy_exports, {
14
- AuthGuard: () => AuthGuard,
15
- AuthProvider: () => AuthProvider,
16
- ForgotPasswordModal: () => ForgotPasswordModal,
17
- LoginModal: () => LoginModal,
18
- RegisterModal: () => RegisterModal,
19
- UserMenu: () => UserMenu,
20
- UserRole: () => UserRole,
21
- calculateSessionExpiry: () => calculateSessionExpiry,
22
- generateSessionToken: () => generateSessionToken,
23
- getUserDisplayName: () => getUserDisplayName,
24
- isActiveUser: () => isActiveUser,
25
- isAdmin: () => isAdmin,
26
- isSessionExpired: () => isSessionExpired,
27
- useAuth: () => useAuth,
28
- validatePassword: () => validatePassword,
29
- validatePhoneNumber: () => validatePhoneNumber
30
- });
31
- var AuthContext = createContext(void 0);
32
- function extractUser(data) {
33
- return data?.user ?? data?.data?.user ?? null;
34
- }
35
- function extractValid(data) {
36
- if (typeof data?.valid === "boolean") return data.valid;
37
- if (typeof data?.data?.valid === "boolean") return data.data.valid;
38
- return false;
39
- }
40
- function AuthProvider({ children }) {
41
- const [user, setUser] = useState(null);
42
- const [loading, setLoading] = useState(true);
43
- const [isAuthenticated, setIsAuthenticated] = useState(false);
44
- const isMountedRef = useRef(true);
45
- const safeSetState = useCallback((updater) => {
46
- if (isMountedRef.current) {
47
- updater();
48
- }
49
- }, []);
50
- const validateSession = useCallback(async () => {
51
- console.log("\u{1F50D} [AuthContext] \u5F00\u59CB\u9A8C\u8BC1\u4F1A\u8BDD...");
52
- try {
53
- const response = await fetch("/api/auth/validate");
54
- console.log("\u{1F4E1} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u54CD\u5E94\u72B6\u6001:", response.status);
55
- const data = await response.json();
56
- console.log("\u{1F4C4} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u54CD\u5E94\u6570\u636E:", data);
57
- const resolvedUser = extractUser(data);
58
- const resolvedValid = extractValid(data);
59
- safeSetState(() => {
60
- if (resolvedValid && resolvedUser) {
61
- console.log("\u2705 [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u6210\u529F, \u7528\u6237:", resolvedUser);
62
- setUser(resolvedUser);
63
- setIsAuthenticated(true);
64
- } else {
65
- console.log("\u274C [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u5931\u8D25:", data.message);
66
- setUser(null);
67
- setIsAuthenticated(false);
68
- }
69
- setLoading(false);
70
- });
71
- } catch (error) {
72
- console.error("\u{1F4A5} [AuthContext] \u4F1A\u8BDD\u9A8C\u8BC1\u5F02\u5E38:", error);
73
- safeSetState(() => {
74
- setUser(null);
75
- setIsAuthenticated(false);
76
- setLoading(false);
77
- });
78
- }
79
- }, [safeSetState]);
80
- const login = useCallback(async (credentials) => {
81
- console.log("\u{1F511} [AuthContext] \u5F00\u59CB\u767B\u5F55...");
82
- console.log("\u{1F4DD} [AuthContext] \u767B\u5F55\u51ED\u636E:", { phone: credentials.phone, password: "***" });
83
- try {
84
- console.log("\u{1F4E4} [AuthContext] \u53D1\u9001\u767B\u5F55\u8BF7\u6C42\u5230 /api/auth/login");
85
- const response = await fetch("/api/auth/login", {
86
- method: "POST",
87
- headers: { "Content-Type": "application/json" },
88
- body: JSON.stringify(credentials)
89
- });
90
- console.log("\u{1F4E1} [AuthContext] \u6536\u5230\u54CD\u5E94\uFF0C\u72B6\u6001\u7801:", response.status);
91
- const data = await response.json();
92
- console.log("\u{1F4C4} [AuthContext] \u54CD\u5E94\u6570\u636E:", data);
93
- const resolvedUser = extractUser(data);
94
- if (data.success && resolvedUser) {
95
- console.log("\u2705 [AuthContext] \u767B\u5F55\u6210\u529F, \u5F00\u59CB\u66F4\u65B0\u5168\u5C40\u72B6\u6001");
96
- console.log("\u{1F464} [AuthContext] \u7528\u6237\u6570\u636E:", resolvedUser);
97
- console.log("\u{1F4CA} [AuthContext] \u66F4\u65B0\u524D\u72B6\u6001:", {
98
- currentUser: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
99
- currentIsAuthenticated: isAuthenticated,
100
- currentLoading: loading
101
- });
102
- console.log("\u{1F504} [AuthContext] \u6267\u884C\u5168\u5C40\u72B6\u6001\u66F4\u65B0...");
103
- safeSetState(() => {
104
- console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u7528\u6237:", resolvedUser);
105
- setUser(resolvedUser);
106
- console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u8BA4\u8BC1\u72B6\u6001: true");
107
- setIsAuthenticated(true);
108
- console.log("\u{1F504} [AuthContext] \u6B63\u5728\u8BBE\u7F6E\u52A0\u8F7D\u72B6\u6001: false");
109
- setLoading(false);
110
- console.log("\u2705 [AuthContext] \u5168\u5C40\u72B6\u6001\u66F4\u65B0\u5B8C\u6210");
111
- });
112
- setTimeout(() => {
113
- console.log("\u{1F389} [AuthContext] \u5EF6\u8FDF\u786E\u8BA4 - \u5168\u5C40\u767B\u5F55\u72B6\u6001\u5E94\u8BE5\u5DF2\u66F4\u65B0:", {
114
- user: resolvedUser,
115
- isAuthenticated: true
116
- });
117
- }, 0);
118
- console.log("\u{1F680} [AuthContext] \u8FD4\u56DE\u6210\u529F\u7ED3\u679C");
119
- return { success: true, user: resolvedUser };
120
- } else {
121
- console.log("\u274C [AuthContext] \u767B\u5F55\u5931\u8D25:", data.message);
122
- return { success: false, message: data.message };
123
- }
124
- } catch (error) {
125
- console.error("\u{1F4A5} [AuthContext] \u767B\u5F55\u5F02\u5E38:", error);
126
- return { success: false, message: "\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5" };
127
- }
128
- }, [safeSetState, user, isAuthenticated, loading]);
129
- const register = useCallback(async (userData) => {
130
- console.log("\u{1F4DD} [AuthContext] \u5F00\u59CB\u6CE8\u518C...");
131
- try {
132
- const response = await fetch("/api/auth/register", {
133
- method: "POST",
134
- headers: { "Content-Type": "application/json" },
135
- body: JSON.stringify(userData)
136
- });
137
- const data = await response.json();
138
- console.log("\u{1F4E1} [AuthContext] \u6CE8\u518C\u54CD\u5E94:", data);
139
- const resolvedUser = extractUser(data);
140
- if (data.success && resolvedUser) {
141
- console.log("\u2705 [AuthContext] \u6CE8\u518C\u6210\u529F, \u7ACB\u5373\u66F4\u65B0\u5168\u5C40\u72B6\u6001");
142
- safeSetState(() => {
143
- setUser(resolvedUser);
144
- setIsAuthenticated(true);
145
- setLoading(false);
146
- });
147
- console.log("\u{1F680} [AuthContext] \u8FD4\u56DE\u6CE8\u518C\u6210\u529F\u7ED3\u679C");
148
- return { success: true, user: resolvedUser };
149
- } else {
150
- console.log("\u274C [AuthContext] \u6CE8\u518C\u5931\u8D25:", data.message);
151
- return { success: false, message: data.message };
152
- }
153
- } catch (error) {
154
- console.error("\u{1F4A5} [AuthContext] \u6CE8\u518C\u5F02\u5E38:", error);
155
- return { success: false, message: "\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5" };
156
- }
157
- }, [safeSetState]);
158
- const logout = useCallback(async () => {
159
- console.log("\u{1F6AA} [AuthContext] \u5F00\u59CB\u767B\u51FA...");
160
- try {
161
- await fetch("/api/auth/logout", { method: "POST" });
162
- safeSetState(() => {
163
- setUser(null);
164
- setIsAuthenticated(false);
165
- });
166
- console.log("\u2705 [AuthContext] \u767B\u51FA\u6210\u529F, \u5168\u5C40\u72B6\u6001\u5DF2\u6E05\u9664");
167
- } catch (error) {
168
- console.error("\u{1F4A5} [AuthContext] \u767B\u51FA\u5931\u8D25:", error);
169
- }
170
- }, [safeSetState]);
171
- const refreshUser = useCallback(() => {
172
- console.log("\u{1F504} [AuthContext] \u5237\u65B0\u7528\u6237\u4FE1\u606F...");
173
- setLoading(true);
174
- validateSession();
175
- }, [validateSession]);
176
- useEffect(() => {
177
- isMountedRef.current = true;
178
- return () => {
179
- isMountedRef.current = false;
180
- };
181
- }, []);
182
- useEffect(() => {
183
- console.log("\u{1F680} [AuthContext] \u521D\u59CB\u5316, \u5F00\u59CB\u9A8C\u8BC1\u4F1A\u8BDD");
184
- validateSession();
185
- }, [validateSession]);
186
- useEffect(() => {
187
- console.log("\u{1F4CA} [AuthContext] \u5168\u5C40\u72B6\u6001\u53D8\u5316:", {
188
- isAuthenticated,
189
- user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
190
- loading
191
- });
192
- }, [isAuthenticated, user, loading]);
193
- const value = {
194
- user,
195
- loading,
196
- isAuthenticated,
197
- login,
198
- register,
199
- logout,
200
- refreshUser
201
- };
202
- return /* @__PURE__ */ React5.createElement(AuthContext.Provider, { value }, children);
203
- }
204
- function useAuth() {
205
- const context = useContext(AuthContext);
206
- if (context === void 0) {
207
- throw new Error("useAuth must be used within an AuthProvider");
208
- }
209
- return context;
210
- }
211
-
212
- // src/business/auth-legacy/utils/authUtils.ts
213
- function validatePhoneNumber(phone) {
214
- return /^1[3-9]\d{9}$/.test(phone);
215
- }
216
- function validatePassword(password) {
217
- if (!password) {
218
- return { valid: false, message: "\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A" };
219
- }
220
- if (password.length < 6) {
221
- return { valid: false, message: "\u5BC6\u7801\u957F\u5EA6\u81F3\u5C116\u4F4D" };
222
- }
223
- return { valid: true };
224
- }
225
- function generateSessionToken() {
226
- return Math.random().toString(36).substring(2) + Date.now().toString(36) + Math.random().toString(36).substring(2);
227
- }
228
- function isAdmin(user) {
229
- return user?.role === "admin";
230
- }
231
- function isActiveUser(user) {
232
- return user?.isActive === true;
233
- }
234
- function getUserDisplayName(user) {
235
- return user.name || user.phone || "\u672A\u77E5\u7528\u6237";
236
- }
237
- function calculateSessionExpiry(days = 30) {
238
- return new Date(Date.now() + days * 24 * 60 * 60 * 1e3);
239
- }
240
- function isSessionExpired(expiresAt) {
241
- return /* @__PURE__ */ new Date() > new Date(expiresAt);
242
- }
243
- function ForgotPasswordModal({ isOpen, onClose, onSuccess }) {
244
- const [formData, setFormData] = useState({
245
- phone: "",
246
- newPassword: "",
247
- confirmPassword: "",
248
- verificationCode: ""
249
- });
250
- const [showPassword, setShowPassword] = useState(false);
251
- const [showConfirmPassword, setShowConfirmPassword] = useState(false);
252
- const [error, setError] = useState("");
253
- const [loading, setLoading] = useState(false);
254
- const [countdown, setCountdown] = useState(0);
255
- const [mounted, setMounted] = useState(false);
256
- useEffect(() => {
257
- setMounted(true);
258
- }, []);
259
- const handleInputChange = (e) => {
260
- const { name, value } = e.target;
261
- setFormData((prev) => ({ ...prev, [name]: value }));
262
- if (error) setError("");
263
- };
264
- const validateForm = () => {
265
- if (!formData.phone || !formData.newPassword || !formData.confirmPassword || !formData.verificationCode) {
266
- setError("\u8BF7\u586B\u5199\u5B8C\u6574\u4FE1\u606F");
267
- return false;
268
- }
269
- if (!validatePhoneNumber(formData.phone)) {
270
- setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
271
- return false;
272
- }
273
- const passwordValidation = validatePassword(formData.newPassword);
274
- if (!passwordValidation.valid) {
275
- setError(passwordValidation.message || "\u5BC6\u7801\u683C\u5F0F\u9519\u8BEF");
276
- return false;
277
- }
278
- if (formData.newPassword !== formData.confirmPassword) {
279
- setError("\u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4");
280
- return false;
281
- }
282
- if (!/^\d{6}$/.test(formData.verificationCode)) {
283
- setError("\u8BF7\u8F93\u51656\u4F4D\u6570\u5B57\u9A8C\u8BC1\u7801");
284
- return false;
285
- }
286
- return true;
287
- };
288
- const handleSendCode = async () => {
289
- if (!formData.phone) {
290
- setError("\u8BF7\u8F93\u5165\u624B\u673A\u53F7");
291
- return;
292
- }
293
- if (!validatePhoneNumber(formData.phone)) {
294
- setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
295
- return;
296
- }
297
- try {
298
- setLoading(true);
299
- setError("");
300
- const response = await fetch("/api/auth/send-verification-code", {
301
- method: "POST",
302
- headers: { "Content-Type": "application/json" },
303
- body: JSON.stringify({ phone: formData.phone })
304
- });
305
- const data = await response.json();
306
- if (data.success) {
307
- setCountdown(60);
308
- const timer = setInterval(() => {
309
- setCountdown((prev) => {
310
- if (prev <= 1) {
311
- clearInterval(timer);
312
- return 0;
313
- }
314
- return prev - 1;
315
- });
316
- }, 1e3);
317
- console.log("\u2705 \u9A8C\u8BC1\u7801\u53D1\u9001\u6210\u529F");
318
- } else {
319
- setError(data.message || "\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25");
320
- }
321
- } catch (error2) {
322
- console.error("\u53D1\u9001\u9A8C\u8BC1\u7801\u5F02\u5E38:", error2);
323
- setError("\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
324
- } finally {
325
- setLoading(false);
326
- }
327
- };
328
- const handleSubmit = async (e) => {
329
- e.preventDefault();
330
- setError("");
331
- setLoading(true);
332
- try {
333
- if (!validateForm()) {
334
- return;
335
- }
336
- const response = await fetch("/api/auth/reset-password", {
337
- method: "POST",
338
- headers: { "Content-Type": "application/json" },
339
- body: JSON.stringify({
340
- phone: formData.phone,
341
- newPassword: formData.newPassword,
342
- verificationCode: formData.verificationCode
343
- })
344
- });
345
- const data = await response.json();
346
- if (data.success) {
347
- onSuccess();
348
- } else {
349
- setError(data.message || "\u91CD\u7F6E\u5BC6\u7801\u5931\u8D25");
350
- }
351
- } catch (error2) {
352
- setError("\u91CD\u7F6E\u5BC6\u7801\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
353
- } finally {
354
- setLoading(false);
355
- }
356
- };
357
- const handleOverlayClick = (e) => {
358
- if (e.target === e.currentTarget) {
359
- onClose();
360
- }
361
- };
362
- if (!isOpen || !mounted) return null;
363
- const modalContent = /* @__PURE__ */ React5.createElement(
364
- "div",
365
- {
366
- className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
367
- style: { margin: 0 },
368
- onClick: handleOverlayClick
369
- },
370
- /* @__PURE__ */ React5.createElement(
371
- "div",
372
- {
373
- className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
374
- onClick: (e) => e.stopPropagation()
375
- },
376
- /* @__PURE__ */ React5.createElement(
377
- "button",
378
- {
379
- className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
380
- onClick: onClose
381
- },
382
- /* @__PURE__ */ React5.createElement(X, { size: 20 })
383
- ),
384
- /* @__PURE__ */ React5.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React5.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u91CD\u7F6E\u5BC6\u7801"), /* @__PURE__ */ React5.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u8F93\u5165\u624B\u673A\u53F7\u548C\u9A8C\u8BC1\u7801\u91CD\u7F6E\u5BC6\u7801")),
385
- /* @__PURE__ */ React5.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
386
- "input",
387
- {
388
- id: "phone",
389
- name: "phone",
390
- type: "tel",
391
- value: formData.phone,
392
- onChange: handleInputChange,
393
- placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
394
- className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
395
- disabled: loading
396
- }
397
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "verificationCode", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u9A8C\u8BC1\u7801"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(
398
- "input",
399
- {
400
- id: "verificationCode",
401
- name: "verificationCode",
402
- type: "text",
403
- value: formData.verificationCode,
404
- onChange: handleInputChange,
405
- placeholder: "\u8BF7\u8F93\u5165\u9A8C\u8BC1\u7801",
406
- className: "w-full py-3 px-4 pr-28 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
407
- disabled: loading,
408
- maxLength: 6
409
- }
410
- ), /* @__PURE__ */ React5.createElement(
411
- "button",
412
- {
413
- type: "button",
414
- className: "absolute right-2 top-1/2 -translate-y-1/2 bg-transparent border-none text-blue-500 text-sm font-medium cursor-pointer px-2 py-1 rounded transition-all whitespace-nowrap hover:bg-blue-50 disabled:text-gray-400 disabled:cursor-not-allowed",
415
- onClick: handleSendCode,
416
- disabled: loading || countdown > 0
417
- },
418
- countdown > 0 ? `${countdown}\u79D2\u540E\u91CD\u8BD5` : "\u53D1\u9001\u9A8C\u8BC1\u7801"
419
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "newPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u65B0\u5BC6\u7801"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
420
- "input",
421
- {
422
- id: "newPassword",
423
- name: "newPassword",
424
- type: showPassword ? "text" : "password",
425
- value: formData.newPassword,
426
- onChange: handleInputChange,
427
- placeholder: "\u8BF7\u8F93\u5165\u65B0\u5BC6\u7801",
428
- className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
429
- disabled: loading
430
- }
431
- ), /* @__PURE__ */ React5.createElement(
432
- "button",
433
- {
434
- type: "button",
435
- className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
436
- onClick: () => setShowPassword(!showPassword),
437
- disabled: loading
438
- },
439
- showPassword ? /* @__PURE__ */ React5.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React5.createElement(Eye, { size: 18 })
440
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "confirmPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
441
- "input",
442
- {
443
- id: "confirmPassword",
444
- name: "confirmPassword",
445
- type: showConfirmPassword ? "text" : "password",
446
- value: formData.confirmPassword,
447
- onChange: handleInputChange,
448
- placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u65B0\u5BC6\u7801",
449
- className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
450
- disabled: loading
451
- }
452
- ), /* @__PURE__ */ React5.createElement(
453
- "button",
454
- {
455
- type: "button",
456
- className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
457
- onClick: () => setShowConfirmPassword(!showConfirmPassword),
458
- disabled: loading
459
- },
460
- showConfirmPassword ? /* @__PURE__ */ React5.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React5.createElement(Eye, { size: 18 })
461
- ))), error && /* @__PURE__ */ React5.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React5.createElement(
462
- "button",
463
- {
464
- type: "submit",
465
- className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
466
- disabled: loading
467
- },
468
- loading ? "\u63D0\u4EA4\u4E2D..." : "\u91CD\u7F6E\u5BC6\u7801"
469
- ))
470
- )
471
- );
472
- return createPortal(modalContent, document.body);
473
- }
474
-
475
- // src/business/auth-legacy/components/LoginModal.tsx
476
- function LoginModal({ isOpen, onClose, onSuccess, onSwitchToRegister }) {
477
- const { login } = useAuth();
478
- const [formData, setFormData] = useState({
479
- phone: "",
480
- password: ""
481
- });
482
- const [showPassword, setShowPassword] = useState(false);
483
- const [error, setError] = useState("");
484
- const [loading, setLoading] = useState(false);
485
- const [showForgotPassword, setShowForgotPassword] = useState(false);
486
- const [mounted, setMounted] = useState(false);
487
- useEffect(() => {
488
- setMounted(true);
489
- }, []);
490
- const fillDemoAccount = (type) => {
491
- if (process.env.NODE_ENV === "development") {
492
- const accounts = {
493
- admin: { phone: "13800138000", password: "admin123456" },
494
- user: { phone: "13900139000", password: "test123456" }
495
- };
496
- setFormData(accounts[type]);
497
- setError("");
498
- }
499
- };
500
- const handleInputChange = (e) => {
501
- const { name, value } = e.target;
502
- setFormData((prev) => ({ ...prev, [name]: value }));
503
- if (error) setError("");
504
- };
505
- const handleSubmit = async (e) => {
506
- e.preventDefault();
507
- setError("");
508
- setLoading(true);
509
- console.log("\u{1F504} [LoginModal] handleSubmit \u5F00\u59CB");
510
- try {
511
- if (!formData.phone || !formData.password) {
512
- console.log("\u274C [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u5931\u8D25: \u4FE1\u606F\u4E0D\u5B8C\u6574");
513
- setError("\u8BF7\u586B\u5199\u5B8C\u6574\u4FE1\u606F");
514
- return;
515
- }
516
- if (!validatePhoneNumber(formData.phone)) {
517
- console.log("\u274C [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u5931\u8D25: \u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF");
518
- setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7");
519
- return;
520
- }
521
- console.log("\u2705 [LoginModal] \u524D\u7AEF\u9A8C\u8BC1\u901A\u8FC7");
522
- console.log("\u{1F511} [LoginModal] \u63D0\u4EA4\u767B\u5F55\u8868\u5355:", {
523
- phone: formData.phone,
524
- password: "***"
525
- });
526
- console.log("\u{1F4DE} [LoginModal] \u51C6\u5907\u8C03\u7528 useAuth.login()...");
527
- const result = await login(formData);
528
- console.log("\u{1F4E1} [LoginModal] useAuth.login() \u8FD4\u56DE\u7ED3\u679C:", result);
529
- if (result.success) {
530
- console.log("\u2705 [LoginModal] \u767B\u5F55\u6210\u529F\uFF0C\u51C6\u5907\u8C03\u7528 onSuccess()");
531
- console.log("\u{1F464} [LoginModal] \u767B\u5F55\u6210\u529F\u7684\u7528\u6237\u4FE1\u606F:", result.user);
532
- setTimeout(() => {
533
- console.log("\u{1F3AF} [LoginModal] \u8C03\u7528 onSuccess \u56DE\u8C03");
534
- onSuccess();
535
- console.log("\u{1F3C1} [LoginModal] onSuccess \u8C03\u7528\u5B8C\u6210");
536
- }, 100);
537
- } else {
538
- console.log("\u274C [LoginModal] \u767B\u5F55\u5931\u8D25:", result.message);
539
- setError(result.message || "\u767B\u5F55\u5931\u8D25");
540
- }
541
- } catch (error2) {
542
- console.error("\u{1F4A5} [LoginModal] \u767B\u5F55\u5F02\u5E38:", error2);
543
- setError("\u767B\u5F55\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
544
- } finally {
545
- console.log("\u{1F51A} [LoginModal] handleSubmit \u7ED3\u675F\uFF0C\u8BBE\u7F6E loading = false");
546
- setLoading(false);
547
- }
548
- };
549
- const handleOverlayClick = (e) => {
550
- if (e.target === e.currentTarget) {
551
- onClose();
552
- }
553
- };
554
- if (!isOpen || !mounted) return null;
555
- const modalContent = /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(
556
- "div",
557
- {
558
- className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
559
- style: { margin: 0 },
560
- onClick: handleOverlayClick
561
- },
562
- /* @__PURE__ */ React5.createElement(
563
- "div",
564
- {
565
- className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
566
- onClick: (e) => e.stopPropagation()
567
- },
568
- /* @__PURE__ */ React5.createElement(
569
- "button",
570
- {
571
- className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
572
- onClick: onClose
573
- },
574
- /* @__PURE__ */ React5.createElement(X, { size: 20 })
575
- ),
576
- /* @__PURE__ */ React5.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React5.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u767B\u5F55"), /* @__PURE__ */ React5.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u8F93\u5165\u60A8\u7684\u624B\u673A\u53F7\u548C\u5BC6\u7801")),
577
- process.env.NODE_ENV === "development" && /* @__PURE__ */ React5.createElement("div", { className: "px-6 py-4 bg-amber-50 border-b border-gray-100" }, /* @__PURE__ */ React5.createElement("p", { className: "text-xs text-amber-800 font-medium mb-2" }, "\u5F00\u53D1\u73AF\u5883\u5FEB\u6377\u767B\u5F55\uFF1A"), /* @__PURE__ */ React5.createElement("div", { className: "flex gap-2" }, /* @__PURE__ */ React5.createElement(
578
- "button",
579
- {
580
- type: "button",
581
- onClick: () => fillDemoAccount("admin"),
582
- className: "px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500"
583
- },
584
- "\u7BA1\u7406\u5458\u8D26\u53F7"
585
- ), /* @__PURE__ */ React5.createElement(
586
- "button",
587
- {
588
- type: "button",
589
- onClick: () => fillDemoAccount("user"),
590
- className: "px-3 py-1.5 text-xs bg-amber-400 text-amber-900 border-none rounded-md cursor-pointer transition-all font-medium hover:bg-amber-500"
591
- },
592
- "\u7528\u6237\u8D26\u53F7"
593
- ))),
594
- /* @__PURE__ */ React5.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
595
- "input",
596
- {
597
- id: "phone",
598
- name: "phone",
599
- type: "tel",
600
- autoComplete: "tel",
601
- value: formData.phone,
602
- onChange: handleInputChange,
603
- placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
604
- className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
605
- disabled: loading
606
- }
607
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
608
- "input",
609
- {
610
- id: "password",
611
- name: "password",
612
- type: showPassword ? "text" : "password",
613
- autoComplete: "current-password",
614
- value: formData.password,
615
- onChange: handleInputChange,
616
- placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801",
617
- className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
618
- disabled: loading
619
- }
620
- ), /* @__PURE__ */ React5.createElement(
621
- "button",
622
- {
623
- type: "button",
624
- className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
625
- onClick: () => setShowPassword(!showPassword),
626
- disabled: loading
627
- },
628
- showPassword ? /* @__PURE__ */ React5.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React5.createElement(Eye, { size: 18 })
629
- ))), /* @__PURE__ */ React5.createElement("div", { className: "text-right -mt-2 mb-4" }, /* @__PURE__ */ React5.createElement(
630
- "button",
631
- {
632
- type: "button",
633
- onClick: () => setShowForgotPassword(true),
634
- className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
635
- },
636
- "\u5FD8\u8BB0\u5BC6\u7801\uFF1F"
637
- )), error && /* @__PURE__ */ React5.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React5.createElement(
638
- "button",
639
- {
640
- type: "submit",
641
- className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
642
- disabled: loading
643
- },
644
- loading ? "\u767B\u5F55\u4E2D..." : "\u767B\u5F55"
645
- ), onSwitchToRegister && /* @__PURE__ */ React5.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React5.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u8FD8\u6CA1\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React5.createElement(
646
- "button",
647
- {
648
- type: "button",
649
- onClick: onSwitchToRegister,
650
- className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
651
- },
652
- "\u7ACB\u5373\u6CE8\u518C"
653
- )))
654
- )
655
- ), /* @__PURE__ */ React5.createElement(
656
- ForgotPasswordModal,
657
- {
658
- isOpen: showForgotPassword,
659
- onClose: () => setShowForgotPassword(false),
660
- onSuccess: () => {
661
- setShowForgotPassword(false);
662
- onSuccess();
663
- }
664
- }
665
- ));
666
- return createPortal(modalContent, document.body);
667
- }
668
-
669
- // src/business/auth-legacy/components/AuthGuard.tsx
670
- function AuthGuard({
671
- children,
672
- fallback,
673
- requireAuth = true
674
- }) {
675
- const { isAuthenticated, loading, refreshUser } = useAuth();
676
- const [showLoginModal, setShowLoginModal] = useState(false);
677
- useEffect(() => {
678
- if (!loading && requireAuth && !isAuthenticated) {
679
- setShowLoginModal(true);
680
- }
681
- }, [loading, requireAuth, isAuthenticated]);
682
- const handleLoginSuccess = () => {
683
- refreshUser();
684
- setShowLoginModal(false);
685
- };
686
- if (loading) {
687
- return /* @__PURE__ */ React5.createElement("div", { style: {
688
- display: "flex",
689
- alignItems: "center",
690
- justifyContent: "center",
691
- minHeight: "200px",
692
- color: "#6b7280",
693
- flexDirection: "column",
694
- gap: "12px"
695
- } }, /* @__PURE__ */ React5.createElement("div", { style: {
696
- width: "32px",
697
- height: "32px",
698
- border: "3px solid #e5e7eb",
699
- borderTop: "3px solid #3b82f6",
700
- borderRadius: "50%",
701
- animation: "spin 1s linear infinite"
702
- } }), /* @__PURE__ */ React5.createElement("div", null, "\u9A8C\u8BC1\u767B\u5F55\u72B6\u6001..."));
703
- }
704
- if (requireAuth && !isAuthenticated) {
705
- return /* @__PURE__ */ React5.createElement(React5.Fragment, null, fallback || /* @__PURE__ */ React5.createElement("div", { style: {
706
- display: "flex",
707
- alignItems: "center",
708
- justifyContent: "center",
709
- minHeight: "200px",
710
- color: "#6b7280",
711
- flexDirection: "column",
712
- gap: "16px",
713
- padding: "24px",
714
- textAlign: "center"
715
- } }, /* @__PURE__ */ React5.createElement("div", { style: {
716
- fontSize: "48px",
717
- opacity: 0.5
718
- } }, "\u{1F512}"), /* @__PURE__ */ React5.createElement("div", { style: {
719
- fontSize: "18px",
720
- fontWeight: "500"
721
- } }, "\u8BF7\u5148\u767B\u5F55\u4EE5\u8BBF\u95EE\u6B64\u9875\u9762"), /* @__PURE__ */ React5.createElement("div", { style: {
722
- fontSize: "14px",
723
- opacity: 0.7
724
- } }, "\u767B\u5F55\u540E\u5373\u53EF\u67E5\u770B\u76F8\u5173\u5185\u5BB9")), /* @__PURE__ */ React5.createElement(
725
- LoginModal,
726
- {
727
- isOpen: showLoginModal,
728
- onClose: () => setShowLoginModal(false),
729
- onSuccess: handleLoginSuccess
730
- }
731
- ));
732
- }
733
- return /* @__PURE__ */ React5.createElement(React5.Fragment, null, children);
734
- }
735
- function RegisterModal({ isOpen, onClose, onSuccess, onSwitchToLogin }) {
736
- const { register } = useAuth();
737
- const [formData, setFormData] = useState({
738
- phone: "",
739
- password: "",
740
- confirmPassword: "",
741
- name: ""
742
- });
743
- const [showPassword, setShowPassword] = useState(false);
744
- const [showConfirmPassword, setShowConfirmPassword] = useState(false);
745
- const [error, setError] = useState("");
746
- const [loading, setLoading] = useState(false);
747
- const [mounted, setMounted] = useState(false);
748
- useEffect(() => {
749
- setMounted(true);
750
- }, []);
751
- const handleInputChange = (e) => {
752
- const { name, value } = e.target;
753
- setFormData((prev) => ({ ...prev, [name]: value }));
754
- if (error) setError("");
755
- };
756
- const validateForm = () => {
757
- if (!formData.phone || !formData.password || !formData.confirmPassword) {
758
- setError("\u8BF7\u586B\u5199\u5FC5\u8981\u4FE1\u606F");
759
- return false;
760
- }
761
- if (!validatePhoneNumber(formData.phone)) {
762
- setError("\u8BF7\u8F93\u5165\u6B63\u786E\u7684\u624B\u673A\u53F7\u683C\u5F0F");
763
- return false;
764
- }
765
- const passwordValidation = validatePassword(formData.password);
766
- if (!passwordValidation.valid) {
767
- setError(passwordValidation.message || "\u5BC6\u7801\u683C\u5F0F\u9519\u8BEF");
768
- return false;
769
- }
770
- if (formData.password !== formData.confirmPassword) {
771
- setError("\u4E24\u6B21\u8F93\u5165\u7684\u5BC6\u7801\u4E0D\u4E00\u81F4");
772
- return false;
773
- }
774
- return true;
775
- };
776
- const handleSubmit = async (e) => {
777
- e.preventDefault();
778
- setError("");
779
- setLoading(true);
780
- try {
781
- if (!validateForm()) {
782
- return;
783
- }
784
- console.log("\u{1F4DD} [RegisterModal] \u63D0\u4EA4\u6CE8\u518C\u8868\u5355:", {
785
- phone: formData.phone,
786
- name: formData.name || "\u672A\u8BBE\u7F6E",
787
- password: "***"
788
- });
789
- const result = await register({
790
- phone: formData.phone,
791
- password: formData.password,
792
- name: formData.name || void 0
793
- });
794
- if (result.success) {
795
- console.log("\u2705 [RegisterModal] \u6CE8\u518C\u6210\u529F");
796
- onSuccess();
797
- } else {
798
- console.log("\u274C [RegisterModal] \u6CE8\u518C\u5931\u8D25:", result.message);
799
- setError(result.message || "\u6CE8\u518C\u5931\u8D25");
800
- }
801
- } catch (error2) {
802
- console.error("\u{1F4A5} [RegisterModal] \u6CE8\u518C\u5F02\u5E38:", error2);
803
- setError("\u6CE8\u518C\u5931\u8D25\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5");
804
- } finally {
805
- setLoading(false);
806
- }
807
- };
808
- const handleOverlayClick = (e) => {
809
- if (e.target === e.currentTarget) {
810
- onClose();
811
- }
812
- };
813
- if (!isOpen || !mounted) return null;
814
- const modalContent = /* @__PURE__ */ React5.createElement(
815
- "div",
816
- {
817
- className: "fixed top-0 left-0 right-0 bottom-0 w-screen h-screen bg-black/50 backdrop-blur-sm flex items-center justify-center z-[9999] p-4",
818
- style: { margin: 0 },
819
- onClick: handleOverlayClick
820
- },
821
- /* @__PURE__ */ React5.createElement(
822
- "div",
823
- {
824
- className: "bg-white rounded-2xl shadow-xl w-full max-w-[420px] max-h-[90vh] overflow-y-auto relative",
825
- onClick: (e) => e.stopPropagation()
826
- },
827
- /* @__PURE__ */ React5.createElement(
828
- "button",
829
- {
830
- className: "absolute top-5 right-5 bg-transparent border-none text-gray-500 cursor-pointer p-2 rounded-lg transition-all hover:bg-gray-100 hover:text-gray-700 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 min-w-9 min-h-9 flex items-center justify-center",
831
- onClick: onClose
832
- },
833
- /* @__PURE__ */ React5.createElement(X, { size: 20 })
834
- ),
835
- /* @__PURE__ */ React5.createElement("div", { className: "px-6 pt-6 pb-4 text-center border-b border-gray-100" }, /* @__PURE__ */ React5.createElement("h2", { className: "text-2xl font-semibold text-gray-800 mb-2" }, "\u7528\u6237\u6CE8\u518C"), /* @__PURE__ */ React5.createElement("p", { className: "text-gray-500 text-sm" }, "\u8BF7\u586B\u5199\u4EE5\u4E0B\u4FE1\u606F\u521B\u5EFA\u8D26\u6237")),
836
- /* @__PURE__ */ React5.createElement("form", { onSubmit: handleSubmit, className: "p-6" }, /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "phone", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u624B\u673A\u53F7 *"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Phone, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
837
- "input",
838
- {
839
- id: "phone",
840
- name: "phone",
841
- type: "tel",
842
- autoComplete: "tel",
843
- value: formData.phone,
844
- onChange: handleInputChange,
845
- placeholder: "\u8BF7\u8F93\u5165\u624B\u673A\u53F7",
846
- className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
847
- disabled: loading
848
- }
849
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "name", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u59D3\u540D"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(User, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
850
- "input",
851
- {
852
- id: "name",
853
- name: "name",
854
- type: "text",
855
- autoComplete: "name",
856
- value: formData.name,
857
- onChange: handleInputChange,
858
- placeholder: "\u8BF7\u8F93\u5165\u59D3\u540D\uFF08\u53EF\u9009\uFF09",
859
- className: "w-full py-3 px-4 pl-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
860
- disabled: loading
861
- }
862
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "password", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u5BC6\u7801 *"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
863
- "input",
864
- {
865
- id: "password",
866
- name: "password",
867
- type: showPassword ? "text" : "password",
868
- autoComplete: "new-password",
869
- value: formData.password,
870
- onChange: handleInputChange,
871
- placeholder: "\u8BF7\u8F93\u5165\u5BC6\u7801\uFF08\u81F3\u5C116\u4F4D\uFF09",
872
- className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
873
- disabled: loading
874
- }
875
- ), /* @__PURE__ */ React5.createElement(
876
- "button",
877
- {
878
- type: "button",
879
- className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
880
- onClick: () => setShowPassword(!showPassword),
881
- disabled: loading
882
- },
883
- showPassword ? /* @__PURE__ */ React5.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React5.createElement(Eye, { size: 18 })
884
- ))), /* @__PURE__ */ React5.createElement("div", { className: "mb-5" }, /* @__PURE__ */ React5.createElement("label", { htmlFor: "confirmPassword", className: "block mb-1.5 text-sm font-medium text-gray-700" }, "\u786E\u8BA4\u5BC6\u7801 *"), /* @__PURE__ */ React5.createElement("div", { className: "relative flex items-center" }, /* @__PURE__ */ React5.createElement(Lock, { size: 18, className: "absolute left-4 text-gray-400 z-[1] pointer-events-none" }), /* @__PURE__ */ React5.createElement(
885
- "input",
886
- {
887
- id: "confirmPassword",
888
- name: "confirmPassword",
889
- type: showConfirmPassword ? "text" : "password",
890
- autoComplete: "new-password",
891
- value: formData.confirmPassword,
892
- onChange: handleInputChange,
893
- placeholder: "\u8BF7\u518D\u6B21\u8F93\u5165\u5BC6\u7801",
894
- className: "w-full py-3 px-4 pl-12 pr-12 border-2 border-gray-200 rounded-lg text-base transition-all box-border min-h-12 bg-white focus:outline-none focus:border-blue-500 focus:ring-2 focus:ring-blue-500/10 placeholder:text-gray-400 disabled:bg-gray-50 disabled:text-gray-500 disabled:cursor-not-allowed",
895
- disabled: loading
896
- }
897
- ), /* @__PURE__ */ React5.createElement(
898
- "button",
899
- {
900
- type: "button",
901
- className: "absolute right-4 bg-transparent border-none text-gray-400 cursor-pointer p-1 rounded transition-all flex items-center justify-center min-w-6 min-h-6 hover:text-gray-600 hover:bg-gray-100 disabled:cursor-not-allowed disabled:opacity-50",
902
- onClick: () => setShowConfirmPassword(!showConfirmPassword),
903
- disabled: loading
904
- },
905
- showConfirmPassword ? /* @__PURE__ */ React5.createElement(EyeOff, { size: 18 }) : /* @__PURE__ */ React5.createElement(Eye, { size: 18 })
906
- ))), error && /* @__PURE__ */ React5.createElement("div", { className: "text-red-500 text-sm my-4 p-3 bg-red-50 border border-red-200 rounded-lg leading-relaxed" }, error), /* @__PURE__ */ React5.createElement(
907
- "button",
908
- {
909
- type: "submit",
910
- className: "w-full bg-blue-500 text-white border-none py-3.5 px-6 rounded-lg text-base font-medium cursor-pointer transition-all mt-2 min-h-[52px] hover:bg-blue-600 hover:-translate-y-0.5 hover:shadow-lg hover:shadow-blue-500/30 active:translate-y-0 disabled:bg-gray-400 disabled:cursor-not-allowed disabled:transform-none disabled:shadow-none focus:outline-none focus:ring-2 focus:ring-blue-700 focus:ring-offset-2",
911
- disabled: loading
912
- },
913
- loading ? "\u6CE8\u518C\u4E2D..." : "\u6CE8\u518C"
914
- ), onSwitchToLogin && /* @__PURE__ */ React5.createElement("div", { className: "text-center mt-5 pt-4 border-t border-gray-100" }, /* @__PURE__ */ React5.createElement("span", { className: "text-gray-500 text-sm mr-1" }, "\u5DF2\u6709\u8D26\u53F7\uFF1F"), /* @__PURE__ */ React5.createElement(
915
- "button",
916
- {
917
- type: "button",
918
- onClick: onSwitchToLogin,
919
- className: "bg-transparent border-none text-blue-500 cursor-pointer text-sm font-medium underline px-1 py-0.5 rounded transition-all hover:text-blue-600 hover:bg-blue-50 hover:no-underline focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
920
- },
921
- "\u7ACB\u5373\u767B\u5F55"
922
- )))
923
- )
924
- );
925
- return createPortal(modalContent, document.body);
926
- }
927
-
928
- // src/business/auth-legacy/components/UserMenu.tsx
929
- function UserMenu({ customMenuItems = [], className }) {
930
- const { user, isAuthenticated, logout } = useAuth();
931
- const [isOpen, setIsOpen] = useState(false);
932
- const [showLoginModal, setShowLoginModal] = useState(false);
933
- const [showRegisterModal, setShowRegisterModal] = useState(false);
934
- const toggleMenu = () => {
935
- setIsOpen(!isOpen);
936
- };
937
- const handleMenuClick = (e) => {
938
- e.stopPropagation();
939
- };
940
- const handleCustomMenuClick = (item) => {
941
- console.log(`\u{1F527} [UserMenu] \u81EA\u5B9A\u4E49\u83DC\u5355\u9879\u88AB\u70B9\u51FB: ${item.label}`);
942
- item.onClick();
943
- setIsOpen(false);
944
- };
945
- const handleLogin = () => {
946
- console.log("\u{1F511} [UserMenu] \u767B\u5F55\u6309\u94AE\u88AB\u70B9\u51FB");
947
- setShowLoginModal(true);
948
- setIsOpen(false);
949
- };
950
- const handleRegister = () => {
951
- console.log("\u{1F4DD} [UserMenu] \u6CE8\u518C\u6309\u94AE\u88AB\u70B9\u51FB");
952
- setShowRegisterModal(true);
953
- setIsOpen(false);
954
- };
955
- const handleLogout = async () => {
956
- console.log("\u{1F6AA} [UserMenu] \u9000\u51FA\u767B\u5F55\u6309\u94AE\u88AB\u70B9\u51FB");
957
- try {
958
- await logout();
959
- console.log("\u2705 [UserMenu] \u9000\u51FA\u767B\u5F55\u6210\u529F");
960
- } catch (error) {
961
- console.error("\u9000\u51FA\u767B\u5F55\u5931\u8D25:", error);
962
- }
963
- setIsOpen(false);
964
- };
965
- const handleAuthSuccess = () => {
966
- console.log("\u{1F389} [UserMenu] \u8BA4\u8BC1\u6210\u529F\u56DE\u8C03\u88AB\u8C03\u7528");
967
- console.log("\u{1F464} [UserMenu] \u5F53\u524DuseAuth\u72B6\u6001:", {
968
- user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
969
- isAuthenticated
970
- });
971
- setShowLoginModal(false);
972
- setShowRegisterModal(false);
973
- console.log("\u2705 [UserMenu] \u8BA4\u8BC1\u6210\u529F\u5904\u7406\u5B8C\u6210 - \u6A21\u6001\u6846\u5DF2\u5173\u95ED");
974
- setTimeout(() => {
975
- console.log("\u{1F50D} [UserMenu] \u5EF6\u8FDF\u72B6\u6001\u68C0\u67E5:", {
976
- user: user ? `${user.name || "\u672A\u8BBE\u7F6E"} (${user.phone})` : null,
977
- isAuthenticated
978
- });
979
- }, 500);
980
- };
981
- const handleSwitchToRegister = () => {
982
- console.log("\u{1F504} [UserMenu] \u4ECE\u767B\u5F55\u5207\u6362\u5230\u6CE8\u518C");
983
- setShowLoginModal(false);
984
- setShowRegisterModal(true);
985
- };
986
- const handleSwitchToLogin = () => {
987
- console.log("\u{1F504} [UserMenu] \u4ECE\u6CE8\u518C\u5207\u6362\u5230\u767B\u5F55");
988
- setShowRegisterModal(false);
989
- setShowLoginModal(true);
990
- };
991
- const getVisibleCustomMenuItems = () => {
992
- return customMenuItems.filter((item) => {
993
- if (item.requireAuth === true) {
994
- return isAuthenticated;
995
- }
996
- if (item.requireAuth === false) {
997
- return !isAuthenticated;
998
- }
999
- return true;
1000
- });
1001
- };
1002
- React5.useEffect(() => {
1003
- const handleGlobalClick = () => {
1004
- setIsOpen(false);
1005
- };
1006
- if (isOpen) {
1007
- document.addEventListener("click", handleGlobalClick);
1008
- }
1009
- return () => {
1010
- document.removeEventListener("click", handleGlobalClick);
1011
- };
1012
- }, [isOpen]);
1013
- const visibleCustomMenuItems = getVisibleCustomMenuItems();
1014
- return /* @__PURE__ */ React5.createElement("div", { className: `relative inline-block ${className || ""}` }, /* @__PURE__ */ React5.createElement(
1015
- "button",
1016
- {
1017
- className: "flex items-center gap-2 px-3 py-2 bg-slate-50 text-slate-500 border border-slate-200 rounded-lg cursor-pointer transition-all min-w-11 min-h-11 text-sm font-medium hover:bg-slate-200 hover:text-slate-800 focus:outline-none focus:ring-2 focus:ring-blue-500/10",
1018
- onClick: toggleMenu
1019
- },
1020
- /* @__PURE__ */ React5.createElement(User, { size: 24 }),
1021
- isAuthenticated && user && /* @__PURE__ */ React5.createElement("span", { className: "max-w-[120px] overflow-hidden text-ellipsis whitespace-nowrap" }, user.name || user.phone)
1022
- ), isOpen && /* @__PURE__ */ React5.createElement(
1023
- "div",
1024
- {
1025
- className: "absolute top-[calc(100%+0.5rem)] right-0 z-[1000] min-w-[200px] bg-white border border-slate-200 rounded-xl shadow-lg max-h-[90vh] overflow-y-auto p-2 animate-in slide-in-from-top-2 fade-in duration-200",
1026
- onClick: handleMenuClick
1027
- },
1028
- isAuthenticated && user ? (
1029
- // 已登录状态的菜单
1030
- /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("div", { className: "p-3 mb-2 bg-slate-50 rounded-lg" }, /* @__PURE__ */ React5.createElement("div", { className: "text-sm font-semibold text-slate-800 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.name || "\u672A\u8BBE\u7F6E\u540D\u79F0"), /* @__PURE__ */ React5.createElement("div", { className: "text-xs text-slate-500 mb-1 overflow-hidden text-ellipsis whitespace-nowrap" }, user.phone), /* @__PURE__ */ React5.createElement("div", { className: "text-xs text-blue-500 font-medium" }, user.role === "admin" ? "\u7BA1\u7406\u5458" : "\u666E\u901A\u7528\u6237")), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
1031
- const IconComponent = item.icon;
1032
- return /* @__PURE__ */ React5.createElement(
1033
- "button",
1034
- {
1035
- key: item.id,
1036
- className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
1037
- onClick: () => handleCustomMenuClick(item)
1038
- },
1039
- IconComponent && /* @__PURE__ */ React5.createElement(IconComponent, { size: 16 }),
1040
- /* @__PURE__ */ React5.createElement("span", null, item.label)
1041
- );
1042
- })), /* @__PURE__ */ React5.createElement("div", { className: "h-px bg-slate-200 my-2" }), /* @__PURE__ */ React5.createElement(
1043
- "button",
1044
- {
1045
- className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-red-50 hover:text-red-600 focus:outline-none focus:bg-red-50 focus:text-red-600 focus:ring-2 focus:ring-red-500/10",
1046
- onClick: handleLogout
1047
- },
1048
- /* @__PURE__ */ React5.createElement(LogOut, { size: 16 }),
1049
- /* @__PURE__ */ React5.createElement("span", null, "\u9000\u51FA\u767B\u5F55")
1050
- ))
1051
- ) : (
1052
- // 未登录状态的菜单
1053
- /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(
1054
- "button",
1055
- {
1056
- className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
1057
- onClick: handleLogin
1058
- },
1059
- /* @__PURE__ */ React5.createElement(LogIn, { size: 16 }),
1060
- /* @__PURE__ */ React5.createElement("span", null, "\u767B\u5F55")
1061
- ), /* @__PURE__ */ React5.createElement(
1062
- "button",
1063
- {
1064
- className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
1065
- onClick: handleRegister
1066
- },
1067
- /* @__PURE__ */ React5.createElement(User, { size: 16 }),
1068
- /* @__PURE__ */ React5.createElement("span", null, "\u6CE8\u518C")
1069
- ), visibleCustomMenuItems.length > 0 && /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("div", { className: "h-px bg-slate-200 my-2" }), visibleCustomMenuItems.map((item) => {
1070
- const IconComponent = item.icon;
1071
- return /* @__PURE__ */ React5.createElement(
1072
- "button",
1073
- {
1074
- key: item.id,
1075
- className: "flex items-center gap-3 w-full p-3 bg-transparent border-none rounded-lg text-gray-700 text-sm font-medium cursor-pointer transition-all text-left min-h-11 hover:bg-slate-100 hover:text-slate-800 focus:outline-none focus:bg-slate-100 focus:ring-2 focus:ring-blue-500/10",
1076
- onClick: () => handleCustomMenuClick(item)
1077
- },
1078
- IconComponent && /* @__PURE__ */ React5.createElement(IconComponent, { size: 16 }),
1079
- /* @__PURE__ */ React5.createElement("span", null, item.label)
1080
- );
1081
- })))
1082
- )
1083
- ), /* @__PURE__ */ React5.createElement(
1084
- LoginModal,
1085
- {
1086
- isOpen: showLoginModal,
1087
- onClose: () => setShowLoginModal(false),
1088
- onSuccess: handleAuthSuccess,
1089
- onSwitchToRegister: handleSwitchToRegister
1090
- }
1091
- ), /* @__PURE__ */ React5.createElement(
1092
- RegisterModal,
1093
- {
1094
- isOpen: showRegisterModal,
1095
- onClose: () => setShowRegisterModal(false),
1096
- onSuccess: handleAuthSuccess,
1097
- onSwitchToLogin: handleSwitchToLogin
1098
- }
1099
- ));
1100
- }
1101
-
1102
- // src/business/auth-legacy/types/index.ts
1103
- var UserRole = /* @__PURE__ */ ((UserRole2) => {
1104
- UserRole2["USER"] = "user";
1105
- UserRole2["ADMIN"] = "admin";
1106
- return UserRole2;
1107
- })(UserRole || {});
1108
-
1109
9
  // src/business/bubbleShooter/index.ts
1110
10
  var bubbleShooter_exports = {};
1111
11
  __export(bubbleShooter_exports, {
@@ -1638,7 +538,7 @@ var BubbleShooterBoard = ({ config: inputConfig, className }) => {
1638
538
  context.fillText(status === "won" ? "You Win!" : "Game Over", boardWidth / 2, boardHeight / 2);
1639
539
  }
1640
540
  }, [aimAngle, boardHeight, boardWidth, config, currentColor, grid, nextColor, projectile, shooterX, shooterY, status]);
1641
- return /* @__PURE__ */ React5.createElement("div", { className }, /* @__PURE__ */ React5.createElement("div", { style: { display: "flex", gap: 16, marginBottom: 10, flexWrap: "wrap", color: "#334155" } }, /* @__PURE__ */ React5.createElement("span", null, "\u72B6\u6001\uFF1A", status === "ready" ? "\u5F85\u53D1\u5C04" : status === "shooting" ? "\u53D1\u5C04\u4E2D" : status === "won" ? "\u80DC\u5229" : "\u5931\u8D25"), /* @__PURE__ */ React5.createElement("span", null, "\u5206\u6570\uFF1A", score), /* @__PURE__ */ React5.createElement("span", null, "\u53D1\u5C04\u6B21\u6570\uFF1A", shots)), /* @__PURE__ */ React5.createElement(
541
+ return /* @__PURE__ */ React.createElement("div", { className }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", gap: 16, marginBottom: 10, flexWrap: "wrap", color: "#334155" } }, /* @__PURE__ */ React.createElement("span", null, "\u72B6\u6001\uFF1A", status === "ready" ? "\u5F85\u53D1\u5C04" : status === "shooting" ? "\u53D1\u5C04\u4E2D" : status === "won" ? "\u80DC\u5229" : "\u5931\u8D25"), /* @__PURE__ */ React.createElement("span", null, "\u5206\u6570\uFF1A", score), /* @__PURE__ */ React.createElement("span", null, "\u53D1\u5C04\u6B21\u6570\uFF1A", shots)), /* @__PURE__ */ React.createElement(
1642
542
  "canvas",
1643
543
  {
1644
544
  ref: canvasRef,
@@ -1658,7 +558,7 @@ var BubbleShooterBoard = ({ config: inputConfig, className }) => {
1658
558
  display: "block"
1659
559
  }
1660
560
  }
1661
- ), /* @__PURE__ */ React5.createElement("div", { style: { marginTop: 10, display: "flex", gap: 10 } }, /* @__PURE__ */ React5.createElement("button", { type: "button", onClick: restart, style: { padding: "8px 12px" } }, "\u91CD\u65B0\u5F00\u59CB")));
561
+ ), /* @__PURE__ */ React.createElement("div", { style: { marginTop: 10, display: "flex", gap: 10 } }, /* @__PURE__ */ React.createElement("button", { type: "button", onClick: restart, style: { padding: "8px 12px" } }, "\u91CD\u65B0\u5F00\u59CB")));
1662
562
  };
1663
563
  var BubbleShooterBoard_default = BubbleShooterBoard;
1664
564
  var BubbleShooterGamePage = ({
@@ -1666,10 +566,10 @@ var BubbleShooterGamePage = ({
1666
566
  title = "\u6CE1\u6CE1\u9F99",
1667
567
  description = "\u57FA\u7840\u7248\uFF1A\u7784\u51C6\u3001\u53D1\u5C04\u3001\u8FDE\u6D88\u3001\u60AC\u7A7A\u6389\u843D\u3002"
1668
568
  }) => {
1669
- return /* @__PURE__ */ React5.createElement("section", null, /* @__PURE__ */ React5.createElement("h2", null, title), /* @__PURE__ */ React5.createElement("p", { style: { color: "#64748b" } }, description), /* @__PURE__ */ React5.createElement(BubbleShooterBoard_default, { config }));
569
+ return /* @__PURE__ */ React.createElement("section", null, /* @__PURE__ */ React.createElement("h2", null, title), /* @__PURE__ */ React.createElement("p", { style: { color: "#64748b" } }, description), /* @__PURE__ */ React.createElement(BubbleShooterBoard_default, { config }));
1670
570
  };
1671
571
  var BubbleShooterGamePage_default = BubbleShooterGamePage;
1672
572
 
1673
- export { auth_legacy_exports as authLegacy, bubbleShooter_exports as bubbleShooter };
573
+ export { bubbleShooter_exports as bubbleShooter };
1674
574
  //# sourceMappingURL=index.mjs.map
1675
575
  //# sourceMappingURL=index.mjs.map