From 363936641a31b0b508197d41bea1ce116931b5d4 Mon Sep 17 00:00:00 2001 From: Paweł Bernaciak Date: Sat, 20 Jan 2024 11:03:44 +0100 Subject: New element creator --- frontend/src/components/ElementCreator.tsx | 203 +++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 frontend/src/components/ElementCreator.tsx (limited to 'frontend/src/components/ElementCreator.tsx') diff --git a/frontend/src/components/ElementCreator.tsx b/frontend/src/components/ElementCreator.tsx new file mode 100644 index 0000000..61f5aba --- /dev/null +++ b/frontend/src/components/ElementCreator.tsx @@ -0,0 +1,203 @@ +import { FC, useEffect, useState } from 'react'; +import { + Element, + Color, + ColorBitmap, + ElementState, + ElementSuggestion, + ColorCode, +} from '../types'; +import toast from 'react-hot-toast'; +import ElementView from './ElementView'; +import { userStore } from '../stores'; + +interface ElementCreatorProps { + firstElementId: number | undefined; + secondElementId: number | undefined; + closeDialog: () => void; +} + +const ElementCreator: FC = ({ + firstElementId, + secondElementId, + closeDialog, +}) => { + const [elementName, setElementName] = useState(''); + const [color, setColor] = useState(Color.Air); + const [firstElement, setFirstElement] = useState(null); + const [secondElement, setSecondElement] = useState(null); + const setUser = userStore((store) => store.setUser); + + const fetchElement = async (elementId: number): Promise => { + const elementResponse = await fetch(`/api/element/${elementId}`); + return await elementResponse.json(); + }; + + useEffect(() => { + if (firstElementId == undefined || secondElementId == undefined) { + return; + } + + setElementName(''); + setColor(Color.Air); + + fetchElement(firstElementId).then((elem) => { + setFirstElement(elem); + }); + fetchElement(secondElementId).then((elem) => { + setSecondElement(elem); + }); + }, [firstElementId, secondElementId]); + + const handleNameChange = (e: React.ChangeEvent) => { + setElementName(e.target.value); + }; + + const createHandleColorClick = (color: Color) => { + return (e: React.MouseEvent) => { + e.preventDefault(); + setColor(color); + }; + }; + + const handleSubmitButton = async (e: React.MouseEvent) => { + e.preventDefault(); + + if (elementName == '') { + toast.error('No name selected'); + return; + } + if (!(color in Color)) { + toast.error('Bad color value'); + return; + } + + const request: ElementSuggestion = { + name: elementName, + iconBitmap: ColorBitmap[color], + firstElementId: firstElementId!, + secondElementId: secondElementId!, + }; + + console.log(request); + + const createVoteResponse = await fetch(`/api/suggestion/create`, { + method: 'POST', + credentials: 'include', + body: JSON.stringify(request), + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (createVoteResponse.status == 401) { + console.log('Session expired'); + toast.error('Your authorization has expired. You have to log in again.'); + localStorage.removeItem('user'); + setUser(undefined); + return; + } + console.log(createVoteResponse.status); + console.log('Vote started'); + closeDialog(); + }; + + return ( +
+
+ {firstElement != null && secondElement != null && ( + <> + {}} + isPreview={false} + interactive={false} + /> + + + + {}} + isPreview={false} + interactive={false} + /> + + + + + )} + {}} + isPreview={true} + interactive={false} + /> +
+
+ + +
+
+ {(Object.keys(Color) as Array) + .filter((color) => Number.isNaN(Number(color))) + .map((color) => { + return ( + + ); + })} +
+ +
+ ); +}; + +export default ElementCreator; -- cgit v1.2.3