You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tailchat/packages/design/components/AutoFolder/index.tsx

72 lines
1.7 KiB
TypeScript

import React, { useEffect, useMemo, useRef, useState } from 'react';
interface AutoFolderProps {
maxHeight: number;
showFullText?: React.ReactNode;
backgroundColor?: string;
}
export const AutoFolder: React.FC<AutoFolderProps> = React.memo((props) => {
const { maxHeight, showFullText = 'More', backgroundColor = 'white' } = props;
const [isShowFull, setIsShowFull] = useState(false);
const contentRef = useRef<HTMLDivElement>(null);
const observer = useMemo(
() =>
new window.ResizeObserver((entries) => {
if (entries[0]) {
const { height } = entries[0].contentRect;
if (height > maxHeight) {
setIsShowFull(false);
observer.disconnect(); // 触发一次则解除连接
} else {
setIsShowFull(true);
}
}
}),
[]
);
useEffect(() => {
if (!contentRef.current) {
return;
}
observer.observe(contentRef.current);
return () => {
observer.disconnect();
};
}, []);
return (
<div
style={{
maxHeight: isShowFull ? 'none' : maxHeight,
overflow: 'hidden',
position: 'relative',
}}
>
<div ref={contentRef}>{props.children}</div>
{!isShowFull && (
<div
style={{
position: 'absolute',
left: 0,
right: 0,
bottom: 0,
textAlign: 'center',
cursor: 'pointer',
backgroundImage: `linear-gradient(rgba(0,0,0,0), ${backgroundColor})`,
padding: '4px 0',
}}
onClick={() => setIsShowFull(true)}
>
{showFullText}
</div>
)}
</div>
);
});
AutoFolder.displayName = 'AutoFolder';