Use zustand and immer
This commit is contained in:
parent
fee10f6006
commit
d73842480a
4 changed files with 62 additions and 7 deletions
48
package-lock.json
generated
48
package-lock.json
generated
|
@ -6,8 +6,10 @@
|
||||||
"": {
|
"": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@radix-ui/react-radio-group": "^1.1.3",
|
"@radix-ui/react-radio-group": "^1.1.3",
|
||||||
|
"immer": "^10.1.1",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1"
|
"react-dom": "^18.3.1",
|
||||||
|
"zustand": "^4.5.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@svgr/plugin-svgo": "^8.1.0",
|
"@svgr/plugin-svgo": "^8.1.0",
|
||||||
|
@ -1927,6 +1929,15 @@
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/immer": {
|
||||||
|
"version": "10.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz",
|
||||||
|
"integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==",
|
||||||
|
"funding": {
|
||||||
|
"type": "opencollective",
|
||||||
|
"url": "https://opencollective.com/immer"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/import-fresh": {
|
"node_modules/import-fresh": {
|
||||||
"version": "3.3.0",
|
"version": "3.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
|
||||||
|
@ -3221,6 +3232,14 @@
|
||||||
"browserslist": ">= 4.21.0"
|
"browserslist": ">= 4.21.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/use-sync-external-store": {
|
||||||
|
"version": "1.2.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
|
||||||
|
"integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
|
||||||
|
"peerDependencies": {
|
||||||
|
"react": "^16.8.0 || ^17.0.0 || ^18.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/util-deprecate": {
|
"node_modules/util-deprecate": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
|
||||||
|
@ -3419,6 +3438,33 @@
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 14"
|
"node": ">= 14"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"node_modules/zustand": {
|
||||||
|
"version": "4.5.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.2.tgz",
|
||||||
|
"integrity": "sha512-2cN1tPkDVkwCy5ickKrI7vijSjPksFRfqS6237NzT0vqSsztTNnQdHw9mmN7uBdk3gceVXU0a+21jFzFzAc9+g==",
|
||||||
|
"dependencies": {
|
||||||
|
"use-sync-external-store": "1.2.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=12.7.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"@types/react": ">=16.8",
|
||||||
|
"immer": ">=9.0.6",
|
||||||
|
"react": ">=16.8"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/react": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"immer": {
|
||||||
|
"optional": true
|
||||||
|
},
|
||||||
|
"react": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,8 +6,10 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@radix-ui/react-radio-group": "^1.1.3",
|
"@radix-ui/react-radio-group": "^1.1.3",
|
||||||
|
"immer": "^10.1.1",
|
||||||
"react": "^18.3.1",
|
"react": "^18.3.1",
|
||||||
"react-dom": "^18.3.1"
|
"react-dom": "^18.3.1",
|
||||||
|
"zustand": "^4.5.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@svgr/plugin-svgo": "^8.1.0",
|
"@svgr/plugin-svgo": "^8.1.0",
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
import { useState } from "react";
|
|
||||||
import * as RadioGroup from "@radix-ui/react-radio-group";
|
import * as RadioGroup from "@radix-ui/react-radio-group";
|
||||||
|
|
||||||
import logo from "../assets/logo.svg";
|
import logo from "../assets/logo.svg";
|
||||||
import Cross from "../assets/icon-x.svg?react";
|
import Cross from "../assets/icon-x.svg?react";
|
||||||
import Oval from "../assets/icon-o.svg?react";
|
import Oval from "../assets/icon-o.svg?react";
|
||||||
|
import { useStore, setPlayerOneSymbol } from "./store.jsx";
|
||||||
|
|
||||||
export default () => {
|
export default () => {
|
||||||
const [playerSymbol, setPlayerSymbol] = useState("cross");
|
const playerOneSymbol = useStore((state) => state.playerOneSymbol);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="m-6 flex w-full max-w-lg flex-col items-center space-y-10">
|
<div className="m-6 flex w-full max-w-lg flex-col items-center space-y-10">
|
||||||
|
@ -17,9 +17,8 @@ export default () => {
|
||||||
</h2>
|
</h2>
|
||||||
<RadioGroup.Root
|
<RadioGroup.Root
|
||||||
className="mb-4 flex h-20 w-full items-center justify-between rounded-xl bg-navy-700 p-2"
|
className="mb-4 flex h-20 w-full items-center justify-between rounded-xl bg-navy-700 p-2"
|
||||||
defaultValue="cross"
|
value={playerOneSymbol}
|
||||||
value={playerSymbol}
|
onValueChange={setPlayerOneSymbol}
|
||||||
onValueChange={setPlayerSymbol}
|
|
||||||
loop={false}
|
loop={false}
|
||||||
>
|
>
|
||||||
{[
|
{[
|
||||||
|
|
8
src/store.jsx
Normal file
8
src/store.jsx
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import { create } from "zustand";
|
||||||
|
|
||||||
|
export const useStore = create((set) => ({
|
||||||
|
playerOneSymbol: "cross",
|
||||||
|
}));
|
||||||
|
|
||||||
|
export const setPlayerOneSymbol = (playerOneSymbol) =>
|
||||||
|
useStore.setState(() => ({ playerOneSymbol }));
|
Reference in a new issue