text: import axios from 'axios'
  import Cookies from 'js-cookie'
  import * as types from '../mutation-types'
  
  // state
  export const state = {
    user: null,
    token: Cookies.get('token'),
  
    // For admin impersonation
    admin_token: Cookies.get('admin_token') ?? null
  }
  
  // getters
  export const getters = {
    user: state => state.user,
    token: state => state.token,
    check: state => state.user !== null,
    isImpersonating: state => state.admin_token !== null
  }
  
  // mutations
  export const mutations = {
    [types.SAVE_TOKEN] (state, { token, remember }) {
      state.token = token
      Cookies.set('token', token, { expires: remember ? 365 : null })
    },
  
    [types.FETCH_USER_SUCCESS] (state, { user }) {
      state.user = user
    },
  
    [types.FETCH_USER_FAILURE] (state) {
      state.token = null
      Cookies.remove('token')
    },
  
    [types.LOGOUT] (state) {
      state.user = null
      state.token = null
  
      Cookies.remove('token')
    },
  
    [types.UPDATE_USER] (state, { user }) {
      state.user = user
    },
  
    // Stores admin token temporarily for impersonation
    startImpersonating (state) {
      state.admin_token = state.token
      Cookies.set('admin_token', state.token, { expires: 365 })
    },
  
    // Stores admin token temporarily for impersonation
    stopImpersonating (state) {
      state.token = state.admin_token
      state.admin_token = null
      Cookies.remove('admin_token')
    }
  }
  
  // actions
  export const actions = {
    saveToken ({ commit, dispatch }, payload) {
      commit(types.SAVE_TOKEN, payload)
    },
  
    async fetchUser ({ commit }) {
      try {
        const { data } = await axios.get('/api/user')
  
        commit(types.FETCH_USER_SUCCESS, { user: data })
        return data
      } catch (e) {
        commit(types.FETCH_USER_FAILURE)
      }
    },
  
    updateUser ({ commit }, payload) {
      commit(types.UPDATE_USER, payload)
    },
  
    async logout ({ commit }) {
      try {
        await axios.post('/api/logout')
      } catch (e) { }
  
      commit(types.LOGOUT)
    },
  
    async fetchOauthUrl (ctx, { provider }) {
      const { data } = await axios.post(`/api/oauth/${provider}`)
  
      return data.url
    },
  
    // Reverse admin impersonation
    stopImpersonating ({ commit, dispatch }, payload) {
      commit('stopImpersonating')
      return dispatch('fetchUser')
    }
  }
  