import React, { useCallback, useEffect, useState } from "react"; import AccountBalanceWalletOutlinedIcon from "@mui/icons-material/AccountBalanceWalletOutlined"; import AddOutlinedIcon from "@mui/icons-material/AddOutlined"; import { Box, Button, Card as MuiCard, CardContent, Grid2 as Grid, Stack, TableBody, Typography, } from "@mui/material"; import { Table } from "../../../components/Table"; import TableHead from "../../../components/Table/TableHead"; import TableHeading from "../../../components/Table/TableHeading"; import TableCard from "../../../components/TableCard"; import TableCardHeader from "../../../components/TableCardHeader"; import Content from "../../../containers/Content"; import { useApi } from "../../../contexts/ApiContext"; import { useI18n } from "../../../contexts/I18nContext"; import { useUser } from "../../../contexts/UserContext"; import { ContribComponent, LimitOffset } from "../../../types"; import { hasPermission } from "../../../util/has_permission"; import { currencyFormat } from "../../pos/utils/amountToCurrencyString"; import WalletTransactionDialog from "../components/WalletTransactionDialog"; import WalletTransactionListItem from "../components/WalletTransactionListItem"; import { WalletAccount, WalletTransaction } from "../types/wallet"; const formatWalletAmount = (value: string | number, currency: string) => currencyFormat(Number(value), currency, "sv-SE", 2, "code"); const WalletCard: ContribComponent = ({ data: accounts, params, refresh }) => { const api = useApi(); const { t } = useI18n(); const { user } = useUser(); const { membership_number } = params as { membership_number: number }; const [selectedAccountId, setSelectedAccountId] = useState(accounts.at(0)?.id ?? ""); const [transactions, setTransactions] = useState([]); const [dialogOpen, setDialogOpen] = useState(false); useEffect(() => { if (!accounts.some((account) => account.id === selectedAccountId)) { setSelectedAccountId(accounts.at(0)?.id ?? ""); } }, [accounts, selectedAccountId]); const fetchTransactions = useCallback(async () => { if (!selectedAccountId) { setTransactions([]); return; } const operation = api.operations["wallet.contrib:member-wallet-transaction-list"]; if (!operation) { throw new Error('Invalid action "wallet.contrib:member-wallet-transaction-list".'); } const response = await operation.call({ params: { membership_number, account_id: selectedAccountId }, query: { page_size: "500" }, }); if (response.ok) { const page = (await response.json()) as LimitOffset; setTransactions(page.results); } }, [api, membership_number, selectedAccountId]); useEffect(() => { fetchTransactions(); }, [fetchTransactions]); const handleCreated = () => { refresh(); fetchTransactions(); }; const selectedAccount = accounts.find((account) => account.id === selectedAccountId); const canAdjust = hasPermission(user, "wallet.add_wallettransaction") && selectedAccount !== undefined; return ( {accounts.map((account) => { const selected = account.id === selectedAccountId; return ( setSelectedAccountId(account.id)} > {account.name} {formatWalletAmount(account.balance, account.currency)} {account.account_number} ); })} {accounts.length === 0 && ( {t("No wallet accounts registered")} )} } variant="contained" onClick={() => setDialogOpen(true)} > {t("Adjust balance")} ) : undefined } title={t("Wallet transactions")} /> {t("Date")} {t("Description")} {t("Account")} {t("Status")} {t("Amount")} {transactions.map((transaction) => ( ))}
{transactions.length === 0 && ( {t("No wallet transactions yet")} )}
{dialogOpen && selectedAccount && ( setDialogOpen(false)} onCreated={handleCreated} /> )}
); }; export default WalletCard;