diff --git a/client/src/components/Header.tsx b/client/src/components/Header.tsx index bbacc2f..adbb2d7 100644 --- a/client/src/components/Header.tsx +++ b/client/src/components/Header.tsx @@ -5,6 +5,7 @@ import SettingsModal from "./modals/SettingsModal"; import { useSettings } from "../context/settings"; import FeaturesVotingModal from "./modals/FeaturesVotingModal"; import PizzaCalculatorModal from "./modals/PizzaCalculatorModal"; +import RefreshMenuModal from "./modals/RefreshMenuModal"; import { useNavigate } from "react-router"; import { STATS_URL } from "../AppRoutes"; import { FeatureRequest, getVotes, updateVote } from "../../../types"; @@ -16,6 +17,7 @@ export default function Header() { const [settingsModalOpen, setSettingsModalOpen] = useState(false); const [votingModalOpen, setVotingModalOpen] = useState(false); const [pizzaModalOpen, setPizzaModalOpen] = useState(false); + const [refreshMenuModalOpen, setRefreshMenuModalOpen] = useState(false); const [featureVotes, setFeatureVotes] = useState([]); useEffect(() => { @@ -38,6 +40,10 @@ export default function Header() { setPizzaModalOpen(false); } + const closeRefreshMenuModal = () => { + setRefreshMenuModalOpen(false); + } + const isValidInteger = (str: string) => { str = str.trim(); if (!str) { @@ -114,6 +120,7 @@ export default function Header() { + diff --git a/client/src/components/modals/RefreshMenuModal.tsx b/client/src/components/modals/RefreshMenuModal.tsx new file mode 100644 index 0000000..70f2785 --- /dev/null +++ b/client/src/components/modals/RefreshMenuModal.tsx @@ -0,0 +1,105 @@ +import { useRef, useState } from "react"; +import { Modal, Button, Alert } from "react-bootstrap"; + +type Props = { + isOpen: boolean; + onClose: () => void; +}; + +/** Modální dialog pro přenačtení menu z restaurací. */ +export default function RefreshMenuModal({ isOpen, onClose }: Readonly) { + const refreshPassRef = useRef(null); + const refreshTypeRef = useRef(null); + const [refreshLoading, setRefreshLoading] = useState(false); + const [refreshMessage, setRefreshMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null); + + const handleRefresh = async () => { + const password = refreshPassRef.current?.value; + const type = refreshTypeRef.current?.value; + if (!password || !type) { + setRefreshMessage({ type: 'error', text: 'Zadejte heslo a typ refresh.' }); + return; + } + + setRefreshLoading(true); + setRefreshMessage(null); + + try { + const res = await fetch(`/api/food/refresh?type=${type}&heslo=${encodeURIComponent(password)}`); + const data = await res.json(); + if (res.ok) { + setRefreshMessage({ type: 'success', text: 'Uspesny fetch' }); + if (refreshPassRef.current) { + // Clean hesla xd + refreshPassRef.current.value = ''; + } + } else { + setRefreshMessage({ type: 'error', text: data.error || 'Chyba při obnovování jídelníčku.' }); + } + } catch (error) { + console.error('Error refreshing menu:', error); + setRefreshMessage({ type: 'error', text: 'Chyba při obnovování jídelníčku.' }); + } finally { + setRefreshLoading(false); + } + }; + + const handleClose = () => { + setRefreshMessage(null); + onClose(); + }; + + return ( + + +

Přenačtení menu

+
+ +

Ruční refresh dat z restaurací.

+ + {refreshMessage && ( + + {refreshMessage.text} + + )} + +
+ Heslo: e.stopPropagation()} + /> +
+ +
+ Typ refreshe: +
+ + +
+ + + +
+ ); +} \ No newline at end of file diff --git a/client/src/components/modals/SettingsModal.tsx b/client/src/components/modals/SettingsModal.tsx index cd3ab81..4c4ba07 100644 --- a/client/src/components/modals/SettingsModal.tsx +++ b/client/src/components/modals/SettingsModal.tsx @@ -1,5 +1,5 @@ -import { useRef, useState } from "react"; -import { Modal, Button, Alert } from "react-bootstrap" +import { useRef } from "react"; +import { Modal, Button } from "react-bootstrap" import { useSettings } from "../../context/settings"; type Props = { @@ -15,41 +15,6 @@ export default function SettingsModal({ isOpen, onClose, onSave }: Readonly(null); const hideSoupsRef = useRef(null); - // Pro refresh jidel - const refreshPassRef = useRef(null); - const refreshTypeRef = useRef(null); - const [refreshLoading, setRefreshLoading] = useState(false); - const [refreshMessage, setRefreshMessage] = useState<{ type: 'success' | 'error', text: string } | null>(null); - - const handleRefresh = async () => { - const password = refreshPassRef.current?.value; - const type = refreshTypeRef.current?.value; - if (!password || !type) { - setRefreshMessage({ type: 'error', text: 'Zadejte heslo a typ refresh.' }); - return; - } - - setRefreshLoading(true); - setRefreshMessage(null); - - try { - const res = await fetch(`/api/food/refresh?type=${type}&heslo=${encodeURIComponent(password)}`); - const data = await res.json(); - if (res.ok) { - setRefreshMessage({ type: 'success', text: 'Uspesny fetch' }); - if (refreshPassRef.current) { - // Clean hesla xd - refreshPassRef.current.value = ''; - } - } else { - setRefreshMessage({ type: 'error', text: data.error || 'Chyba při obnovování jídelníčku.' }); - } - } catch (error) { } - finally { - setRefreshLoading(false); - } - }; - return

Nastavení

@@ -59,48 +24,6 @@ export default function SettingsModal({ isOpen, onClose, onSave }: Readonly Skrýt polévky -
-

Obnovit jídelníček

-

Ruční refresh dat z restaurací.

- - {refreshMessage && ( - - {refreshMessage.text} - - )} - -
- Heslo: e.stopPropagation()} - /> -
- -
- Typ refreshe: -
- - -

Bankovní účet

Nastavením čísla účtu umožníte automatické generování QR kódů pro úhradu za vámi provedené objednávky v rámci Pizza day.
Pokud vaše číslo účtu neobsahuje předčíslí, je možné ho zcela vynechat.

Číslo účtu není ukládáno na serveru, posílá se na něj pouze za účelem vygenerování QR kódů.