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)}
}
)
}