"use client"; import React from "react"; import { Box, VStack, HStack, Text, Heading, Button, useDisclosure, Modal, ModalOverlay, ModalContent, ModalHeader, ModalCloseButton, ModalBody, ModalFooter, Badge, Progress, Table, Thead, Tr, Th, Tbody, Td, Code, } from "@chakra-ui/react"; import { useTransaction } from "../../contexts/TransactionContext"; import { TransactionRequestStatus } from "../../types"; import { formatEther } from "ethers/lib/utils"; export default function TransactionApproval() { const { pendingTransactions, approveTransaction, rejectTransaction, executeTransaction } = useTransaction(); const { isOpen, onOpen, onClose } = useDisclosure(); const [selectedTx, setSelectedTx] = React.useState(null); const selectedTransaction = pendingTransactions.find((ptx) => ptx.id === selectedTx); const handleApprove = async () => { if (!selectedTx) return; // Get approver address from active wallet or use a placeholder // In production, this would get from the connected wallet const approver = typeof window !== "undefined" && (window as any).ethereum ? await (window as any).ethereum.request({ method: "eth_accounts" }).then((accounts: string[]) => accounts[0]) : "0x0000000000000000000000000000000000000000"; await approveTransaction(selectedTx, approver || "0x0000000000000000000000000000000000000000"); onClose(); }; const handleReject = async () => { if (!selectedTx) return; const approver = typeof window !== "undefined" && (window as any).ethereum ? await (window as any).ethereum.request({ method: "eth_accounts" }).then((accounts: string[]) => accounts[0]) : "0x0000000000000000000000000000000000000000"; await rejectTransaction(selectedTx, approver || "0x0000000000000000000000000000000000000000"); onClose(); }; const handleExecute = async () => { if (!selectedTx) return; const hash = await executeTransaction(selectedTx); if (hash) { // Transaction executed successfully } onClose(); }; return ( Pending Transactions {pendingTransactions.length === 0 ? ( No pending transactions ) : ( {pendingTransactions.map((ptx) => ( ))}
ID To Value Approvals Status Actions
{ptx.id.slice(0, 10)}... {ptx.transaction.to.slice(0, 10)}... {parseFloat(formatEther(ptx.transaction.value || "0")).toFixed(4)} ETH {ptx.approvalCount} / {ptx.requiredApprovals} {ptx.transaction.status} {ptx.canExecute && ( )}
)} Transaction Details {selectedTransaction && ( Transaction ID {selectedTransaction.id} To {selectedTransaction.transaction.to} Value {parseFloat(formatEther(selectedTransaction.transaction.value || "0")).toFixed( 6 )}{" "} ETH Data {selectedTransaction.transaction.data || "0x"} Approvals {selectedTransaction.approvalCount} / {selectedTransaction.requiredApprovals} Execution Method {selectedTransaction.transaction.method} )} {selectedTransaction && !selectedTransaction.canExecute && ( <> )}
); }