Header.js 7.4 KB

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