Commit 4792ca5d authored by timel's avatar timel

feat: life bar using spring

parent 37415155
Pipeline #22421 failed with stages
in 15 minutes and 43 seconds
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
"google-protobuf": "^3.21.2", "google-protobuf": "^3.21.2",
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"react": "^18.2.0", "react": "^18.2.0",
"react-animated-numbers": "^0.16.0",
"react-dom": "^18.2.0", "react-dom": "^18.2.0",
"react-draggable": "^4.4.5", "react-draggable": "^4.4.5",
"react-router-dom": "^6.10.0", "react-router-dom": "^6.10.0",
...@@ -20627,6 +20628,19 @@ ...@@ -20627,6 +20628,19 @@
"node": ">=0.10.0" "node": ">=0.10.0"
} }
}, },
"node_modules/react-animated-numbers": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/react-animated-numbers/-/react-animated-numbers-0.16.0.tgz",
"integrity": "sha512-MUoOsf8fLzwyUL9l6NEMma+29QtfbeYmt8x2LLt4IeLHQWJQfGa4WIUXB/VDVBXEhg74BhCRytdyvhHR3IiHsw==",
"dependencies": {
"@react-spring/web": "^9.4.5",
"react-intersection-observer": "^8.33.1"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/react-app-polyfill": { "node_modules/react-app-polyfill": {
"version": "0.2.2", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz",
...@@ -21260,6 +21274,14 @@ ...@@ -21260,6 +21274,14 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz",
"integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q=="
}, },
"node_modules/react-intersection-observer": {
"version": "8.34.0",
"resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz",
"integrity": "sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==",
"peerDependencies": {
"react": "^15.0.0 || ^16.0.0 || ^17.0.0|| ^18.0.0"
}
},
"node_modules/react-is": { "node_modules/react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
...@@ -44269,6 +44291,15 @@ ...@@ -44269,6 +44291,15 @@
"loose-envify": "^1.1.0" "loose-envify": "^1.1.0"
} }
}, },
"react-animated-numbers": {
"version": "0.16.0",
"resolved": "https://registry.npmjs.org/react-animated-numbers/-/react-animated-numbers-0.16.0.tgz",
"integrity": "sha512-MUoOsf8fLzwyUL9l6NEMma+29QtfbeYmt8x2LLt4IeLHQWJQfGa4WIUXB/VDVBXEhg74BhCRytdyvhHR3IiHsw==",
"requires": {
"@react-spring/web": "^9.4.5",
"react-intersection-observer": "^8.33.1"
}
},
"react-app-polyfill": { "react-app-polyfill": {
"version": "0.2.2", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz", "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-0.2.2.tgz",
...@@ -44763,6 +44794,12 @@ ...@@ -44763,6 +44794,12 @@
"resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz", "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-5.1.6.tgz",
"integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==" "integrity": "sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q=="
}, },
"react-intersection-observer": {
"version": "8.34.0",
"resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-8.34.0.tgz",
"integrity": "sha512-TYKh52Zc0Uptp5/b4N91XydfSGKubEhgZRtcg1rhTKABXijc4Sdr1uTp5lJ8TN27jwUsdXxjHXtHa0kPj704sw==",
"requires": {}
},
"react-is": { "react-is": {
"version": "16.13.1", "version": "16.13.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
import "./index.scss"; import "./index.scss";
import React from "react"; import React, { useEffect } from "react";
import { useSnapshot } from "valtio"; import { useSnapshot } from "valtio";
import { matStore, playerStore } from "@/stores"; import { matStore, playerStore } from "@/stores";
import classNames from "classnames"; import classNames from "classnames";
import AnimatedNumbers from "react-animated-numbers";
// 三个候选方案
// https://snack.expo.dev/?platform=web
// https://github.com/heyman333/react-animated-numbers
// https://www.npmjs.com/package/react-countup?activeTab=dependents
export const LifeBar: React.FC = () => { export const LifeBar: React.FC = () => {
const snap = useSnapshot(matStore.initInfo); const snap = useSnapshot(matStore.initInfo);
const snapPlayer = useSnapshot(playerStore); const snapPlayer = useSnapshot(playerStore);
const { currentPlayer } = useSnapshot(matStore); const { currentPlayer } = useSnapshot(matStore);
const [meLife, setMeLife] = React.useState(0);
const [opLife, setOpLife] = React.useState(0);
useEffect(() => {
setMeLife(snap.me.life);
}, [snap.me.life]);
useEffect(() => {
setOpLife(snap.op.life);
}, [snap.op.life]);
return ( return (
<div id="life-bar-container"> <div id="life-bar-container">
<div <div
...@@ -19,7 +37,9 @@ export const LifeBar: React.FC = () => { ...@@ -19,7 +37,9 @@ export const LifeBar: React.FC = () => {
})} })}
> >
<div className="name">{snapPlayer.getOpPlayer().name}</div> <div className="name">{snapPlayer.getOpPlayer().name}</div>
<div className="life">{snap.op.life}</div> <div className="life">
{<AnimatedNumbers animateToNumber={opLife} />}
</div>
</div> </div>
<div <div
className={classNames("life-bar", { className={classNames("life-bar", {
...@@ -27,7 +47,9 @@ export const LifeBar: React.FC = () => { ...@@ -27,7 +47,9 @@ export const LifeBar: React.FC = () => {
})} })}
> >
<div className="name">{snapPlayer.getMePlayer().name}</div> <div className="name">{snapPlayer.getMePlayer().name}</div>
<div className="life">{snap.me.life}</div> <div className="life">
<AnimatedNumbers animateToNumber={meLife} />
</div>
</div> </div>
</div> </div>
); );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment