Commit 9939ef54 authored by tom's avatar tom

better array display

parent 37c411a6
...@@ -24,21 +24,23 @@ const MetadataAccordion = ({ data, level = 0 }: Props) => { ...@@ -24,21 +24,23 @@ const MetadataAccordion = ({ data, level = 0 }: Props) => {
return 24; return 24;
})(); })();
const isFlat = Object.entries(data).every(([ , value ]) => typeof value !== 'object');
const renderItem = React.useCallback((name: string, value: unknown) => { const renderItem = React.useCallback((name: string, value: unknown) => {
switch (typeof value) { switch (typeof value) {
case 'string': case 'string':
case 'number': case 'number':
case 'boolean': { case 'boolean': {
return <MetadataItemPrimitive name={ name } value={ value }/>; return <MetadataItemPrimitive name={ name } value={ value } isFlat={ isFlat }/>;
} }
case 'object': { case 'object': {
if (value === null) { if (value === null) {
return <MetadataItemPrimitive name={ name } value={ value }/>; return <MetadataItemPrimitive name={ name } value={ value } isFlat={ isFlat }/>;
} }
if (Array.isArray(value) && value.length > 0) { if (Array.isArray(value) && value.length > 0) {
return <MetadataItemArray name={ name } value={ value }/>; return <MetadataItemArray name={ name } value={ value } level={ level }/>;
} }
if (Object.keys(value).length > 0) { if (Object.keys(value).length > 0) {
...@@ -47,16 +49,14 @@ const MetadataAccordion = ({ data, level = 0 }: Props) => { ...@@ -47,16 +49,14 @@ const MetadataAccordion = ({ data, level = 0 }: Props) => {
} }
// eslint-disable-next-line no-fallthrough // eslint-disable-next-line no-fallthrough
default: { default: {
return <MetadataItemPrimitive name={ name } value={ String(value) }/>; return <MetadataItemPrimitive name={ name } value={ String(value) } isFlat={ isFlat }/>;
} }
} }
}, [ level ]); }, [ level, isFlat ]);
return ( return (
<Accordion allowMultiple fontSize="sm" ml={ `${ ml }px` } defaultIndex={ level === 0 ? [ 0 ] : undefined }> <Accordion allowMultiple fontSize="sm" ml={ `${ ml }px` } defaultIndex={ level === 0 ? [ 0 ] : undefined }>
{ Object.entries(data).map(([ key, value ]) => { { Object.entries(data).map(([ key, value ]) => renderItem(key, value)) }
return renderItem(key, value);
}) }
</Accordion> </Accordion>
); );
}; };
......
import { AccordionButton, AccordionIcon, AccordionPanel, Box, Flex } from '@chakra-ui/react'; import { AccordionButton, AccordionIcon, AccordionPanel, Flex } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import MetadataAccordionItem from './MetadataAccordionItem'; import MetadataAccordionItem from './MetadataAccordionItem';
import MetadataAccordionItemTitle from './MetadataAccordionItemTitle'; import MetadataAccordionItemTitle from './MetadataAccordionItemTitle';
import MetadataItemPrimitive from './MetadataItemPrimitive';
interface Props { interface Props {
name: string; name: string;
value: Array<unknown>; value: Array<unknown>;
level: number;
} }
const MetadataItemArray = ({ name, value }: Props) => { const MetadataItemArray = ({ name, value, level }: Props) => {
return ( return (
<MetadataAccordionItem <MetadataAccordionItem
...@@ -32,25 +34,35 @@ const MetadataItemArray = ({ name, value }: Props) => { ...@@ -32,25 +34,35 @@ const MetadataItemArray = ({ name, value }: Props) => {
<AccordionIcon boxSize={ 6 } p={ 1 }/> <AccordionIcon boxSize={ 6 } p={ 1 }/>
<MetadataAccordionItemTitle name={ name }/> <MetadataAccordionItemTitle name={ name }/>
</AccordionButton> </AccordionButton>
<AccordionPanel p={ 0 } ml={ 126 }> <AccordionPanel p={ 0 } ml={ level === 0 ? '126px' : '24px' }>
{ value.map((item, index) => { { value.map((item, index) => {
const content = (() => { const content = (() => {
switch (typeof item) { switch (typeof item) {
case 'string':
case 'number':
case 'boolean': {
return <MetadataItemPrimitive value={ item } isItem={ false }/>;
}
case 'object': { case 'object': {
if (item && !Array.isArray(item)) { if (item) {
return Object.entries(item).map(([ name, value ], index) => ( if (Array.isArray(item)) {
<Flex key={ index } columnGap={ 3 }> return <span>{ JSON.stringify(item, undefined, 2) }</span>;
<MetadataAccordionItemTitle name={ name } w="70px" fontWeight={ 400 }/> } else {
<Box>{ value }</Box> return Object.entries(item).map(([ name, value ], index) => {
</Flex> return (
)); <Flex key={ index } columnGap={ 3 }>
<MetadataAccordionItemTitle name={ name } fontWeight={ 400 }/>
<MetadataItemPrimitive value={ typeof value === 'object' ? JSON.stringify(value, undefined, 2) : value } isItem={ false }/>
</Flex>
);
});
}
} else {
return <span>{ String(item) }</span>;
} }
} }
// eslint-disable-next-line no-fallthrough
default: { default: {
return <span>{ JSON.stringify(item) }</span>; return <span>{ String(item) }</span>;
} }
} }
})(); })();
......
...@@ -15,7 +15,7 @@ const MetadataItemObject = ({ name, value, level }: Props) => { ...@@ -15,7 +15,7 @@ const MetadataItemObject = ({ name, value, level }: Props) => {
if (level >= 4) { if (level >= 4) {
return ( return (
<MetadataAccordionItem level={ level }> <MetadataAccordionItem level={ level } pl={{ base: 0, lg: 0 }}>
<MetadataAccordionItemTitle name={ name }/> <MetadataAccordionItemTitle name={ name }/>
<Box whiteSpace="pre-wrap">{ JSON.stringify(value, undefined, 2) }</Box> <Box whiteSpace="pre-wrap">{ JSON.stringify(value, undefined, 2) }</Box>
</MetadataAccordionItem> </MetadataAccordionItem>
......
import { Box } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Primitive } from 'react-hook-form'; import type { Primitive } from 'react-hook-form';
...@@ -9,9 +10,13 @@ import MetadataAccordionItemTitle from './MetadataAccordionItemTitle'; ...@@ -9,9 +10,13 @@ import MetadataAccordionItemTitle from './MetadataAccordionItemTitle';
interface Props { interface Props {
name?: string; name?: string;
value: Primitive; value: Primitive;
isItem?: boolean;
isFlat?: boolean;
} }
const MetadataItemPrimitive = ({ name, value }: Props) => { const MetadataItemPrimitive = ({ name, value, isItem = true, isFlat }: Props) => {
const Component = isItem ? MetadataAccordionItem : Box;
const content = (() => { const content = (() => {
switch (typeof value) { switch (typeof value) {
...@@ -29,14 +34,13 @@ const MetadataItemPrimitive = ({ name, value }: Props) => { ...@@ -29,14 +34,13 @@ const MetadataItemPrimitive = ({ name, value }: Props) => {
return <div>{ String(value) }</div>; return <div>{ String(value) }</div>;
} }
} }
})(); })();
return ( return (
<MetadataAccordionItem> <Component { ...(isFlat ? { pl: { base: 0, lg: 0 } } : {}) }>
{ name && <MetadataAccordionItemTitle name={ name }/> } { name && <MetadataAccordionItemTitle name={ name }/> }
{ content } { content }
</MetadataAccordionItem> </Component>
); );
}; };
......
...@@ -97,6 +97,32 @@ const data = { ...@@ -97,6 +97,32 @@ const data = {
primary: [ primary: [
'QmPGMksnyQemncHKQ67zGiuTAsnFi8HTJkY9ebQ6eVVQLv', 'QmPGMksnyQemncHKQ67zGiuTAsnFi8HTJkY9ebQ6eVVQLv',
'https://nftu.com/nft/92ee5f5c-bce9-4d64-8a25-c7e1e6305572/949', 'https://nftu.com/nft/92ee5f5c-bce9-4d64-8a25-c7e1e6305572/949',
{
label: 'foo',
data: [
{
name: 'John',
email: 'john@foo.com',
},
{
name: 'Mary',
email: 'mary@foo.com',
},
[ 1, 2 ],
],
},
[
{
address: 'foo',
age: 523,
gender: 'male',
},
{
address: 'bar',
age: 24,
gender: 'https://nftu.com/nft/92ee5f5c-bce9-4d64-8a25-c7e1e6305572/949',
},
],
], ],
}, },
royalty_amount: 1000, royalty_amount: 1000,
......
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