diff --git a/README.md b/README.md index 8dcccceb..d0506c0c 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,70 @@ # Creando una Red Social +## HELIVISUEL 🍿 + + + ## Índice -* [1. Preámbulo](#1-preámbulo) -* [2. Resumen del proyecto](#2-resumen-del-proyecto) -* [3. Objetivos de aprendizaje](#3-objetivos-de-aprendizaje) -* [4. Consideraciones generales](#4-consideraciones-generales) -* [5. Criterios de aceptación mínimos del proyecto](#5-criterios-de-aceptación-mínimos-del-proyecto) -* [6. Hacker edition](#6-hacker-edition) -* [7. Entrega](#7-entrega) -* [8. Pistas, tips y lecturas complementarias](#8-pistas-tips-y-lecturas-complementarias) +* [1. Definición del producto](#1-definición-del-producto) +* [2. Historia de usuarios](#2-historia-de-usuarios) +* [3. Prototipos](#3-prototipos) +* [4. Test de usabilidad](#4-Test-de-usabilidad) +* [5. Objetivos de aprendizaje](#5-objetivos-de-aprendizaje) + +## 1. DEFINICIÓN DEL PRODUCTO + +### Definición del problema + +Con las mejoras en el flujo de datos a partir de tecnologías como 4G y 5G, el crecimiento de contenido audiovisual variado, de calidad y asequible a través de plataformas de streaming, se están creando comunidades de discusión sobre series, películas, documentales, cortometrajes, etc., donde las opiniones generan un valor sobre cada contenido para el usuario influenciado las decisiones sobre lo próximo que verá y al tiempo le permite compartir con personas que tienen intereses afines. + + +### Perfil del usuario + +Nuestros usuarios son personas entre los 18 y los 50 años tiene un interés por las películas, series y demás contenido audiovisual, que tienen acceso a las plataformas de streaming como Netflix, Disney +, Amazon Prime o Hulu o servicios de televisión o que frecuentan el cine, y a quiénes les gusta compartir y comparar opiniones sobre estas producciones. + +Nuestros usuarios abarcan desde aquel que se dedica profesionalmente a hacer reviews hasta personas que solo buscan aportar su opinión o una buena recomendación. Quieren poder agregar recomendaciones de otros a su lista de pendientes, y agregar una lista donde aparezca aquello que vio y quiere recomendar a la comunidad o comentar, participar en discusiones, poder buscar una película por su título ver las reviews asociadas y darles like, saber quién escribió la reseña (y si le gusta poder seguirlo). + + +## 2. HISTORIAS DE USUARIO + +* H1: El usuario se puede loguear o registrar +* H2: El usuario puede realizar posts y visualizarlos en su muro +* H3: El usuario podrá ingresar a su perfil y ver su información general +* H4: El usuario tendrá más opciones para interactuar en la red social + +## 3. PROTOTIPOS DE ALTA Y BAJA FIDELIDAD + +### Prototipos de baja fidelidad -## 1. Preámbulo + + + + -Instagram, Snapchat, Twitter, Facebook, Twitch, Linkedin, etc. Las redes -sociales han invadido nuestras vidas. Las amamos u odiamos, y muchos no podemos -vivir sin ellas. +### Prototipos de alta fidelidad -Hay redes sociales de todo tipo y para todo tipo de intereses. Por ejemplo, -en una ronda de financiamiento con inversionistas, se presentó una red social -para químicos en la que los usuarios podían publicar artículos sobre sus -investigaciones, comentar en los artículos de sus colegas, y filtrar artículos -de acuerdo a determinadas etiquetas o su popularidad, lo más reciente, o lo -más comentado. +Movil: https://www.figma.com/proto/vVV1qI2KgMuUCAKSVx8nxJ/Prototyping-in-Figma?node-id=31%3A492&scaling=scale-down + +Desktop: https://www.figma.com/proto/vVV1qI2KgMuUCAKSVx8nxJ/Prototyping-in-Figma?node-id=51%3A79&scaling=min-zoom + +Tablet: https://www.figma.com/proto/vVV1qI2KgMuUCAKSVx8nxJ/Prototyping-in-Figma?node-id=77%3A180&scaling=scale-down -## 2. Resumen del proyecto +### Paleta de colores -En este proyecto construirás una Red Social sobre lo que decidan tú y tu equipo. -Podría ser, por ejemplo, sobre alimentación saludable, feminismo, educación, -salud, energías renovables, amantes de las [Empanadas](https://es.wikipedia.org/wiki/Empanada) -o de los [Tacos de Canasta](https://es.wikipedia.org/wiki/Taco), de la -[Feijoada](https://es.wikipedia.org/wiki/Feijoada), o de lo que sea. + -Tu Red Social tendrá que permitir a cualquier usuario crear una cuenta de -acceso y loguearse con ella; crear, editar, borrar y _"likear"_ publicacciones. + +## 2. Test de Usabilidad + +En los tests de usabilidad que se realizaron con nuestras compañeras y coach se identifico que la paleta de colores que estabamos utilizando era la correcta, les gusto el diseño de la página, como sugerencias nos dijeron que pusieramos la letra mas grande, adicional que le cambiaramos el color si era un link, y que el fondo del timeline fuera diferente al tono blanco para que la experiencia visual del usuario fuera mejor. + +El usuario interactua con la pagina de la siguiente manera: + +1. Primero el usuario entra a una pagina de Bienvenida a la red social donde puede ingresar. +2. Segundo encuentra una sección donde se puede loguear, tiene la opción de crear una cuenta o entrar con Google, adicional tiene la opción de recuperar la contraseña si la ha olvidado. +3. Tercero al haberse logueado ya puede ingresar al timeline, donde puede realizar una publicación teniendo en cuenta tres categorias: Películas, series o documentales. Además puede dar o quitar like a otras publicaciones. +4. Cuarto tiene una sección de perfil, donde puede cambiar su foto, agregar una biografia, y ver sus publicaciones, las cuales puede editar o eliminar. ## 3. Objetivos de aprendizaje @@ -105,219 +136,3 @@ El objetivo principal de aprendizaje de este proyecto es construir una * [ ] Aplicar los principios de diseño visual (contraste, alineación, jerarquía) * [ ] Planear y ejecutar tests de usabilidad. -## 4. Consideraciones generales - -* Este proyecto se debe trabajar en equipos de tres. - -* La lógica del proyecto debe estar implementada completamente en JavaScript - (ES6+), HTML y CSS :smiley:. Para este proyecto **no está permitido** utilizar - _frameworks_ o librerías de CSS y JS. - -* La división y organización del trabajo debe permitir, sin excepciones, que - **cada integrante** del equipo practique el aprendizaje de todo lo involucrado - en **cada historia**. _No se dividan el trabajo como en una fábrica._ - - ¿Hasta acá has avanzado en tus proyectos con cierta fluidez y sin mayores - problemas? Sé generosa con tus compañeras, permíteles aprender y practicar - sin restricciones, aunque tome un poco más de tiempo. Aproveha de - _coachearlas_, de hacer _pair programming_, una de las mejores maneras de - aprender es explicando verbalmente. - - - ¿Se te está haciendo difícil y te cuesta un poco más avanzar? No te quedes - con las partes "fáciles" del proyecto, conversa, negocia, exige tu oportunidad - para practicar y aprender lo que se te hace más difícil. - -* Solamente pueden trabajar en una única historia por vez, no pueden avanzar a - la siguiente sin haber completado la anterior. La historia se completa cuando - se cumplen **todos** sus Criterios de Aceptación + **toda** su Definición - de Terminado. - -Para comenzar tendrás que hacer un _fork_ y _clonar_ este repositorio. - -## 5. Criterios de aceptación mínimos del proyecto - -### 5.1 Boilerplate - -Este proyecto no incluye un _boilerplate_, así es que tendrás que definir la -estructura de carpetas y escribir tus propias Pruebas Unitarias (_tests_). Para -hacerlo, puedes guiarte de los proyectos anteriores. - -### 5.2 Definición del producto - -En el `README.md` cuéntanos brevemente cómo descubriste las necesidades de los -usuarios y cómo llegaste a la definición final de tu producto. Es importante -que detalles: - -* Quiénes son los principales usuarios de producto. -* Qué problema resuelve el producto / para qué le servirá a estos usuarios. - -### 5.3 Historias de usuario - -Una vez que entiendas las necesidades de tus usuarixs, escribe las Historias de -Usuario que representen todo lo que necesitan hacer/ver en la Red Social. Cada -una de tus Historias de Usuario debe tener: - -* **Criterios de Aceptación:** todo lo que debe ocurrir para satisfacer las - necesidades del usuario. - -* **Definición de terminado:** todos los aspectos técnicos que deben cumplirse - para que, como equipo, sepan que esa historia está terminada y lista - para publicarse. **Todas** tus Historias de Usuario (salvo excepciones), deben - incluir estos aspectos en su Definición de Terminado (más todo lo que - necesiten agregar): - - - Debe ser una SPA. - - Debe ser _responsive_. - - Deben haber recibido _code review_ de al menos una compañera de otro equipo. - - Hicieron los _test_ unitarios - - Testearon manualmente buscando errores e imperfecciones simples. - - Hicieron _pruebas_ de usabilidad e incorporaron el _feedback_ de los - usuarios como mejoras. - - Desplegaron su aplicación y etiquetaron la versión (git tag). - -### 5.4 Diseño de la Interfaz de Usuario (prototipo de baja fidelidad) - -Debes definir cuál será el flujo que seguirá el usuario dentro de tu aplicación -y, con eso, diseña la Interfaz de Usuario (UI por sus siglas en inglés) que -siga este flujo. - -### 5.5 Responsive - -Debe verse bien en dispositivos de pantallas grandes -(computadoras/es, laptops, etc.) y pequeñas (_tablets_, celulares, etc.). Te -sugerimos seguir la técnica de _`mobile first`_ (más detalles sobre esta técnica -al final). - -### 5.6 Consideraciones del comportamiento de la interfaz de usuario (UI) - -Estas consideraciones te ayudarán a escribir las Definiciones de Terminado de -tus H.U.: - -#### Creación de cuenta de usuario e inicio de sesión - -* _Login_ con Firebase: - - Para el _login_ y las publicaciones en el muro puedes utilizar [Firebase](https://firebase.google.com/products/database/) - - Creación de cuenta de acceso y autenticación con cuenta de correo y - contraseña, y también con una cuenta de Google. -* Validaciones: - - Solamente se permite el acceso a usuarios con cuentas válidas. - - No pueden haber usuarios repetidos. - - La cuenta de usuario debe ser un correo electrónico válido. - - Lo que se escriba en el campo (_input_) de contraseña debe ser secreto. -* Comportamiento: - - Al enviarse el formulario de registro o inicio de sesión, debe validarse. - - Si hay errores, se deben mostrar mensajes descriptivos para ayudar al - usuario a corregirlos. - -#### Muro/timeline - -* Validaciones: - - Al publicar, se debe validar que exista contenido en el _input_. -* Comportamiento: - - Al recargar la aplicación, se debe verificar si el usuario está _logueado_ - antes de mostrar contenido. - - Poder publicar un _post_. - - Poder dar y quitar _like_ a una publicación. Máximo uno por usuario. - - Llevar un conteo de los _likes_. - - Poder eliminar un post específico. - - Pedir confirmación antes de eliminar un _post_. - - Al dar _click_ para editar un _post_, debe cambiar el texto por un _input_ - que permita editar el texto y luego guardar los cambios. - - Al guardar los cambios debe cambiar de vuelta a un texto normal pero con la - información editada. - - Al recargar la página debo de poder ver los textos editados. - -### 5.7 Consideraciones técnicas Front-end - -* Separar la manipulación del DOM de la lógica (Separación de responsabilidades). -* Contar con múltiples vistas. Para esto, tu aplicación debe ser una - [Single Page Application (SPA)](https://es.wikipedia.org/wiki/Single-page_application) -* Alterar y persistir datos. Los datos que agregues o modifiques deberán - persistir a lo largo de la aplicación. Te recomendamos que uses - [Firebase](https://firebase.google.com/) para eso también. - -#### Pruebas unitarias (unit tests) - -* Recuerda que no hay un _setup_ de **tests** definido, dependerá de - la estructura de tu proyecto. Algo que no debes de olvidar es pensar en éstas - pruebas, te pueden ayudar a definir la estructura y nomenclatura de tu lógica. - -* Los tests unitarios deben cubrir un mínimo del 70% de _statements_, _functions_, - _lines_, y _branches_. - -### 5.8 Consideraciones técnicas UX - -* Hacer al menos 2 entrevistas con usuarios. -* Hacer un prototipo de baja fidelidad. -* Asegurarte de que la implementación en código siga los lineamientos del - diseño. -* Hacer sesiones de _testing de usabilidad_ con el producto en HTML. - -## 6. Hacker edition - -Las secciones llamadas _Hacker Edition_ son **opcionales**. Si **terminaste** -con todo lo anterior y te queda tiempo, intenta completarlas. Así podrás -profundizar y/o ejercitar más sobre los objetivos de aprendizaje del proyecto. - -* Permite crear posts con imágenes. -* Permite buscar usuarios, agregar y eliminar "amigos". -* Permite definir la privacidad de los _posts_ (público o solamente para amigos). -* Permite ver su muro de cualquier usuario "no-amigo" (solamente los - posts _públicos_). -* Permite comentar o responder una publicación. -* Permite editar perfil. - -## 7. Entrega - -El proyecto será _entregado_ subiendo tu código a GitHub (`commit`/`push`) y la -interfaz será desplegada usando GitHub pages u otro servicio de hosting que -puedas haber encontrado en el camino. - -*** - -## 8. Pistas, tips y Lecturas complementarias - -### Mobile first - -El concepto de [_mobile first_](https://www.mediaclick.es/blog/diseno-web-responsive-design-y-la-importancia-del-mobile-first/) -hace referencia a un proceso de diseño y desarrollo donde partimos de cómo se ve -y cómo funciona la aplicación en un dispositivo móvil primero, y más adelante se -ve como adaptar la aplicación a pantallas progresivamente grandes y -características específicas del entorno desktop. Esto es en contraposición al -modelo tradicional, donde primero se diseñaban los websites (o webapps) para -desktop y después se trataba de _arrugar_ el diseño para que entre en pantallas -más chicas. La clave acá es asegurarse de que desde el principio diseñan usando -la vista _responsive_ de las herramientas de desarrollador (developer tools) del -navegador. De esa forma, partimos de cómo se ve y comporta la aplicación en una -pantalla y entorno móvil. - -### Múltiples vistas - -En proyectos anteriores nuestras aplicaciones habían estado compuestas de una -sola _vista_ principal (una sóla _página_). En este proyecto se introduce la -necesidad de tener que dividir nuestra interfaz en varias _vistas_ o _páginas_ -y ofrecer una manera de navegar entre estas vistas. Este problema se puede -afrontar de muchas maneras: con archivos HTML independientes (cada uno con su -URL) y links tradicionales, manteniendo estado en memoria y rederizando -condicionalmente (sin refrescar la página), [manipulando el historial del -navegador](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) -con [`window.history`](https://developer.mozilla.org/es/docs/Web/API/Window/history). -En este proyecto te invitamos a explorar opciones y decidir una opción -de implementación. - -### Escritura de datos - -En los proyectos anteriores hemos consumido (leído) datos, pero todavía no -habíamos escrito datos (salvar cambios, crear datos, borrar, ...). En este -proyecto tendrás que crear (salvar) nuevos datos, así como leer, actualizar y -modificar datos existentes. Estos datos se podrán guardar de forma remota -usando [Firebase](https://firebase.google.com/). - -Otras: - -* [Modulos: Export](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/export) -* [Modulos: Import](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/import) -* [Diseño web, responsive design y la importancia del mobile first - Media Click](https://www.mediaclick.es/blog/diseno-web-responsive-design-y-la-importancia-del-mobile-first/) -* [Mobile First: el enfoque actual del diseño web móvil - 1and1](https://www.1and1.es/digitalguide/paginas-web/diseno-web/mobile-first-la-nueva-tendencia-del-diseno-web/) -* [Mobile First - desarrolloweb.com](https://desarrolloweb.com/articulos/mobile-first-responsive.html) -* [Mobile First - ZURB](https://zurb.com/word/mobile-first) -* [Mobile First Is NOT Mobile Only - Nielsen Norman Group](https://www.nngroup.com/articles/mobile-first-not-mobile-only/) diff --git a/_mocks_/firebase_mock.js b/_mocks_/firebase_mock.js deleted file mode 100644 index a00ef286..00000000 --- a/_mocks_/firebase_mock.js +++ /dev/null @@ -1,32 +0,0 @@ - -const auth = () => { - return{ - createUserWithEmailAndPassword: (email,pass) => { - return new Promise ((resolve) =>{ - resolve(`Se creo un usuario con ${email} y ${pass}`); - }) - } - /*sendPasswordResetEmail: (email) => { - return new Promise ((resolve) => { - resolve (`Se envio un correo de restablecer contraseña a ${email}`) - }) - }*/ - /*signInWithEmailAndPassword: (email,password) => { - return new Promise ((resolve) =>{ - resolve (`Se pudo loguear con ${email} y contraseña ${password}`) - }) - }, - signInWithPopup: (user) => { - return new Promise ((resolve) =>{ - resolve (`${user} se logueo con Google`) - }) - }*/ - } -} -/*const firebase = { - auth:auth -}*/ - -export default jest.fn(() => { - return auth; -}) \ No newline at end of file diff --git a/package.json b/package.json index 796f1d15..5344d097 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "eslint-plugin-jest": "^22.1.2", "htmlhint": "^0.11.0", "jest": "^24.8.0", + "mock-cloud-firestore": "^0.12.0", "regenerator-runtime": "^0.13.1", "serve": "^11.0.2", "stylelint": "^10.1.0", diff --git a/src/components/modal.js b/src/components/modal.js index 20833ad9..ebabdbfb 100644 --- a/src/components/modal.js +++ b/src/components/modal.js @@ -1,6 +1,7 @@ import { commentPublish } from '../lib/firebaseFirestore.js'; export const publish = (userPhoto, userID, userName) =>{ + const photoDefault = 'https://www.nicepng.com/png/detail/202-2022264_usuario-annimo-usuario-annimo-user-icon-png-transparent.png'; const modal = document.createElement('section'); modal.setAttribute('class', 'modal'); modal.innerHTML = `` let photo = modal.querySelector('#userPhoto'); - photo.src = `${userPhoto}`; + photo.src = `${(userPhoto === null ? photoDefault : userPhoto)}`; const publish = modal.querySelector('#formComment'); - //const img = form.loadImg.value; + publish.addEventListener('submit', (e)=>{ e.preventDefault(); let comment = publish.comment.value; diff --git a/src/components/printPost.js b/src/components/printPost.js index 1c8f95aa..87e3a898 100644 --- a/src/components/printPost.js +++ b/src/components/printPost.js @@ -1,15 +1,17 @@ -import { deletePost } from '../lib/firebaseFirestore.js'; +import { deletePost, likePost } from '../lib/firebaseFirestore.js'; import { updateFieldData } from '../lib/firebaseFirestore.js'; +import {currentUser} from '../lib/firebaseAuth.js'; //Imprime el post en el timeline y en profile export default (post, user, postid) => { + let photoDefault = "https://www.nicepng.com/png/detail/202-2022264_usuario-annimo-usuario-annimo-user-icon-png-transparent.png"; const newpost = document.createElement('div'); newpost.setAttribute('id', postid); newpost.setAttribute('class', 'post'); newpost.innerHTML = `
-
+

