PersonalDropdown.jsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { createSubscribedElement } from '../UnstatedUtils';
  5. import AppContainer from '../../services/AppContainer';
  6. import UserPicture from '../User/UserPicture';
  7. const PersonalDropdown = (props) => {
  8. const { t, appContainer } = props;
  9. const username = appContainer.me;
  10. const user = appContainer.findUser(username);
  11. const logoutHandler = () => {
  12. const { interceptorManager } = appContainer;
  13. const context = {
  14. user,
  15. currentPagePath: decodeURIComponent(window.location.pathname),
  16. };
  17. interceptorManager.process('logout', context);
  18. window.location.href = '/logout';
  19. };
  20. return (
  21. <>
  22. <a className="dropdown-toggle waves-effect waves-light" data-toggle="dropdown">
  23. <UserPicture user={user} withoutLink />&nbsp;{user.name}
  24. </a>
  25. <ul className="dropdown-menu dropdown-menu-right">
  26. <li><a href={`/user/${user.username}`}><i className="icon-fw icon-home"></i>{ t('Home') }</a></li>
  27. <li><a href="/me"><i className="icon-fw icon-wrench"></i>{ t('User Settings') }</a></li>
  28. <li role="separator" className="divider"></li>
  29. <li><a href={`/user/${user.username}#user-draft-list`}><i className="icon-fw icon-docs"></i>{ t('List Drafts') }</a></li>
  30. <li><a href="/trash"><i className="icon-fw icon-trash"></i>{ t('Deleted Pages') }</a></li>
  31. <li role="separator" className="divider"></li>
  32. <li><a role="button" onClick={logoutHandler}><i className="icon-fw icon-power"></i>{ t('Sign out') }</a></li>
  33. </ul>
  34. </>
  35. );
  36. };
  37. /**
  38. * Wrapper component for using unstated
  39. */
  40. const PersonalDropdownWrapper = (props) => {
  41. return createSubscribedElement(PersonalDropdown, props, [AppContainer]);
  42. };
  43. PersonalDropdown.propTypes = {
  44. t: PropTypes.func.isRequired, // i18next
  45. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  46. };
  47. export default withTranslation()(PersonalDropdownWrapper);