From 26030a50262d626355cbe58017d8e474c642f078 Mon Sep 17 00:00:00 2001 From: z1glr Date: Sat, 4 Jan 2025 01:01:35 +0000 Subject: [PATCH] added zustand for state managing --- client/package-lock.json | 36 +++++++++- client/package.json | 3 +- client/src/app/components/Event/AddEvent.tsx | 71 ++++++++++++++------ client/src/app/components/Event/Event.tsx | 34 ++++------ client/src/app/components/Overview.tsx | 32 +++------ client/src/app/components/Zustand.ts | 68 +++++++++++++++++++ 6 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 client/src/app/components/Zustand.ts diff --git a/client/package-lock.json b/client/package-lock.json index 25e224b..9be2728 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -11,7 +11,8 @@ "@carbon/icons-react": "^11.53.0", "next": "15.1.3", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "zustand": "^5.0.2" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -976,7 +977,7 @@ "version": "19.0.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.2.tgz", "integrity": "sha512-USU8ZI/xyKJwFTpjSVIrSeHBVAGagkHQKPNbxeWwql/vDmnTIBgx+TJnhFnj1NXgz8XfprU0egV2dROLGpsBEg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1842,7 +1843,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, + "devOptional": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -6016,6 +6017,35 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zustand": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.2.tgz", + "integrity": "sha512-8qNdnJVJlHlrKXi50LDqqUNmUbuBjoKLrYQBnoChIbVph7vni+sY+YpvdjXG9YLd/Bxr6scMcR+rm5H3aSqPaw==", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } } } } diff --git a/client/package.json b/client/package.json index 51664df..bb430dc 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,8 @@ "@carbon/icons-react": "^11.53.0", "next": "15.1.3", "react": "^19.0.0", - "react-dom": "^19.0.0" + "react-dom": "^19.0.0", + "zustand": "^5.0.2" }, "devDependencies": { "@eslint/eslintrc": "^3", diff --git a/client/src/app/components/Event/AddEvent.tsx b/client/src/app/components/Event/AddEvent.tsx index 6458e04..e78dcef 100644 --- a/client/src/app/components/Event/AddEvent.tsx +++ b/client/src/app/components/Event/AddEvent.tsx @@ -1,25 +1,26 @@ import { useState } from "react"; import CheckBox from "../CheckBox"; -import { Task } from "./Event"; import { AddLarge } from "@carbon/icons-react"; import Button from "../Button"; +import zustand, { EventData, ISODate, Task, Tasks } from "../Zustand"; interface state { - date: Date; + date: string; description: string; - tasks: string[]; + tasks: Task[]; } -export default function AddEvent(props: { className?: string }) { - const availableTasks = Object.keys(Task).filter((tt) => isNaN(Number(tt))); - +export default function AddEvent(props: { + className?: string; + onClose: () => void; +}) { const [state, setState] = useState({ - date: new Date(), + date: ISODate(new Date()), description: "", tasks: [], }); - function toggleTask(task: string) { + function toggleTask(task: Task) { const new_tasks = state.tasks.slice(); const index = new_tasks.indexOf(task); @@ -36,26 +37,54 @@ export default function AddEvent(props: { className?: string }) { }); } + function addEvent() { + const eventData: EventData = { + date: state.date, + description: state.description, + id: zustand.getState().events.slice(-1)[0].id + 1, + tasks: {}, + }; + + // add all the tasks + state.tasks.forEach((task) => { + eventData.tasks[task] = undefined; + }); + + zustand.getState().addEvent(eventData); + + props.onClose(); + } + return (

Add Event

- - - {availableTasks.map((tt, ii) => ( -
- + console.log(e.target.value)} + /> + setState({ ...state, description: e.target.value })} + /> + {Tasks.map((task, ii) => ( +
toggleTask(task)} + className="flex cursor-default items-center gap-2" + > + + {task}
))} - diff --git a/client/src/app/components/Event/Event.tsx b/client/src/app/components/Event/Event.tsx index 992c39f..f6d2ff3 100644 --- a/client/src/app/components/Event/Event.tsx +++ b/client/src/app/components/Event/Event.tsx @@ -1,30 +1,22 @@ -export enum Task { - Audio, - Livestream, - Camera, - Light, - StreamAudio, -} - -export interface EventData { - id: number; - date: Date; - tasks: Partial>; - description: string; -} +import { EventData } from "../Zustand"; export default function Event(props: EventData) { return ( -
-

{props.date.toLocaleDateString()}

- {props.description !== undefined ?
{props.description}
: null} - +
+

{props.date}

+
{props.description}
+ +
+ {Object.entries(props.tasks).map(([task, person], ii) => ( - + ))} diff --git a/client/src/app/components/Overview.tsx b/client/src/app/components/Overview.tsx index 0b3202f..6dc1d00 100644 --- a/client/src/app/components/Overview.tsx +++ b/client/src/app/components/Overview.tsx @@ -1,39 +1,20 @@ "use client"; import { AddLarge, CloseLarge } from "@carbon/icons-react"; -import Event, { EventData } from "./Event/Event"; +import Event from "./Event/Event"; import { useState } from "react"; import AddEvent from "./Event/AddEvent"; import Button from "./Button"; +import zustand from "./Zustand"; export default function EventVolunteer() { - const events: EventData[] = [ - { - id: 0, - date: new Date("2025-01-05"), - tasks: { - "0": "Mark", - }, - description: "neuer Prädikant", - }, - { - id: 1, - date: new Date("2025-01-12"), - tasks: { - "0": "Mark", - "1": undefined, - }, - description: "", - }, - ]; - - const [showAddItemDialogue, setShowAddItemDialogue] = useState(true); + const [showAddItemDialogue, setShowAddItemDialogue] = useState(false); return (

Overview

- {events.map((ee) => Event(ee))} + {zustand.getState().events.map((ee) => Event(ee))}
+

Task assignment

+
- {Task[task as unknown as Task]} - {task} {person ?? missing}