Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | import {
ReactElement,
SVGProps,
useCallback,
useEffect,
useState,
} from "react";
import { useLottie } from "lottie-react";
import AddAnimation from "animations/add-circle.json";
import { handleAsyncError } from "utils";
export default function AddAnimated(
props: SVGProps<SVGSVGElement> & {
handleClick?: () => Promise<boolean>;
isAdded?: boolean;
shouldUpdateList?: boolean;
}
): ReactElement {
const [isPlaying, setIsPlaying] = useState(false);
const { View, goToAndPlay, animationItem, pause, goToAndStop } = useLottie(
{
animationData: AddAnimation,
loop: 0,
autoplay: false,
onSegmentStart: () => {
setIsPlaying(true);
},
onComplete: () => {
setIsPlaying(false);
},
},
{
width: 24,
height: 24,
}
);
useEffect(() => {
Iif (props.isAdded && props.shouldUpdateList && !isPlaying) {
goToAndStop(50, true);
}
}, [goToAndStop, isPlaying, props.isAdded, props.shouldUpdateList]);
useEffect(() => {
animationItem?.addEventListener("enterFrame", () => {
Iif (
animationItem?.currentFrame > 50 &&
animationItem?.currentFrame < 60
) {
pause();
setIsPlaying(false);
}
});
}, [animationItem, pause]);
const handleClick = useCallback(async () => {
Iif (isPlaying) return;
Iif (props.handleClick) {
const res = await props.handleClick();
if (res) {
goToAndPlay(0);
} else {
goToAndPlay(60, true);
}
}
}, [goToAndPlay, isPlaying, props]);
Iif (!props.handleClick) {
return (
<svg height="12" width="12" viewBox="0 0 16 16" {...props}>
<path d="M14 7H9V2H7v5H2v2h5v5h2V9h5z"></path>
<path fill="none" d="M0 0h16v16H0z"></path>
</svg>
);
}
return (
<button
type="button"
aria-label="Add"
onClick={handleAsyncError(handleClick)}
>
{View}
<style jsx>{`
button {
position: relative;
background: none;
border: none;
display: block;
width: 24px;
height: 24px;
max-width: 24px;
max-height: 24px;
overflow: hidden;
}
button :global(div) {
position: absolute;
transform: scale(5.6);
top: 0;
left: 0;
display: inline-block;
}
button:hover :global(g path),
button:hover :global(g path) {
stroke: #fff;
}
`}</style>
</button>
);
}
|