import { useQuery, useLazyQuery } from '@apollo/react-hooks' import { utils as coinUtils } from '@lamassu/coins' import { makeStyles } from '@material-ui/core' import BigNumber from 'bignumber.js' import gql from 'graphql-tag' import * as R from 'ramda' import React, { useEffect, useState } from 'react' import DetailsRow from 'src/pages/Transactions/DetailsCard' import { mainStyles } from 'src/pages/Transactions/Transactions.styles' import { getStatus } from 'src/pages/Transactions/helper' import { ReactComponent as TxInIcon } from 'src/styling/icons/direction/cash-in.svg' import { ReactComponent as TxOutIcon } from 'src/styling/icons/direction/cash-out.svg' import * as Customer from 'src/utils/customer' import { formatDate } from 'src/utils/timezones' import DataTable from './DataTable' const useStyles = makeStyles(mainStyles) const NUM_LOG_RESULTS = 5 const GET_TRANSACTIONS = gql` query transactions($limit: Int, $from: Date, $until: Date, $deviceId: ID) { transactions( limit: $limit from: $from until: $until deviceId: $deviceId ) { id txClass txHash toAddress commissionPercentage expired machineName operatorCompleted sendConfirmed dispense hasError: error deviceId fiat cashInFee fiatCode cryptoAtoms cryptoCode toAddress created customerName customerIdCardData customerIdCardPhotoPath customerFrontCameraPath customerPhone discount customerId isAnonymous rawTickerPrice profit } } ` const GET_DATA = gql` query getData { config } ` const Transactions = ({ id }) => { const classes = useStyles() const [extraHeight, setExtraHeight] = useState(0) const [clickedId, setClickedId] = useState('') const [getTx, { data: txResponse, loading: txLoading }] = useLazyQuery( GET_TRANSACTIONS, { variables: { limit: NUM_LOG_RESULTS, deviceId: id } } ) const { data: configData, loading: configLoading } = useQuery(GET_DATA) const timezone = R.path(['config', 'locale_timezone'], configData) const loading = txLoading || configLoading if (!loading && txResponse) { txResponse.transactions = txResponse.transactions.splice(0, 5) } useEffect(() => { if (id !== null) { getTx() } }, [getTx, id]) const elements = [ { header: '', width: 0, size: 'sm', view: it => (it.txClass === 'cashOut' ? : ) }, { header: 'Customer', width: 122, size: 'sm', view: Customer.displayName }, { header: 'Cash', width: 144, textAlign: 'right', size: 'sm', view: it => `${Number.parseFloat(it.fiat)} ${it.fiatCode}` }, { header: 'Crypto', width: 164, textAlign: 'right', size: 'sm', view: it => `${coinUtils .toUnit(new BigNumber(it.cryptoAtoms), it.cryptoCode) .toFormat(5)} ${it.cryptoCode}` }, { header: 'Address', view: it => coinUtils.formatCryptoAddress(it.cryptoCode, it.toAddress), className: classes.overflowTd, size: 'sm', textAlign: 'left', width: 140 }, { header: 'Date', view: it => formatDate(it.created, timezone, 'yyyy‑MM‑dd'), textAlign: 'left', size: 'sm', width: 140 }, { header: 'Status', view: it => getStatus(it), size: 'sm', width: 20 } ] const handleClick = e => { if (clickedId === e.id) { setClickedId('') setExtraHeight(0) } else { setClickedId(e.id) setExtraHeight(310) } } return ( ) } export default Transactions