Header.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. import React, { Component } from 'react';
  2. import PropTypes from 'prop-types';
  3. import Link from 'next/link';
  4. import {
  5. UncontrolledDropdown,
  6. DropdownToggle,
  7. DropdownMenu,
  8. DropdownItem,
  9. ListGroup,
  10. ListGroupItem
  11. } from 'reactstrap';
  12. import { connect } from 'react-redux';
  13. import { bindActionCreators } from 'redux';
  14. import * as actions from '../../store/actions/actions';
  15. import ToggleFullscreen from '../Common/ToggleFullscreen';
  16. import HeaderSearch from './HeaderSearch';
  17. class Header extends Component {
  18. state = {
  19. navSearchOpen: false
  20. };
  21. toggleNavSearch = e => {
  22. e.preventDefault();
  23. this.setState({
  24. navSearchOpen: !this.state.navSearchOpen
  25. });
  26. };
  27. closeNavSearch = e => {
  28. e.preventDefault();
  29. this.setState({
  30. navSearchOpen: false
  31. });
  32. };
  33. toggleUserblock = e => {
  34. e.preventDefault();
  35. this.props.actions.toggleSetting('showUserBlock');
  36. };
  37. toggleOffsidebar = e => {
  38. e.preventDefault();
  39. this.props.actions.toggleSetting('offsidebarOpen');
  40. };
  41. toggleCollapsed = e => {
  42. e.preventDefault();
  43. this.props.actions.toggleSetting('isCollapsed');
  44. this.resize();
  45. };
  46. toggleAside = e => {
  47. e.preventDefault();
  48. this.props.actions.toggleSetting('asideToggled');
  49. };
  50. resize() {
  51. // all IE friendly dispatchEvent
  52. var evt = document.createEvent('UIEvents');
  53. evt.initUIEvent('resize', true, false, window, 0);
  54. window.dispatchEvent(evt);
  55. // modern dispatchEvent way
  56. // window.dispatchEvent(new Event('resize'));
  57. }
  58. render() {
  59. return (
  60. <header className="topnavbar-wrapper">
  61. {/* START Top Navbar */}
  62. <nav className="navbar topnavbar">
  63. {/* START navbar header */}
  64. <div className="navbar-header">
  65. <a className="navbar-brand" href="#/">
  66. <div className="brand-logo">
  67. {/* <img
  68. className="img-fluid"
  69. src="/static/img/logo-inner.png"
  70. alt="App Logo"
  71. /> */}
  72. </div>
  73. <div className="brand-logo-collapsed">
  74. <img
  75. className="img-fluid"
  76. src="/static/img/logo-single.png"
  77. alt="App Logo"
  78. />
  79. </div>
  80. </a>
  81. </div>
  82. {/* END navbar header */}
  83. {/* START Left navbar */}
  84. <ul className="navbar-nav mr-auto flex-row">
  85. <li className="nav-item">
  86. {/* Button used to collapse the left sidebar. Only visible on tablet and desktops */}
  87. <a
  88. href=""
  89. className="nav-link d-none d-md-block d-lg-block d-xl-block"
  90. onClick={this.toggleCollapsed}
  91. >
  92. <em className="fas fa-bars" />
  93. </a>
  94. {/* Button to show/hide the sidebar on mobile. Visible on mobile only. */}
  95. <a
  96. href=""
  97. className="nav-link sidebar-toggle d-md-none"
  98. onClick={this.toggleAside}
  99. >
  100. <em className="fas fa-bars" />
  101. </a>
  102. </li>
  103. {/* START User avatar toggle */}
  104. <li className="nav-item d-none d-md-block">
  105. <a className="nav-link" onClick={this.toggleUserblock}>
  106. <em className="icon-user" />
  107. </a>
  108. </li>
  109. {/* END User avatar toggle */}
  110. {/* START lock screen */}
  111. <li className="nav-item d-none d-md-block">
  112. <Link href="/pages/lock" as="/lock">
  113. <a title="Lock screen" className="nav-link">
  114. <em className="icon-lock" />
  115. </a>
  116. </Link>
  117. </li>
  118. {/* END lock screen */}
  119. </ul>
  120. {/* END Left navbar */}
  121. {/* START Right Navbar */}
  122. <ul className="navbar-nav flex-row">
  123. {/* Search icon */}
  124. <li className="nav-item">
  125. <a className="nav-link" href="" onClick={this.toggleNavSearch}>
  126. <em className="icon-magnifier" />
  127. </a>
  128. </li>
  129. {/* Fullscreen (only desktops) */}
  130. <li className="nav-item d-none d-md-block">
  131. <ToggleFullscreen className="nav-link" />
  132. </li>
  133. {/* START Alert menu */}
  134. <UncontrolledDropdown nav inNavbar className="dropdown-list">
  135. <DropdownToggle nav className="dropdown-toggle-nocaret">
  136. <em className="icon-bell" />
  137. <span className="badge badge-danger">11</span>
  138. </DropdownToggle>
  139. {/* START Dropdown menu */}
  140. <DropdownMenu right className="dropdown-menu-right animated flipInX">
  141. <DropdownItem>
  142. {/* START list group */}
  143. <ListGroup>
  144. <ListGroupItem
  145. action
  146. tag="a"
  147. href=""
  148. onClick={e => e.preventDefault()}
  149. >
  150. <div className="media">
  151. <div className="align-self-start mr-2">
  152. <em className="fab fa-twitter fa-2x text-info" />
  153. </div>
  154. <div className="media-body">
  155. <p className="m-0">New followers</p>
  156. <p className="m-0 text-muted text-sm">
  157. 1 new follower
  158. </p>
  159. </div>
  160. </div>
  161. </ListGroupItem>
  162. <ListGroupItem
  163. action
  164. tag="a"
  165. href=""
  166. onClick={e => e.preventDefault()}
  167. >
  168. <div className="media">
  169. <div className="align-self-start mr-2">
  170. <em className="fa fa-envelope fa-2x text-warning" />
  171. </div>
  172. <div className="media-body">
  173. <p className="m-0">New e-mails</p>
  174. <p className="m-0 text-muted text-sm">
  175. You have 10 new emails
  176. </p>
  177. </div>
  178. </div>
  179. </ListGroupItem>
  180. <ListGroupItem
  181. action
  182. tag="a"
  183. href=""
  184. onClick={e => e.preventDefault()}
  185. >
  186. <div className="media">
  187. <div className="align-self-start mr-2">
  188. <em className="fa fa-tasks fa-2x text-success" />
  189. </div>
  190. <div className="media-body">
  191. <p className="m-0">Pending Tasks</p>
  192. <p className="m-0 text-muted text-sm">
  193. 11 pending task
  194. </p>
  195. </div>
  196. </div>
  197. </ListGroupItem>
  198. <ListGroupItem
  199. action
  200. tag="a"
  201. href=""
  202. onClick={e => e.preventDefault()}
  203. >
  204. <span className="d-flex align-items-center">
  205. <span className="text-sm">More notifications</span>
  206. <span className="badge badge-danger ml-auto">
  207. 14
  208. </span>
  209. </span>
  210. </ListGroupItem>
  211. </ListGroup>
  212. {/* END list group */}
  213. </DropdownItem>
  214. </DropdownMenu>
  215. {/* END Dropdown menu */}
  216. </UncontrolledDropdown>
  217. {/* END Alert menu */}
  218. {/* START Offsidebar button */}
  219. <li className="nav-item">
  220. <a className="nav-link" href="" onClick={this.toggleOffsidebar}>
  221. <em className="icon-notebook" />
  222. </a>
  223. </li>
  224. {/* END Offsidebar menu */}
  225. </ul>
  226. {/* END Right Navbar */}
  227. {/* START Search form */}
  228. <HeaderSearch isOpen={this.state.navSearchOpen} onClose={this.closeNavSearch} />
  229. {/* END Search form */}
  230. </nav>
  231. {/* END Top Navbar */}
  232. </header>
  233. );
  234. }
  235. }
  236. Header.propTypes = {
  237. actions: PropTypes.object,
  238. settings: PropTypes.object
  239. };
  240. const mapStateToProps = state => ({ settings: state.settings });
  241. const mapDispatchToProps = dispatch => ({
  242. actions: bindActionCreators(actions, dispatch)
  243. });
  244. export default connect(
  245. mapStateToProps,
  246. mapDispatchToProps
  247. )(Header);