import { Chip, ScrollShadow } from '@heroui/react'; import type { QuickReply as QuickReplyType } from '@mujian/js-sdk/types'; import { useEffect, useRef } from 'react'; import { mjChatCls } from '@/utils/cls'; export interface QuickReplyProps { quickReplies: Array; onSend: (query: string) => void; } export const QuickReply = (props: QuickReplyProps) => { const { quickReplies, onSend } = props; const scrollShadowRef = useRef(null); useEffect(() => { const handleWheel = (e: WheelEvent) => { if (Math.abs(e.deltaY) > 0 && scrollShadowRef.current) { e.preventDefault(); scrollShadowRef.current.scrollLeft += e.deltaY; } }; scrollShadowRef?.current?.addEventListener('wheel', handleWheel, { passive: false, }); return () => scrollShadowRef?.current?.removeEventListener('wheel', handleWheel); }, []); const lastDragTime = useRef(0); const onmousedown = (e: React.MouseEvent) => { // 防止文字选择 e.preventDefault(); // 禁用页面文字选择 document.body.style.userSelect = 'none'; document.body.style.webkitUserSelect = 'none'; lastDragTime.current = 0; let dragged = false; // biome-ignore lint/suspicious/noExplicitAny: 抄来的代码 const mouseMove: EventListener = (e: any) => { dragged = true; if (scrollShadowRef.current) { scrollShadowRef.current.scrollLeft += e.movementX * -2; } }; const mouseUp: EventListener = () => { // 恢复文字选择 document.body.style.userSelect = ''; document.body.style.webkitUserSelect = ''; document.removeEventListener('mousemove', mouseMove); document.removeEventListener('mouseup', mouseUp); if (dragged) { lastDragTime.current = Date.now(); } }; document.addEventListener('mousemove', mouseMove); document.addEventListener('mouseup', mouseUp); }; return ( {quickReplies .filter((qr) => !qr.isHidden) .map((qr, index) => ( { const isClick = Date.now() - lastDragTime.current > 50; if (isClick && qr.message) { onSend(qr.message); } }} > {qr.label} ))} ); };