feat: podpora ručního generování QR kódů pro platby
All checks were successful
ci/woodpecker/push/workflow Pipeline was successful
All checks were successful
ci/woodpecker/push/workflow Pipeline was successful
This commit is contained in:
@@ -6,9 +6,12 @@ import { useSettings, ThemePreference } from "../context/settings";
|
||||
import FeaturesVotingModal from "./modals/FeaturesVotingModal";
|
||||
import PizzaCalculatorModal from "./modals/PizzaCalculatorModal";
|
||||
import RefreshMenuModal from "./modals/RefreshMenuModal";
|
||||
import GenerateQrModal from "./modals/GenerateQrModal";
|
||||
import GenerateMockDataModal from "./modals/GenerateMockDataModal";
|
||||
import ClearMockDataModal from "./modals/ClearMockDataModal";
|
||||
import { useNavigate } from "react-router";
|
||||
import { STATS_URL } from "../AppRoutes";
|
||||
import { FeatureRequest, getVotes, updateVote } from "../../../types";
|
||||
import { FeatureRequest, getVotes, updateVote, LunchChoices } from "../../../types";
|
||||
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
|
||||
import { faSun, faMoon } from "@fortawesome/free-solid-svg-icons";
|
||||
|
||||
@@ -16,9 +19,17 @@ const CHANGELOG = [
|
||||
"Nový moderní design aplikace",
|
||||
"Oprava parsování Sladovnické a TechTower",
|
||||
"Možnost označit se jako objednávající u volby \"budu objednávat\"",
|
||||
"Možnost generovat QR kódy pro platby (i mimo Pizza day)",
|
||||
];
|
||||
|
||||
export default function Header() {
|
||||
const IS_DEV = process.env.NODE_ENV === 'development';
|
||||
|
||||
type Props = {
|
||||
choices?: LunchChoices;
|
||||
dayIndex?: number;
|
||||
};
|
||||
|
||||
export default function Header({ choices, dayIndex }: Props) {
|
||||
const auth = useAuth();
|
||||
const settings = useSettings();
|
||||
const navigate = useNavigate();
|
||||
@@ -27,6 +38,9 @@ export default function Header() {
|
||||
const [pizzaModalOpen, setPizzaModalOpen] = useState<boolean>(false);
|
||||
const [refreshMenuModalOpen, setRefreshMenuModalOpen] = useState<boolean>(false);
|
||||
const [changelogModalOpen, setChangelogModalOpen] = useState<boolean>(false);
|
||||
const [qrModalOpen, setQrModalOpen] = useState<boolean>(false);
|
||||
const [generateMockModalOpen, setGenerateMockModalOpen] = useState<boolean>(false);
|
||||
const [clearMockModalOpen, setClearMockModalOpen] = useState<boolean>(false);
|
||||
const [featureVotes, setFeatureVotes] = useState<FeatureRequest[] | undefined>([]);
|
||||
|
||||
// Zjistíme aktuální efektivní téma (pro zobrazení správné ikony)
|
||||
@@ -73,6 +87,18 @@ export default function Header() {
|
||||
setRefreshMenuModalOpen(false);
|
||||
}
|
||||
|
||||
const closeQrModal = () => {
|
||||
setQrModalOpen(false);
|
||||
}
|
||||
|
||||
const handleQrMenuClick = () => {
|
||||
if (!settings?.bankAccount || !settings?.holderName) {
|
||||
alert('Pro generování QR kódů je nutné mít v nastavení vyplněné číslo účtu a jméno držitele účtu.');
|
||||
return;
|
||||
}
|
||||
setQrModalOpen(true);
|
||||
}
|
||||
|
||||
const toggleTheme = () => {
|
||||
// Přepínáme mezi light a dark (ignorujeme system pro jednoduchost)
|
||||
const newTheme: ThemePreference = effectiveTheme === 'dark' ? 'light' : 'dark';
|
||||
@@ -169,8 +195,16 @@ export default function Header() {
|
||||
<NavDropdown.Item onClick={() => setRefreshMenuModalOpen(true)}>Přenačtení menu</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={() => setVotingModalOpen(true)}>Hlasovat o nových funkcích</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={() => setPizzaModalOpen(true)}>Pizza kalkulačka</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={handleQrMenuClick}>Generování QR kódů</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={() => navigate(STATS_URL)}>Statistiky</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={() => setChangelogModalOpen(true)}>Novinky</NavDropdown.Item>
|
||||
{IS_DEV && (
|
||||
<>
|
||||
<NavDropdown.Divider />
|
||||
<NavDropdown.Item onClick={() => setGenerateMockModalOpen(true)}>🔧 Generovat mock data</NavDropdown.Item>
|
||||
<NavDropdown.Item onClick={() => setClearMockModalOpen(true)}>🔧 Smazat data dne</NavDropdown.Item>
|
||||
</>
|
||||
)}
|
||||
<NavDropdown.Divider />
|
||||
<NavDropdown.Item onClick={auth?.logout}>Odhlásit se</NavDropdown.Item>
|
||||
</NavDropdown>
|
||||
@@ -180,6 +214,29 @@ export default function Header() {
|
||||
<RefreshMenuModal isOpen={refreshMenuModalOpen} onClose={closeRefreshMenuModal} />
|
||||
<FeaturesVotingModal isOpen={votingModalOpen} onClose={closeVotingModal} onChange={saveFeatureVote} initialValues={featureVotes} />
|
||||
<PizzaCalculatorModal isOpen={pizzaModalOpen} onClose={closePizzaModal} />
|
||||
{choices && settings?.bankAccount && settings?.holderName && (
|
||||
<GenerateQrModal
|
||||
isOpen={qrModalOpen}
|
||||
onClose={closeQrModal}
|
||||
choices={choices}
|
||||
bankAccount={settings.bankAccount}
|
||||
bankAccountHolder={settings.holderName}
|
||||
/>
|
||||
)}
|
||||
{IS_DEV && (
|
||||
<>
|
||||
<GenerateMockDataModal
|
||||
isOpen={generateMockModalOpen}
|
||||
onClose={() => setGenerateMockModalOpen(false)}
|
||||
currentDayIndex={dayIndex}
|
||||
/>
|
||||
<ClearMockDataModal
|
||||
isOpen={clearMockModalOpen}
|
||||
onClose={() => setClearMockModalOpen(false)}
|
||||
currentDayIndex={dayIndex}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
<Modal show={changelogModalOpen} onHide={() => setChangelogModalOpen(false)}>
|
||||
<Modal.Header closeButton>
|
||||
<Modal.Title><h2>Novinky</h2></Modal.Title>
|
||||
|
||||
Reference in New Issue
Block a user