91 lines
3.3 KiB
TypeScript
91 lines
3.3 KiB
TypeScript
import { useState } from "react";
|
|
import { Navbar, Nav, NavDropdown } from "react-bootstrap";
|
|
import { useAuth } from "../context/auth";
|
|
import BankAccountModal from "./modals/BankAccountModal";
|
|
import { useBank } from "../context/bank";
|
|
|
|
|
|
export default function Header() {
|
|
const auth = useAuth();
|
|
const bank = useBank();
|
|
const [modalOpen, setModalOpen] = useState<boolean>(false);
|
|
|
|
const openBankSettings = () => {
|
|
setModalOpen(true);
|
|
}
|
|
|
|
const closeModal = () => {
|
|
setModalOpen(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 save = (bankAccountNumber?: string, bankAccountHolderName?: string) => {
|
|
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
|
|
}
|
|
}
|
|
bank?.setBankAccountNumber(bankAccountNumber);
|
|
bank?.setBankAccountHolderName(bankAccountHolderName);
|
|
closeModal();
|
|
}
|
|
|
|
return <Navbar variant='dark' expand="lg">
|
|
<Navbar.Brand>Luncher</Navbar.Brand>
|
|
<Navbar.Toggle aria-controls="basic-navbar-nav" />
|
|
<Navbar.Collapse id="basic-navbar-nav">
|
|
<Nav className="nav">
|
|
<NavDropdown align="end" title={auth?.login} id="basic-nav-dropdown">
|
|
<NavDropdown.Item onClick={openBankSettings}>Nastavit číslo účtu</NavDropdown.Item>
|
|
<NavDropdown.Item onClick={auth?.logout}>Odhlásit se</NavDropdown.Item>
|
|
</NavDropdown>
|
|
</Nav>
|
|
</Navbar.Collapse>
|
|
<BankAccountModal isOpen={modalOpen} onClose={closeModal} onSave={save} />
|
|
</Navbar>
|
|
} |