diff --git a/package.json b/package.json index 0d3d176..268044e 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,8 @@ "react-circular-progressbar": "^2.1.0", "react-dom": "^18", "tailwind-merge": "^2.2.0", - "uuid": "^9.0.1" + "uuid": "^9.0.1", + "zustand": "^4.4.7" }, "devDependencies": { "@types/node": "^20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 47b648a..cd39253 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ dependencies: uuid: specifier: ^9.0.1 version: 9.0.1 + zustand: + specifier: ^4.4.7 + version: 4.4.7(@types/react@18.2.46)(react@18.2.0) devDependencies: '@types/node': @@ -332,7 +335,6 @@ packages: /@types/prop-types@15.7.11: resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true /@types/react-dom@18.2.18: resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} @@ -346,11 +348,9 @@ packages: '@types/prop-types': 15.7.11 '@types/scheduler': 0.16.8 csstype: 3.1.3 - dev: true /@types/scheduler@0.16.8: resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true /@types/uuid@9.0.7: resolution: {integrity: sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==} @@ -751,7 +751,6 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -2818,6 +2817,14 @@ packages: punycode: 2.3.1 dev: true + /use-sync-external-store@1.2.0(react@18.2.0): + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + dependencies: + react: 18.2.0 + dev: false + /util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: true @@ -2926,3 +2933,23 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} dev: true + + /zustand@4.4.7(@types/react@18.2.46)(react@18.2.0): + resolution: {integrity: sha512-QFJWJMdlETcI69paJwhSMJz7PPWjVP8Sjhclxmxmxv/RYI7ZOvR5BHX+ktH0we9gTWQMxcne8q1OY8xxz604gw==} + engines: {node: '>=12.7.0'} + peerDependencies: + '@types/react': '>=16.8' + immer: '>=9.0' + react: '>=16.8' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + dependencies: + '@types/react': 18.2.46 + react: 18.2.0 + use-sync-external-store: 1.2.0(react@18.2.0) + dev: false diff --git a/src/components/PrimaryValues.tsx b/src/components/PrimaryValues.tsx index e3a02ac..8108ebd 100644 --- a/src/components/PrimaryValues.tsx +++ b/src/components/PrimaryValues.tsx @@ -6,6 +6,7 @@ import { LooksIcon, MoraleIcon, } from '@/components/Icons'; +import { useGetPrimaryValues } from '@/lib/store/player'; import { PrimaryValue } from '@/lib/types/general'; import { CircularProgressbarWithChildren } from 'react-circular-progressbar'; import 'react-circular-progressbar/dist/styles.css'; @@ -80,12 +81,14 @@ export const PrimaryValueItem = (props: PrimaryValueItemProps) => { }; const PrimaryValues = () => { + const values = useGetPrimaryValues(); + return (
- - - - + + + +
); }; diff --git a/src/lib/store/player.ts b/src/lib/store/player.ts new file mode 100644 index 0000000..13b7317 --- /dev/null +++ b/src/lib/store/player.ts @@ -0,0 +1,33 @@ +import { useStore } from '@/lib/store/store'; +import { create } from 'zustand'; + +interface PlayerState { + name: string; + country: string; + age: number; // In months + money: number; + primaryValues: { + health: number; + morale: number; + intellect: number; + looks: number; + }; +} + +export const usePlayer = create()((set) => ({ + name: 'Player', + country: 'Undefined', + age: 12 * 18, + money: 0, + primaryValues: { + health: 100, + morale: 90, + intellect: 80, + looks: 70, + }, +})); + +export const useGetPrimaryValues = () => { + const _values = useStore(usePlayer, (state) => state.primaryValues); + return _values; +}; diff --git a/src/lib/store/store.ts b/src/lib/store/store.ts new file mode 100644 index 0000000..b5f76d0 --- /dev/null +++ b/src/lib/store/store.ts @@ -0,0 +1,15 @@ +import { useEffect, useState } from 'react'; + +export const useStore = ( + store: (callback: (state: T) => unknown) => unknown, + callback: (state: T) => F +) => { + const result = store(callback) as F; + const [data, setData] = useState(); + + useEffect(() => { + setData(result); + }, [result]); + + return data; +};