# CRUD FireBase

# HTML

<!-- Formulario para obtener datos del usuario -->
<form>
	<input type="text" id="name" placeholder="Escribe tu ombre" required />
	<input type="text" id="email" placeholder="Escribe tu Email" required />
	<input type="hidden" id="id" />
	<input type="submit" value="Enviar" />
</form>

<!-- Lista donde se mostraran los usuarior registrados -->
<ul id="contacts"></ul>

# JavaScript

;
((d, c, f) => {

	const config = {
	   apiKey: "",
	   authDomain: "",
	   databaseURL: "",
	   projectId: "",
	   storageBucket: "",
	   messagingSenderId: ""
	};

	// ( f ) es utilizada como firebase para inicializar firebase
	f.initializeApp( config );

	/*
	|-----------------------------------------------
	| Obtener campos y crear variables
	|-----------------------------------------------
	| Obtenemos todas lod campos HTML que utilizamos y
	| creamos las variables.
	|
	*/
	const db = f.database(),
		  contactRef   = db.ref().child('contacts'),
		  contactsForm = d.forms[0],
		  contactName  = d.getElementById('name'),
		  contactEmail = d.getElementById('email'),
		  contactId    = d.getElementById('id'),
		  contacts     = d.getElementById('contacts')


	/*
	|-----------------------------------------------
	| ASSETS
	|-----------------------------------------------
	| Funciones de ayuda que se utilizaran
	|
	*/
	function contactTemplate({name, email}) {
		return `
			<span> ${name}$ </span>
			-
			<span> ${email}$ </span>

			<button class="edit"> Editar </button>
			<button> class="delete" Eliminar </button>
		`
	}


	/*
	|-----------------------------------------------
	| CREATE
	|-----------------------------------------------
	| Guardamos los datos recibidos por el formulario
	|
	*/
	contactsForm.addEventListener('submit', e => {
		e.preventDefault();

		let id = contactId || contactRef.push().key,
			contactData = {
				name  = contactName.value,
				email = contactEmail.value
			},
			updateData = {}

		updateData[`/${id}`] = contactData;

		contactRef.update(updateData);

		contactId.value = '';
		contactsForm.reset();
	});


	/*
	|-----------------------------------------------
	| READ
	|-----------------------------------------------
	| Leemos los datos,
	| Detectamos cambios,
	| Detectamos eliminados de la DB de firebase
	|
	| Todo esto para mantener la vista actualizada con los datos de la DB
	|
	*/
	// Muestra los datos
	contactRef.on('child_added', data => {
		let li = d.createElement('li')

		li.id = data.key
		li.innerHTML = contactTemplate(data.val())
		contacts.appendChild(li)
	})

	// Detecta ediciones en los datos y actualiza la vista
	contactRef.on('child_changed', data => {
		let affectedNode = d.getElementById(data.key)
		affectedNode.innerHTML = contactTemplate(data.val())
	})

	// Detecta las eliminaciones y elimina los datos de la vista
	contactRef.on('child_removed', data => {
		let affectedNode = d.getElementById(data.key)
		contacts.removeChild(affectedNode)
	})


	/*
	|-----------------------------------------------
	| EDIT - DELETE
	|-----------------------------------------------
	|
	| Detectara clicK en todo el documento HTML
	| Luego se le pedira que escuche los botones edit, delete
	| matches() retorna boolean --> si coincide o no con ... ( cualquier selector CSS valido )
	|
	*/
	d.addEventListener('click', e => {
		let affectedNode = e.target.parentElement;
		//UPDATE
		if( e.target.matches('button.edit')) {
			contactName.value = affectedNode.querySelector('.name').innerText
			contactEmail.value = affectedNode.querySelector('.email').innerText
			contactId.value = affectedNode.id
		}

		//DELETE
		if( e.target.matches('button.delete')) {
			let id = affectedNode.id
			db.ref(`contacts/${id}`).remove()
		}
	})



})(document, console.log, firebase);