Files
tom goriunovandGitHub 434aae92bb Call contract read methods from the client (#2032)
* display methods accordion

* add method_id to methods

* query read method via public client

* query read methods without inputs at accordion section open

* add custom abi tabs

* add proxy tabs

* custom wagmi config if wc is not configured

* remove ContractAbiItemConstant component

* display tuple properties in method outputs

* display read result

* clean up

* support nested arrays in the read result

* re-write test for contract methods

* change result view for address output

* refactoring

* fix tests

* remove web3 provider fallback

* fix tab loading

* refactoring

* add implementation contract selector

* add "copy to clipboard" for address, remove top-level square brackets

* add preview mode to contract method result

* tests for read result

* fix tests

* change styles for result preview

* review fix
2024-06-24 19:56:06 +02:00

41 lines
1.5 KiB
TypeScript

import React from 'react';
import type { AbiParameter } from 'viem';
import type { ResultViewMode } from '../../types';
import { matchArray } from '../utils';
import ItemArray from './ItemArray';
import ItemPrimitive from './ItemPrimitive';
import ItemTuple from './ItemTuple';
interface Props {
abiParameter: AbiParameter;
data: unknown;
mode: ResultViewMode;
level?: number;
}
const Item = ({ abiParameter, data, mode, level = 0 }: Props) => {
const arrayMatch = React.useMemo(() => matchArray(abiParameter.type), [ abiParameter.type ]);
if (arrayMatch) {
if (!Array.isArray(data)) {
if (arrayMatch.itemType === 'tuple' && mode === 'preview' && 'components' in abiParameter) {
const previewData = Object.fromEntries(abiParameter.components.map(({ name }) => ([ name ?? '', undefined ])));
return <ItemArray abiParameter={ abiParameter } data={ [ previewData ] } mode={ mode } level={ level } arrayMatch={ arrayMatch }/>;
}
return <ItemPrimitive abiParameter={ abiParameter } data={ data || (mode === 'preview' ? undefined : '[ ]') } level={ level }/>;
}
return <ItemArray abiParameter={ abiParameter } data={ data } level={ level } mode={ mode } arrayMatch={ arrayMatch }/>;
}
const tupleMatch = abiParameter.type.includes('tuple');
if (tupleMatch) {
return <ItemTuple abiParameter={ abiParameter } data={ data } mode={ mode } level={ level }/>;
}
return <ItemPrimitive abiParameter={ abiParameter } data={ data } level={ level }/>;
};
export default React.memo(Item);