account.js 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. const html = require('choo/html');
  2. const Component = require('choo/component');
  3. class Account extends Component {
  4. constructor(name, state, emit) {
  5. super(name);
  6. this.state = state;
  7. this.emit = emit;
  8. this.enabled = state.capabilities.account;
  9. this.local = state.components[name] = {};
  10. this.setState();
  11. }
  12. avatarClick(event) {
  13. event.preventDefault();
  14. const menu = document.getElementById('accountMenu');
  15. menu.classList.toggle('invisible');
  16. menu.focus();
  17. }
  18. hideMenu(event) {
  19. event.stopPropagation();
  20. const menu = document.getElementById('accountMenu');
  21. menu.classList.add('invisible');
  22. }
  23. login(event) {
  24. event.preventDefault();
  25. this.emit('signup-cta', 'button');
  26. }
  27. logout(event) {
  28. event.preventDefault();
  29. this.emit('logout');
  30. }
  31. changed() {
  32. return this.local.loggedIn !== this.state.user.loggedIn;
  33. }
  34. setState() {
  35. const changed = this.changed();
  36. if (changed) {
  37. this.local.loggedIn = this.state.user.loggedIn;
  38. }
  39. return changed;
  40. }
  41. update() {
  42. return this.setState();
  43. }
  44. createElement() {
  45. if (!this.enabled) {
  46. return html`
  47. <div></div>
  48. `;
  49. }
  50. const user = this.state.user;
  51. const translate = this.state.translate;
  52. if (!this.local.loggedIn) {
  53. return html`
  54. <send-account>
  55. <button
  56. class="p-2 border rounded border-white text-white hover:bg-white hover:text-black md:text-blue-dark md:border-blue-dark md:hover:text-white md:hover:bg-blue-dark"
  57. onclick="${e => this.login(e)}"
  58. >
  59. ${translate('signInMenuOption')}
  60. </button>
  61. </send-account>
  62. `;
  63. }
  64. return html`
  65. <send-account class="relative h-8">
  66. <input
  67. type="image"
  68. alt="${user.email}"
  69. class="w-8 h-8 rounded-full border text-blue md:text-white"
  70. src="${user.avatar}"
  71. onclick="${e => this.avatarClick(e)}"
  72. />
  73. <ul
  74. id="accountMenu"
  75. class="invisible list-reset absolute pin-t pin-r mt-10 pt-2 pb-2 bg-white shadow-md whitespace-no-wrap outline-none z-50"
  76. onblur="${e => this.hideMenu(e)}"
  77. tabindex="-1"
  78. >
  79. <li class="p-2 text-grey-dark">${user.email}</li>
  80. <li>
  81. <a
  82. class="block px-4 py-2 text-grey-darkest hover:bg-blue hover:text-white cursor-pointer"
  83. onclick="${e => this.logout(e)}"
  84. >
  85. ${translate('logOut')}
  86. </a>
  87. </li>
  88. </ul>
  89. </send-account>
  90. `;
  91. }
  92. }
  93. module.exports = Account;