CollapseButton.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. import React from 'react';
  2. import { noop } from 'lodash-es';
  3. import { IconSidebar } from '@douyinfe/semi-icons';
  4. import Button from '../button';
  5. import Tooltip from '../tooltip';
  6. import { Locale } from '../locale/interface';
  7. export interface CollapseButtonProps {
  8. prefixCls?: string;
  9. locale?: Locale['Navigation'];
  10. collapseText?(isCollapsed: boolean): React.ReactNode;
  11. isCollapsed?: boolean;
  12. onClick?(e: boolean): void;
  13. }
  14. export default function CollapseButton({ prefixCls, locale, collapseText, isCollapsed, onClick = noop }: CollapseButtonProps) {
  15. const handleClick = () => {
  16. if (typeof onClick === 'function') {
  17. onClick(!isCollapsed);
  18. }
  19. };
  20. const btnProps = {
  21. icon: <IconSidebar />,
  22. type: 'tertiary',
  23. theme: 'borderless',
  24. onClick: handleClick,
  25. };
  26. let finalCollapseText: React.ReactNode = isCollapsed ? locale?.expandText : locale?.collapseText;
  27. if (typeof collapseText === 'function') {
  28. finalCollapseText = collapseText(isCollapsed);
  29. }
  30. return (
  31. <div className={`${prefixCls}-collapse-btn`}>
  32. {isCollapsed ? (
  33. <Tooltip content={finalCollapseText} position="right">
  34. <Button {...(btnProps as any)} />
  35. </Tooltip>
  36. ) : (
  37. <Button {...(btnProps as any)}>{finalCollapseText}</Button>
  38. )}
  39. </div>
  40. );
  41. }