Commit 83fda2c9 authored by tom's avatar tom

handle blobs with no data

parent 760c69e2
...@@ -20,7 +20,17 @@ export const base2: Blob = { ...@@ -20,7 +20,17 @@ export const base2: Blob = {
], ],
}; };
export const withoutData: Blob = {
blob_data: null,
hash: '0x0197fdb17195c176b23160f335daabd4b6a231aaaadd73ec567877c66a3affd3',
kzg_commitment: null,
kzg_proof: null,
transaction_hashes: [
{ block_consensus: true, transaction_hash: '0x22d597ebcf3e8d60096dd0363bc2f0f5e2df27ba1dacd696c51aa7c9409f3193' },
],
};
export const txBlobs: TxBlobs = { export const txBlobs: TxBlobs = {
items: [ base1, base2 ], items: [ base1, base2, withoutData ],
next_page_params: null, next_page_params: null,
}; };
export interface TxBlob { export interface TxBlob {
hash: string; hash: string;
blob_data: string; blob_data: string | null;
kzg_commitment: string; kzg_commitment: string | null;
kzg_proof: string; kzg_proof: string | null;
} }
export type TxBlobs = { export type TxBlobs = {
......
import { Grid, Skeleton } from '@chakra-ui/react'; import { Alert, Grid, GridItem, Skeleton } from '@chakra-ui/react';
import React from 'react'; import React from 'react';
import type { Blob } from 'types/api/blobs'; import type { Blob } from 'types/api/blobs';
...@@ -17,45 +17,56 @@ interface Props { ...@@ -17,45 +17,56 @@ interface Props {
} }
const BlobInfo = ({ data, isLoading }: Props) => { const BlobInfo = ({ data, isLoading }: Props) => {
const size = data.blob_data.replace('0x', '').length / 2;
return ( return (
<Grid <Grid
columnGap={ 8 } columnGap={ 8 }
rowGap={ 3 } rowGap={ 3 }
templateColumns={{ base: 'minmax(0, 1fr)', lg: '216px minmax(728px, auto)' }} templateColumns={{ base: 'minmax(0, 1fr)', lg: '216px minmax(728px, auto)' }}
> >
<DetailsInfoItem { !data.blob_data && (
title="Proof" <GridItem colSpan={{ base: undefined, lg: 2 }} mb={ 3 }>
hint="Zero knowledge proof. Allows for quick verification of commitment" <Skeleton isLoaded={ !isLoading }>
isLoading={ isLoading } <Alert status="warning">This blob is not yet indexed</Alert>
> </Skeleton>
<Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all" lineHeight={ 6 } my="-2px"> </GridItem>
{ data.kzg_proof } ) }
<CopyToClipboard text={ data.kzg_proof } isLoading={ isLoading }/> { data.kzg_proof && (
</Skeleton> <DetailsInfoItem
</DetailsInfoItem> title="Proof"
<DetailsInfoItem hint="Zero knowledge proof. Allows for quick verification of commitment"
title="Commitment" isLoading={ isLoading }
hint="Commitment to the data in the blob" >
isLoading={ isLoading } <Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all" lineHeight={ 6 } my="-2px">
> { data.kzg_proof }
<Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all" lineHeight={ 6 } my="-2px"> <CopyToClipboard text={ data.kzg_proof } isLoading={ isLoading }/>
{ data.kzg_commitment } </Skeleton>
<CopyToClipboard text={ data.kzg_commitment } isLoading={ isLoading }/> </DetailsInfoItem>
</Skeleton> ) }
</DetailsInfoItem> { data.kzg_commitment && (
<DetailsInfoItem <DetailsInfoItem
title="Size, bytes" title="Commitment"
hint="Blob size in bytes" hint="Commitment to the data in the blob"
isLoading={ isLoading } isLoading={ isLoading }
> >
<Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all"> <Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all" lineHeight={ 6 } my="-2px">
{ size.toLocaleString() } { data.kzg_commitment }
</Skeleton> <CopyToClipboard text={ data.kzg_commitment } isLoading={ isLoading }/>
</DetailsInfoItem> </Skeleton>
</DetailsInfoItem>
) }
{ data.blob_data && (
<DetailsInfoItem
title="Size, bytes"
hint="Blob size in bytes"
isLoading={ isLoading }
>
<Skeleton isLoaded={ !isLoading } overflow="hidden" whiteSpace="pre-wrap" wordBreak="break-all">
{ (data.blob_data.replace('0x', '').length / 2).toLocaleString() }
</Skeleton>
</DetailsInfoItem>
) }
<DetailsInfoItemDivider/> { data.blob_data && <DetailsInfoItemDivider/> }
{ data.transaction_hashes[0] && ( { data.transaction_hashes[0] && (
<DetailsInfoItem <DetailsInfoItem
...@@ -68,9 +79,12 @@ const BlobInfo = ({ data, isLoading }: Props) => { ...@@ -68,9 +79,12 @@ const BlobInfo = ({ data, isLoading }: Props) => {
) } ) }
<DetailsSponsoredItem isLoading={ isLoading }/> <DetailsSponsoredItem isLoading={ isLoading }/>
<DetailsInfoItemDivider/> { data.blob_data && (
<>
<BlobData data={ data.blob_data } hash={ data.hash } isLoading={ isLoading }/> <DetailsInfoItemDivider/>
<BlobData data={ data.blob_data } hash={ data.hash } isLoading={ isLoading }/>
</>
) }
</Grid> </Grid>
); );
}; };
......
...@@ -47,3 +47,22 @@ test('base view +@mobile +@dark-mode', async({ mount, page }) => { ...@@ -47,3 +47,22 @@ test('base view +@mobile +@dark-mode', async({ mount, page }) => {
maskColor: configs.maskColor, maskColor: configs.maskColor,
}); });
}); });
test('without data', async({ mount, page }) => {
await page.route(BLOB_API_URL, (route) => route.fulfill({
status: 200,
body: JSON.stringify(blobsMock.withoutData),
}));
const component = await mount(
<TestApp>
<Blob/>
</TestApp>,
{ hooksConfig },
);
await expect(component).toHaveScreenshot({
mask: [ page.locator(configs.adsBannerSelector) ],
maskColor: configs.maskColor,
});
});
...@@ -13,7 +13,7 @@ interface Props { ...@@ -13,7 +13,7 @@ interface Props {
} }
const TxBlobListItem = ({ data, isLoading }: Props) => { const TxBlobListItem = ({ data, isLoading }: Props) => {
const size = data.blob_data.replace('0x', '').length / 2; const size = data.blob_data ? data.blob_data.replace('0x', '').length / 2 : '-';
return ( return (
<ListItemMobileGrid.Container> <ListItemMobileGrid.Container>
...@@ -24,7 +24,7 @@ const TxBlobListItem = ({ data, isLoading }: Props) => { ...@@ -24,7 +24,7 @@ const TxBlobListItem = ({ data, isLoading }: Props) => {
<ListItemMobileGrid.Label isLoading={ isLoading }>Data type</ListItemMobileGrid.Label> <ListItemMobileGrid.Label isLoading={ isLoading }>Data type</ListItemMobileGrid.Label>
<ListItemMobileGrid.Value> <ListItemMobileGrid.Value>
<BlobDataType isLoading={ isLoading } data={ data.blob_data }/> { data.blob_data ? <BlobDataType isLoading={ isLoading } data={ data.blob_data }/> : '-' }
</ListItemMobileGrid.Value> </ListItemMobileGrid.Value>
<ListItemMobileGrid.Label isLoading={ isLoading }>Size, bytes</ListItemMobileGrid.Label> <ListItemMobileGrid.Label isLoading={ isLoading }>Size, bytes</ListItemMobileGrid.Label>
......
...@@ -12,7 +12,7 @@ interface Props { ...@@ -12,7 +12,7 @@ interface Props {
} }
const TxBlobsTableItem = ({ data, isLoading }: Props) => { const TxBlobsTableItem = ({ data, isLoading }: Props) => {
const size = data.blob_data.replace('0x', '').length / 2; const size = data.blob_data ? data.blob_data.replace('0x', '').length / 2 : '-';
return ( return (
<Tr alignItems="top"> <Tr alignItems="top">
...@@ -20,7 +20,7 @@ const TxBlobsTableItem = ({ data, isLoading }: Props) => { ...@@ -20,7 +20,7 @@ const TxBlobsTableItem = ({ data, isLoading }: Props) => {
<BlobEntity hash={ data.hash } noIcon isLoading={ isLoading }/> <BlobEntity hash={ data.hash } noIcon isLoading={ isLoading }/>
</Td> </Td>
<Td verticalAlign="middle"> <Td verticalAlign="middle">
<BlobDataType isLoading={ isLoading } data={ data.blob_data }/> { data.blob_data ? <BlobDataType isLoading={ isLoading } data={ data.blob_data }/> : '-' }
</Td> </Td>
<Td verticalAlign="middle"> <Td verticalAlign="middle">
<Skeleton isLoaded={ !isLoading } display="inline-block"> <Skeleton isLoaded={ !isLoading } display="inline-block">
......
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