diff --git a/src/GridDemo.jsx b/src/GridDemo.jsx index e6134be5..f12b585c 100644 --- a/src/GridDemo.jsx +++ b/src/GridDemo.jsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useRef, useState } from "react"; import { useDrag } from "react-use-gesture"; -import { useSprings, animated } from "@react-spring/web"; +import { useSprings, animated, useSpring } from "@react-spring/web"; import styles from "./GridDemo.module.css"; import useMeasure from "react-use-measure"; @@ -132,7 +132,7 @@ export function GridDemo() { setStream(stream); tileOrderRef.current.push(tileOrderRef.current.length); setTileState(() => { - const tiles = [{ stream, key: tileKey.current++ }]; + const tiles = [{ stream, key: tileKey.current++, remove: false }]; const tilePositions = getTilePositions(tiles, gridBounds); return { tiles, tilePositions }; }); @@ -146,22 +146,37 @@ export function GridDemo() { setTileState(({ tiles }) => { const newTiles = [ ...tiles, - { stream: newStream, key: tileKey.current++ }, + { stream: newStream, key: tileKey.current++, remove: false }, ]; const tilePositions = getTilePositions(newTiles, gridBounds); return { tiles: newTiles, tilePositions }; }); }, [stream, gridBounds]); - const removeTile = useCallback(() => { - tileOrderRef.current.pop(); - setTileState(({ tiles }) => { - const newTiles = [...tiles]; - newTiles.pop(); - const tilePositions = getTilePositions(newTiles, gridBounds); - return { tiles: newTiles, tilePositions }; - }); - }, [gridBounds]); + const removeTile = useCallback( + (tile) => { + const tileKey = tile.key; + + setTileState(({ tiles, tilePositions }) => { + return { + tiles: tiles.map((tile) => ({ + ...tile, + remove: tile.key === tileKey, + })), + tilePositions, + }; + }); + + setTimeout(() => { + setTileState(({ tiles }) => { + const newTiles = tiles.filter((t) => t.key !== tileKey); + const tilePositions = getTilePositions(newTiles, gridBounds); + return { tiles: newTiles, tilePositions }; + }); + }, 250); + }, + [gridBounds] + ); useEffect(() => { setTileState(({ tiles }) => ({ @@ -254,7 +269,9 @@ export function GridDemo() { )} {stream && tiles.length > 0 && ( - + )}