EditorNavbarBottom.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import React, { useState } from 'react';
  2. import PropTypes from 'prop-types';
  3. import { Collapse } from 'reactstrap';
  4. import NavigationContainer from '../../services/NavigationContainer';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import SavePageControls from '../SavePageControls';
  7. import OptionsSelector from './OptionsSelector';
  8. const EditorNavbarBottom = (props) => {
  9. const [isExpanded, setExpanded] = useState(false);
  10. const {
  11. navigationContainer,
  12. } = props;
  13. const { editorMode, isDrawerMode, isDeviceSmallerThanMd } = navigationContainer.state;
  14. const additionalClasses = ['grw-editor-navbar-bottom'];
  15. const renderDrawerButton = () => (
  16. <button type="button" className="btn btn-outline-secondary border-0" onClick={() => navigationContainer.toggleDrawer()}>
  17. <i className="icon-menu"></i>
  18. </button>
  19. );
  20. // eslint-disable-next-line react/prop-types
  21. const renderExpandButton = () => (
  22. <div className="d-md-none ml-2">
  23. <button
  24. type="button"
  25. className={`btn btn-outline-secondary btn-expand border-0 ${isExpanded ? 'expand' : ''}`}
  26. onClick={() => setExpanded(!isExpanded)}
  27. >
  28. <i className="icon-arrow-up"></i>
  29. </button>
  30. </div>
  31. );
  32. const isOptionsSelectorEnabled = editorMode !== 'hackmd';
  33. const isCollapsedOptionsSelectorEnabled = isOptionsSelectorEnabled && isDeviceSmallerThanMd;
  34. return (
  35. <div className={`${isCollapsedOptionsSelectorEnabled ? 'fixed-bottom' : ''} `}>
  36. <div className={`navbar navbar-expand border-top px-2 ${additionalClasses.join(' ')}`}>
  37. <form className="form-inline">
  38. { isDrawerMode && renderDrawerButton() }
  39. { isOptionsSelectorEnabled && !isDeviceSmallerThanMd && <OptionsSelector /> }
  40. </form>
  41. <form className="form-inline ml-auto">
  42. <SavePageControls />
  43. { isCollapsedOptionsSelectorEnabled && renderExpandButton() }
  44. </form>
  45. </div>
  46. {/* Collapsed OptionsSelector */}
  47. { isCollapsedOptionsSelectorEnabled && (
  48. <Collapse isOpen={isExpanded}>
  49. <div className="px-2"> {/* set padding for border-top */}
  50. <div className={`navbar navbar-expand border-top px-0 ${additionalClasses.join(' ')}`}>
  51. <form className="form-inline ml-auto">
  52. <OptionsSelector />
  53. </form>
  54. </div>
  55. </div>
  56. </Collapse>
  57. ) }
  58. </div>
  59. );
  60. };
  61. EditorNavbarBottom.propTypes = {
  62. navigationContainer: PropTypes.instanceOf(NavigationContainer).isRequired,
  63. };
  64. export default withUnstatedContainers(EditorNavbarBottom, [NavigationContainer]);