From d096187c7a230cd4dd53ee4e823052cb6e4bde68 Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 29 Feb 2024 12:38:15 +0100 Subject: [PATCH 1/3] remove title second raw gap --- ui/shared/Page/PageTitle.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/shared/Page/PageTitle.tsx b/ui/shared/Page/PageTitle.tsx index d531921cc4..8c6e2f5d53 100644 --- a/ui/shared/Page/PageTitle.tsx +++ b/ui/shared/Page/PageTitle.tsx @@ -143,7 +143,7 @@ const PageTitle = ({ title, contentAfter, withTextAd, backLink, className, isLoa { withTextAd && } { secondRow && ( - + { secondRow } ) } From ac9bcfe9aaf299bb0c2622d0d19715c09d0e52f6 Mon Sep 17 00:00:00 2001 From: isstuev Date: Thu, 29 Feb 2024 12:43:04 +0100 Subject: [PATCH 2/3] fix block table layout h ick 7b395881 up node version to 18 --- ui/blocks/BlocksTable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/blocks/BlocksTable.tsx b/ui/blocks/BlocksTable.tsx index cfd481321d..9a422d0de5 100644 --- a/ui/blocks/BlocksTable.tsx +++ b/ui/blocks/BlocksTable.tsx @@ -33,7 +33,7 @@ const isRollup = config.features.rollup.isEnabled; const BlocksTable = ({ data, isLoading, top, page, showSocketInfo, socketInfoNum, socketInfoAlert }: Props) => { const widthBase = - VALIDATOR_COL_WEIGHT + + (!config.UI.views.block.hiddenFields?.miner ? VALIDATOR_COL_WEIGHT : 0) + GAS_COL_WEIGHT + (!isRollup && !config.UI.views.block.hiddenFields?.total_reward ? REWARD_COL_WEIGHT : 0) + (!isRollup && !config.UI.views.block.hiddenFields?.burnt_fees ? FEES_COL_WEIGHT : 0); From 0d3890dff1526aa059e3683d4ab864367cbc86f4 Mon Sep 17 00:00:00 2001 From: tom Date: Tue, 5 Mar 2024 09:27:20 +0400 Subject: [PATCH 3/3] add fallback for NFT animation media --- pages/api/media-type.ts | 6 +- ui/address/tokens/NFTItem.tsx | 3 +- ui/shared/nft/NftMedia.pw.tsx | 57 +++++++++- ui/shared/nft/NftMedia.tsx | 32 ++++-- ...lt_no-url-non-media-url-and-fallback-1.png | Bin 0 -> 21472 bytes ....pw.tsx_default_no-url-with-fallback-1.png | Bin 0 -> 21472 bytes ui/shared/nft/useNftMediaInfo.tsx | 98 ++++++++++++++++++ ui/shared/nft/useNftMediaType.tsx | 49 --------- ui/token/TokenInventoryItem.tsx | 3 +- ui/tokenInstance/TokenInstanceDetails.tsx | 3 +- 10 files changed, 183 insertions(+), 68 deletions(-) create mode 100644 ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-non-media-url-and-fallback-1.png create mode 100644 ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-with-fallback-1.png create mode 100644 ui/shared/nft/useNftMediaInfo.tsx delete mode 100644 ui/shared/nft/useNftMediaType.tsx diff --git a/pages/api/media-type.ts b/pages/api/media-type.ts index f64301f094..7489fecdf1 100644 --- a/pages/api/media-type.ts +++ b/pages/api/media-type.ts @@ -22,11 +22,13 @@ export default async function mediaTypeHandler(req: NextApiRequest, res: NextApi return 'video'; } + if (contentType?.startsWith('image')) { + return 'image'; + } + if (contentType?.startsWith('text/html')) { return 'html'; } - - return 'image'; })(); res.status(200).json({ type: mediaType }); } catch (error) { diff --git a/ui/address/tokens/NFTItem.tsx b/ui/address/tokens/NFTItem.tsx index 50a33ab73b..cc61b70dd1 100644 --- a/ui/address/tokens/NFTItem.tsx +++ b/ui/address/tokens/NFTItem.tsx @@ -26,7 +26,8 @@ const NFTItem = ({ token, value, isLoading, withTokenLink, ...tokenInstance }: P diff --git a/ui/shared/nft/NftMedia.pw.tsx b/ui/shared/nft/NftMedia.pw.tsx index 71d09de045..4b91def420 100644 --- a/ui/shared/nft/NftMedia.pw.tsx +++ b/ui/shared/nft/NftMedia.pw.tsx @@ -10,7 +10,54 @@ test.describe('no url', () => { test('preview +@dark-mode', async({ mount }) => { const component = await mount( - + + , + ); + + await expect(component).toHaveScreenshot(); + }); + + test('with fallback', async({ mount, page }) => { + const IMAGE_URL = 'https://localhost:3000/my-image.jpg'; + + await page.route(IMAGE_URL, (route) => { + return route.fulfill({ + status: 200, + path: './playwright/mocks/image_long.jpg', + }); + }); + + const component = await mount( + + + , + ); + + await expect(component).toHaveScreenshot(); + }); + + test('non-media url and fallback', async({ mount, page }) => { + const ANIMATION_URL = 'https://localhost:3000/my-animation.m3u8'; + const ANIMATION_MEDIA_TYPE_API_URL = `/node-api/media-type?url=${ encodeURIComponent(ANIMATION_URL) }`; + const IMAGE_URL = 'https://localhost:3000/my-image.jpg'; + + await page.route(ANIMATION_MEDIA_TYPE_API_URL, (route) => { + return route.fulfill({ + status: 200, + body: JSON.stringify({ type: undefined }), + }); + }); + + await page.route(IMAGE_URL, (route) => { + return route.fulfill({ + status: 200, + path: './playwright/mocks/image_long.jpg', + }); + }); + + const component = await mount( + + , ); @@ -35,7 +82,7 @@ test.describe('image', () => { test('preview +@dark-mode', async({ mount }) => { const component = await mount( - + , ); @@ -55,7 +102,7 @@ test('image preview hover', async({ mount, page }) => { const component = await mount( - + , ); @@ -75,7 +122,7 @@ test('image fullscreen +@dark-mode +@mobile', async({ mount, page }) => { }); const component = await mount( - + , ); @@ -107,7 +154,7 @@ test.describe('page', () => { test('preview +@dark-mode', async({ mount }) => { const component = await mount( - + , ); diff --git a/ui/shared/nft/NftMedia.tsx b/ui/shared/nft/NftMedia.tsx index e01569c314..ace164692a 100644 --- a/ui/shared/nft/NftMedia.tsx +++ b/ui/shared/nft/NftMedia.tsx @@ -9,29 +9,31 @@ import NftImage from './NftImage'; import NftImageFullscreen from './NftImageFullscreen'; import NftVideo from './NftVideo'; import NftVideoFullscreen from './NftVideoFullscreen'; -import useNftMediaType from './useNftMediaType'; +import useNftMediaInfo from './useNftMediaInfo'; import { mediaStyleProps } from './utils'; interface Props { - url: string | null; + imageUrl: string | null; + animationUrl: string | null; className?: string; isLoading?: boolean; withFullscreen?: boolean; } -const NftMedia = ({ url, className, isLoading, withFullscreen }: Props) => { +const NftMedia = ({ imageUrl, animationUrl, className, isLoading, withFullscreen }: Props) => { const [ isMediaLoading, setIsMediaLoading ] = React.useState(true); const [ isLoadingError, setIsLoadingError ] = React.useState(false); const { ref, inView } = useInView({ triggerOnce: true }); - const type = useNftMediaType(url, !isLoading && inView); + const mediaInfo = useNftMediaInfo({ imageUrl, animationUrl, isEnabled: !isLoading && inView }); React.useEffect(() => { - if (!isLoading) { - setIsMediaLoading(Boolean(url)); + if (!isLoading && !mediaInfo) { + setIsMediaLoading(false); + setIsLoadingError(true); } - }, [ isLoading, url ]); + }, [ isLoading, mediaInfo ]); const handleMediaLoaded = React.useCallback(() => { setIsMediaLoading(false); @@ -45,11 +47,17 @@ const NftMedia = ({ url, className, isLoading, withFullscreen }: Props) => { const { isOpen, onOpen, onClose } = useDisclosure(); const content = (() => { - if (!url || isLoadingError) { + if (!mediaInfo || isLoadingError) { const styleProps = withFullscreen ? {} : mediaStyleProps; return ; } + const { type, url } = mediaInfo; + + if (!url) { + return null; + } + const props = { src: url, onLoad: handleMediaLoaded, @@ -70,7 +78,13 @@ const NftMedia = ({ url, className, isLoading, withFullscreen }: Props) => { })(); const modal = (() => { - if (!url || !withFullscreen) { + if (!mediaInfo || !withFullscreen) { + return null; + } + + const { type, url } = mediaInfo; + + if (!url) { return null; } diff --git a/ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-non-media-url-and-fallback-1.png b/ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-non-media-url-and-fallback-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4273139fafbe29f1675ba675511d0e0ce7b78b0d GIT binary patch literal 21472 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 literal 0 HcmV?d00001 diff --git a/ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-with-fallback-1.png b/ui/shared/nft/__screenshots__/NftMedia.pw.tsx_default_no-url-with-fallback-1.png new file mode 100644 index 0000000000000000000000000000000000000000..4273139fafbe29f1675ba675511d0e0ce7b78b0d GIT binary patch literal 21472 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 literal 0 HcmV?d00001 diff --git a/ui/shared/nft/useNftMediaInfo.tsx b/ui/shared/nft/useNftMediaInfo.tsx new file mode 100644 index 0000000000..7c36f828e9 --- /dev/null +++ b/ui/shared/nft/useNftMediaInfo.tsx @@ -0,0 +1,98 @@ +import { useQuery } from '@tanstack/react-query'; +import React from 'react'; + +import type { StaticRoute } from 'nextjs-routes'; +import { route } from 'nextjs-routes'; + +import type { ResourceError } from 'lib/api/resources'; +import useFetch from 'lib/hooks/useFetch'; + +import type { MediaType } from './utils'; +import { getPreliminaryMediaType } from './utils'; + +interface Params { + imageUrl: string | null; + animationUrl: string | null; + isEnabled: boolean; +} + +interface ReturnType { + type: MediaType | undefined; + url: string | null; +} + +export default function useNftMediaInfo({ imageUrl, animationUrl, isEnabled }: Params): ReturnType | null { + + const primaryQuery = useNftMediaTypeQuery(animationUrl, isEnabled); + const secondaryQuery = useNftMediaTypeQuery(imageUrl, !primaryQuery.isPending && !primaryQuery.data); + + return React.useMemo(() => { + if (primaryQuery.isPending) { + return { + type: undefined, + url: animationUrl, + }; + } + + if (primaryQuery.data) { + return primaryQuery.data; + } + + if (secondaryQuery.isPending) { + return { + type: undefined, + url: imageUrl, + }; + } + + if (secondaryQuery.data) { + return secondaryQuery.data; + } + + return null; + }, [ animationUrl, imageUrl, primaryQuery.data, primaryQuery.isPending, secondaryQuery.data, secondaryQuery.isPending ]); +} + +function useNftMediaTypeQuery(url: string | null, enabled: boolean) { + const fetch = useFetch(); + + return useQuery, ReturnType | null>({ + queryKey: [ 'nft-media-type', url ], + queryFn: async() => { + if (!url) { + return null; + } + + // media could be either image, gif, video or html-page + // so we pre-fetch the resources in order to get its content type + // have to do it via Node.js due to strict CSP for connect-src + // but in order not to abuse our server firstly we check file url extension + // and if it is valid we will trust it and display corresponding media component + + const preliminaryType = getPreliminaryMediaType(url); + + if (preliminaryType) { + return { type: preliminaryType, url }; + } + + const type = await (async() => { + try { + const mediaTypeResourceUrl = route({ pathname: '/node-api/media-type' as StaticRoute<'/api/media-type'>['pathname'], query: { url } }); + const response = await fetch<{ type: MediaType | undefined }, ResourceError>(mediaTypeResourceUrl, undefined, { resource: 'media-type' }); + + return 'type' in response ? response.type : undefined; + } catch (error) { + return; + } + })(); + + if (!type) { + return null; + } + + return { type, url }; + }, + enabled, + staleTime: Infinity, + }); +} diff --git a/ui/shared/nft/useNftMediaType.tsx b/ui/shared/nft/useNftMediaType.tsx deleted file mode 100644 index 4444b122e3..0000000000 --- a/ui/shared/nft/useNftMediaType.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { useQuery } from '@tanstack/react-query'; - -import type { StaticRoute } from 'nextjs-routes'; -import { route } from 'nextjs-routes'; - -import type { ResourceError } from 'lib/api/resources'; -import useFetch from 'lib/hooks/useFetch'; - -import type { MediaType } from './utils'; -import { getPreliminaryMediaType } from './utils'; - -export default function useNftMediaType(url: string | null, isEnabled: boolean) { - - const fetch = useFetch(); - - const { data } = useQuery, MediaType>({ - queryKey: [ 'nft-media-type', url ], - queryFn: async() => { - if (!url) { - return 'image'; - } - - // media could be either image, gif, video or html-page - // so we pre-fetch the resources in order to get its content type - // have to do it via Node.js due to strict CSP for connect-src - // but in order not to abuse our server firstly we check file url extension - // and if it is valid we will trust it and display corresponding media component - - const preliminaryType = getPreliminaryMediaType(url); - - if (preliminaryType) { - return preliminaryType; - } - - try { - const mediaTypeResourceUrl = route({ pathname: '/node-api/media-type' as StaticRoute<'/api/media-type'>['pathname'], query: { url } }); - const response = await fetch<{ type: MediaType | undefined }, ResourceError>(mediaTypeResourceUrl, undefined, { resource: 'media-type' }); - - return 'type' in response ? response.type ?? 'image' : 'image'; - } catch (error) { - return 'image'; - } - }, - enabled: isEnabled && Boolean(url), - staleTime: Infinity, - }); - - return data; -} diff --git a/ui/token/TokenInventoryItem.tsx b/ui/token/TokenInventoryItem.tsx index 72f650d2b8..6add374550 100644 --- a/ui/token/TokenInventoryItem.tsx +++ b/ui/token/TokenInventoryItem.tsx @@ -20,7 +20,8 @@ const TokenInventoryItem = ({ item, token, isLoading }: Props) => { const mediaElement = ( ); diff --git a/ui/tokenInstance/TokenInstanceDetails.tsx b/ui/tokenInstance/TokenInstanceDetails.tsx index 6896f1cc4c..dfff7aacc4 100644 --- a/ui/tokenInstance/TokenInstanceDetails.tsx +++ b/ui/tokenInstance/TokenInstanceDetails.tsx @@ -74,7 +74,8 @@ const TokenInstanceDetails = ({ data, token, scrollRef, isLoading }: Props) => {