# AUTH + FIRESTORE (Vue.js 2)

Tomando como ejemplo los dos ejercicios anteriores:

# GET tareas

import {auth, db} from '../firebase'

state: {
  tareas: []
},
mutations: {
  setTareas(state, payload){
    state.tareas = payload
  }
},
actions: {
  getTareas({commit, state}){
      const tareas = []
      db.collection(state.usuario.email).get()
      .then(res => {
          res.forEach(doc => {
              let tarea = doc.data()
              tarea.id = doc.id
              tareas.push(tarea)
          })
          commit('setTareas', tareas)
      })
      .catch(error => console.log(error))
  },
  crearUsuario({commit}, usuario){
    auth.createUserWithEmailAndPassword(usuario.email, usuario.password)
      .then(res => {
        console.log(res)
        const usuario = {
          email: res.user.email,
          uid: res.user.uid
        }
        db.collection(usuario.email).add({
          nombre: 'tarea de ejemplo #0'
        }).then(doc => {
          commit('setUsuario', usuario)
          router.push('/')
        })
        .catch(error => console.log(error))
      })
      .catch(error => {
        console.log(error)
        commit('setError', error)
      })
  },
}

Inicio.vue

<template>
    <div>
        <h1>Lista de Tareas</h1>
        <router-link to='/agregar'>
            <button>Agregar</button>
        </router-link>
        <ul>
            <li v-for="(item, index) in tareas" :key="index">
                {{item.id}} - {{item.nombre}}
                <router-link :to="{name: 'Editar', params: {id: item.id}}">
                    <button>Editar</button>
                </router-link>
            </li>
        </ul>
    </div>
</template>

<script>
import {mapActions, mapState} from 'vuex'
export default {
    name: 'Inicio',
    created(){
        this.getTareas()
    },
    methods:{
        ...mapActions(['getTareas'])
    },
    computed:{
        ...mapState(['tareas'])
    }
}
</script>

# UPDATE Tarea

// state
tarea: {nombre: '', id: ''}

// mutations
setTareas(state, payload){
  state.tareas = payload
},
setTarea(state, payload){
  state.tarea = payload
}

// actions
getTarea({commit, state}, id){
  db.collection(state.usuario.email).doc(id).get()
  .then(doc => {
      let tarea = doc.data()
      tarea.id = doc.id
      commit('setTarea', tarea)
  })
  .catch(error => console.log(error))
},
editarTarea({commit, state}, tarea){
  db.collection(state.usuario.email).doc(tarea.id).update({
      nombre: tarea.nombre
  })
  .then(() => {
      router.push({name: 'Inicio'})
  })
  .catch(error => console.log(error))
},

Editar.vue

<template>
    <div>
        <h1>Editar</h1>
        {{id}} - {{tarea}}
        <form @submit.prevent="editarTarea(tarea)">
            <input type="text" v-model="tarea.nombre">
            <button>Editar</button>
        </form>
    </div>
</template>

<script>
import {mapActions, mapState} from 'vuex'
export default {
    name: 'Editar',
    data(){
        return {
            id: this.$route.params.id
        }
    },
    created(){
        this.getTarea(this.id)
    },
    methods:{
        ...mapActions(['getTarea', 'editarTarea'])
    },
    computed:{
        ...mapState(['tarea'])
    }
}
</script>

Router

{
  path: '/editar/:id',
  name: 'Editar',
  component: () => import(/* webpackChunkName: "editar" */ '../views/Editar.vue'),
  meta: { requiresAuth: true }
}

# POST tarea

agregarTarea({commit, state}, nombreTarea){
    db.collection(state.usuario.email).add({
        nombre: nombreTarea
    })
    .then(doc => {
        router.push({name: 'Inicio'})
    })
    .catch(error => console.log(error))
},

Agregar.vue

<template>
    <div>
        <h1>Agregar</h1>
        <form @submit.prevent="agregarTarea(nombre)">
            <input type="text" v-model="nombre">
            <button type="submit">Agregar</button>
        </form>
    </div>
</template>

<script>
import { mapActions } from 'vuex'
export default {
    name: 'Agregar',
    data() {
        return {
            nombre: ''
        }
    },
    methods:{
        ...mapActions(['agregarTarea'])
    }
}
</script>

Router

{
  path: '/agregar',
  name: 'Agregar',
  component: () => import(/* webpackChunkName: "editar" */ '../views/Agregar.vue'),
  meta: { requiresAuth: true }
}

# DELETE tarea

// mutations
setEliminarTarea(state, payload){
  state.tareas = state.tareas.filter(item => item.id !== payload)
}
// actions
eliminarTarea({commit, state}, id){
    db.collection(state.usuario.email).doc(id).delete()
    .then(() => {
        commit('setEliminarTarea', id)
    })
    .catch(error => console.log(error))
},

Inicio.vue













 













 







<template>
    <div>
        <h1>Lista de Tareas</h1>
        <router-link to='/agregar'>
            <button>Agregar</button>
        </router-link>
        <ul>
            <li v-for="(item, index) in tareas" :key="index">
                {{item.id}} - {{item.nombre}}
                <router-link :to="{name: 'Editar', params: {id: item.id}}">
                    <button>Editar</button>
                </router-link>
                <button @click="eliminarTarea(item.id)">Eliminar</button>
            </li>
        </ul>
    </div>
</template>

<script>
import {mapActions, mapState} from 'vuex'
export default {
    name: 'Inicio',
    created(){
        this.getTareas()
    },
    methods:{
        ...mapActions(['getTareas', 'eliminarTarea'])
    },
    computed:{
        ...mapState(['tareas'])
    }
}
</script>
Last Updated: 12/3/2022, 9:51:20