Search code examples
javascriptvue.jsvuejs2vue-componentvuex

Vue & Vuex not retrieving proper value in html


I have a navbar where I only show certain menu items based off the user's role.

Here is the HTML (I removed all the menu items except one to simplify):

<v-speed-dial class="speed-dial-container contextual-text-menu" v-if="user && user.emailVerified" fixed top right
  direction="bottom" transition="slide-y-transition">
  
<v-icon v-if="checkAuthorization(['superAdmin', 'admin', 'pastor', 'member']) === true" class="mt-2"
    @click="sendComponent({ component: 'Dashboard' })">$admin</v-icon>
  
</v-speed-dial>

My method:

async checkAuthorization(permissions) {
  if (permissions.length > 0) {
    const temp = await this.$store.dispatch('UserData/isAuthorized', permissions)
    return temp
  }
},

Vuex store:

isAuthorized({
  state
}, permissions) {
  const userRoles = state.roles
  if (permissions && userRoles) {
    const found = userRoles.some(r => permissions.includes(r))
    return found
  }
},

All of my console logs show the correct values but the HTML is not responding accordingly.

Example: in this line of code checkAuthorization(['superAdmin', 'admin', 'pastor', 'member']) === true I added 'member' and I am logged in as a user that ONLY has the 'member' role. When looking through the console logs everything returns true so I should see this menu item but it does not show.


Solution

  • As someone pointed out in the comments, checkAuthorization is an async function and will return a Promise, so you cannot check for promise === true.

    That aside, I would change isAuthorized to be a vuex getter and not an action, e.g.

    getters: {
      // ...
      isAuthorized: (state) => (permissions) => {
        if (permissions && state.roles) {
          return state.roles.some(r => permissions.includes(r))
        }
        return false;
      }
    }
    

    And update checkAuthorization to not return a promise e.g.

    function checkAuthorization(permissions) {
      if (permissions.length > 0) {
        return this.$store.getters.isAuthorized(permissions);
      }
      return false;
    }