# Pasos para la utilización de VUEX

# Archivo Index.js de la carpeta store

En este archivo guardamos todos los datos y funciones que necesitaremos y que obtendremos a partir de importaciones y mapeo de las funciones.

import Vue from 'vue'
import Vuex from 'vuex'
import { auth, db } from '@/firebase'
import router from '../router'

Vue.use(Vuex)

export default new Vuex.Store ( {
  state: {
    usuario: null,
    error: null,
    foto: null,
    
    urlTemporal: '',
    loading: false,
    file: null,
    
    productos: [ ],
    producto: {
      nombre: '',
      familia: '',
      descripcion: '',
      precio: '',
      valoracion: '',
      unidades: '',
      link: '',
      photo: ''
    }
  },
  mutations: {
    updatePhoto (state, foto) {
      state.foto = foto
      console.log(foto)
    },
    updateFile (state, file) {
      state.file = file
    },
    setUsuario (state, payload){
      state.usuario = payload
    },
    setError (state, payload) {
      state.error = payload
    },
    // GET / Obtener
    setProductos (state, payload) {
      state.productos = payload
    },
    // GET BY ID / Obtener por id
    setProducto (state, payload) {
      state.producto = payload
    },
    // DELETE / Eliminar
    setDeleteProducto (state, payload) {
      state.producto = state.productos.filter(item => item.id !== payload)
    }
  },
  actions: {
    // GET / Obtener
    obtenerDatos({commit}){
      const productos = []
      db.collection('productos').get()
      .then(res => {
          res.forEach(doc => {
              let producto = doc.data()
              producto.id = doc.id
              productos.push(producto)
          })
          commit('setProductos', productos)
      })
    },
    // ADD / Añadir
    agregarDato({commit}, producto ){
      db.collection('productos').add({
        nombre: productos.nombre,
        descripcion: productos.descripcion,
        precio: productos.precio,
        valoracion: productos.valoracion,
        link: productos.link,
        photo: this.foto
      })
        .then(doc => {
          router.push({name: 'Index'})
        })
    },
    // DELETE / Eliminar
    eliminarDato({ commit }, id){
      db.collection('productos').doc(id).delete()
        .then(() => {
          commit('setDeleteProducto', id)
        })
        .catch (error => console.log (error))
    },
    // GET BY ID / Obtener por id
    obtenerDatoID({commit}, id){
      db.collection('productos').doc(id).get()
        .then(doc => {
          let producto= doc.data()
          producto.id = doc.id
          commit('setProducto', productos)
        })
    },
    // UPDATE / Actualizar
    actualizarDato({commit}, producto){
      db.collection('productos').doc(producto.id).update({
        idProducto: producto.idProducto,
        nombre: producto.nombre,
        familia: producto.familia,
        descripcion: producto.descripcion,
        precio: producto.precio,
        valoracion: producto.valoracion,
        link: producto.link,
      })
      .then(() => {
        router.push({name: 'Index'})
      })
    },
    crearUsuario ({commit}, usuario){
      auth.createUserWithEmailAndPassword(usuario.email, usuario.password)
        .then (res =>{
          const usuarioCreado = {
          email: res.user.email,
          uid: res.user.uid
        }
        commit ( 'setUsuario',usuarioCreado)
        router.push('/')
        })
          .catch( error => {
            console.log(error)
            commit('setError', error)
          });
    },
    cerrarSesion(){
      auth.signOut()
        .then (() => {
          router.push('/login')
        })
    },
    detectarUsuario( {commit}, usuario ){
      commit ('setUsuario', usuario)
    },
  },

  modules: {
  },

  getters: {
    existeUsuario(state){
      if(state.usuario === null){
          return false
      }else{
          return true
      }
    }
 },
})

# Importación y mapeo de VUEX

<script>
// @ is an alias to /src
import Navbar from '@/components/Navbar.vue'
import FormAdd  from '@/components/FormAdd.vue'
import FormUpdate  from '@/components/FormUpdate.vue'
import { mapActions, mapState } from 'vuex'
import {storage, db} from '../firebase'

export default {

    data() {
      return {
        edit: true,
        urlTemporal: '',
        loading: false,
        error: null,
      }
    },
    name: 'NombreArchivo.vue',
    components: {
        Navbar,
        FormAdd,
        FormUpdate
    },
    mutations: {
    },
    // Tareas
    computed: {
        ...mapState(['productos', 'producto', 'file']),
        file: {
          get () {
            return this.$store.state.file
          },
          set (value) {
            this.$store.commit('updateFile', value)
          }
        },
        photo: {
          get () {
            return this.$store.state.producto.foto
          },
          set (value) {
            this.$store.commit('updatePhoto', value)
          }
        }
      },
      // Funciones
      methods:{
         ...mapActions(['getProductos', 'addProducto', 'getProducto', 'updateProducto', 'deleteProducto'
         ]),
         buscarImagen(event){
             console.log(event.target.files[0]);
             const tipoArchivo = event.target.files[0].type;
             if(tipoArchivo === 'image/jpeg' || tipoArchivo === 'image/png'){
                 this.file = event.target.files[0]
                 this.error = null
                 }else{
                     this.error = 'Archivo no válido'
                     his.file = null
                     return
                    }
                    const reader = new FileReader();
                    reader.readAsDataURL(this.file);
                    reader.onload = (e) => {
                        this.urlTemporal = e.target.result
        }
      },
/* Subir imagen */
        async subirImagen(){
            try {
                this.loading = true
                const refImagen = storage.ref().child('imagenes').child(this.file.name)
                const res = await refImagen.put(this.file)
                console.log(res);
                const urlDescarga = await refImagen.getDownloadURL()
                this.foto = urlDescarga
                this.error = 'Imagen subida con éxito'
                this.file = null
                } catch (error) {
                    console.log(error);
                    } finally {
                        this.loading = false
                    }
                }
        }, 
    created(){
        this.getProductos()
    },   
}
</script>