import { useEffect, useState } from "react"; import { Navbar, Nav, NavDropdown } from "react-bootstrap"; import { useAuth } from "../context/auth"; import SettingsModal from "./modals/SettingsModal"; import { useSettings } from "../context/settings"; import FeaturesVotingModal from "./modals/FeaturesVotingModal"; import { FeatureRequest } from "../../../types"; import { errorHandler } from "../api/Api"; import { getFeatureVotes, updateFeatureVote } from "../api/VotingApi"; import PizzaCalculatorModal from "./modals/PizzaCalculatorModal"; export default function Header() { const auth = useAuth(); const settings = useSettings(); const [settingsModalOpen, setSettingsModalOpen] = useState(false); const [votingModalOpen, setVotingModalOpen] = useState(false); const [pizzaModalOpen, setPizzaModalOpen] = useState(false); const [featureVotes, setFeatureVotes] = useState([]); useEffect(() => { if (auth?.login) { getFeatureVotes().then(votes => { setFeatureVotes(votes); }) } }, [auth?.login]); const closeSettingsModal = () => { setSettingsModalOpen(false); } const closeVotingModal = () => { setVotingModalOpen(false); } const closePizzaModal = () => { setPizzaModalOpen(false); } const isValidInteger = (str: string) => { str = str.trim(); if (!str) { return false; } str = str.replace(/^0+/, "") || "0"; const n = Math.floor(Number(str)); return n !== Infinity && String(n) === str && n >= 0; } const saveSettings = (bankAccountNumber?: string, bankAccountHolderName?: string, hideSoupsOption?: boolean) => { if (bankAccountNumber) { try { // Validace kódu banky if (bankAccountNumber.indexOf('/') < 0) { throw Error("Číslo účtu neobsahuje lomítko/kód banky") } const split = bankAccountNumber.split("/"); if (split[1].length !== 4) { throw Error("Kód banky musí být 4 číslice") } if (!isValidInteger(split[1])) { throw Error("Kód banky není číslo") } // Validace čísla a předčíslí let cislo = split[0]; if (cislo.indexOf('-') > 0) { cislo = cislo.replace('-', ''); } if (!isValidInteger(cislo)) { throw Error("Předčíslí nebo číslo účtu neobsahuje pouze číslice") } if (cislo.length < 16) { cislo = cislo.padStart(16, '0'); } let sum = 0; for (var i = 0; i < cislo.length; i++) { const char = cislo.charAt(i); const order = (cislo.length - 1) - i; const weight = (2 ** order) % 11; sum += Number.parseInt(char) * weight } if (sum % 11 !== 0) { throw Error("Číslo účtu je neplatné") } } catch (e: any) { alert(e.message) return } } settings?.setBankAccountNumber(bankAccountNumber); settings?.setBankAccountHolderName(bankAccountHolderName); settings?.setHideSoupsOption(hideSoupsOption); closeSettingsModal(); } const saveFeatureVote = async (option: FeatureRequest, active: boolean) => { await errorHandler(() => updateFeatureVote(option, active)); const votes = [...featureVotes]; if (active) { votes.push(option); } else { votes.splice(votes.indexOf(option), 1); } setFeatureVotes(votes); } return Luncher }