import { useEffect, useState } from 'react';
import { Link } from 'react-router-dom';
import { useQuery, gql } from '@apollo/client';
import { useQueryClient } from 'src/contexts/queryClient';
import { formatNumber } from '../../../utils/utils';
import { CardStatisics, Dots } from '../../../components';
import { ContainerCardStatisics, ContainerCol } from '../ui/ui';
import ContractTable from './ContractTable';
import { CYBER } from '../../../utils/config';
const PAGE_SIZE = 50;
const GET_CHARACTERS = gql`
query MyQuery($offset: Int) {
contracts(limit: 50, offset: $offset, order_by: { tx: desc }) {
address
admin
code_id
creator
fees
gas
label
tx
}
contracts_aggregate {
aggregate {
sum {
gas
fees
tx
}
count(columns: address)
}
}
}
`;
const useGetContracts = (offset) => {
const [dataContracts, setDataContracts] = useState([]);
const [dataAggregate, setDataAggregate] = useState(null);
const { loading, data } = useQuery(GET_CHARACTERS, {
variables: {
offset: offset * PAGE_SIZE,
},
});
useEffect(() => {
if (data && data.contracts && data.contracts_aggregate) {
setDataContracts((items) => [...items, ...data.contracts]);
if (data.contracts_aggregate.aggregate) {
setDataAggregate(data.contracts_aggregate.aggregate);
}
}
}, [data]);
return { dataContracts, dataAggregate, loading };
};
const useGetCodes = () => {
const queryClient = useQueryClient();
const [codes, setCodes] = useState(null);
useEffect(() => {
const getCodes = async () => {
try {
if (queryClient) {
const resposeCodes = await queryClient.getCodes();
if (resposeCodes && resposeCodes.length > 0) {
setCodes(resposeCodes.length);
} else {
setCodes(0);
}
}
} catch (error) {
console.log(`error getCodes`, error);
setCodes(0);
}
};
getCodes();
}, [queryClient]);
return { codes };
};
function DashboardPage() {
const [offset, setOffset] = useState(0);
const { dataContracts, dataAggregate } = useGetContracts(offset);
const { codes } = useGetCodes();
return (
<main className="block-body">
<ContainerCol>
<ContainerCardStatisics>
<CardStatisics
title="Contracts"
value={
dataAggregate !== null ? (
formatNumber(dataAggregate.count)
) : (
<Dots />
)
}
/>
<CardStatisics
title={`Income, ${CYBER.DENOM_CYBER.toUpperCase()}`}
value={
dataAggregate !== null && dataAggregate.sum.fees !== null ? (
formatNumber(dataAggregate.sum.fees)
) : (
<Dots />
)
}
/>
<CardStatisics
title="Gas used"
value={
dataAggregate !== null && dataAggregate.sum.gas !== null ? (
formatNumber(dataAggregate.sum.gas)
) : (
<Dots />
)
}
/>
<CardStatisics
title="Total txs"
value={
dataAggregate !== null && dataAggregate.sum.tx !== null ? (
formatNumber(dataAggregate.sum.tx)
) : (
<Dots />
)
}
/>
<Link to="/libs">
<CardStatisics
title="Libs"
value={codes !== null ? formatNumber(codes) : <Dots />}
link
/>
</Link>
</ContainerCardStatisics>
{dataContracts.length === 0 ? (
<Dots />
) : (
<ContractTable
contracts={dataContracts}
setOffset={setOffset}
count={dataAggregate !== null ? dataAggregate.count : 0}
/>
)}
</ContainerCol>
</main>
);
}
export default DashboardPage;