Commit fdea72ed authored by isstuev's avatar isstuev

contracts counters

parent a3417b52
...@@ -17,7 +17,7 @@ import type { AddressesResponse } from 'types/api/addresses'; ...@@ -17,7 +17,7 @@ import type { AddressesResponse } from 'types/api/addresses';
import type { BlocksResponse, BlockTransactionsResponse, Block, BlockFilters } from 'types/api/block'; import type { BlocksResponse, BlockTransactionsResponse, Block, BlockFilters } from 'types/api/block';
import type { ChartMarketResponse, ChartTransactionResponse } from 'types/api/charts'; import type { ChartMarketResponse, ChartTransactionResponse } from 'types/api/charts';
import type { SmartContract, SmartContractReadMethod, SmartContractWriteMethod, SmartContractVerificationConfig } from 'types/api/contract'; import type { SmartContract, SmartContractReadMethod, SmartContractWriteMethod, SmartContractVerificationConfig } from 'types/api/contract';
import type { VerifiedContractsResponse, VerifiedContractsFilters } from 'types/api/contracts'; import type { VerifiedContractsResponse, VerifiedContractsFilters, VerifiedContractsCounters } from 'types/api/contracts';
import type { IndexingStatus } from 'types/api/indexingStatus'; import type { IndexingStatus } from 'types/api/indexingStatus';
import type { InternalTransactionsResponse } from 'types/api/internalTransaction'; import type { InternalTransactionsResponse } from 'types/api/internalTransaction';
import type { LogsResponseTx, LogsResponseAddress } from 'types/api/log'; import type { LogsResponseTx, LogsResponseAddress } from 'types/api/log';
...@@ -264,6 +264,9 @@ export const RESOURCES = { ...@@ -264,6 +264,9 @@ export const RESOURCES = {
paginationFields: [ 'items_count' as const, 'smart_contract_id' as const ], paginationFields: [ 'items_count' as const, 'smart_contract_id' as const ],
filterFields: [ 'q' as const, 'filter' as const ], filterFields: [ 'q' as const, 'filter' as const ],
}, },
verified_contracts_counters: {
path: '/api/v2/smart-contracts/counters',
},
// TOKEN // TOKEN
token: { token: {
...@@ -476,6 +479,7 @@ Q extends 'contract_methods_read_proxy' ? Array<SmartContractReadMethod> : ...@@ -476,6 +479,7 @@ Q extends 'contract_methods_read_proxy' ? Array<SmartContractReadMethod> :
Q extends 'contract_methods_write' ? Array<SmartContractWriteMethod> : Q extends 'contract_methods_write' ? Array<SmartContractWriteMethod> :
Q extends 'contract_methods_write_proxy' ? Array<SmartContractWriteMethod> : Q extends 'contract_methods_write_proxy' ? Array<SmartContractWriteMethod> :
Q extends 'verified_contracts' ? VerifiedContractsResponse : Q extends 'verified_contracts' ? VerifiedContractsResponse :
Q extends 'verified_contracts_counters' ? VerifiedContractsCounters :
Q extends 'visualize_sol2uml' ? VisualizedContract : Q extends 'visualize_sol2uml' ? VisualizedContract :
Q extends 'contract_verification_config' ? SmartContractVerificationConfig : Q extends 'contract_verification_config' ? SmartContractVerificationConfig :
never; never;
......
import type { VerifiedContractsCounters } from 'types/api/contracts';
export const verifiedContractsCountersMock: VerifiedContractsCounters = {
smart_contracts: '123456789',
new_smart_contracts_24h: '12345',
verified_smart_contracts: '654321',
new_verified_smart_contracts_24h: '0',
};
...@@ -24,3 +24,10 @@ export interface VerifiedContractsFilters { ...@@ -24,3 +24,10 @@ export interface VerifiedContractsFilters {
q: string | undefined; q: string | undefined;
filter: 'vyper' | 'solidity' | undefined; filter: 'vyper' | 'solidity' | undefined;
} }
export type VerifiedContractsCounters = {
new_smart_contracts_24h: string;
new_verified_smart_contracts_24h: string;
smart_contracts: string;
verified_smart_contracts: string;
}
...@@ -2,6 +2,7 @@ import { test, expect } from '@playwright/experimental-ct-react'; ...@@ -2,6 +2,7 @@ import { test, expect } from '@playwright/experimental-ct-react';
import React from 'react'; import React from 'react';
import * as textAdMock from 'mocks/ad/textAd'; import * as textAdMock from 'mocks/ad/textAd';
import { verifiedContractsCountersMock } from 'mocks/contracts/counters';
import * as verifiedContractsMock from 'mocks/contracts/index'; import * as verifiedContractsMock from 'mocks/contracts/index';
import TestApp from 'playwright/TestApp'; import TestApp from 'playwright/TestApp';
import buildApiUrl from 'playwright/utils/buildApiUrl'; import buildApiUrl from 'playwright/utils/buildApiUrl';
...@@ -9,6 +10,7 @@ import buildApiUrl from 'playwright/utils/buildApiUrl'; ...@@ -9,6 +10,7 @@ import buildApiUrl from 'playwright/utils/buildApiUrl';
import VerifiedContracts from './VerifiedContracts'; import VerifiedContracts from './VerifiedContracts';
const VERIFIED_CONTRACTS_API_URL = buildApiUrl('verified_contracts'); const VERIFIED_CONTRACTS_API_URL = buildApiUrl('verified_contracts');
const VERIFIED_CONTRACTS_COUNTERS_API_URL = buildApiUrl('verified_contracts_counters');
test.beforeEach(async({ page }) => { test.beforeEach(async({ page }) => {
await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({ await page.route('https://request-global.czilladx.com/serve/native.php?z=19260bf627546ab7242', (route) => route.fulfill({
...@@ -28,6 +30,10 @@ test('base view +@mobile', async({ mount, page }) => { ...@@ -28,6 +30,10 @@ test('base view +@mobile', async({ mount, page }) => {
status: 200, status: 200,
body: JSON.stringify(verifiedContractsMock.baseResponse), body: JSON.stringify(verifiedContractsMock.baseResponse),
})); }));
await page.route(VERIFIED_CONTRACTS_COUNTERS_API_URL, (route) => route.fulfill({
status: 200,
body: JSON.stringify(verifiedContractsCountersMock),
}));
const component = await mount( const component = await mount(
<TestApp> <TestApp>
......
import { Box, Flex, Hide, Show } from '@chakra-ui/react'; import { Box, Hide, HStack, Show } from '@chakra-ui/react';
import { useRouter } from 'next/router'; import { useRouter } from 'next/router';
import React from 'react'; import React from 'react';
...@@ -16,6 +16,7 @@ import Pagination from 'ui/shared/Pagination'; ...@@ -16,6 +16,7 @@ import Pagination from 'ui/shared/Pagination';
import Sort from 'ui/shared/sort/Sort'; import Sort from 'ui/shared/sort/Sort';
import type { SortField, Sort as TSort } from 'ui/verifiedContracts/utils'; import type { SortField, Sort as TSort } from 'ui/verifiedContracts/utils';
import { SORT_OPTIONS, sortFn, getNextSortValue } from 'ui/verifiedContracts/utils'; import { SORT_OPTIONS, sortFn, getNextSortValue } from 'ui/verifiedContracts/utils';
import VerifiedContractsCounters from 'ui/verifiedContracts/VerifiedContractsCounters';
import VerifiedContractsFilter from 'ui/verifiedContracts/VerifiedContractsFilter'; import VerifiedContractsFilter from 'ui/verifiedContracts/VerifiedContractsFilter';
import VerifiedContractsList from 'ui/verifiedContracts/VerifiedContractsList'; import VerifiedContractsList from 'ui/verifiedContracts/VerifiedContractsList';
import VerifiedContractsTable from 'ui/verifiedContracts/VerifiedContractsTable'; import VerifiedContractsTable from 'ui/verifiedContracts/VerifiedContractsTable';
...@@ -33,6 +34,8 @@ const VerifiedContracts = () => { ...@@ -33,6 +34,8 @@ const VerifiedContracts = () => {
filters: { q: debouncedSearchTerm, filter: type }, filters: { q: debouncedSearchTerm, filter: type },
}); });
// const counters = useQuery
const handleSearchTermChange = React.useCallback((value: string) => { const handleSearchTermChange = React.useCallback((value: string) => {
onFilterChange({ q: value, filter: type }); onFilterChange({ q: value, filter: type });
setSearchTerm(value); setSearchTerm(value);
...@@ -81,20 +84,16 @@ const VerifiedContracts = () => { ...@@ -81,20 +84,16 @@ const VerifiedContracts = () => {
const actionBar = ( const actionBar = (
<> <>
<Show below="lg" ssr={ false }> <HStack spacing={ 3 } mb={ 6 } display={{ base: 'flex', lg: 'none' }}>
<Flex columnGap={ 3 } mb={ 6 }>
{ typeFilter } { typeFilter }
{ sortButton } { sortButton }
{ filterInput } { filterInput }
</Flex> </HStack>
</Show>
<ActionBar mt={ -6 }> <ActionBar mt={ -6 }>
<Hide below="lg" ssr={ false }> <HStack spacing={ 3 } display={{ base: 'none', lg: 'flex' }}>
<Flex columnGap={ 3 }>
{ typeFilter } { typeFilter }
{ filterInput } { filterInput }
</Flex> </HStack>
</Hide>
{ isPaginationVisible && <Pagination ml="auto" { ...pagination }/> } { isPaginationVisible && <Pagination ml="auto" { ...pagination }/> }
</ActionBar> </ActionBar>
</> </>
...@@ -116,6 +115,7 @@ const VerifiedContracts = () => { ...@@ -116,6 +115,7 @@ const VerifiedContracts = () => {
return ( return (
<Box> <Box>
<PageTitle text="Verified contracts" withTextAd/> <PageTitle text="Verified contracts" withTextAd/>
<VerifiedContractsCounters/>
<DataListDisplay <DataListDisplay
isError={ isError } isError={ isError }
isLoading={ isLoading } isLoading={ isLoading }
......
import { Box, Flex, Skeleton, Text, useColorModeValue } from '@chakra-ui/react';
import React from 'react';
import useApiQuery from 'lib/api/useApiQuery';
const VerifiedContractsCounters = () => {
const countersQuery = useApiQuery('verified_contracts_counters');
const itemBgColor = useColorModeValue('blue.50', 'blue.800');
const renderItem = (name: string, total: string, new24: string) => {
return (
<Box
w={{ base: '100%', lg: 'calc((100% - 12px)/2)' }}
borderRadius="12px"
backgroundColor={ itemBgColor }
p={ 3 }
>
<Text variant="secondary" fontSize="xs">{ name }</Text>
<Flex alignItems="baseline">
<Text fontWeight={ 600 } mr={ 2 } fontSize="lg">{ Number(total).toLocaleString('en') }</Text>
<Text fontWeight={ 600 } mr={ 1 } fontSize="lg" color="green.500">+{ new24 }</Text>
<Text variant="secondary" fontSize="sm">(24h)</Text>
</Flex>
</Box>
);
};
if (countersQuery.isError) {
return null;
}
const content = (() => {
if (countersQuery.isLoading) {
const item = <Skeleton w={{ base: '100%', lg: 'calc((100% - 12px)/2)' }} h="69px" borderRadius="12px"/>;
return (
<>
{ item }
{ item }
</>
);
}
return (
<>
{ renderItem('Total contracts', countersQuery.data.smart_contracts, countersQuery.data.new_smart_contracts_24h) }
{ renderItem('Verified contracts', countersQuery.data.verified_smart_contracts, countersQuery.data.new_verified_smart_contracts_24h) }
</>
);
})();
return (
<Flex columnGap={ 3 } rowGap={ 3 } flexDirection={{ base: 'column', lg: 'row' }} mb={ 6 }>
{ content }
</Flex>
);
};
export default VerifiedContractsCounters;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment