import React, {CSSProperties, useContext, useLayoutEffect} from "react" import css from "./FeedGridLayout.pcss" import {TokenTile} from "spotlight/feed/components/TokenTile" import {FeedLayout, LayoutProps} from "spotlight/feed/components/FeedLayout" import {classList} from "spotlight/utils/jsx/classes" import {uniqueNum} from "spotlight/utils/numbers/uniqueNum" import {FeedContext} from "spotlight/feed/context" import {Token, Tokens} from "spotlight/common/modules/tokens" import {Square} from "spotlight/common/components/Square/Square" type Props = { cellClassName?: (token: Token | null, idx: number) => string; } export function FeedGridLayout({cellClassName}: Props) { return ( {({tokens, openToken, loadMoreBtn, loadingTokens}: LayoutProps) => { const {state} = useContext(FeedContext) const design = state.getDesign() cellClassName = cellClassName ?? (() => undefined) const gridCss: CSSProperties = { gridGap: design.imgPadding, gridTemplateColumns: `repeat(${design.numColumns}, 1fr)`, } return (
{/* Layout content - only when the feed is not doing a full (re)load */} {(!state.isLoading() || state.isLoadingMore()) &&
{/* Media cells */} {tokens.length ? tokens.map((token, idx) => ( )) : null} {/* Fake media when loading more, but not when doing a full (re)load */} {state.isLoadingMore() && loadingTokens.map((className, idx) => (
))}
} {/* Fake media only shown for a full (re)load */} {state.isLoading() && !state.isLoadingMore() && (
{loadingTokens.map((className, idx) => (
))}
)}
{loadMoreBtn}
) }} ) } interface CellProps { token: Token; className: string; style?: CSSProperties; openToken: (token: Token) => void; } function Cell({token, className, style, openToken}: CellProps) { const handleClick = React.useCallback(() => openToken(token), [token, openToken]) const {state} = useContext(FeedContext) const {showNames} = state.getDesign() return (
{showNames &&
{Tokens.getName(token)}
}
) }