PersonalDropdown.jsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import React from 'react';
  2. import { UserPicture } from '@growi/ui';
  3. import { useTranslation } from 'react-i18next';
  4. import { toastError } from '~/client/util/apiNotification';
  5. import { apiv3Post } from '~/client/util/apiv3-client';
  6. import { useCurrentUser } from '~/stores/context';
  7. const PersonalDropdown = () => {
  8. const { t } = useTranslation();
  9. const { data: currentUser } = useCurrentUser();
  10. const user = currentUser || {};
  11. const logoutHandler = async() => {
  12. try {
  13. await apiv3Post('/logout');
  14. window.location.reload();
  15. }
  16. catch (err) {
  17. toastError(err);
  18. }
  19. };
  20. return (
  21. <>
  22. {/* Button */}
  23. {/* remove .dropdown-toggle for hide caret */}
  24. {/* See https://stackoverflow.com/a/44577512/13183572 */}
  25. <a className="px-md-3 nav-link waves-effect waves-light" data-toggle="dropdown">
  26. <UserPicture user={user} noLink noTooltip /><span className="ml-1 d-none d-lg-inline-block">&nbsp;{user.name}</span>
  27. </a>
  28. {/* Menu */}
  29. <div className="dropdown-menu dropdown-menu-right">
  30. <div className="px-4 pt-3 pb-2 text-center">
  31. <UserPicture user={user} size="lg" noLink noTooltip />
  32. <h5 className="mt-2">
  33. {user.name}
  34. </h5>
  35. <div className="my-2">
  36. <i className="icon-user icon-fw"></i>{user.username}<br />
  37. <i className="icon-envelope icon-fw"></i><span className="grw-email-sm">{user.email}</span>
  38. </div>
  39. <div className="btn-group btn-block mt-2" role="group">
  40. <a className="btn btn-sm btn-outline-secondary col" href={`/user/${user.username}`}>
  41. <i className="icon-fw icon-home"></i>{ t('personal_dropdown.home') }
  42. </a>
  43. <a className="btn btn-sm btn-outline-secondary col" href="/me">
  44. <i className="icon-fw icon-wrench"></i>{ t('personal_dropdown.settings') }
  45. </a>
  46. </div>
  47. </div>
  48. <div className="dropdown-divider"></div>
  49. <button type="button" className="dropdown-item" onClick={logoutHandler}><i className="icon-fw icon-power"></i>{ t('Sign out') }</button>
  50. </div>
  51. </>
  52. );
  53. };
  54. export default PersonalDropdown;