| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416 | import REST from 'vuejs/api/rest-axios'// import JSONAPI from 'vuejs/api/json-axios'import MA from 'vuejs/api/ma-axios'import qs from 'querystring-es3'import materiauFlaglistGQL from 'vuejs/api/gql/materiauflaglist.fragment.gql'// import router from 'vuejs/route' // this is not workingexport default {  namespaced: true,  // router,  // initial state  state: {    uid: null,    // username: '',    mail: '',    csrf_token: null,    logout_token: null,    loginMessage: '',    registerMessage: '',    isloggedin: false,    isAdmin: false,    isAdherent: false,    canSearch: false,    hasDBAccess: false,    roles: [],    flagcolls: false,    flagcollsLoadedItems: {},    openedCollid: null  },  // getters  getters: {},  // mutations  mutations: {    SetCsrftoken (state, token) {      console.log('SetCsrftoken', token)      state.csrf_token = token    },    setToken (state, data) {      console.log('setToken', data)      state.uid = data.current_user.uid      // state.username = data.username;      state.mail = data.current_user.mail      state.csrf_token = data.csrf_token      // state.isloggedin = true      state.logout_token = data.logout_token    },    setLoginMessage (state, message) {      console.log('setLoginMessage', message)      state.loginMessage = message    },    setRegisterMessage (state, message) {      console.log('setRegisterMessage', message)      state.registerMessage = message    },    setUid (state, uid) {      state.uid = uid      state.isloggedin = true    },    setUser (state, data) {      state.mail = data.mail[0].value      state.uuid = data.uuid[0].value      // with session_limit, only here we are certain that the user is logged      state.isloggedin = true    },    setRoles (state, roles) {      console.log('User setRoles', roles)      state.roles = []      for (let i = 0; i < roles.length; i++) {        state.roles.push(roles[i].target_id)      }      // check if admin      if (        state.roles.indexOf('admin') !== -1 ||        state.roles.indexOf('root') !== -1      ) {        // console.log('is admin')        state.isAdmin = true      }      // check if has access to search      if (state.roles.indexOf('adherent') !== -1 ||          state.roles.indexOf('student') !== -1) {        // console.log('is admin')        state.canSearch = true        state.isAdherent = true      }      if (state.isAdherent || state.isAdmin) {        state.hasDBAccess = true      }    },    setLoggedOut (state) {      console.log('setLoggedOut state', state)      state.uid = null      state.mail = ''      state.csrf_token = null      state.isloggedin = false      state.logout_token = null      state.asAdmin = false      state.canSearch = false      // if (state.isAdmin) {      //   // TODO: what if on a page where login is needed (as commerce checkout and cart)      //   window.location.reload(true)      // } else {      //      //   // return systematically to home page      //   this.$router.push({      //     name:`home`      //     // params: { alias:this.alias }      //     // query: { nid: this.item.nid }      //     // meta: { uuid:this.item.uuid },      //   })      // }      // redirect to home page in every case      window.location = window.location.origin    },    setFlagColls (state, flagcolls) {      console.log('User pre setFlagColls', state.flagcolls)      state.flagcolls = flagcolls      // console.log('User post setFlagColls', state.flagcolls)    },    openFlagColl (state, collid) {      state.openedCollid = collid    },    closeFlagColl (state) {      state.openedCollid = null    },    setLoadedCollItems (state, data) {      console.log('setLoadedCollItems', data)      // if no data, we are just calling the mutation to trigger the component update      if (data) {        state.flagcollsLoadedItems[data.collid] = data.items      }    }  },  // actions  actions: {    userRegister ({ dispatch, commit, state }, credentials) {      return new Promise((resolve) => {        REST.get('/session/token').then(({ token }) => {          commit('SetCsrftoken', token)          REST.post('/user/register?_format=json', credentials, {            'X-CSRF-Token': state.csrftoken,            validateStatus: function (status) {              return status >= 200 && status < 500            }          })            .then((response) => {              console.log('user REST registered', response)              if (response.status === 200) {                dispatch('userLogin', credentials).then(() => {                  resolve()                })              } else {                let message = ''                switch (response.status) {                  case 422:                    message = 'email is already registered'                    break                  default:                    message = response.data.message                }                commit('setRegisterMessage', message)              }            })            .catch(error => {              console.warn('Issue with register', error)              Promise.reject(error)            })        })      })    },    userLogin ({ dispatch, commit, state }, credentials) {      return new Promise((resolve, reject) => {        dispatch('getToken', credentials)          // TODO: catch failed login          .then((response) => {            console.log('userLogin dispatch getToken response', response)            if (response.status === 200) {              commit('setToken', response.data)              dispatch('getUser').then(userdata => {                console.log('User Loggedin', state.isAdmin, state.isAdherent)                // have to reload systematicly because of autologout library not loaded if not logged in the begining                if (state.isAdmin) {                  window.location.reload()                }                if (state.isAdherent) {                  // router.push({                  //   name: 'base'                  // })                  // // TODO: openCloseHamMenu(false)                  // dispatch('Common/openCloseHamMenu', false)                  window.location = '/base'                }                // else {                //   // * window.location.reload()                // }                resolve()              })            } else {              commit('setLoginMessage', response.data.message)              console.warn('Issue with getToken', response)              console.log('user loggein failed')              Promise.reject(new Error('user loggein failed'))            }          })          .catch(error => {            console.warn('Issue with Dispatch getToken', error)            Promise.reject(error)          })      })    },    getToken ({ dispatch, commit, state }, credentials) {      return REST.post('/user/login?_format=json',        credentials,        {          validateStatus: function (status) {            return status >= 200 && status < 500          }        })    },    getUser ({ dispatch, commit, state }) {      return new Promise((resolve, reject) => {        REST.get('/session/token').then(({ data }) => {          console.log('csrftoken', data)          commit('SetCsrftoken', data)          console.log('state.csrf_token', state.csrf_token)          const params = {            token: state.csrf_token          }          REST.get(`/user/${state.uid}?_format=json`, params)            .then(({ data }) => {              console.log('user REST getUser data', data)              console.log('roles', data.roles)              // with session_limit, only here we are certain that the user is logged              commit('setUser', data)              if (data.roles) {                commit('setRoles', data.roles)              }              dispatch('getUserFlagColls')              resolve()            })            .catch(error => {              console.warn('Issue with getUser', error)              Promise.reject(error)            })        })      })    },    getUserFlagColls ({ dispatch, commit, state }) {      // flags      // REST.get('/flagging_collection/1?_format=json')      //   .then((data) => {      //     console.log('TEST FLAG REST data', data)      //   })      //   .catch(error => {      //       console.warn('Issue USER TEST FLAG REST', error)      //       Promise.reject(error)      //   })      return MA.get('materio_flag/user_flagging_collections')        .then(({ data }) => {          console.log('user MA getFlags data', data)          commit('setFlagColls', data)        })        .catch(error => {          console.warn('Issue USER MA getFlags', error)          Promise.reject(error)        })    },    // https://drupal.stackexchange.com/questions/248539/cant-get-flagging-api-to-accept-post-request    createFlagColl ({ dispatch, commit, state }, newCollectionName) {      console.log('user createFlagColl', newCollectionName)      return new Promise((resolve, reject) => {        const params = {          name: newCollectionName        }        MA.post('materio_flag/create_user_flagging_collection', params)          .then(({ data }) => {            console.log('user MA createFlagColl data', data)            if (data.status) {              dispatch('getUserFlagColls').then(() => {                resolve(data)              })            }          })          .catch(error => {            console.warn('Issue USER MA createFlag', error)            reject(error)          })      })    },    deleteFlagColl ({ dispatch, commit, state }, flagcollid) {      console.log('user deleteFlagColl', flagcollid)      return new Promise((resolve, reject) => {        const params = {          flagcollid: flagcollid        }        MA.post('materio_flag/delete_user_flagging_collection', params)          .then(({ data }) => {            console.log('user MA deleteFlagColl data', data)            dispatch('getUserFlagColls').then(() => {              resolve()            })          })          .catch(error => {            console.warn('Issue USER MA createFlag', error)            reject(error)          })      })    },    flagUnflag ({ dispatch, commit, state }, { action, id, collid }) {      console.log('user flagUnflag', action, id, collid)      return new Promise((resolve, reject) => {        const params = {          flagid: state.flagcolls[collid].flag_id,          id: id,          flagcollid: collid        }        return MA.post(`materio_flag/${action}`, params)          .then(({ data }) => {            console.log('user MA flag', data)            // reload the fulllist of flagcolleciton            dispatch('getUserFlagColls').then(() => {              if (state.flagcolls[collid].items.length) {                dispatch('loadMaterialsGQL', {                  ids: state.flagcolls[collid].items,                  gqlfragment: materiauFlaglistGQL,                  callBack: 'loadMaterialsCallBack',                  callBackArgs: { collid: collid }                }).then(() => {                  resolve()                })                // dispatch('loadMaterials', {                //   uuids: state.flagcolls[collid].items_uuids,                //   imgStyle: ['card_medium_half'],                //   callBack: 'loadMaterialsCallBack',                //   callBackArgs: { collid: collid }                // }).then(() => {                //   resolve()                // })              } else {                commit('setLoadedCollItems', { collid: collid, items: [] })                resolve()              }            })          })          .catch(error => {            console.warn('Issue USER MA flagUnflag', error)          })      })    },    openFlagColl ({ commit, dispatch, state }, collid) {      console.log('user openFlagColl', collid)      commit('openFlagColl', collid)      if (state.flagcolls[collid].items.length) {        if (typeof state.flagcollsLoadedItems[collid] === 'undefined') {          console.log('loading flagcoll items', state.flagcolls[collid])          // if no loadedItems, load them          // loadMaterials is on mixins          // https://github.com/huybuidac/vuex-extensions          dispatch('loadMaterialsGQL', {            ids: state.flagcolls[collid].items,            gqlfragment: materiauFlaglistGQL,            callBack: 'loadMaterialsCallBack',            callBackArgs: { collid: collid }          })          // dispatch('loadMaterials', {          //   uuids: state.flagcolls[collid].items_uuids,          //   imgStyle: ['card_medium_half'],          //   callBack: 'loadMaterialsCallBack',          //   callBackArgs: { collid: collid }          // })        } else {          // call the mutation without data to only trigger the FlagCollection component update          console.log('committing setLoadedCollItems without args')          commit('setLoadedCollItems')        }      } else {        commit('setLoadedCollItems', { collid: collid, items: [] })      }    },    loadMaterialsCallBack ({ commit }, { items, callBackArgs }) {      console.log('user loadMaterialsCallBack', items, callBackArgs)      commit('setLoadedCollItems', { collid: callBackArgs.collid, items: items })    },    closeFlagColl ({ commit, dispatch }) {      console.log('user closeFlagColl')      commit('closeFlagColl')    },    userLogout ({ commit, state }) {      const credentials = qs.stringify({        token: state.csrf_token      })      REST.post('/user/logout', credentials)        .then(resp => {          console.log('userLogout resp', resp)          commit('setLoggedOut')          // window.location.reload(true) ???        })        .catch(error => {          console.warn('Issue with logout', error)          Promise.reject(error)        })    }  }}
 |