style: add AutoFolder

pull/81/head
moonrailgun 3 years ago
parent 918adf4d62
commit 3a7d1126e7

@ -0,0 +1,35 @@
import React from 'react';
import { ComponentStory, ComponentMeta } from '@storybook/react';
import { AutoFolder } from '.';
export default {
title: 'Tailchat/AutoFolder',
component: AutoFolder,
argTypes: {},
} as ComponentMeta<typeof AutoFolder>;
const Template: ComponentStory<typeof AutoFolder> = (args) => (
<AutoFolder {...args} />
);
export const Default = Template.bind({});
Default.args = {
maxHeight: 100,
children: (
<div style={{ border: '1px solid #999' }}>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
<div>foooooo</div>
</div>
),
};

@ -0,0 +1,57 @@
import React, { useEffect, useRef, useState } from 'react';
interface AutoFolderProps {
maxHeight: number;
showFullText?: string;
backgroundColor?: string;
}
export const AutoFolder: React.FC<AutoFolderProps> = React.memo((props) => {
const {
maxHeight,
showFullText = 'More',
backgroundColor = 'rgba(0,0,0,0)',
} = props;
const [isShowFull, setIsShowFull] = useState(false);
const contentRef = useRef<HTMLDivElement>();
useEffect(() => {
if (contentRef.current) {
if (contentRef.current.scrollHeight > maxHeight) {
setIsShowFull(false);
} else {
setIsShowFull(true);
}
}
}, [props.maxHeight]);
return (
<div
style={{
height: isShowFull ? 'auto' : 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(${backgroundColor}, white)`,
padding: '4px 0',
}}
onClick={() => setIsShowFull(true)}
>
{showFullText}
</div>
)}
</div>
);
});
AutoFolder.displayName = 'AutoFolder';
Loading…
Cancel
Save