Footer.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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, { NavContextType } from './nav-context';
  8. import { BaseProps } from '../_base/baseComponent';
  9. export interface NavFooterProps extends BaseProps {
  10. collapseButton?: React.ReactNode;
  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. context: NavContextType;
  26. static elementType = "NavFooter";
  27. renderCollapseButton = () => {
  28. const { collapseButton, collapseText } = this.props;
  29. if (React.isValidElement(collapseButton)) {
  30. return collapseButton;
  31. }
  32. const { onCollapseChange, prefixCls, locale, isCollapsed } = this.context;
  33. return (
  34. <CollapseButton
  35. prefixCls={prefixCls}
  36. isCollapsed={isCollapsed}
  37. locale={locale}
  38. onClick={onCollapseChange}
  39. collapseText={collapseText}
  40. />
  41. );
  42. };
  43. render() {
  44. const { style, className, collapseButton } = this.props;
  45. let { children } = this.props;
  46. const { isCollapsed, mode } = this.context;
  47. if (!React.isValidElement(children) && collapseButton && mode !== strings.MODE_HORIZONTAL) {
  48. children = this.renderCollapseButton();
  49. }
  50. const wrapCls = cls(className, `${cssClasses.PREFIX}-footer`, {
  51. [`${cssClasses.PREFIX}-footer-collapsed`]: isCollapsed,
  52. });
  53. return (
  54. <div className={wrapCls} style={style}>
  55. {children}
  56. </div>
  57. );
  58. }
  59. }