Footer.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import React, { PureComponent } from 'react';
  2. import PropTypes from 'prop-types';
  3. import cls from 'classnames';
  4. import { strings, cssClasses } from '@douyinfe/semi-foundation/navigation/constants';
  5. import CollapseButton from './CollapseButton';
  6. import '@douyinfe/semi-foundation/navigation/navigation.scss';
  7. import NavContext from './nav-context';
  8. import { BaseProps } from '../_base/baseComponent';
  9. export interface NavFooterProps extends BaseProps {
  10. collapseButton?: React.ReactNode | boolean;
  11. collapseText?: (collapsed?: boolean) => React.ReactNode;
  12. }
  13. export default class NavFooter extends PureComponent<NavFooterProps> {
  14. static contextType = NavContext;
  15. static propTypes = {
  16. children: PropTypes.node,
  17. style: PropTypes.object,
  18. className: PropTypes.string,
  19. collapseButton: PropTypes.oneOfType([PropTypes.node, PropTypes.bool]),
  20. collapseText: PropTypes.func,
  21. };
  22. static defaultProps = {
  23. collapseButton: false,
  24. };
  25. renderCollapseButton = () => {
  26. const { collapseButton, collapseText } = this.props;
  27. if (React.isValidElement(collapseButton)) {
  28. return collapseButton;
  29. }
  30. const { onCollapseChange, prefixCls, locale, isCollapsed } = this.context;
  31. return (
  32. <CollapseButton
  33. prefixCls={prefixCls}
  34. isCollapsed={isCollapsed}
  35. locale={locale}
  36. onClick={onCollapseChange}
  37. collapseText={collapseText}
  38. {...collapseButton}
  39. />
  40. );
  41. };
  42. render() {
  43. const { style, className, collapseButton } = this.props;
  44. let { children } = this.props;
  45. const { isCollapsed, mode } = this.context;
  46. if (!React.isValidElement(children) && collapseButton && mode !== strings.MODE_HORIZONTAL) {
  47. children = this.renderCollapseButton();
  48. }
  49. const wrapCls = cls(className, `${cssClasses.PREFIX}-footer`, {
  50. [`${cssClasses.PREFIX}-footer-collapsed`]: isCollapsed,
  51. });
  52. return (
  53. <div className={wrapCls} style={style}>
  54. {children}
  55. </div>
  56. );
  57. }
  58. }