import * as React from "react"; import { Link } from "gatsby"; import { GatsbyImage, getImage } from "gatsby-plugin-image"; import * as R from "ramda"; import { getAspectRatio, getName } from "../utils"; import useBreakpoint from "use-breakpoint"; import themeBreakpoints from "../breakpoints"; import classNames from "classnames"; const MasonryGallery = ({ images, aspectsByBreakpoint: aspectTargetsByBreakpoint, debug, }) => { const breakpoints = React.useMemo( () => R.pick(R.keys(aspectTargetsByBreakpoint), themeBreakpoints), [aspectTargetsByBreakpoint] ); const { breakpoint } = useBreakpoint(breakpoints, "sm"); const scrollIntoView = React.useCallback(() => { if (!window.location.hash) { return; } const el = document.getElementById(window.location.hash.split("#")[1]); if (!el) { return; } el.scrollIntoView({ block: "center", }); }, []); React.useEffect(() => { // hacky but it works for now setTimeout(() => { scrollIntoView(); }, 100); }, [scrollIntoView]); const aspectRatios = React.useMemo( () => R.map(getAspectRatio, images), [images] ); const targetAspect = aspectTargetsByBreakpoint[breakpoint]; const rows = React.useMemo( () => R.pipe( R.reduce( (acc, currentAspect) => { const currentRow = acc.pop(); const currentDiff = Math.abs(targetAspect - currentRow.aspect); const diffIfImageIsAddedToCurrentRow = Math.abs( targetAspect - (currentRow.aspect + currentAspect) ); // add image to current row if it gets us closer to our target aspect ratio if (currentDiff > diffIfImageIsAddedToCurrentRow) { return [ ...acc, { aspect: currentRow.aspect + currentAspect, images: currentRow.images + 1, startIndex: currentRow.startIndex, }, ]; } return [ ...acc, currentRow, { aspect: currentAspect, images: 1, startIndex: currentRow.startIndex + currentRow.images, }, ]; }, [{ aspect: 0, startIndex: 0, images: 0 }] ), R.indexBy(R.prop("startIndex")) )(aspectRatios), [aspectRatios, targetAspect] ); let cursor = 0; return (