Loader při zakládání Pizza day, mock data

This commit is contained in:
Martin Berka 2023-09-24 09:21:43 +02:00
parent 3f16485368
commit f5ecedb3b9
5 changed files with 778 additions and 7 deletions

View File

@ -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

View File

@ -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<HTMLInputElement>(null);
const [failure, setFailure] = useState<boolean>(false);
const [dayIndex, setDayIndex] = useState<number>();
const [loadingPizzaDay, setLoadingPizzaDay] = useState<boolean>(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<number | undefined>(dayIndex);
@ -353,6 +354,7 @@ function App() {
<ul>
<li>Oprava generování QR kódů pro Pizza day</li>
<li>Serverová validace času odchodu</li>
<li>Loader při zakládání Pizza day</li>
</ul>
</Alert>
{dayIndex != null &&
@ -464,9 +466,16 @@ function App() {
{!data.pizzaDay &&
<div style={{ textAlign: 'center' }}>
<p>Pro dnešní den není aktuálně založen Pizza day.</p>
<Button onClick={async () => {
await createPizzaDay();
}}>Založit Pizza day</Button>
{loadingPizzaDay ?
<span>
<FontAwesomeIcon icon={faGear} className='fa-spin' /> Zjišťujeme dostupné pizzy
</span>
:
<Button onClick={async () => {
setLoadingPizzaDay(true);
await createPizzaDay().then(() => setLoadingPizzaDay(false));
}}>Založit Pizza day</Button>
}
</div>
}
{data.pizzaDay &&

View File

@ -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<Pizza[]> {
export async function downloadPizzy(mock: boolean): Promise<Pizza[]> {
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);

View File

@ -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;
}

View File

@ -17,7 +17,8 @@ export async function getPizzaList(): Promise<Pizza[] | undefined> {
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);
}