2024-08-06 16:36:00 -07:00
|
|
|
import React, { useReducer } from 'react';
|
|
|
|
import { useAnimatedListItems } from './useAnimatedListItems';
|
|
|
|
|
|
|
|
type Mutation = 'reverse' | 'randomize' | 'insert' | 'remove';
|
2024-08-06 16:26:30 -07:00
|
|
|
|
|
|
|
export const AnimatedListDemo = () => {
|
2024-08-06 16:36:00 -07:00
|
|
|
const [items, mutateItems] = useReducer(
|
|
|
|
(prevState: string[], mutation: Mutation) => {
|
|
|
|
switch (mutation) {
|
|
|
|
case 'reverse':
|
|
|
|
const newState = [...prevState];
|
|
|
|
newState.reverse();
|
|
|
|
return newState;
|
|
|
|
default:
|
|
|
|
return prevState;
|
|
|
|
}
|
|
|
|
},
|
|
|
|
['Item 0', 'Item 1', 'Item 2', 'Item 3'],
|
|
|
|
);
|
|
|
|
|
|
|
|
const { updateItemRef, updateItemPositions, itemStyles } =
|
|
|
|
useAnimatedListItems({ keys: items });
|
|
|
|
|
|
|
|
return (
|
|
|
|
<main>
|
|
|
|
<ol>
|
|
|
|
{items.map((item) => {
|
|
|
|
return (
|
|
|
|
<li
|
|
|
|
key={item}
|
|
|
|
ref={(li) => updateItemRef(item, li)}
|
|
|
|
style={itemStyles[item]}
|
|
|
|
>
|
|
|
|
{item}
|
|
|
|
</li>
|
|
|
|
);
|
|
|
|
})}
|
|
|
|
</ol>
|
|
|
|
<button
|
|
|
|
type="button"
|
|
|
|
onClick={() => {
|
|
|
|
updateItemPositions();
|
|
|
|
mutateItems('reverse');
|
|
|
|
}}
|
|
|
|
>
|
|
|
|
Reverse
|
|
|
|
</button>
|
|
|
|
</main>
|
|
|
|
);
|
2024-08-06 16:26:30 -07:00
|
|
|
};
|