import { COSMOS_MAINNET_CHAINS, TCosmosChain } from '@/data/COSMOSData' import { EIP155_CHAINS, TEIP155Chain } from '@/data/EIP155Data' import ModalStore from '@/store/ModalStore' import { cosmosAddresses } from '@/utils/CosmosWalletUtil' import { eip155Addresses } from '@/utils/EIP155WalletUtil' import { isCosmosChain, isEIP155Chain, truncate } from '@/utils/HelperUtil' import { walletConnectClient } from '@/utils/WalletConnectUtil' import { Avatar, Button, Card, Checkbox, Col, Container, Divider, Link, Modal, Row, Text } from '@nextui-org/react' import { Fragment, useState } from 'react' export default function SessionProposalModal() { const [selectedEIP155, setSelectedEip155] = useState([]) const [selectedCosmos, setSelectedCosmos] = useState([]) // Get proposal data and wallet address from store const proposal = ModalStore.state.data?.proposal // Ensure proposal is defined if (!proposal) { return Missing proposal data } // Get required proposal data const { proposer, permissions, relay } = proposal const { icons, name, url } = proposer.metadata const { chains } = permissions.blockchain const { methods } = permissions.jsonrpc const { protocol } = relay // Add / remove address from EIP155 selection function onSelectEIP155(address: string) { if (selectedEIP155.includes(address)) { const newAddresses = selectedEIP155.filter(a => a !== address) setSelectedEip155(newAddresses) } else { setSelectedEip155([...selectedEIP155, address]) } } // Add / remove address from Cosmos selection function onSelectCosmos(address: string) { if (selectedCosmos.includes(address)) { const newAddresses = selectedCosmos.filter(a => a !== address) setSelectedCosmos(newAddresses) } else { setSelectedCosmos([...selectedCosmos, address]) } } // Hanlde approve action async function onApprove() { if (proposal) { const accounts: string[] = [] chains.forEach(chain => { if (isEIP155Chain(chain)) { selectedEIP155.forEach(address => { accounts.push(`${chain}:${address}`) }) } else if (isCosmosChain(chain)) { cosmosAddresses.forEach(address => { accounts.push(`${chain}:${address}`) }) } }) const response = { state: { accounts } } await walletConnectClient.approve({ proposal, response }) } ModalStore.close() } // Hanlde reject action async function onReject() { if (proposal) { await walletConnectClient.reject({ proposal }) } ModalStore.close() } return ( Session Proposal {name} {url} Blockchains {chains .map( chain => EIP155_CHAINS[chain as TEIP155Chain]?.name ?? COSMOS_MAINNET_CHAINS[chain as TCosmosChain]?.name ?? chain ) .join(', ')} Methods {methods.map(method => method).join(', ')} Relay Protocol {protocol} {chains.map(chain => { if (isEIP155Chain(chain)) { return ( Select EIP155 Accounts {eip155Addresses.map((address, index) => ( onSelectEIP155(address)} clickable key={address} css={{ marginTop: '$5', backgroundColor: selectedEIP155.includes(address) ? 'rgba(23, 200, 100, 0.2)' : '$accents2' }} > {`${truncate(address, 14)} - Account ${index + 1}`} ))} ) } else if (isCosmosChain(chain)) { return ( Select Cosmos Accounts {cosmosAddresses.map((address, index) => ( onSelectCosmos(address)} clickable key={address} css={{ marginTop: '$5', backgroundColor: selectedCosmos.includes(address) ? 'rgba(23, 200, 100, 0.2)' : '$accents2' }} > {`${truncate(address, 14)} - Account ${index + 1}`} ))} ) } })} ) }