From ce8b6ae2c948ad0d91fdda37ccdbf9d66940ea5a Mon Sep 17 00:00:00 2001 From: Robert Long Date: Mon, 16 Aug 2021 12:57:33 -0700 Subject: [PATCH] Add/remove animations --- src/GridDemo.jsx | 81 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/src/GridDemo.jsx b/src/GridDemo.jsx index e6134be..f12b585 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 && ( - + )}
@@ -281,7 +298,14 @@ export function GridDemo() { ); } -function ParticipantTile({ style, stream, ...rest }) { +function ParticipantTile({ + style, + stream, + remove, + finishRemovingTile, + tileKey, + ...rest +}) { const videoRef = useRef(); useEffect(() => { @@ -293,8 +317,35 @@ function ParticipantTile({ style, stream, ...rest }) { } }, [stream]); + const [springStyles, api] = useSpring(() => ({ + from: { + scale: 0, + opacity: 0, + }, + to: { + scale: 1, + opacity: 1, + }, + })); + + useEffect(() => { + if (remove) { + api.start({ + scale: 0, + opacity: 0, + }); + } + }, [remove]); + return ( - + );