${user.name}

${post.date.toDate().toDateString()}

@@ -21,6 +23,11 @@ export default (post, user, postid) => {
`; + // Toma el id del usuario logueado y valida y está dentro del arreglo de likes + const userid = currentUser(); + let pushLike = post.likes.some(likes => likes === userid.uid); + // FIN + const categoryIcon = newpost.querySelector('.categories'); switch (post.category) { case 'Movie': @@ -39,15 +46,14 @@ export default (post, user, postid) => { icons.setAttribute('class', 'input-comment'); icons.innerHTML = `
- - - 00000 + + ${post.likes.length} - 00000 + 0
- +

¿Estás seguro que quieres eliminar la publicación?

@@ -58,7 +64,8 @@ export default (post, user, postid) => {
`; newpost.appendChild(icons); - const comments = document.createElement('section'); + + /*const comments = document.createElement('section'); comments.setAttribute('class', 'newsfeed'); comments.innerHTML = `
@@ -67,14 +74,15 @@ export default (post, user, postid) => {
- ""
`; + "" `;*/ if (window.location.hash === '#timeline') { icons.querySelector('#delete').style.display = 'none'; icons.querySelector('#edit').style.display = 'none'; } - // newpost.appendChild(comments); + const postId = newpost.getAttribute('id'); + window.addEventListener('click', (e) => { if (e.target === icons.querySelector('.commentaries')) { icons.querySelector('.inputCommentandButton').style.display = 'block'; @@ -82,7 +90,6 @@ export default (post, user, postid) => { } else if (e.target === icons.querySelector('#delete')) { icons.querySelector('#confirm').style.display = 'block'; } else if (e.target === icons.querySelector('#deleteBtn')) { - //const postId = newpost.getAttribute('id'); deletePost(postId); } else { icons.querySelector('.inputCommentandButton').style.display = 'none'; @@ -91,19 +98,45 @@ export default (post, user, postid) => { } }); - let editPost = newpost.querySelector('#post'); - const btnEdit = icons.querySelector('#edits'); + // ocultar comentarios + window.addEventListener('click', (e) => { + if (e.target == icons.querySelector('.commentaries ')) { + icons.querySelector('.inputCommentandButton').style.display = 'block'; + newpost.querySelector('.card', '#icons').style.display = 'none'; + } else { + icons.querySelector('.inputCommentandButton').style.display = 'none'; + newpost.querySelector('.card').style.display = 'block'; + } + }); + + // like activo inactivo + const btnlike = icons.querySelector('#likes'); + btnlike.addEventListener('click', () => { + const userid = currentUser(); + likePost(userid.uid, postid, pushLike); + if (pushLike) { + pushLike = false; + } else { + pushLike = true; + } + }); + + //Editar post + + const editPost = newpost.querySelector('#post'); + const btnEdit = icons.querySelector('#edit'); const btnSave = icons.querySelector('#saveBtn'); btnEdit.addEventListener ('click', () => { editPost.contentEditable = true; + editPost.style.backgroundColor = 'white'; btnSave.style.display = 'block'; console.log('editing') }); btnSave.addEventListener ('click', () => { - updateFieldData('post',postId,{comment: editPost.innerHTML}) + updateFieldData('post',postId,{comment: editPost.innerHTML}); console.log(postId,editPost.innerHTML); editPost.contentEditable = false; btnSave.style.display = 'none'; @@ -111,12 +144,5 @@ export default (post, user, postid) => { }); - /* window.addEventListener('click', (e)=>{ - if(e.target == icons.querySelector('.commentaries')){ - icons.querySelector('.inputCommentandButton').style.display = 'block'; - }else{ - icons.querySelector('.inputCommentandButton').style.display = 'none'; - }); */ - return newpost; }; diff --git a/src/css/createAccount.css b/src/css/createAccount.css index 1e23e034..e058d531 100644 --- a/src/css/createAccount.css +++ b/src/css/createAccount.css @@ -1,5 +1,5 @@ .accountOne{ - height: 100%; + height: 90vh; display: flex; padding: 0 20px; } diff --git a/src/css/home.css b/src/css/home.css index 93fb7f77..01a61fb6 100644 --- a/src/css/home.css +++ b/src/css/home.css @@ -1,5 +1,5 @@ .home{ - height: 100%; + height: 90vh; display: flex; justify-content: center; align-items: center; diff --git a/src/css/login.css b/src/css/login.css index 29638a58..a8532b81 100644 --- a/src/css/login.css +++ b/src/css/login.css @@ -1,5 +1,5 @@ .container { - height: 100%; + height: 90vh; display: flex; justify-content: center; align-items: center; diff --git a/src/css/profile.css b/src/css/profile.css index 2fb3246b..e5cc1e9e 100644 --- a/src/css/profile.css +++ b/src/css/profile.css @@ -88,7 +88,7 @@ #biographyid{ width:200px; - height:50px; + height:80px; font-family: 'Source Sans Pro'; background: #DED5D5; color:black; diff --git a/src/css/profileUser.css b/src/css/profileUser.css deleted file mode 100644 index 376c1331..00000000 --- a/src/css/profileUser.css +++ /dev/null @@ -1,69 +0,0 @@ -#profile{ - height: 100%; - display: flex; - justify-content: center; - align-items: center; - background-color: #FFFFF0; - background-size:cover; - flex-direction: column; - } -#profile h1,h3{ - font-size: 13px; - color:black; - text-align: center; -} - -#profile .photo{ - border-radius: 50%; - max-width: 25%; - display:inline-block; - } - - #profileBody{ - display: flex; - flex-direction: column; - width: 100%; - height: 100%; - background-color: #FFFFF0; - position: relative; - padding: 10px - } - - .comment{ - min-width: 250px; - margin: 30px auto; - background-color: gray; - } - #deleteIcon{ - width: 30px; - height: 30px; - background-image: url(../img/delete.png); - background-position: center; - cursor: pointer; - } - - #confirm{ - display: none; - flex-direction: column; - justify-content: space-around; - max-width: 400px; - height: 100px; - background-color: #FFFFFF; - border: 1px solid #766D78; - border-radius: 20px; - font-size: 1em; - text-align: center; - color: #5D5D5D; - position: absolute; - left: 0; - right: 0; - margin: auto; - } - - #confirm > h2{ - font-size: 1em; - } - #deleteBtn{ - background-color: #ED3124; - border: 2px solid #C7251F; - } diff --git a/src/css/recover.css b/src/css/recover.css index d164a68d..c4cad97e 100644 --- a/src/css/recover.css +++ b/src/css/recover.css @@ -1,6 +1,6 @@ .recover{ display: flex; - height: 100%; + height: 90vh; justify-content: center; align-items: center; background-image: url(background/recoveraccaunt.png); diff --git a/src/css/thanksAccount.css b/src/css/thanksAccount.css index 349b0384..8583fd39 100644 --- a/src/css/thanksAccount.css +++ b/src/css/thanksAccount.css @@ -1,5 +1,5 @@ #thanku { -height: 100%; +height: 90vh; display: flex; justify-content: center; align-items: center; diff --git a/src/img/Banner.png b/src/img/Banner.png new file mode 100644 index 00000000..22648dcb Binary files /dev/null and b/src/img/Banner.png differ diff --git a/src/img/dislike.png b/src/img/dislike.png new file mode 100644 index 00000000..88c70d6b Binary files /dev/null and b/src/img/dislike.png differ diff --git a/src/img/error404.png b/src/img/error404.png new file mode 100644 index 00000000..6b35eff9 Binary files /dev/null and b/src/img/error404.png differ diff --git a/src/lib/firebaseAuth.js b/src/lib/firebaseAuth.js index 4699e585..364e5d70 100644 --- a/src/lib/firebaseAuth.js +++ b/src/lib/firebaseAuth.js @@ -4,19 +4,17 @@ export function currentUser() { return user; } -export async function signUp(email, password, name) { +export async function signUp(email, password, name, birthday) { + const photoDefault = 'https://www.nicepng.com/png/detail/202-2022264_usuario-annimo-usuario-annimo-user-icon-png-transparent.png'; try { const newUser = await auth.createUserWithEmailAndPassword(email, password); - let currentUser = await auth.currentUser; - currentUser.updateProfile({displayName: name}); - let userDb = await data.collection('users').doc(currentUser.uid) - .set({birthday, biography:'', name, photo: currentUser.photoURL}); - - window.location.hash = "#thankAccount"; - + const currentUser = await auth.currentUser; + currentUser.photoURL = (currentUser.photoURL === null ? photoDefault : currentUser.photoURL); + currentUser.updateProfile({ displayName: name }); + const userDb = await data.collection('users').doc(currentUser.uid) + .add({ birthday, biography:'', name, photo: (currentUser.photoURL) }); + window.location.hash = '#thankAccount'; return newUser; - - } catch (error) { // Handle Errors here. const errorCode = error.code; @@ -52,7 +50,7 @@ export async function logInGoogle(provider) { let currentUser = await auth.currentUser; currentUser.providerData.forEach(function (profile){ data.collection('users').doc(currentUser.uid) - .set({name: profile.displayName, photo: profile.photoURL, biography:''}); + .add({name: profile.displayName, photo: profile.photoURL, biography:''}); }) } catch (error) { // Handle Errors here. diff --git a/src/lib/firebaseFirestore.js b/src/lib/firebaseFirestore.js index cee97776..b95d5ca2 100644 --- a/src/lib/firebaseFirestore.js +++ b/src/lib/firebaseFirestore.js @@ -1,5 +1,6 @@ import printPost from '../components/printPost.js'; +// crear publicaciones y los campos export const commentPublish = (comment, category, userID) => { try { var userDocRef = data.collection('post').doc().set({ @@ -12,6 +13,8 @@ export const commentPublish = (comment, category, userID) => { console.log(e); } }; + +//Cargar los posts //onSnapshot,cambios de la colección post,trae o quita los cambios que se hagan export const loadPost = async (containerDOM) =>{ try { @@ -30,6 +33,7 @@ export const loadPost = async (containerDOM) =>{ } }; + //User login autora del post, posts del usuario logueado export const currentUserPost = async (containerDOM, currentUser) =>{ try { @@ -43,6 +47,7 @@ export const currentUserPost = async (containerDOM, currentUser) =>{ querySnapshot.forEach(async (doc) => { let postid = doc.id; let post = doc.data(); + console.log(post); containerDOM.appendChild(printPost(post, user, postid)); }); }); @@ -51,6 +56,7 @@ export const currentUserPost = async (containerDOM, currentUser) =>{ } }; +//Borrar post export const deletePost = async(id) =>{ try { await data.collection('post').doc(id).delete(); @@ -59,6 +65,7 @@ export const deletePost = async(id) =>{ } }; +//Me actualiza cualquier campo de la colección, en este caso lo utilizamos para actualizar la biografia y los posts export const updateFieldData = async( collectionName, id, field ) =>{ try{ await data.collection(collectionName).doc(id).update(field); @@ -67,6 +74,7 @@ export const deletePost = async(id) =>{ } }; + //Guarda la información de la biografia del usuario export const updateBiography = async(id,containerBio) =>{ try{ await data.collection('users').doc(id).onSnapshot((querySnapshot) => { @@ -79,14 +87,29 @@ export const deletePost = async(id) =>{ } }; + // coloca y quita los likes. +export async function likePost(currentUserId, postId, pushLike) { + const postRef = data.collection('post').doc(postId); + if (pushLike) { + postRef.update({ + likes: firebase.firestore.FieldValue.arrayRemove(currentUserId), + }); + } else { + postRef.update({ + likes: firebase.firestore.FieldValue.arrayUnion(currentUserId), + }); + } +} - +// array de objetos en donde se va a guardar toda la información de cada usuario export const userInfo = async() =>{ const users = [] await data.collection('users').get().then((querySnapshot) => { querySnapshot.forEach((doc) => { users.push({id: doc.id, name: doc.data().name, photo: doc.data().photo, biography:doc.data().biography}); }); + //console.log(users); }); + return users; }; \ No newline at end of file diff --git a/src/lib/firebase_auth.js b/src/lib/firebase_auth.js deleted file mode 100644 index e40a8215..00000000 --- a/src/lib/firebase_auth.js +++ /dev/null @@ -1,76 +0,0 @@ - -// create Account -export async function signUser(email, pass) { - //console.log(auth()); - try { - const userNew = await auth.createUserWithEmailAndPassword(email, pass); - console.log(userNew); - return userNew; - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - console.log(errorMessage,errorCode); - } -} - -// recover - -export async function recoverUser(message, email) { - try { - const userRecover = await auth.sendPasswordResetEmail(email); - message.innerHTML = `Hemos enviado un email a ${email} para cambiar la contraseña`; - return userRecover; - } catch (error) { - message.innerHTML = 'No se ha podido enviar el correo'; - console.log('No se envio el correo'); - } -} - -// sign in,login - -export async function loginUser(loginEmail, passwordLogin) { - try { - const userLogin = await auth.signInWithEmailAndPassword(loginEmail, passwordLogin); - console.log(userLogin); - return userLogin; - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - console.log(errorMessage, errorCode); - } -} - -// Login with Google - -export async function loginGoogle(provider) { - try { - const googleLogin = await auth.signInWithPopup(provider); - const token = googleLogin.credential.accessToken; - const user = googleLogin.user; - window.location.hash = '#timeline'; - console.log(user); - return googleLogin; - } catch (error) { - const errorCode = error.code; - const errorMessage = error.message; - const email = error.email; - const credential = error.credential; - console.log(errorCode, errorMessage); - } -} - -// Log out -export async function signOut() { - try { - const userOut = await auth.signOut(); - return userOut; - //console.log('user log out'); - } catch (e) { - console.log(e); - } -} - -export function currentUser() { - const user = auth.currentUser; - return user; -} diff --git a/src/views/profile.js b/src/views/profile.js index 92738369..7e21a805 100644 --- a/src/views/profile.js +++ b/src/views/profile.js @@ -4,13 +4,13 @@ import { updateBiography } from '../lib/firebaseFirestore.js'; import { updateFieldData } from '../lib/firebaseFirestore.js'; export default () => { - + const photoDefault = 'https://www.nicepng.com/png/detail/202-2022264_usuario-annimo-usuario-annimo-user-icon-png-transparent.png'; const profileContainer = document.createElement('div'); profileContainer.setAttribute('id', 'profileContainer'); const profile = document.createElement('div'); profile.setAttribute('id', 'profile'); profile.innerHTML = `

Mi perfil

- photoUser + photoUser