Navbar.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <template>
  2. <nav class="navbar is-active" role="navigation" aria-label="main navigation">
  3. <div class="navbar-brand">
  4. <nuxt-link class="navbar-item" to="/">
  5. <h1 class="brand-title">Promo-Yourself</h1>
  6. </nuxt-link>
  7. <!-- Adds click to open -->
  8. <!-- Adds active class -->
  9. <a
  10. @click="isActive = !isActive"
  11. :class="{'isActive' : isActive}"
  12. role="button"
  13. class="navbar-burger burger"
  14. aria-label="menu"
  15. aria-expanded="false"
  16. data-target="navbarBasicExample">
  17. <span aria-hidden="true"></span>
  18. <span aria-hidden="true"></span>
  19. <span aria-hidden="true"></span>
  20. </a>
  21. </div>
  22. <!-- Adds active class -->
  23. <div id="navbarBasicExample"
  24. :class="{'is-active': isActive}"
  25. class="navbar-menu">
  26. <div class="navbar-start">
  27. <nav-link to="/" class="navbar-item">
  28. Home
  29. </nav-link>
  30. <nav-link to="/courses" class="navbar-item">
  31. Courses
  32. </nav-link>
  33. <nav-link to="/blogs" class="navbar-item">
  34. Blogs
  35. </nav-link>
  36. <nav-link to="/about" class="navbar-item">
  37. About
  38. </nav-link>
  39. <nav-link to="/cv" class="navbar-item">
  40. Cv
  41. </nav-link>
  42. <!-- <nuxt-link to="/instructor" class="navbar-item">
  43. Instructor
  44. </nuxt-link>
  45. <nuxt-link to="/secret" class="navbar-item">
  46. Secret
  47. </nuxt-link> -->
  48. </div>
  49. <div class="navbar-end">
  50. <div class="navbar-item">
  51. <div class="buttons">
  52. <!-- If Authenticated -->
  53. <template v-if="isAuth">
  54. <figure class="image avatar is-48x48 m-r-sm">
  55. <img class="is-rounded" :src="user.avatar">
  56. </figure>
  57. <div class="m-r-sm m-b-sm">
  58. Welcome {{user.username}}!
  59. </div>
  60. <!-- If Admin -->
  61. <button
  62. v-if="isAdmin" class="button is-link is-outlined"
  63. @click="() => $router.push('/instructor')">
  64. Instructor
  65. </button>
  66. <a class="button is-primary" @click="logout">
  67. Logout
  68. </a>
  69. </template>
  70. <template v-else>
  71. <nuxt-link to="/register" class="button is-primary">
  72. Sign up
  73. </nuxt-link>
  74. <nuxt-link to="/login" class="button is-light">
  75. Log in
  76. </nuxt-link>
  77. </template>
  78. </div>
  79. </div>
  80. </div>
  81. </div>
  82. </nav>
  83. </template>
  84. <script>
  85. import { mapGetters } from 'vuex'
  86. export default {
  87. data() {
  88. return {
  89. isActive: false
  90. }
  91. },
  92. computed : {
  93. ...mapGetters({
  94. 'user': 'auth/authUser',
  95. 'isAuth': 'auth/isAuthenticated',
  96. 'isAdmin': 'auth/isAdmin'
  97. })
  98. },
  99. methods : {
  100. async logout() {
  101. console.log('Navbar.vue call await this.$store.dispatch(auth/logout)')
  102. const result = await this.$store.dispatch('auth/logout')
  103. console.log('Navbar.vue done await this.$store.dispatch(auth/logout)', result)
  104. this.$router.push('/login')
  105. }
  106. }
  107. }
  108. </script>
  109. <style lang="scss" scoped>
  110. .brand-title {
  111. font-size: 35px;
  112. font-weight: bold;
  113. }
  114. .navbar-brand {
  115. padding-right: 30px;
  116. @media screen and (max-width: 1023px) {
  117. padding-right: 0px;
  118. }
  119. }
  120. .avatar {
  121. margin-right: 5px;
  122. }
  123. </style>