import React, { useContext, useEffect, useMemo, useRef, useState } from 'react'; import 'bootstrap/dist/css/bootstrap.min.css'; import { EVENT_DISCONNECT, EVENT_MESSAGE, SocketContext } from './context/socket'; import { addPizza, createPizzaDay, deletePizzaDay, finishDelivery, finishOrder, getData, getFood, getPizzy, getQrUrl, lockPizzaDay, removePizza, unlockPizzaDay, updateChoice, updateNote } from './Api'; import { useAuth } from './context/auth'; import Login from './Login'; import { Locations, ClientData, Pizza, PizzaOrder, State, Order } from './Types'; import { Alert, Button, Col, Form, Row, Table } from 'react-bootstrap'; import Header from './components/Header'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' import PizzaOrderList from './components/PizzaOrderList'; import SelectSearch from 'react-select-search'; import 'react-select-search/style.css'; import './App.css'; import { SelectSearchOption } from 'react-select-search'; import { faTrashCan } from '@fortawesome/free-regular-svg-icons'; import { useBank } from './context/bank'; const EVENT_CONNECT = "connect" function App() { const auth = useAuth(); const bank = useBank(); const [isConnected, setIsConnected] = useState(false); const [data, setData] = useState(); const [food, setFood] = useState(); const [pizzy, setPizzy] = useState(); const [myOrder, setMyOrder] = useState(); const socket = useContext(SocketContext); const choiceRef = useRef(null); const poznamkaRef = 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) => { // 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, auth?.login, data?.choices]) // Reference na mojí objednávku useEffect(() => { if (data?.pizzaDay?.orders) { const myOrder = data.pizzaDay.orders.find(o => o.customer === auth?.login); setMyOrder(myOrder); } }, [data?.pizzaDay?.orders]) 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 removeChoice = async (key: string) => { if (auth?.login) { await updateChoice(auth.login, null); if (choiceRef?.current?.value) { choiceRef.current.value = ""; } } } const pizzaSuggestions = useMemo(() => { if (!pizzy) { return []; } const suggestions: SelectSearchOption[] = []; pizzy.forEach((pizza, index) => { const group: SelectSearchOption = { name: pizza.name, type: "group", items: [] } pizza.sizes.forEach((size, sizeIndex) => { const name = `${size.size} (${size.price} Kč)`; const value = `${index}|${sizeIndex}`; group.items?.push({ name, value }); }) suggestions.push(group); }) return suggestions; }, [pizzy]); const handlePizzaChange = async (value) => { if (auth?.login && pizzy) { const s = value.split('|'); const pizzaIndex = Number.parseInt(s[0]); const pizzaSizeIndex = Number.parseInt(s[1]); await addPizza(auth.login, pizzaIndex, pizzaSizeIndex); } } const handlePizzaDelete = async (pizzaOrder: PizzaOrder) => { if (auth?.login) { await removePizza(auth?.login, pizzaOrder); } } const handlePoznamkaChange = async () => { if (auth?.login) { if (poznamkaRef.current?.value && poznamkaRef.current.value.length > 100) { alert("Poznámka může mít maximálně 100 znaků"); return; } updateNote(auth.login, poznamkaRef.current?.value); } } // const addToCart = async () => { // TODO aktuálně nefunkční - nedokážeme poslat PHPSESSIONID cookie // if (data?.pizzaDay?.orders) { // for (const order of data?.pizzaDay?.orders) { // for (const pizzaOrder of order.pizzaList) { // const url = 'https://www.pizzachefie.cz/pridat.html'; // const payload = new URLSearchParams(); // payload.append('varId', pizzaOrder.varId.toString()); // await fetch(url, { // method: "POST", // mode: "no-cors", // cache: "no-cache", // credentials: "same-origin", // headers: { // 'Content-Type': 'application/x-www-form-urlencoded', // }, // body: payload, // }) // } // } // // TODO otevřít košík v nové záložce // } // } const renderFoodTable = (name, food) => { return

{name}

{food?.length > 0 ? food.map((f: any, index: number) => ) :

Hmmmmm podivné.... nic se nevrátilo

}
{f.amount} {f.name} {f.price}
} if (!auth || !auth.login) { return ; } if (!data || !isConnected || !food) { return
Načítám data...
} const noOrders = data?.pizzaDay?.orders?.length === 0; return ( <>
{data.isWeekend ?

Užívejte víkend :)

: <> Poslední změny:
  • Nová žárovka zatím funguje
  • Funkční generování a zobrazení QR kódů pro Pizza day
  • Možnost zadat k Pizza day objednávce poznámku

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.

{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} {p === auth.login && { removeChoice(key); }} title='Odstranit' className='trash-icon' icon={faTrashCan} />}
  • )}
:
Zatím nikdo nehlasoval...
}
{!data.pizzaDay &&

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

} {data.pizzaDay &&

Pizza day

{ data.pizzaDay.state === State.CREATED &&

Pizza Day je založen a spravován uživatelem {data.pizzaDay.creator}.
Můžete upravovat své objednávky.

{ data.pizzaDay.creator === auth.login && <> }
} { data.pizzaDay.state === State.LOCKED &&

Objednávky jsou uzamčeny uživatelem {data.pizzaDay.creator}

{data.pizzaDay.creator === auth.login && <> {/* */} }
} { data.pizzaDay.state === State.ORDERED &&

Pizzy byly objednány uživatelem {data.pizzaDay.creator}

{data.pizzaDay.creator === auth.login &&
}
} { data.pizzaDay.state === State.DELIVERED &&

Pizzy byly doručeny. Objednávku můžete uhradit pomocí QR kódu níže.

}
{data.pizzaDay.state === State.CREATED &&
Poznámka: { if (event.key === 'Enter') { handlePoznamkaChange(); } }} />
} { data.pizzaDay.state === State.DELIVERED && myOrder?.hasQr &&

QR platba

Částka: {myOrder.totalPrice} Kč
QR kód

Generování QR kódů je v experimentální fázi - doporučujeme si překontrolovat údaje před odesláním platby.

}
}
}
); } export default App;