18da32b5cSDixsie Wolmers# Store Anatomy
28da32b5cSDixsie Wolmers
38da32b5cSDixsie Wolmers## Store
48da32b5cSDixsie Wolmers
5*7385e139SPatrick WilliamsA "store" is a container that holds the application's state.
6*7385e139SPatrick Williams[Learn more about Vuex.](https://vuex.vuejs.org/)
78da32b5cSDixsie Wolmers
88da32b5cSDixsie Wolmers```sh
98da32b5cSDixsie Wolmers# Store structure
108da32b5cSDixsie Wolmers└── store
118da32b5cSDixsie Wolmers    ├── api.js                             # axios requests
128da32b5cSDixsie Wolmers    ├── index.js                           # import store modules
138da32b5cSDixsie Wolmers    ├── plugins
148da32b5cSDixsie Wolmers    └── modules
158da32b5cSDixsie Wolmers        └── FeatureName                    # feature module
168da32b5cSDixsie Wolmers            ├── FeatureStore.js            # feature store
178da32b5cSDixsie Wolmers            ├── AdditionalFeatureStore.js  # additional features per store
188da32b5cSDixsie Wolmers            ├── AnotherFeatureStore.js     # additional features per store
198da32b5cSDixsie Wolmers```
208da32b5cSDixsie Wolmers
218da32b5cSDixsie Wolmers### Modules
228da32b5cSDixsie Wolmers
2349287562SDerick MontagueThe application store is divided into modules to prevent the store from getting
2449287562SDerick Montaguebloated. Each module contains its own state, mutations, actions, and getters.
2549287562SDerick Montague[Learn more about Vuex modules.](https://vuex.vuejs.org/guide/modules.html)
268da32b5cSDixsie Wolmers
278da32b5cSDixsie Wolmers#### Module Anatomy
288da32b5cSDixsie Wolmers
29*7385e139SPatrick Williams- **State:** You cannot directly mutate the store's state.
30*7385e139SPatrick Williams  [Learn more about state.](https://vuex.vuejs.org/guide/state.html)
3149287562SDerick Montague- **Getters:** Getters are used to compute derived state based on store state.
3249287562SDerick Montague  [Learn more about getters.](https://vuex.vuejs.org/guide/getters.html)
3349287562SDerick Montague- **Mutations:** The only way to mutate the state is by committing mutations,
34*7385e139SPatrick Williams  which are synchronous transactions.
35*7385e139SPatrick Williams  [Learn more about mutations.](https://vuex.vuejs.org/guide/mutations.html)
3649287562SDerick Montague- **Actions:** Asynchronous logic should be encapsulated in, and can be composed
37*7385e139SPatrick Williams  with actions.
38*7385e139SPatrick Williams  [Learn more about actions.](https://vuex.vuejs.org/guide/actions.html)
398da32b5cSDixsie Wolmers
408da32b5cSDixsie WolmersImport new store modules in `src/store/index.js`.
418da32b5cSDixsie Wolmers
428da32b5cSDixsie Wolmers```js
438da32b5cSDixsie Wolmers// `src/store/index.js`
448da32b5cSDixsie Wolmers
45*7385e139SPatrick Williamsimport Vue from "vue";
46*7385e139SPatrick Williamsimport Vuex from "vuex";
478da32b5cSDixsie Wolmers
48*7385e139SPatrick Williamsimport FeatureNameStore from "./modules/FeatureNameStore";
498da32b5cSDixsie Wolmers
508da32b5cSDixsie WolmersVue.use(Vuex);
518da32b5cSDixsie Wolmers
528da32b5cSDixsie Wolmersexport default new Vuex.Store({
538da32b5cSDixsie Wolmers  state: {},
548da32b5cSDixsie Wolmers  mutations: {},
558da32b5cSDixsie Wolmers  actions: {},
568da32b5cSDixsie Wolmers  modules: {
578da32b5cSDixsie Wolmers    feature: FeatureNameStore, // store names can be renamed for brevity
588da32b5cSDixsie Wolmers  },
598da32b5cSDixsie Wolmers});
608da32b5cSDixsie Wolmers```
618da32b5cSDixsie Wolmers
628da32b5cSDixsie Wolmers## Complete store
638da32b5cSDixsie Wolmers
648da32b5cSDixsie WolmersA store module will look like this.
658da32b5cSDixsie Wolmers
668da32b5cSDixsie Wolmers```js
67*7385e139SPatrick Williamsimport api from "@/store/api";
68*7385e139SPatrick Williamsimport i18n from "@/i18n";
698da32b5cSDixsie Wolmers
708da32b5cSDixsie Wolmersconst FeatureNameStore = {
718da32b5cSDixsie Wolmers  // getters, actions, and mutations will be namespaced
728da32b5cSDixsie Wolmers  // based on the path the module is registered at
738da32b5cSDixsie Wolmers  namespaced: true,
748da32b5cSDixsie Wolmers  state: {
75*7385e139SPatrick Williams    exampleValue: "Off",
768da32b5cSDixsie Wolmers  },
778da32b5cSDixsie Wolmers  getters: {
788da32b5cSDixsie Wolmers    // namespace -> getters['featureNameStore/getExampleValue']
79*7385e139SPatrick Williams    getExampleValue: (state) => state.exampleValue,
808da32b5cSDixsie Wolmers  },
818da32b5cSDixsie Wolmers  mutations: {
828da32b5cSDixsie Wolmers    // namespace -> commit('featureNameStore/setExampleValue)
83*7385e139SPatrick Williams    setExampleValue: (state) => state.exampleValue,
848da32b5cSDixsie Wolmers  },
858da32b5cSDixsie Wolmers  actions: {
868da32b5cSDixsie Wolmers    // namespace -> dispatch('featureNameStore/getExampleValue')
878da32b5cSDixsie Wolmers    async getExampleValue({ commit }) {
888da32b5cSDixsie Wolmers      return await api
89*7385e139SPatrick Williams        .get("/redfish/v1/../..")
90*7385e139SPatrick Williams        .then((response) => {
91*7385e139SPatrick Williams          commit("setExampleValue", response.data.Value);
928da32b5cSDixsie Wolmers        })
93*7385e139SPatrick Williams        .catch((error) => console.log(error));
948da32b5cSDixsie Wolmers    },
958da32b5cSDixsie Wolmers    // namespace -> ('featureNameStore/saveExampleValue', payload)
968da32b5cSDixsie Wolmers    async saveExampleValue({ commit }, payload) {
978da32b5cSDixsie Wolmers      return await api
98*7385e139SPatrick Williams        .patch("/redfish/v1/../..", { Value: payload })
998da32b5cSDixsie Wolmers        .then(() => {
100*7385e139SPatrick Williams          commit("setExampleValue", payload);
1018da32b5cSDixsie Wolmers        })
102*7385e139SPatrick Williams        .catch((error) => {
1038da32b5cSDixsie Wolmers          console.log(error);
1048da32b5cSDixsie Wolmers        });
1058da32b5cSDixsie Wolmers    },
1068da32b5cSDixsie Wolmers  },
1078da32b5cSDixsie Wolmers};
1088da32b5cSDixsie Wolmers
1098da32b5cSDixsie Wolmersexport default FeatureNameStore;
1108da32b5cSDixsie Wolmers```
111