diff --git a/packages/atlas/src/components/AssetImage/AssetImage.tsx b/packages/atlas/src/components/AssetImage/AssetImage.tsx index 9ba7d415cc..e89bb7c50d 100644 --- a/packages/atlas/src/components/AssetImage/AssetImage.tsx +++ b/packages/atlas/src/components/AssetImage/AssetImage.tsx @@ -27,10 +27,12 @@ export const AssetImage: FC = ({ resolvedUrls, isLoading, type, > {loading ? ( - ) : imagePlaceholder && !url ? ( + ) : url ? ( + + ) : imagePlaceholder ? ( <>{imagePlaceholder} ) : ( - + )} diff --git a/packages/atlas/src/components/NftCarousel/components/MarketplaceCarouselCard/types/NftCarouselDetails.tsx b/packages/atlas/src/components/NftCarousel/components/MarketplaceCarouselCard/types/NftCarouselDetails.tsx index 7588457a76..e51002081f 100644 --- a/packages/atlas/src/components/NftCarousel/components/MarketplaceCarouselCard/types/NftCarouselDetails.tsx +++ b/packages/atlas/src/components/NftCarousel/components/MarketplaceCarouselCard/types/NftCarouselDetails.tsx @@ -240,7 +240,7 @@ export const VideoCardWrapper = ({ details, }: VideoCardWrapperProps) => { const [isPaused, setIsPaused] = useState(!active) - const debouncedActive = useDebounceValue(active, 500) + const debouncedActive = useDebounceValue(active, 800, true) return ( @@ -251,15 +251,15 @@ export const VideoCardWrapper = ({ {active ? ( setIsPaused(true)} onPlay={() => setIsPaused(false)} preload="auto" src={mediaUrls ?? undefined} poster={thumbnailUrls ?? undefined} - handleActions={active ? debouncedActive : active} + handleActions={active ? !!debouncedActive : active} videoPlaytime={30} onEnded={goNextSlide} customLink={to} diff --git a/packages/atlas/src/hooks/useDebounceValue.ts b/packages/atlas/src/hooks/useDebounceValue.ts index f69f28e3cd..81f405176e 100644 --- a/packages/atlas/src/hooks/useDebounceValue.ts +++ b/packages/atlas/src/hooks/useDebounceValue.ts @@ -1,15 +1,24 @@ import { useEffect, useState } from 'react' -export function useDebounceValue(value: T, delay?: number): T { - const [debouncedValue, setDebouncedValue] = useState(value) +export function useDebounceValue( + value: T, + delay?: number, + emptyInitialValue?: R +): R extends true ? T | null : T { + type ReturnType = R extends true ? T | null : T + // Initialize the state with appropriate type + const [debouncedValue, setDebouncedValue] = useState( + emptyInitialValue ? (null as ReturnType) : (value as ReturnType) + ) useEffect(() => { - const timer = setTimeout(() => setDebouncedValue(value), delay ?? 500) + const timer = setTimeout(() => setDebouncedValue(value as ReturnType), delay ?? 500) return () => { clearTimeout(timer) } }, [value, delay]) + // TypeScript will infer the return type based on the value of emptyInitialValue return debouncedValue }