From f5ecedb3b94606765649cdb9f03773b189183b90 Mon Sep 17 00:00:00 2001 From: Martin Berka Date: Sun, 24 Sep 2023 09:21:43 +0200 Subject: [PATCH] =?UTF-8?q?Loader=20p=C5=99i=20zakl=C3=A1d=C3=A1n=C3=AD=20?= =?UTF-8?q?Pizza=20day,=20mock=20data?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- client/src/App.tsx | 17 +- server/src/chefie.ts | 9 +- server/src/mock.ts | 754 +++++++++++++++++++++++++++++++++++++++++++ server/src/pizza.ts | 3 +- 5 files changed, 778 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 6cf86f7..7795d57 100644 --- a/README.md +++ b/README.md @@ -64,8 +64,8 @@ Aplikace sestává ze tří modulů. - [ ] Pizzy se samy budou při naklikání přidávat do košíku - [ ] Nutno nejprve vyřešit předávání PHPSESSIONID cookie na pizzachefie.cz pomocí fetch() - [ ] Ceny krabic za pizzu jsou napevno v kódu - problém, pokud se někdy změní - - [ ] Prvotní načtení pizz při založení Pizza Day trvá a nic se během toho nezobrazuje (např. loader) - [ ] Umožnit u Pizza day ručně připočíst cenu za přísady + - [X] Prvotní načtení pizz při založení Pizza Day trvá a nic se během toho nezobrazuje (např. loader) - [X] Po doručení zobrazit komu zaplatit (kdo objednával) - [x] Zbytečně nescrapovat každý den pizzy z Pizza Chefie, dokud není založen Pizza Day - [x] Umožnit uzamčení objednávek zakladatelem diff --git a/client/src/App.tsx b/client/src/App.tsx index dfa2e5e..ec30fb1 100644 --- a/client/src/App.tsx +++ b/client/src/App.tsx @@ -16,7 +16,7 @@ import { faCircleCheck, faTrashCan } from '@fortawesome/free-regular-svg-icons'; import { useBank } from './context/bank'; import { ClientData, Restaurants, Food, Order, Locations, PizzaOrder, PizzaDayState, FoodChoices, Menu } from './types'; import Footer from './components/Footer'; -import { faChainBroken, faChevronLeft, faChevronRight, faSatelliteDish, faSearch } from '@fortawesome/free-solid-svg-icons'; +import { faChainBroken, faChevronLeft, faChevronRight, faGear, faSatelliteDish, faSearch } from '@fortawesome/free-solid-svg-icons'; import Loader from './components/Loader'; const EVENT_CONNECT = "connect" @@ -37,6 +37,7 @@ function App() { const poznamkaRef = useRef(null); const [failure, setFailure] = useState(false); const [dayIndex, setDayIndex] = useState(); + const [loadingPizzaDay, setLoadingPizzaDay] = useState(false); // Prazvláštní workaround, aby socket.io listener viděl aktuální hodnotu // https://medium.com/@kishorkrishna/cant-access-latest-state-inside-socket-io-listener-heres-how-to-fix-it-1522a5abebdb const dayIndexRef = useRef(dayIndex); @@ -353,6 +354,7 @@ function App() {
  • Oprava generování QR kódů pro Pizza day
  • Serverová validace času odchodu
  • +
  • Loader při zakládání Pizza day
{dayIndex != null && @@ -464,9 +466,16 @@ function App() { {!data.pizzaDay &&

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

- + {loadingPizzaDay ? + + Zjišťujeme dostupné pizzy + + : + + }
} {data.pizzaDay && diff --git a/server/src/chefie.ts b/server/src/chefie.ts index 2d3df80..b9afba8 100644 --- a/server/src/chefie.ts +++ b/server/src/chefie.ts @@ -1,5 +1,6 @@ import axios from 'axios'; import { load } from 'cheerio'; +import { getPizzaListMock } from './mock'; // TODO přesunout do types type PizzaSize = { @@ -35,8 +36,14 @@ const boxPrices: { [key: string]: number } = { /** * Stáhne a scrapne aktuální pizzy ze stránek Pizza Chefie. + * + * @param mock zda vrátit pouze mock data */ -export async function downloadPizzy(): Promise { +export async function downloadPizzy(mock: boolean): Promise { + if (mock) { + // Záměrné zpoždění pro testování + return new Promise((resolve) => setTimeout(() => resolve(getPizzaListMock()), 3000)); + } // Získáme seznam pizz const html = await axios.get(pizzyUrl).then(res => res.data); const $ = load(html); diff --git a/server/src/mock.ts b/server/src/mock.ts index 9444a91..d32d980 100644 --- a/server/src/mock.ts +++ b/server/src/mock.ts @@ -370,6 +370,756 @@ const MOCK_DATA = { ] } +// Mockovací data pro Pizza day +const MOCK_PIZZA_LIST = [ + { + name: "Margherita", + ingredients: [ + "tomato", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 1, + size: "30cm", + pizzaPrice: 138, + boxPrice: 13, + price: 151 + }, + { + varId: 2, + size: "35cm", + pizzaPrice: 166, + boxPrice: 15, + price: 181 + }, + { + varId: 3, + size: "40cm", + pizzaPrice: 223, + boxPrice: 18, + price: 241 + }, + { + varId: 4, + size: "50cm", + pizzaPrice: 306, + boxPrice: 25, + price: 331 + } + ] + }, + { + name: "Salami", + ingredients: [ + "tomato", + "pikantní salám", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 6, + size: "30cm", + pizzaPrice: 142, + boxPrice: 13, + price: 155 + }, + { + varId: 7, + size: "35cm", + pizzaPrice: 172, + boxPrice: 15, + price: 187 + }, + { + varId: 8, + size: "40cm", + pizzaPrice: 233, + boxPrice: 18, + price: 251 + }, + { + varId: 9, + size: "50cm", + pizzaPrice: 316, + boxPrice: 25, + price: 341 + } + ] + }, + { + name: "Sausage", + ingredients: [ + "tomato", + "klobása", + "pálivé papričky", + "česnek", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 10, + size: "30cm", + pizzaPrice: 142, + boxPrice: 13, + price: 155 + }, + { + varId: 11, + size: "35cm", + pizzaPrice: 172, + boxPrice: 15, + price: 187 + }, + { + varId: 12, + size: "40cm", + pizzaPrice: 233, + boxPrice: 18, + price: 251 + }, + { + varId: 13, + size: "50cm", + pizzaPrice: 316, + boxPrice: 25, + price: 341 + } + ] + }, + { + name: "Classic Ham", + ingredients: [ + "tomato", + "šunka výběrová", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 14, + size: "30cm", + pizzaPrice: 142, + boxPrice: 13, + price: 155 + }, + { + varId: 15, + size: "35cm", + pizzaPrice: 172, + boxPrice: 15, + price: 187 + }, + { + varId: 16, + size: "40cm", + pizzaPrice: 233, + boxPrice: 18, + price: 251 + }, + { + varId: 17, + size: "50cm", + pizzaPrice: 294, + boxPrice: 25, + price: 319 + } + ] + }, + { + name: "Quattro Formaggi", + ingredients: [ + "tomato", + "niva", + "mozzarella", + "uzený sýr", + "eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 22, + size: "30cm", + pizzaPrice: 162, + boxPrice: 13, + price: 175 + }, + { + varId: 23, + size: "35cm", + pizzaPrice: 186, + boxPrice: 15, + price: 201 + }, + { + varId: 24, + size: "40cm", + pizzaPrice: 263, + boxPrice: 18, + price: 281 + }, + { + varId: 25, + size: "50cm", + pizzaPrice: 346, + boxPrice: 25, + price: 371 + } + ] + }, + { + name: "Hawai", + ingredients: [ + "tomato", + "šunka výběrová", + "ananas", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 26, + size: "30cm", + pizzaPrice: 162, + boxPrice: 13, + price: 175 + }, + { + varId: 27, + size: "35cm", + pizzaPrice: 186, + boxPrice: 15, + price: 201 + }, + { + varId: 28, + size: "40cm", + pizzaPrice: 263, + boxPrice: 18, + price: 281 + }, + { + varId: 29, + size: "50cm", + pizzaPrice: 346, + boxPrice: 25, + price: 371 + } + ] + }, + { + name: "Mushroom", + ingredients: [ + "tomato", + "žampiony", + "zakysaná smetana", + "pórek", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 30, + size: "30cm", + pizzaPrice: 162, + boxPrice: 13, + price: 175 + }, + { + varId: 31, + size: "35cm", + pizzaPrice: 186, + boxPrice: 15, + price: 201 + }, + { + varId: 32, + size: "40cm", + pizzaPrice: 263, + boxPrice: 18, + price: 281 + }, + { + varId: 33, + size: "50cm", + pizzaPrice: 346, + boxPrice: 25, + price: 371 + } + ] + }, + { + name: "Mexico", + ingredients: [ + "tomato", + "pikantní salám", + "slanina", + "pálivé papričky", + "červená cibule", + "zelené olivy", + "kukuřice", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 34, + size: "30cm", + pizzaPrice: 162, + boxPrice: 13, + price: 175 + }, + { + varId: 35, + size: "35cm", + pizzaPrice: 186, + boxPrice: 15, + price: 201 + }, + { + varId: 36, + size: "40cm", + pizzaPrice: 263, + boxPrice: 18, + price: 281 + }, + { + varId: 37, + size: "50cm", + pizzaPrice: 346, + boxPrice: 25, + price: 371 + } + ] + }, + { + name: "Bismark", + ingredients: [ + "tomato", + "slanina", + "vejce", + "pórek", + "mozzarella, eidam 40%", + "sýr" + ], + sizes: [ + { + varId: 38, + size: "30cm", + pizzaPrice: 162, + boxPrice: 13, + price: 175 + }, + { + varId: 39, + size: "35cm", + pizzaPrice: 186, + boxPrice: 15, + price: 201 + }, + { + varId: 40, + size: "40cm", + pizzaPrice: 263, + boxPrice: 18, + price: 281 + }, + { + varId: 41, + size: "50cm", + pizzaPrice: 346, + boxPrice: 25, + price: 371 + } + ] + }, + { + name: "Tuna", + ingredients: [ + "tomato", + "tuňák", + "červená cibule", + "černé olivy", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 42, + size: "30cm", + pizzaPrice: 172, + boxPrice: 13, + price: 185 + }, + { + varId: 43, + size: "35cm", + pizzaPrice: 212, + boxPrice: 15, + price: 227 + }, + { + varId: 44, + size: "40cm", + pizzaPrice: 293, + boxPrice: 18, + price: 311 + }, + { + varId: 45, + size: "50cm", + pizzaPrice: 376, + boxPrice: 25, + price: 401 + } + ] + }, + { + name: "Spinach", + ingredients: [ + "listový špenát", + "kuřecí maso", + "smetana", + "mozzarella, eidam 40%", + "česnek", + "goldi" + ], + sizes: [ + { + varId: 46, + size: "30cm", + pizzaPrice: 182, + boxPrice: 13, + price: 195 + }, + { + varId: 47, + size: "35cm", + pizzaPrice: 222, + boxPrice: 15, + price: 237 + }, + { + varId: 48, + size: "40cm", + pizzaPrice: 303, + boxPrice: 18, + price: 321 + }, + { + varId: 49, + size: "50cm", + pizzaPrice: 386, + boxPrice: 25, + price: 411 + } + ] + }, + { + name: "Persia", + ingredients: [ + "smetana", + "česnek", + "slanina", + "červené cibule", + "paprika mix", + "černé olivy", + "kuřecí maso", + "2 druhy omáček", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 50, + size: "30cm", + pizzaPrice: 182, + boxPrice: 13, + price: 195 + }, + { + varId: 51, + size: "35cm", + pizzaPrice: 222, + boxPrice: 15, + price: 237 + }, + { + varId: 52, + size: "40cm", + pizzaPrice: 303, + boxPrice: 18, + price: 321 + }, + { + varId: 53, + size: "50cm", + pizzaPrice: 396, + boxPrice: 25, + price: 421 + } + ] + }, + { + name: "BBQ Dream", + ingredients: [ + "tomato", + "slanina", + "paprika mix", + "kuřecí maso", + "červená cibule", + "BBQ omáčka", + "mozzarella, eidam 40%" + ], + sizes: [ + { + varId: 54, + size: "30cm", + pizzaPrice: 182, + boxPrice: 13, + price: 195 + }, + { + varId: 55, + size: "35cm", + pizzaPrice: 222, + boxPrice: 15, + price: 237 + }, + { + varId: 56, + size: "40cm", + pizzaPrice: 303, + boxPrice: 18, + price: 321 + }, + { + varId: 57, + size: "50cm", + pizzaPrice: 396, + boxPrice: 25, + price: 421 + } + ] + }, + { + name: "Cranberries", + ingredients: [ + "niva", + "uzený sýr", + "kuřecí maso", + "brusinky", + "goldi", + "mozzarella, eidam 40%", + "smetana", + "česnek" + ], + sizes: [ + { + varId: 58, + size: "30cm", + pizzaPrice: 182, + boxPrice: 13, + price: 195 + }, + { + varId: 59, + size: "35cm", + pizzaPrice: 222, + boxPrice: 15, + price: 237 + }, + { + varId: 60, + size: "40cm", + pizzaPrice: 303, + boxPrice: 18, + price: 321 + }, + { + varId: 61, + size: "50cm", + pizzaPrice: 396, + boxPrice: 25, + price: 421 + } + ] + }, + { + name: "Vegetarian", + ingredients: [ + "tomato", + "listový špenát", + "rajčata", + "černé olivy", + "kukuřice", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 62, + size: "30cm", + pizzaPrice: 188, + boxPrice: 13, + price: 201 + }, + { + varId: 63, + size: "35cm", + pizzaPrice: 226, + boxPrice: 15, + price: 241 + }, + { + varId: 64, + size: "40cm", + pizzaPrice: 313, + boxPrice: 18, + price: 331 + }, + { + varId: 65, + size: "50cm", + pizzaPrice: 426, + boxPrice: 25, + price: 451 + } + ] + }, + { + name: "Spicy Devil", + ingredients: [ + "tomato", + "červené cibule", + "kuřecí maso", + "pálivé papričky", + "parmská šunka", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 66, + size: "30cm", + pizzaPrice: 188, + boxPrice: 13, + price: 201 + }, + { + varId: 67, + size: "35cm", + pizzaPrice: 226, + boxPrice: 15, + price: 241 + }, + { + varId: 68, + size: "40cm", + pizzaPrice: 313, + boxPrice: 18, + price: 331 + }, + { + varId: 69, + size: "50cm", + pizzaPrice: 426, + boxPrice: 25, + price: 451 + } + ] + }, + { + name: "Dimi's pizza", + ingredients: [ + "brokolice", + "slanina", + "kuřecí maso", + "kukuřice", + "kari", + "mozzarella, eidam 40%", + "smetana", + "červená cibule", + "goldi" + ], + sizes: [ + { + varId: 309, + size: "30cm", + pizzaPrice: 182, + boxPrice: 13, + price: 195 + }, + { + varId: 310, + size: "35cm", + pizzaPrice: 222, + boxPrice: 15, + price: 237 + }, + { + varId: 311, + size: "40cm", + pizzaPrice: 303, + boxPrice: 18, + price: 321 + }, + { + varId: 312, + size: "50cm", + pizzaPrice: 396, + boxPrice: 25, + price: 421 + } + ] + }, + { + name: "Texas Pulled Pork", + ingredients: [ + "tomato", + "trhané vepřové maso", + "kukuřice", + "jalapeňos", + "BBQ omáčka", + "mozzarella, eidam 40%", + "goldi" + ], + sizes: [ + { + varId: 394, + size: "30cm", + pizzaPrice: 188, + boxPrice: 13, + price: 201 + }, + { + varId: 395, + size: "35cm", + pizzaPrice: 226, + boxPrice: 15, + price: 241 + }, + { + varId: 396, + size: "40cm", + pizzaPrice: 313, + boxPrice: 18, + price: 331 + }, + { + varId: 397, + size: "50cm", + pizzaPrice: 426, + boxPrice: 25, + price: 451 + } + ] + } +] + export const getTodayMock = () => { return '2023-05-31'; // středa } @@ -384,4 +1134,8 @@ export const getMenuUMotlikuMock = (date: Date) => { export const getMenuTechTowerMock = (date: Date) => { return MOCK_DATA['techTower'][getDayOfWeekIndex(date)]; +} + +export const getPizzaListMock = () => { + return MOCK_PIZZA_LIST; } \ No newline at end of file diff --git a/server/src/pizza.ts b/server/src/pizza.ts index c806fd3..3444997 100644 --- a/server/src/pizza.ts +++ b/server/src/pizza.ts @@ -17,7 +17,8 @@ export async function getPizzaList(): Promise { const today = formatDate(getToday()); let clientData: ClientData = await storage.getData(today); if (!clientData.pizzaList) { - clientData = await savePizzaList(await downloadPizzy()); + const mock = process.env.MOCK_DATA === 'true'; + clientData = await savePizzaList(await downloadPizzy(mock)); } return Promise.resolve(clientData.pizzaList); }