import React, { useCallback, useContext, useEffect, useRef, useState } from 'react'; import 'bootstrap/dist/css/bootstrap.min.css'; import { EVENT_DISCONNECT, EVENT_MESSAGE, SocketContext } from './context/socket'; import { getData, getFood, updateChoice } from './Api'; import { useAuth } from './context/auth'; import Login from './Login'; import { Locations, ClientData } from './Types'; import { Alert, Col, Form, Row, Table } from 'react-bootstrap'; import Header from './components/Header'; import './App.css'; const EVENT_CONNECT = "connect" function App() { const auth = useAuth(); const [isConnected, setIsConnected] = useState(false); const [data, setData] = useState(); const [food, setFood] = useState(); // const [pizzy, setPizzy] = useState(); const socket = useContext(SocketContext); const choiceRef = useRef(null); // Prvotní načtení aktuálního stavu useEffect(() => { // getPizzy().then(pizzy => { // setPizzy(pizzy); // }); getData().then(data => { setData(data); }) getFood().then(food => { setFood(food); }) }, []); // Registrace socket eventů useEffect(() => { socket.on(EVENT_CONNECT, () => { // console.log("Connected!"); setIsConnected(true); }); socket.on(EVENT_DISCONNECT, () => { // console.log("Disconnected!"); setIsConnected(false); }); socket.on(EVENT_MESSAGE, (newData: ClientData) => { // const data: any = JSON.parse(payload); // console.log("Přijata nová data ze socketu", newData); setData(newData); }); return () => { socket.off(EVENT_CONNECT); socket.off(EVENT_DISCONNECT); socket.off(EVENT_MESSAGE); } }, [socket]); useEffect(() => { if (!auth || !auth.login) { return } // TODO tohle občas náhodně nezafunguje, nutno přepsat, viz https://medium.com/@teh_builder/ref-objects-inside-useeffect-hooks-eb7c15198780 if (data?.choices && choiceRef.current) { for (let entry of Object.entries(data.choices)) { if (entry[1].includes(auth.login)) { choiceRef.current.value = Object.values(Locations)[entry[0]] } } } }, [auth?.login, data?.choices, choiceRef?.current]) const changeChoice = async (event: React.ChangeEvent) => { const index = Object.values(Locations).indexOf(event.target.value as unknown as Locations); if (auth?.login) { await updateChoice(auth.login, index > -1 ? index : null); } } const renderFoodTable = (name, food) => { return

{name}

{food.map((f: any, index: number) => )}
{f.amount} {f.name} {f.price}
} if (!auth || !auth.login) { return ; } if (!data || !isConnected || !food) { return
Načítám data...
} // const pizzaDayExists = data?.state > 0; return ( <>
{data.isWeekend ?

Užívejte víkend :)

: <> Tvé zobrazované jméno je {auth.login}. Změnu můžeš provést v local storage prohlížeče.
Pro gamer move: Změň si své jméno na cizí. Můžeš pak libovolně měnit jejich volbu.

Dnes je {data.date}

{renderFoodTable('Sladovnická', food.sladovnicka)} {renderFoodTable('U Motlíků', food.uMotliku)} {renderFoodTable('TechTower', food.techTower)}

Jak to dnes vidíš s obědem?

Aktuálně je možné vybrat pouze jednu variantu. Vyber prázdnou položku pro odstranění.

{Object.keys(data.choices).length > 0 ? {Object.keys(data.choices).map((key: string, index: number) => )}
{Object.values(Locations)[Number(key)]}
    {data.choices[Number(key)].map((p: string, index: number) =>
  • {p}
  • )}
:
Zatím nikdo nehlasoval...
}
} {/* {!pizzaDayExists &&

Pro dnešní den není aktuálně založen Pizza day.

} {pizzaDayExists &&
} */} {/* */}
); } export default App;