import PropTypes from 'prop-types';
// third-party
import { motion, useCycle } from 'framer-motion';
// ==============================|| ANIMATION BUTTON ||============================== //
export default function AnimateButton({
children,
type = 'scale',
direction = 'right',
offset = 10,
scale = {
hover: 1.05,
tap: 0.95
}
}) {
let offset1;
let offset2;
switch (direction) {
case 'up':
case 'left':
offset1 = offset;
offset2 = 0;
break;
case 'right':
case 'down':
default:
offset1 = 0;
offset2 = offset;
break;
}
const [x, cycleX] = useCycle(offset1, offset2);
const [y, cycleY] = useCycle(offset1, offset2);
switch (type) {
case 'rotate':
return (
{children}
);
case 'slide':
if (direction === 'up' || direction === 'down') {
return (
cycleY()} onHoverStart={() => cycleY()}>
{children}
);
}
return (
cycleX()} onHoverStart={() => cycleX()}>
{children}
);
case 'scale':
default:
if (typeof scale === 'number') {
scale = {
hover: scale,
tap: scale
};
}
return (
{children}
);
}
}
AnimateButton.propTypes = {
children: PropTypes.node,
offset: PropTypes.number,
type: PropTypes.oneOf(['slide', 'scale', 'rotate']),
direction: PropTypes.oneOf(['up', 'down', 'left', 'right']),
scale: PropTypes.oneOfType([PropTypes.number, PropTypes.object])
};