import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    sessionId: settingParam.sessionId,
    topMainHeight: '',// PAL主页面主体高度，
    navigationQueryVisible: false, // 导航栏输入框的快速搜索结果显示控制
    navigationConditionQueryVisible: false, // 导航栏输入框的快速搜索结果显示控制
    wsId: '',// 资产库id
    teamId: '',// 小组id
    createUsers:[],
    orgIds:[],
    methodIds:[],
    pageFunction: {}
  },
  getters: {// 提供获取state相关数据的方法
    getTopMainHeightFn(state) {// 获取PAL主页面主体高度
      //console.log('get height ' + state.topMainHeight);
      return state.topMainHeight;
    },
    getNavigationQueryVisibleFn(state) {// 获取PAL导航栏搜索框结果的显示与隐藏
      return state.navigationQueryVisible;
    },
    getNavigationConditionQueryVisibleFn(state) {// 获取PAL导航栏条件搜索框结果的显示与隐藏
      return state.navigationConditionQueryVisible;
    },
    getTeamIdFn(state) {// 获取小组id
      return state.teamId;
    },
    getWsIdFn(state) {// 获取资产库id
      return state.wsId;
    },
    getCreateUsers(state){
      return state.createUsers;
    },
    getOrgIds(state){
      return state.orgIds;
    },
    getMethodIds(state){
      return state.methodIds;
    },
    getPageFunction(state){
      return state.pageFunction;
    }
  },
  actions: {// 提供跟后台接口交互的方法，并且调用mutations提供的方法进行更新提交
    setTopMainHeightFn({commit, state}, height) {// 设置PAL主页面主体高度更新
      commit("setTopMainHeightFn", height);
      //console.log('dispatch update height ' + height);
    },
    setNavigationQueryVisibleFn({commit, state}, visible) {// 设置PAL导航栏搜索框结果的显示与隐藏
      commit("setNavigationQueryVisibleFn", visible);
    },
    setNavigationConditionQueryVisibleFn({commit, state}, visible) {// 设置PAL导航栏条件搜索框结果的显示与隐藏
      commit("setNavigationConditionQueryVisibleFn", visible);
    },
    setTeamIdFn({commit, state}, teamId) {
      commit('setTeamIdFn', teamId)
    },
    setWsIdFn({commit, state}, wsId) {
      commit('setWsIdFn', wsId)
    },
    setCreateUsers({commit, state},createUsers){
      commit('setCreateUsers', createUsers)
    },
    setOrgIds({commit, state},orgIds){
      commit('setOrgIds', orgIds)
    },
    setMethodIds({commit, state},methodIds){
      commit('setMethodIds', methodIds)
    },
    setPageFunction({commit,state},functionObj){
      commit('setPageFunction',functionObj)
    }
  },
  mutations: {// 提供存储设置state数据的方法
    setTopMainHeightFn(state, height) {// 设置PAL主页面主体高度更新
      state.topMainHeight = height;
    },
    setNavigationQueryVisibleFn(state, visible) {// 设置PAL导航栏搜索框结果的显示与隐藏
      state.navigationQueryVisible = visible;
    },
    setNavigationConditionQueryVisibleFn(state, visible) {// 设置PAL导航栏条件搜索框结果的显示与隐藏
      state.navigationConditionQueryVisible = visible;
    },
    setTeamIdFn(state, teamId) {// 设置资产库小组Id
      state.teamId = teamId;
    },
    setWsIdFn(state, wsId) {// 设置资产库Id
      state.wsId = wsId;
    },
    setCreateUsers(state,createUsers){
      state.createUsers = createUsers;
    },
    setOrgIds(state,orgIds){
      state.orgIds = orgIds;
    },
    setMethodIds(state,methodIds){
      state.methodIds = methodIds;
    },
    setPageFunction(state,functionObj){
      for (let key in functionObj) {
        state.pageFunction[key] = functionObj[key]
      }
    },
    edit(state, data) {
      for (let p in data) {
        state[p] = data[p];
      }
    }
  },
  modules: {
  }
})

/*
在state中定义数据

Getter相当于vue中的computed计算属性，getter 的返回值会根据它的依赖被缓存起来，且只有当它的依赖值发生了改变才会被重新计算，Getters 可以用于监听、state中的值的变化，返回计算后的结果

给action注册事件处理函数，当这个函数被触发时候，将状态提交到mutations中处理。actions里面自定义的函数接收一个context参数和要变化的形参

mutations是一个对象里。面的方法 都是同步事务，是更改state初始状态的唯一合法方法，具体的用法就是给里面的方法传入参数state或额外的参数

代码中设置全局存储方法：

dispatch：含有异步操作，例如向后台提交数据，写法： this.$store.dispatch('action方法名',值)

commit：同步操作，写法：this.$store.commit('mutations方法名',值)

代码中取值方法：
getters: 写法：this.$store.getters.getTopMainHeightFn
 */

/*
多级嵌套组件监听用法
父组件：Main.vue
某子组件：Child.vue
父组件进行变量赋值
  this.$store.commit('setTopMainHeightFn',this.bodyHeight);// 更新主体高度存储
子组件获取并监听父组件设置的变量变化
  computed: {
    listenTopMainHeight() {
      return this.$store.getters.getTopMainHeightFn;
    }
  },
  watch : {
    listenTopMainHeight: function (newd, old) {
      console.log("old " + old);
      console.log("new " + newd);
    }
  }
 */

