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