Footer.tsx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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 { noop } from 'lodash';
  8. import NavContext, { NavContextType } from './nav-context';
  9. import { BaseProps } from '../_base/baseComponent';
  10. export interface NavFooterProps extends BaseProps {
  11. collapseButton?: React.ReactNode;
  12. collapseText?: (collapsed?: boolean) => React.ReactNode;
  13. onClick?: (event: React.MouseEvent) => void
  14. }
  15. export default class NavFooter extends PureComponent<NavFooterProps> {
  16. static contextType = NavContext;
  17. static propTypes = {
  18. children: PropTypes.node,
  19. style: PropTypes.object,
  20. className: PropTypes.string,
  21. collapseButton: PropTypes.oneOfType([PropTypes.node, PropTypes.bool]),
  22. collapseText: PropTypes.func,
  23. onClick: PropTypes.func,
  24. };
  25. static defaultProps = {
  26. collapseButton: false,
  27. onClick: noop,
  28. };
  29. context: NavContextType;
  30. static elementType = "NavFooter";
  31. renderCollapseButton = () => {
  32. const { collapseButton, collapseText } = this.props;
  33. if (React.isValidElement(collapseButton)) {
  34. return collapseButton;
  35. }
  36. const { onCollapseChange, prefixCls, locale, isCollapsed } = this.context;
  37. return (
  38. <CollapseButton
  39. prefixCls={prefixCls}
  40. isCollapsed={isCollapsed}
  41. locale={locale}
  42. onClick={onCollapseChange}
  43. collapseText={collapseText}
  44. />
  45. );
  46. };
  47. render() {
  48. const { style, className, collapseButton, onClick } = this.props;
  49. let { children } = this.props;
  50. const { isCollapsed, mode } = this.context;
  51. if (!React.isValidElement(children) && collapseButton && mode !== strings.MODE_HORIZONTAL) {
  52. children = this.renderCollapseButton();
  53. }
  54. const wrapCls = cls(className, `${cssClasses.PREFIX}-footer`, {
  55. [`${cssClasses.PREFIX}-footer-collapsed`]: isCollapsed,
  56. });
  57. return (
  58. // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions
  59. <div className={wrapCls} style={style} onClick={onClick}>
  60. {children}
  61. </div>
  62. );
  63. }
  64. }