|
import { AnimatePresence, cubicBezier, motion } from 'framer-motion'; |
|
|
|
interface SendButtonProps { |
|
show: boolean; |
|
isStreaming?: boolean; |
|
disabled?: boolean; |
|
onClick?: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => void; |
|
onImagesSelected?: (images: File[]) => void; |
|
} |
|
|
|
const customEasingFn = cubicBezier(0.4, 0, 0.2, 1); |
|
|
|
export const SendButton = ({ show, isStreaming, disabled, onClick }: SendButtonProps) => { |
|
return ( |
|
<AnimatePresence> |
|
{show ? ( |
|
<motion.button |
|
className="absolute flex justify-center items-center top-[18px] right-[22px] p-1 bg-accent-500 hover:brightness-94 color-white rounded-md w-[34px] h-[34px] transition-theme disabled:opacity-50 disabled:cursor-not-allowed" |
|
transition={{ ease: customEasingFn, duration: 0.17 }} |
|
initial={{ opacity: 0, y: 10 }} |
|
animate={{ opacity: 1, y: 0 }} |
|
exit={{ opacity: 0, y: 10 }} |
|
disabled={disabled} |
|
onClick={(event) => { |
|
event.preventDefault(); |
|
|
|
if (!disabled) { |
|
onClick?.(event); |
|
} |
|
}} |
|
> |
|
<div className="text-lg"> |
|
{!isStreaming ? <div className="i-ph:arrow-right"></div> : <div className="i-ph:stop-circle-bold"></div>} |
|
</div> |
|
</motion.button> |
|
) : null} |
|
</AnimatePresence> |
|
); |
|
}; |
|
|