feat: implement user authentication with login functionality

- Add auth-api for handling login requests.
- Update index.ts to export AuthApi.
- Modify HeroLayout to display username or login link based on authentication state.
- Create LoginPage component for user login.
- Update router to include login route with EmptyLayout.
- Configure WebClient to include credentials in requests.
- Add auth-slice for managing authentication state in Redux.
- Update Redux store to include auth reducer.
- Define LoginRequest and User types in types/index.ts.
- Configure Vite to proxy API requests to the backend server.
This commit is contained in:
2026-04-14 11:17:31 +08:00
parent b000336d22
commit ac76150915
12 changed files with 249 additions and 98 deletions
+5 -5
View File
@@ -18,13 +18,13 @@
"@tailwindcss/vite": "^4.2.2", "@tailwindcss/vite": "^4.2.2",
"@tanstack/react-virtual": "^3.13.23", "@tanstack/react-virtual": "^3.13.23",
"antd": "^6.3.5", "antd": "^6.3.5",
"axios": "^1.14.0", "axios": "^1.15.0",
"dayjs": "^1.11.20", "dayjs": "^1.11.20",
"react": "^19.2.5", "react": "^19.2.5",
"react-dom": "^19.2.5", "react-dom": "^19.2.5",
"react-redux": "^9.2.0", "react-redux": "^9.2.0",
"react-router": "^7.14.0", "react-router": "^7.14.1",
"react-router-dom": "^7.14.0", "react-router-dom": "^7.14.1",
"redux-persist": "^6.0.0", "redux-persist": "^6.0.0",
"tailwindcss": "^4.2.2" "tailwindcss": "^4.2.2"
}, },
@@ -33,8 +33,8 @@
"@types/react": "^19.2.14", "@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3", "@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^6.0.1", "@vitejs/plugin-react": "^6.0.1",
"globals": "^17.4.0", "globals": "^17.5.0",
"prettier": "^3.8.1", "prettier": "^3.8.2",
"typescript": "~6.0.2", "typescript": "~6.0.2",
"vite": "^8.0.8" "vite": "^8.0.8"
}, },
+92 -92
View File
@@ -24,8 +24,8 @@ importers:
specifier: ^6.3.5 specifier: ^6.3.5
version: 6.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5) version: 6.3.5(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
axios: axios:
specifier: ^1.14.0 specifier: ^1.15.0
version: 1.14.0 version: 1.15.0
dayjs: dayjs:
specifier: ^1.11.20 specifier: ^1.11.20
version: 1.11.20 version: 1.11.20
@@ -39,11 +39,11 @@ importers:
specifier: ^9.2.0 specifier: ^9.2.0
version: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1) version: 9.2.0(@types/react@19.2.14)(react@19.2.5)(redux@5.0.1)
react-router: react-router:
specifier: ^7.14.0 specifier: ^7.14.1
version: 7.14.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) version: 7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react-router-dom: react-router-dom:
specifier: ^7.14.0 specifier: ^7.14.1
version: 7.14.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) version: 7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
redux-persist: redux-persist:
specifier: ^6.0.0 specifier: ^6.0.0
version: 6.0.0(react@19.2.5)(redux@5.0.1) version: 6.0.0(react@19.2.5)(redux@5.0.1)
@@ -64,11 +64,11 @@ importers:
specifier: ^6.0.1 specifier: ^6.0.1
version: 6.0.1(vite@8.0.8(@types/node@22.19.17)(esbuild@0.27.4)(jiti@2.6.1)) version: 6.0.1(vite@8.0.8(@types/node@22.19.17)(esbuild@0.27.4)(jiti@2.6.1))
globals: globals:
specifier: ^17.4.0 specifier: ^17.5.0
version: 17.4.0 version: 17.5.0
prettier: prettier:
specifier: ^3.8.1 specifier: ^3.8.2
version: 3.8.1 version: 3.8.2
typescript: typescript:
specifier: ~6.0.2 specifier: ~6.0.2
version: 6.0.2 version: 6.0.2
@@ -372,8 +372,8 @@ packages:
react: '>=16.9.0' react: '>=16.9.0'
react-dom: '>=16.9.0' react-dom: '>=16.9.0'
'@rc-component/image@1.8.0': '@rc-component/image@1.8.1':
resolution: {integrity: sha512-Dr41bFevLB5NgVaJhEUmNvbEf+ynAhim6W98ZW2xvCsdFISc2TYP4ZvCVdie3eaZdum2kieVcvpNHu+UrzAAHA==} resolution: {integrity: sha512-JfPCijmMl+EaMvbftsEs/4VHmTyJKsZBh5ujFowSA45i9NTVYS1vuHtgpVV/QrGa27kXwbVOZriffCe/PNKuMw==}
peerDependencies: peerDependencies:
react: '>=16.9.0' react: '>=16.9.0'
react-dom: '>=16.9.0' react-dom: '>=16.9.0'
@@ -583,8 +583,8 @@ packages:
react: '>=16.9.0' react: '>=16.9.0'
react-dom: '>=16.9.0' react-dom: '>=16.9.0'
'@rc-component/util@1.10.0': '@rc-component/util@1.10.1':
resolution: {integrity: sha512-aY9GLBuiUdpyfIUpAWSYer4Tu3mVaZCo5A0q9NtXcazT3MRiI3/WNHCR+DUn5VAtR6iRRf0ynCqQUcHli5UdYw==} resolution: {integrity: sha512-q++9S6rUa5Idb/xIBNz6jtvumw5+O5YV5V0g4iK9mn9jWs4oGJheE3ZN1kAnE723AXyaD8v95yeOASmdk8Jnng==}
peerDependencies: peerDependencies:
react: '>=18.0.0' react: '>=18.0.0'
react-dom: '>=18.0.0' react-dom: '>=18.0.0'
@@ -856,8 +856,8 @@ packages:
asynckit@0.4.0: asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
axios@1.14.0: axios@1.15.0:
resolution: {integrity: sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==} resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==}
call-bind-apply-helpers@1.0.2: call-bind-apply-helpers@1.0.2:
resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==}
@@ -930,8 +930,8 @@ packages:
picomatch: picomatch:
optional: true optional: true
follow-redirects@1.15.11: follow-redirects@1.16.0:
resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==}
engines: {node: '>=4.0'} engines: {node: '>=4.0'}
peerDependencies: peerDependencies:
debug: '*' debug: '*'
@@ -959,8 +959,8 @@ packages:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
globals@17.4.0: globals@17.5.0:
resolution: {integrity: sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==} resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==}
engines: {node: '>=18'} engines: {node: '>=18'}
gopd@1.2.0: gopd@1.2.0:
@@ -1096,12 +1096,12 @@ packages:
resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
engines: {node: '>=12'} engines: {node: '>=12'}
postcss@8.5.8: postcss@8.5.9:
resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
prettier@3.8.1: prettier@3.8.2:
resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} resolution: {integrity: sha512-8c3mgTe0ASwWAJK+78dpviD+A8EqhndQPUBpNUIPt6+xWlIigCwfN01lWr9MAede4uqXGTEKeQWTvzb3vjia0Q==}
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
@@ -1129,15 +1129,15 @@ packages:
redux: redux:
optional: true optional: true
react-router-dom@7.14.0: react-router-dom@7.14.1:
resolution: {integrity: sha512-2G3ajSVSZMEtmTjIklRWlNvo8wICEpLihfD/0YMDxbWK2UyP5EGfnoIn9AIQGnF3G/FX0MRbHXdFcD+rL1ZreQ==} resolution: {integrity: sha512-ZkrQuwwhGibjQLqH1eCdyiZyLWglPxzxdl5tgwgKEyCSGC76vmAjleGocRe3J/MLfzMUIKwaFJWpFVJhK3d2xA==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
peerDependencies: peerDependencies:
react: '>=18' react: '>=18'
react-dom: '>=18' react-dom: '>=18'
react-router@7.14.0: react-router@7.14.1:
resolution: {integrity: sha512-m/xR9N4LQLmAS0ZhkY2nkPA1N7gQ5TUVa5n8TgANuDTARbn1gt+zLPXEm7W0XDTbrQ2AJSJKhoa6yx1D8BcpxQ==} resolution: {integrity: sha512-5BCvFskyAAVumqhEKh/iPhLOIkfxcEUz8WqFIARCkMg8hZZzDYX9CtwxXA0e+qT8zAxmMC0x3Ckb9iMONwc5jg==}
engines: {node: '>=20.0.0'} engines: {node: '>=20.0.0'}
peerDependencies: peerDependencies:
react: '>=18' react: '>=18'
@@ -1197,16 +1197,16 @@ packages:
tailwindcss@4.2.2: tailwindcss@4.2.2:
resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==}
tapable@2.3.0: tapable@2.3.2:
resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==}
engines: {node: '>=6'} engines: {node: '>=6'}
throttle-debounce@5.0.2: throttle-debounce@5.0.2:
resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==}
engines: {node: '>=12.22'} engines: {node: '>=12.22'}
tinyglobby@0.2.15: tinyglobby@0.2.16:
resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
engines: {node: '>=12.0.0'} engines: {node: '>=12.0.0'}
tslib@2.8.1: tslib@2.8.1:
@@ -1278,7 +1278,7 @@ snapshots:
dependencies: dependencies:
'@ant-design/cssinjs': 2.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@ant-design/cssinjs': 2.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1287,7 +1287,7 @@ snapshots:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@emotion/hash': 0.8.0 '@emotion/hash': 0.8.0
'@emotion/unitless': 0.7.5 '@emotion/unitless': 0.7.5
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
csstype: 3.2.3 csstype: 3.2.3
react: 19.2.5 react: 19.2.5
@@ -1302,7 +1302,7 @@ snapshots:
dependencies: dependencies:
'@ant-design/colors': 8.0.1 '@ant-design/colors': 8.0.1
'@ant-design/icons-svg': 4.4.2 '@ant-design/icons-svg': 4.4.2
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1452,14 +1452,14 @@ snapshots:
dependencies: dependencies:
'@rc-component/select': 1.6.15(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/select': 1.6.15(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/tree': 1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/tree': 1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/checkbox@2.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/checkbox@2.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1468,7 +1468,7 @@ snapshots:
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1476,14 +1476,14 @@ snapshots:
'@rc-component/color-picker@3.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/color-picker@3.1.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@ant-design/fast-color': 3.0.1 '@ant-design/fast-color': 3.0.1
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/context@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/context@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1491,7 +1491,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1500,7 +1500,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1508,7 +1508,7 @@ snapshots:
'@rc-component/dropdown@1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/dropdown@1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1516,16 +1516,16 @@ snapshots:
'@rc-component/form@1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/form@1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/async-validator': 5.1.0 '@rc-component/async-validator': 5.1.0
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/image@1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/image@1.8.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1533,14 +1533,14 @@ snapshots:
'@rc-component/input-number@1.6.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/input-number@1.6.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/mini-decimal': 1.1.3 '@rc-component/mini-decimal': 1.1.3
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/input@1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/input@1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1551,7 +1551,7 @@ snapshots:
'@rc-component/menu': 1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/menu': 1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/textarea': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/textarea': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1561,7 +1561,7 @@ snapshots:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1572,21 +1572,21 @@ snapshots:
'@rc-component/motion@1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/motion@1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/mutate-observer@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/mutate-observer@2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/notification@1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/notification@1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1595,14 +1595,14 @@ snapshots:
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/pagination@1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/pagination@1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1612,7 +1612,7 @@ snapshots:
'@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1621,14 +1621,14 @@ snapshots:
'@rc-component/portal@2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/portal@2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/progress@1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/progress@1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1641,14 +1641,14 @@ snapshots:
'@rc-component/rate@1.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/rate@1.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/resize-observer@1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/resize-observer@1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1656,7 +1656,7 @@ snapshots:
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1665,7 +1665,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/overflow': 1.0.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
@@ -1673,21 +1673,21 @@ snapshots:
'@rc-component/slider@1.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/slider@1.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/steps@1.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/steps@1.2.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/switch@1.0.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/switch@1.0.3(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1696,7 +1696,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/context': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/context': 2.0.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
@@ -1708,7 +1708,7 @@ snapshots:
'@rc-component/menu': 1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/menu': 1.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1717,7 +1717,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/input': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/input': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1725,7 +1725,7 @@ snapshots:
'@rc-component/tooltip@1.4.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/tooltip@1.4.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1734,7 +1734,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1743,7 +1743,7 @@ snapshots:
dependencies: dependencies:
'@rc-component/select': 1.6.15(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/select': 1.6.15(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/tree': 1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/tree': 1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1751,7 +1751,7 @@ snapshots:
'@rc-component/tree@1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/tree@1.2.4(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/virtual-list': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
@@ -1762,19 +1762,19 @@ snapshots:
'@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/motion': 1.3.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/portal': 2.2.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/upload@1.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/upload@1.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
'@rc-component/util@1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)': '@rc-component/util@1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)':
dependencies: dependencies:
is-mobile: 5.0.0 is-mobile: 5.0.0
react: 19.2.5 react: 19.2.5
@@ -1785,7 +1785,7 @@ snapshots:
dependencies: dependencies:
'@babel/runtime': 7.29.2 '@babel/runtime': 7.29.2
'@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/resize-observer': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
@@ -1976,7 +1976,7 @@ snapshots:
'@rc-component/drawer': 1.4.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/drawer': 1.4.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/dropdown': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/dropdown': 1.0.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/form': 1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/form': 1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/image': 1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/image': 1.8.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/input': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/input': 1.1.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/input-number': 1.6.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/input-number': 1.6.2(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/mentions': 1.6.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/mentions': 1.6.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
@@ -2004,7 +2004,7 @@ snapshots:
'@rc-component/tree-select': 1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/tree-select': 1.8.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/trigger': 3.9.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/upload': 1.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/upload': 1.1.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
'@rc-component/util': 1.10.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) '@rc-component/util': 1.10.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
clsx: 2.1.1 clsx: 2.1.1
dayjs: 1.11.20 dayjs: 1.11.20
react: 19.2.5 react: 19.2.5
@@ -2018,9 +2018,9 @@ snapshots:
asynckit@0.4.0: {} asynckit@0.4.0: {}
axios@1.14.0: axios@1.15.0:
dependencies: dependencies:
follow-redirects: 1.15.11 follow-redirects: 1.16.0
form-data: 4.0.5 form-data: 4.0.5
proxy-from-env: 2.1.0 proxy-from-env: 2.1.0
transitivePeerDependencies: transitivePeerDependencies:
@@ -2058,7 +2058,7 @@ snapshots:
enhanced-resolve@5.20.1: enhanced-resolve@5.20.1:
dependencies: dependencies:
graceful-fs: 4.2.11 graceful-fs: 4.2.11
tapable: 2.3.0 tapable: 2.3.2
es-define-property@1.0.1: {} es-define-property@1.0.1: {}
@@ -2109,7 +2109,7 @@ snapshots:
optionalDependencies: optionalDependencies:
picomatch: 4.0.4 picomatch: 4.0.4
follow-redirects@1.15.11: {} follow-redirects@1.16.0: {}
form-data@4.0.5: form-data@4.0.5:
dependencies: dependencies:
@@ -2142,7 +2142,7 @@ snapshots:
dunder-proto: 1.0.1 dunder-proto: 1.0.1
es-object-atoms: 1.1.1 es-object-atoms: 1.1.1
globals@17.4.0: {} globals@17.5.0: {}
gopd@1.2.0: {} gopd@1.2.0: {}
@@ -2235,13 +2235,13 @@ snapshots:
picomatch@4.0.4: {} picomatch@4.0.4: {}
postcss@8.5.8: postcss@8.5.9:
dependencies: dependencies:
nanoid: 3.3.11 nanoid: 3.3.11
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
prettier@3.8.1: {} prettier@3.8.2: {}
proxy-from-env@2.1.0: {} proxy-from-env@2.1.0: {}
@@ -2261,13 +2261,13 @@ snapshots:
'@types/react': 19.2.14 '@types/react': 19.2.14
redux: 5.0.1 redux: 5.0.1
react-router-dom@7.14.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): react-router-dom@7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies: dependencies:
react: 19.2.5 react: 19.2.5
react-dom: 19.2.5(react@19.2.5) react-dom: 19.2.5(react@19.2.5)
react-router: 7.14.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5) react-router: 7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5)
react-router@7.14.0(react-dom@19.2.5(react@19.2.5))(react@19.2.5): react-router@7.14.1(react-dom@19.2.5(react@19.2.5))(react@19.2.5):
dependencies: dependencies:
cookie: 1.1.1 cookie: 1.1.1
react: 19.2.5 react: 19.2.5
@@ -2328,11 +2328,11 @@ snapshots:
tailwindcss@4.2.2: {} tailwindcss@4.2.2: {}
tapable@2.3.0: {} tapable@2.3.2: {}
throttle-debounce@5.0.2: {} throttle-debounce@5.0.2: {}
tinyglobby@0.2.15: tinyglobby@0.2.16:
dependencies: dependencies:
fdir: 6.5.0(picomatch@4.0.4) fdir: 6.5.0(picomatch@4.0.4)
picomatch: 4.0.4 picomatch: 4.0.4
@@ -2352,9 +2352,9 @@ snapshots:
dependencies: dependencies:
lightningcss: 1.32.0 lightningcss: 1.32.0
picomatch: 4.0.4 picomatch: 4.0.4
postcss: 8.5.8 postcss: 8.5.9
rolldown: 1.0.0-rc.15 rolldown: 1.0.0-rc.15
tinyglobby: 0.2.15 tinyglobby: 0.2.16
optionalDependencies: optionalDependencies:
'@types/node': 22.19.17 '@types/node': 22.19.17
esbuild: 0.27.4 esbuild: 0.27.4
+9
View File
@@ -0,0 +1,9 @@
import { LoginRequest, User } from "@/types"
import { WebClient } from "@/shared/web-client"
export async function login(loginRequest: LoginRequest): Promise<User> {
const { data } = await WebClient.post<User>("/auth/login", {
...loginRequest,
})
return data
}
+1
View File
@@ -1,3 +1,4 @@
export * as FirearmApi from "./firearm-api" export * as FirearmApi from "./firearm-api"
export * as ModificationApi from "./modification-api" export * as ModificationApi from "./modification-api"
export * as TagApi from "./tag-api" export * as TagApi from "./tag-api"
export * as AuthApi from "./auth-api"
+14
View File
@@ -1,6 +1,7 @@
import { Outlet, Link } from "react-router-dom" import { Outlet, Link } from "react-router-dom"
import { useMemo } from "react" import { useMemo } from "react"
import dayjs from "dayjs" import dayjs from "dayjs"
import { useAppSelector } from "@/store"
/** /**
* Main application component that serves as the root layout. * Main application component that serves as the root layout.
@@ -8,6 +9,7 @@ import dayjs from "dayjs"
*/ */
export default function HeroLayout() { export default function HeroLayout() {
const today = useMemo(() => dayjs(), []) const today = useMemo(() => dayjs(), [])
const user = useAppSelector((state) => state.auth.user)
return ( return (
<div className="bg-gray-50"> <div className="bg-gray-50">
@@ -33,6 +35,18 @@ export default function HeroLayout() {
> >
</Link> </Link>
{user ? (
<span className="text-gray-700 px-3 py-2 rounded-md text-sm font-medium">
{user.username}
</span>
) : (
<Link
to="/login"
className="text-gray-500 hover:text-gray-900 px-3 py-2 rounded-md text-sm font-medium"
>
</Link>
)}
<a <a
href="https://github.com/zihluwang/delta-force-firearm-modification-codes" href="https://github.com/zihluwang/delta-force-firearm-modification-codes"
target="_blank" target="_blank"
+67
View File
@@ -0,0 +1,67 @@
import { useState } from "react"
import { useNavigate } from "react-router-dom"
import { App, Button, Card, Form, Input, Typography } from "antd"
import { AuthApi } from "@/api"
import { useAppDispatch } from "@/store"
import { setCurrentUser } from "@/store/auth-slice"
import { LoginRequest } from "@/types"
export default function LoginPage() {
const navigate = useNavigate()
const { message } = App.useApp()
const dispatch = useAppDispatch()
const [loading, setLoading] = useState(false)
async function onFinish(values: LoginRequest) {
setLoading(true)
try {
const user = await AuthApi.login(values)
dispatch(setCurrentUser(user))
message.success(`欢迎回来,${user.username}`)
navigate("/firearms")
} catch {
message.error("登录失败,请检查帐号或密码")
} finally {
setLoading(false)
}
}
return (
<div className="min-h-screen bg-gray-100 px-4 py-10 sm:py-16">
<div className="mx-auto max-w-md">
<Card bordered={false} className="shadow-sm">
<Typography.Title level={3} className="!mb-2 text-center">
</Typography.Title>
<Typography.Paragraph className="!mb-6 text-center !text-gray-500">
使
</Typography.Paragraph>
<Form<LoginRequest> layout="vertical" onFinish={onFinish} requiredMark={false}>
<Form.Item<LoginRequest>
name="principle"
label="帐号"
rules={[{ required: true, message: "请输入帐号" }]}
>
<Input autoComplete="username" placeholder="请输入帐号" />
</Form.Item>
<Form.Item<LoginRequest>
name="credential"
label="密码"
rules={[{ required: true, message: "请输入密码" }]}
>
<Input.Password autoComplete="current-password" placeholder="请输入密码" />
</Form.Item>
<Form.Item className="!mb-0">
<Button type="primary" htmlType="submit" loading={loading} block>
</Button>
</Form.Item>
</Form>
</Card>
</div>
</div>
)
}
+11
View File
@@ -1,6 +1,7 @@
import { ComponentType } from "react" import { ComponentType } from "react"
import { createBrowserRouter } from "react-router-dom" import { createBrowserRouter } from "react-router-dom"
import ErrorPage from "@/components/error-page" import ErrorPage from "@/components/error-page"
import EmptyLayout from "@/layout/empty-layout"
import HeroLayout from "@/layout/hero-layout" import HeroLayout from "@/layout/hero-layout"
function lazy<T extends { default: ComponentType<unknown> }>(importer: () => Promise<T>) { function lazy<T extends { default: ComponentType<unknown> }>(importer: () => Promise<T>) {
@@ -37,6 +38,16 @@ const router = createBrowserRouter(
}, },
], ],
}, },
{
element: <EmptyLayout />,
errorElement: <ErrorPage />,
children: [
{
path: "login",
lazy: lazy(() => import("@/page/login")),
},
],
},
], ],
{ {
basename: "/", basename: "/",
+1
View File
@@ -4,6 +4,7 @@ import dayjs from "dayjs"
const WebClient = axios.create({ const WebClient = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL, baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: dayjs.duration({ seconds: 10 }).asMilliseconds(), timeout: dayjs.duration({ seconds: 10 }).asMilliseconds(),
withCredentials: true
}) })
export { WebClient } export { WebClient }
+26
View File
@@ -0,0 +1,26 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit"
import { User } from "@/types"
interface AuthState {
user: User | null
}
const initialState: AuthState = {
user: null,
}
const authSlice = createSlice({
name: "auth",
initialState,
reducers: {
setCurrentUser(state, action: PayloadAction<User>) {
state.user = action.payload
},
clearCurrentUser(state) {
state.user = null
},
},
})
export const { setCurrentUser, clearCurrentUser } = authSlice.actions
export const authReducer = authSlice.reducer
+3 -1
View File
@@ -11,6 +11,7 @@ import {
REGISTER, REGISTER,
} from "redux-persist" } from "redux-persist"
import createWebStorage from "redux-persist/es/storage/createWebStorage" import createWebStorage from "redux-persist/es/storage/createWebStorage"
import { authReducer } from "./auth-slice"
import { firearmsReducer } from "./firearms-slice" import { firearmsReducer } from "./firearms-slice"
const storage = createWebStorage(import.meta.env.VITE_REDUX_STORAGE ?? "local") const storage = createWebStorage(import.meta.env.VITE_REDUX_STORAGE ?? "local")
@@ -18,10 +19,11 @@ const storage = createWebStorage(import.meta.env.VITE_REDUX_STORAGE ?? "local")
const persistConfig = { const persistConfig = {
key: "root", key: "root",
storage, storage,
whitelist: ["firearms"], whitelist: ["auth", "firearms"],
} }
const rootReducer = combineReducers({ const rootReducer = combineReducers({
auth: authReducer,
firearms: firearmsReducer firearms: firearmsReducer
}) })
+11
View File
@@ -47,3 +47,14 @@ export interface PageQueryParams {
sortBy?: string sortBy?: string
direction?: Direction direction?: Direction
} }
export interface LoginRequest {
principle: string
credential: string
}
export interface User {
id: number
username: string
email: string
}
+9
View File
@@ -12,4 +12,13 @@ export default defineConfig({
"@": fileURLToPath(new URL("./src", import.meta.url)), "@": fileURLToPath(new URL("./src", import.meta.url)),
}, },
}, },
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, '')
}
}
}
}) })