mirror of
https://github.com/luxfi/explore.git
synced 2026-09-24 00:28:18 +00:00
* 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
41 lines
1.5 KiB
TypeScript
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);
|