diff --git a/README.md b/README.md index c737b2cd..434451ae 100644 --- a/README.md +++ b/README.md @@ -1,530 +1,225 @@ -# Creando una Red Social +# Journey Mates 🛫 ## Í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) +* [i. Acerca de "Journey Mates"](#i-acerca-de-Journey-Mates) +* [ii. Historias de Usuario](#ii-historias-de-usuario) +* [iii. Prototipos](#iii-prototipos) +* [iv. Consideraciones técnicas UX](#iv-consideraciones-tecnicas-UX) +* [v. Proyectos desplegados](#v-proyectos-desplegados) -## 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. - -![adem-ay-Tk9m_HP4rgQ-unsplash](https://user-images.githubusercontent.com/110297/135544666-4efa54f1-4ff6-4c4c-b398-6df04ef56117.jpg) - -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. - -## 2. Resumen del proyecto - -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. - -Por lo tanto, en este proyecto construirás una -[Single-page Application (SPA)](https://es.wikipedia.org/wiki/Single-page_application) -[_responsive_](https://curriculum.laboratoria.la/es/topics/css/02-responsive) (con más de una vista / página) -en la que podamos **leer y escribir datos**. - -### Los objetivos generales de este proyecto son los siguientes - -* Desarrollar una SPA con temática de red social -* Aplicar los conceptos de responsividad en el desarrollo de las vistas (templates) -* Implementar un router para la navegación entre las diferentes vistas de la aplicación -* Emplear un servicio externo para la persistencia de datos de la aplicación -* Crear una suite de pruebas unitarias que permitan testear código asíncrono - -Para lograr estos objetivos, deberás aprender y hacer uso de las siguientes -herramientas o habilidades técnicas: - -## 3. Objetivos de aprendizaje - -Reflexiona y luego marca los objetivos que has llegado a entender y aplicar en tu proyecto. Piensa en eso al decidir tu estrategia de trabajo. - -### HTML - -- [ ] **Uso de HTML semántico** - -
Links

- - * [HTML semántico](https://curriculum.laboratoria.la/es/topics/html/02-html5/02-semantic-html) - * [Semantics - MDN Web Docs Glossary](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) -

- -### CSS - -- [ ] **Uso de selectores de CSS** - -
Links

- - * [Intro a CSS](https://curriculum.laboratoria.la/es/topics/css/01-css/01-intro-css) - * [CSS Selectors - MDN](https://developer.mozilla.org/es/docs/Web/CSS/CSS_Selectors) -

- -- [ ] **Modelo de caja (box model): borde, margen, padding** - -
Links

- - * [Box Model & Display](https://curriculum.laboratoria.la/es/topics/css/01-css/02-boxmodel-and-display) - * [The box model - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/The_box_model) - * [Introduction to the CSS box model - MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) - * [CSS display - MDN](https://developer.mozilla.org/pt-BR/docs/Web/CSS/display) - * [display - CSS Tricks](https://css-tricks.com/almanac/properties/d/display/) -

- -- [ ] **Uso de flexbox en CSS** - -
Links

- - * [A Complete Guide to Flexbox - CSS Tricks](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) - * [Flexbox Froggy](https://flexboxfroggy.com/#es) - * [Flexbox - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Flexbox) -

- -- [ ] **Uso de CSS Grid Layout** - -
Links

- - * [A Complete Guide to Grid - CSS Tricks](https://css-tricks.com/snippets/css/complete-guide-grid/) - * [Grids - MDN](https://developer.mozilla.org/en-US/docs/Learn/CSS/CSS_layout/Grids) -

- -### Web APIs - -- [ ] **Uso de selectores del DOM** - -
Links

- - * [Manipulación del DOM](https://curriculum.laboratoria.la/es/topics/browser/02-dom/03-1-dom-methods-selection) - * [Introducción al DOM - MDN](https://developer.mozilla.org/es/docs/Web/API/Document_Object_Model/Introduction) - * [Localizando elementos DOM usando selectores - MDN](https://developer.mozilla.org/es/docs/Web/API/Document_object_model/Locating_DOM_elements_using_selectors) -

- -- [ ] **Manejo de eventos del DOM (listeners, propagación, delegación)** - -
Links

- - * [Introducción a eventos - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Events) - * [EventTarget.addEventListener() - MDN](https://developer.mozilla.org/es/docs/Web/API/EventTarget/addEventListener) - * [EventTarget.removeEventListener() - MDN](https://developer.mozilla.org/es/docs/Web/API/EventTarget/removeEventListener) - * [El objeto Event](https://developer.mozilla.org/es/docs/Web/API/Event) -

+*** -- [ ] **Manipulación dinámica del DOM** +## i. Acerca de Journey Mates -
Links

+El proyecto _"Journey Mates"_ surge con la finalidad de brindar a las usuarias que disfrutan de viajar y conocer nuevos lugares en Latinoamerica, una red social en la cual, puedan compartir sus experiencias y recomendaciones, y descubrir a través de las recomendaciones de otras usuarias, nuevos lugares, ciudades y otros sitios de interés. - * [Introducción al DOM](https://developer.mozilla.org/es/docs/Web/API/Document_Object_Model/Introduction) - * [Node.appendChild() - MDN](https://developer.mozilla.org/es/docs/Web/API/Node/appendChild) - * [Document.createElement() - MDN](https://developer.mozilla.org/es/docs/Web/API/Document/createElement) - * [Document.createTextNode()](https://developer.mozilla.org/es/docs/Web/API/Document/createTextNode) - * [Element.innerHTML - MDN](https://developer.mozilla.org/es/docs/Web/API/Element/innerHTML) - * [Node.textContent - MDN](https://developer.mozilla.org/es/docs/Web/API/Node/textContent) -

-- [ ] **Ruteado (History API, evento hashchange, window.location)** +## ii. Historias de Usuario -
Links

+Las historias de usuario las realizamos en función de los hallazgos de una investigación con personas que disfrutan de viajar. - * [Manipulando el historial del navegador - MDN](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) -

+Nuestras Historias de Usuario fueron 7: -### JavaScript +1. ** HU | Crear Cuenta:** Como viajera, quiero registrarme en JourneyMates para crear un perfil. -- [ ] **Arrays (arreglos)** +**Criterios de aceptación:** -
Links

+ *La página tiene que ser responsive. + * Al presionar el botón "Registrarme" permite crear una cuenta usando un correo electrónico o a través de gmail. + * Permite crear una contraseña de acceso. + *Fiel a prototipo. - * [Arreglos](https://curriculum.laboratoria.la/es/topics/javascript/04-arrays) - * [Array - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/) - * [Array.prototype.sort() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/sort) - * [Array.prototype.forEach() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach) - * [Array.prototype.map() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/map) - * [Array.prototype.filter() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) - * [Array.prototype.reduce() - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce) -

+**Definición de terminado:** -- [ ] **Objetos (key, value)** + *Debe ser una SPA. + + *La página muestra un botón "Registarme". + + *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -
Links

+ *La página muestra un input a través del cual se puede crear una cuenta usando un correo electrónico. + + *Se puede crear una contraseña para poder acceder a la cuenta. - * [Objetos en JavaScript](https://curriculum.laboratoria.la/es/topics/javascript/05-objects/01-objects) -

+ *Se muestra un error si el correo electrónico ya se registró anteriormente. -- [ ] **Diferenciar entre tipos de datos primitivos y no primitivos** + *Se muestra un error si la contraseña no cumple con los requisitos (mínimo 6 caracteres). -- [ ] **Variables (declaración, asignación, ámbito)** + 2. **HU | Login:** Yo como viajera quiero ingresar a mi cuenta de JourneyMates con mi usuario y contraseña o con mi cuenta de google para tener acceso a mi perfil. -
Links

+**Criterios de aceptación:** - * [Valores, tipos de datos y operadores](https://curriculum.laboratoria.la/es/topics/javascript/01-basics/01-values-variables-and-types) - * [Variables](https://curriculum.laboratoria.la/es/topics/javascript/01-basics/02-variables) -

+ *La página tiene que ser responsive. -- [ ] **Uso de condicionales (if-else, switch, operador ternario, lógica booleana)** + *La página permite ingresar a un perfil al momento de iniciar sesión con usuario y contraseña. + + *La página muestra un error si la contraseña y/o correo son incorrrectos. -
Links

+ *Fiel a prototipo. - * [Estructuras condicionales y repetitivas](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/01-conditionals-and-loops) - * [Tomando decisiones en tu código — condicionales - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/conditionals) -

+**Definición de terminado:** -- [ ] **Uso de bucles/ciclos (while, for, for..of)** + *Debe ser una SPA. -
Links

+ *El código pasa los tests necesarios. - * [Bucles (Loops)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/02-loops) - * [Bucles e iteración - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Loops_and_iteration) -

+ *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -- [ ] **Funciones (params, args, return)** + *Al presionar el botón de "iniciar sesión" te dirige a la página de Timeline. -
Links

+ *La página muestra error si el correo ya está registrado o si no es válido. - * [Funciones (control de flujo)](https://curriculum.laboratoria.la/es/topics/javascript/02-flow-control/03-functions) - * [Funciones clásicas](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/01-classic) - * [Arrow Functions](https://curriculum.laboratoria.la/es/topics/javascript/03-functions/02-arrow) - * [Funciones — bloques de código reutilizables - MDN](https://developer.mozilla.org/es/docs/Learn/JavaScript/Building_blocks/Functions) -

-- [ ] **Pruebas unitarias (unit tests)** +3. **HU | Mostrar timeline/home:** Yo como viajera quiero ver la página de timeline para visualizar las publicaciones de mis amigas. -
Links

+**Criterios de aceptación:** - * [Empezando con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/getting-started) -

+ *La página tiene que ser responsive. -- [ ] **Pruebas asíncronas** + *Se visualizan las publicaciones de las mujeres que están registradas en esa red social. -
Links

+ *Se muestran las publicaciones de la más reciente a la más antigua. - * [Tests de código asincrónico con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/asynchronous) -

+ *Fiel a prototipo. -- [ ] **Uso de mocks y espías** +**Definición de terminado:** -
Links

+ *Debe ser una SPA. - * [Manual Mocks con Jest - Documentación oficial](https://jestjs.io/docs/es-ES/manual-mocks) -

+ *El código pasa los tests necesarios. -- [ ] **Módulos de ECMAScript (ES Modules)** + *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -
Links

- * [import - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/import) - * [export - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Statements/export) -

+4. **HU | Mostrar perfil:** Yo como viajera quiero ver/acceder a mi perfil de Journey Mates para visualizar mi información. -- [ ] **Uso de linter (ESLINT)** +**Criterios de aceptación:** -- [ ] **Uso de identificadores descriptivos (Nomenclatura y Semántica)** + *La página tiene que ser responsive. -- [ ] **Diferenciar entre expresiones (expressions) y sentencias (statements)** + *Se visualiza la información de la usuaria. -- [ ] **Callbacks** + *Se muestra mi foto de perfil. -
Links

+ *Fiel a prototipo. - * [Función Callback - MDN](https://developer.mozilla.org/es/docs/Glossary/Callback_function) -

+**Definición de terminado:** -- [ ] **Promesas** + *Debe ser una SPA. -
Links

+ *El código pasa los tests necesarios. - * [Promise - MDN](https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise) - * [How to Write a JavaScript Promise - freecodecamp (en inglés)](https://www.freecodecamp.org/news/how-to-write-a-javascript-promise-4ed8d44292b8/) -

+ *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -### Control de Versiones (Git y GitHub) + *Se muestra la sección de información y contiene foto de perfil e información de la persona (nombre, edad, país). -- [ ] **Git: Instalación y configuración** +5. **HU | Publicar:** Yo como viajera quiero publicar recomendaciones de países que he visitado para compartirlas con otras usuarias. -- [ ] **Git: Control de versiones con git (init, clone, add, commit, status, push, pull, remote)** +**Criterios de aceptación:** -- [ ] **Git: Integración de cambios entre ramas (branch, checkout, fetch, merge, reset, rebase, tag)** + *La página tiene que ser responsive. -- [ ] **GitHub: Creación de cuenta y repos, configuración de llaves SSH** + *Existe un input para poder agregar mi estado y un botón para publicarlo. -- [ ] **GitHub: Despliegue con GitHub Pages** + *Se muestra la opción de "publicar". -
Links

+ *Fiel a prototipo. - * [Sitio oficial de GitHub Pages](https://pages.github.com/) -

+**Definición de terminado:** -- [ ] **GitHub: Colaboración en Github (branches | forks | pull requests | code review | tags)** + *Debe ser una SPA. -- [ ] **GitHub: Organización en Github (projects | issues | labels | milestones | releases)** + *El código pasa los tests necesarios. -### Centrado en el usuario + *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -- [ ] **Diseñar y desarrollar un producto o servicio poniendo a las usuarias en el centro** -### Diseño de producto +6. **HU | Editar:** Yo como viajera quiero editar mis publicaciones para poder modificar errores o publicaciones/recomendaciones en general. -- [ ] **Crear prototipos de alta fidelidad que incluyan interacciones** +**Criterios de aceptación:** -- [ ] **Seguir los principios básicos de diseño visual** + *La página tiene que ser responsive. -### Investigación + *Existe un logo/botón para poder editar mis publicaciones. -- [ ] **Planear y ejecutar testeos de usabilidad de prototipos en distintos niveles de fidelidad** + *Se muestra el input de la publicación para poder editarlo. -
Links

+ *Se muestra la opción de "publicar". - * [Intro a testeos usabilidad](https://coda.io/@bootcamp-laboratoria/contenido-ux/test-de-usabilidad-15) - * [Pruebas con Usuarios 1 — ¿Qué, cuándo y para qué testeamos?](https://eugeniacasabona.medium.com/pruebas-con-usuarios-1-qu%C3%A9-cu%C3%A1ndo-y-para-qu%C3%A9-testeamos-7c3a89b4b5e7) -

+ *Fiel a prototipo. -### Firebase +**Definición de terminado:** -- [ ] **Firebase Auth** + *Debe ser una SPA. -
Links

+ *El código pasa los tests necesarios. - * [Primeros pasos con Firebase Authentication en sitios web - Documentación oficial](https://firebase.google.com/docs/auth/web/start?hl=es) - * [Administra usuarios en Firebase (onAuthStateChanged)](https://firebase.google.com/docs/auth/web/manage-users?hl=es#get_the_currently_signed-in_user) -

+ *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -- [ ] **Firestore** + *Puedes editar cada una de tus publicaciones a través de un logo/botón de editar. -
Links

+ *Tu estado se publica nuevamente y sin recargar la página se muestra editado. - * [Firestore - Documentación oficial](https://firebase.google.com/docs/firestore?hl=es) - * [Reglas de seguridad de Firestore - Documentación oficial](https://firebase.google.com/docs/rules?hl=es) - * [Obtén actualizaciones en tiempo real con Cloud Firestore - Documentación oficial](https://firebase.google.com/docs/firestore/query-data/listen?hl=es) -

+7. **HU | Likear:** Yo como viajera quiero poder dar y quitar like a las publicaciones +para interactuar con otras usuarias. -## 4. Consideraciones generales +**Criterios de aceptación:** -* Este proyecto se debe trabajar en equipos de tres. + *La página tiene que ser responsive. -* 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. + *Existe un botón/logo que al momento de dar click, muestra un like y cambia de color. -* 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 puede quitar el like de la publicación. - - ¿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. + *Existe un conteo de likes. -* 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. + *Fiel a prototipo. -Para comenzar tendrás que hacer un _fork_ y _clonar_ este repositorio. +**Definición de terminado:** -## 5. Criterios de aceptación mínimos del proyecto + *Debe ser una SPA. -### 5.1 Boilerplate + *El código pasa los tests necesarios. -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. + *La página se puede abrir tanto en computadora como en dispositivos móviles y es funcional. -### 5.2 Definición del producto + *Cada publicación cuenta con un logo que al momento de darle click, se agrega un like al conteo. -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. +## iii. Prototipos -### 5.3 Historias de usuario +* Prototipo de baja fidelidad -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: +![img](./src/images/Prototipo%20de%20baja_mobile.JPG) +![img](./src/images/Prototipo%20de%20baja_desktop.JPG) -* **Criterios de Aceptación:** todo lo que debe ocurrir para satisfacer las - necesidades del usuario. +* Prototipo de alta fidelidad -* **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): +![img](./src/images/1.png) +![img](./src/images/2.png) +![img](./src/images/3.png) +![img](./src/images/4.png) - - 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) +## iv. Consideraciones técnicas UX -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. +* Usuaria #1: + Como usuaria de Journey Mates, considero que la interfaz es muy amigable. La idea detrás de la página es valiosa, ya que me permite compartir y leer recomendaciones y reseñas de otros viajeros. Además, la página es responsive, lo que significa que puedo abrirla tanto en mi computadora como en mi celular y sigue siendo funcional en ambos dispositivos. La navegación es clara y fácil de seguir, lo que hace que sea sencillo encontrar la información que estoy buscando. La interfaz de usuario es atractiva y la disposición de la información es clara y legible. En general, estoy muy contenta con la experiencia de usuario en Journey Mates. -### 5.5 Responsive +* Usuaria #2: + Como usuaria de Journey Mates, me gustó especialmente la funcionalidad de dar "like" a las recomendaciones y reseñas de otros viajeros, ya que me permite destacar aquellas que realmente me gustaron. Además, los colores elegidos para la página me parecen adecuados y ayudan a crear una atmósfera acogedora y amigable. -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). + Sin embargo, me gustaría ver un mapa o imágenes en la página para hacerla más atractiva visualmente. Creo que sería una excelente manera de mostrar los diferentes países de las recomendaciones que se pueden encontrar en la página y hacer que sea más fácil para las usuarias visualizarlos. En general, estoy muy contenta con la experiencia de usuario en Journey Mates, pero creo que un mapa o imágenes añadirían un toque adicional de atractivo visual a la página. -### 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.: +## v. Proyectos desplegados -#### Creación de cuenta de usuario e inicio de sesión +* 💻 Daniela: https://journey-mates.netlify.app/ +* 💻 Carmen: https://journey-mates.netlify.app/ +* 💻 Miriam: https://journey-mates.netlify.app/ -* _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 Is NOT Mobile Only - Nielsen Norman Group](https://www.nngroup.com/articles/mobile-first-not-mobile-only/) diff --git a/package.json b/package.json index 0c72f6c8..3fbedbbc 100644 --- a/package.json +++ b/package.json @@ -17,18 +17,19 @@ "test": "jest --coverage", "start": "serve -s src/" }, + "devDependencies": { "@babel/core": "^7.11.4", "@babel/preset-env": "^7.11.0", "babel-jest": "^27.0.1", "eslint": "^8.3.0", - "eslint-config-airbnb-base": "^15.0.0", + "eslint-config-airbnb-base": "^14.2.1", "eslint-plugin-import": "^2.18.2", "eslint-plugin-jest": "^25.3.0", "htmlhint": "^1.0.0", "jest": "^27.0.1", "regenerator-runtime": "^0.13.1", - "serve": "^13.0.2", + "serve": "^14.1.2", "stylelint": "^14.1.0", "stylelint-config-recommended": "^6.0.0" }, @@ -39,5 +40,20 @@ "createdAt": "2022-11-30T16:52:37.204Z", "version": "5.5.0", "commit": "51e941edf1cc991930aefd7dd9c406a7c43741c1" - } -} \ No newline at end of file + }, + "dependencies": { + "firebase": "^9.15.0" + }, + "directories": { + "test": "test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/dvnielx/DEV002-social-network.git" + }, + "author": "", + "bugs": { + "url": "https://github.com/dvnielx/DEV002-social-network/issues" + }, + "homepage": "https://github.com/dvnielx/DEV002-social-network#readme" +} diff --git a/src/_redirects b/src/_redirects new file mode 100644 index 00000000..f8243379 --- /dev/null +++ b/src/_redirects @@ -0,0 +1 @@ +/* /index.html 200 \ No newline at end of file diff --git a/src/firebase/configuracion.js b/src/firebase/configuracion.js new file mode 100644 index 00000000..254d12d2 --- /dev/null +++ b/src/firebase/configuracion.js @@ -0,0 +1,202 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable max-len */ +/* eslint-disable no-alert */ +/* eslint-disable no-console */ +/* eslint-disable no-shadow */ +// Importa la biblioteca de Firebase +// eslint-disable-next-line import/no-unresolved +import { initializeApp } from 'https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js'; +import { + createUserWithEmailAndPassword, + signInWithEmailAndPassword, + sendEmailVerification, + GoogleAuthProvider, + onAuthStateChanged, + signInWithPopup, + updateProfile, + getAuth, + signOut, +// eslint-disable-next-line import/no-unresolved +} from 'https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js'; +import { + getFirestore, + arrayRemove, + onSnapshot, + arrayUnion, + collection, + deleteDoc, + updateDoc, + Timestamp, + getDocs, + orderBy, + addDoc, + getDoc, + query, + doc, +// eslint-disable-next-line import/no-unresolved +} from 'https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js'; + +// Your web app's Firebase configuration +const firebaseConfig = { + apiKey: 'AIzaSyAAHfvbH9LChUrOwAbR4cydwCsmHa7Q330', + authDomain: 'usuarias-journey-mates.firebaseapp.com', + projectId: 'usuarias-journey-mates', + storageBucket: 'usuarias-journey-mates.appspot.com', + messagingSenderId: '15257223280', + appId: '1:15257223280:web:eecc0cb646124a2f42b4b5', + measurementId: 'G-4W8ETMYH7S', +}; + +// Inicializa la aplicación de Firebase +export const app = initializeApp(firebaseConfig); +export const auth = getAuth(app); +export const provider = new GoogleAuthProvider(app); +export const db = getFirestore(app); +export const user = () => auth.currentUser; + +export const saveTask = (description) => addDoc(collection(db, 'tasks'), { + description, + name: auth.currentUser.displayName, + uid: auth.currentUser.uid, + likes: [], + createdDateTime: Timestamp.fromDate(new Date()), +}); + +export const saveUser = (name, uid, email, pais) => addDoc(collection(db, 'users'), { + name, + uid, + email, + pais, + createdDateTime: Timestamp.fromDate(new Date()), +}); + +// Estas funciones realizan una operación específica en la colección de tareas en Firestore. +export const getTasks = () => getDocs(collection(db, 'tasks')); +export const deleteTask = (id) => deleteDoc(doc(db, 'tasks', id)); +export const getTask = (id) => getDoc(doc(db, 'tasks', id)); +export const updateTask = (id, newFields) => updateDoc(doc(db, 'tasks', id), newFields); +export const dateTask = (querySnapshot) => { + const q = query(collection(db, 'tasks'), orderBy('createdDateTime', 'desc')); + onSnapshot(q, querySnapshot); +}; + +// Create new users + +export function registerUser(email, password, name, pais, callback) { + createUserWithEmailAndPassword(auth, email, password) + .then((userCredential) => { + sendEmailVerification(auth.currentUser); + updateProfile(auth.currentUser, { + displayName: name, + + }); + + const user = userCredential.user; + const userId = user.uid; + user.displayName = name; + saveUser(user.displayName, userId, email, pais); + callback(true); // Se llama una función de callback para indicar que el registro se ha realizado correctamente. + }) + .catch((error) => { + console.error(error.code); + if (error.code === 'auth/email-already-in-use') { + alert('Este correo ya está registrado'); + } else if (error.code === 'auth/weak-password') { + alert('Tu contraseña debe contener al menos 6 caracteres'); + } else if (error.code === 'auth/invalid-email') { + alert('Este correo no existe o es inválido'); + } else if (error.code === 'auth/internal-error') { + alert('Completa todos los campos'); + } + callback(false); + }); +} + +// Inicio de sesión con email + +export async function inicioDeSesionEmail(email, password) { + try { + const userCredential = await signInWithEmailAndPassword(auth, email, password); + const user = userCredential.user; + const userId = user.uid; + return true; // Si la operación es exitosa, la función imprime un mensaje "signed in" y devuelve true. + } catch (error) { + if (error.code === 'auth/email-already-in-use') { + alert('Este correo ya está registrado'); + } else if (error.code === 'auth/weak-password') { + alert('Tu contraseña no es segura'); + } else if (error.code === 'auth/invalid-email') { + alert('Este correo no existe o es inválido'); + } else if (error.code === 'auth/internal-error') { + alert('Completa todos los campos'); + } + return false; + } +} + +// Sign in with Google + +export const authGoogle = async () => { + try { + const userResult = await signInWithPopup(auth, provider); + window.location.href = '/timeLine'; + } catch (error) { + console.log(error); + } +}; + +// Cerrar sesión + +export const signOutFirebase = (auth) => auth.signOut(); // llama a su método signOut() que termina la sesión actual. + +export const onAuth = (auth) => { + auth.onAuthStateChanged((user) => { + if (user) { + console.log('user is signed in'); + } else { + console.log('user is signed out'); + } + }); +}; + +// Like function + +export const tapLike = (id, newLike) => { + updateDoc(doc(db, 'tasks', id), { // Actualiza el documento en la colección "tasks" con el + likes: // identificador "id" agregando un nuevo elemento "newLike" a la lista de "likes" + arrayUnion( // Permite agregar un nuevo elemento a un campo en la base de datos + newLike, + ), + }); +}; + +export const dislike = (id, oldLike) => { // Se realiza la operación opuesta, eliminando un elemento "oldLike" de la lista de "likes". + updateDoc(doc(db, 'tasks', id), { // updateDoc actualiza el documento en la base de datos y doc toma como argumentos db, task y id + likes: + arrayRemove( // Permite eliminar un elemento en la base de datos. + oldLike, + ), + }); +}; + +export { + createUserWithEmailAndPassword, + signInWithEmailAndPassword, + onAuthStateChanged, + GoogleAuthProvider, + signInWithPopup, + updateProfile, + getFirestore, + arrayRemove, + collection, + onSnapshot, + arrayUnion, + updateDoc, + deleteDoc, + Timestamp, + signOut, + getDocs, + getDoc, + addDoc, + doc, +}; diff --git a/src/firebase/firestore.js b/src/firebase/firestore.js new file mode 100644 index 00000000..7ce2cf83 --- /dev/null +++ b/src/firebase/firestore.js @@ -0,0 +1,135 @@ +/* eslint-disable max-len */ +/* eslint-disable no-alert */ +/* eslint-disable no-restricted-globals */ +/* eslint-disable no-console */ +// import { async } from 'regenerator-runtime'; +import { + saveTask, deleteTask, getTask, updateTask, tapLike, dislike, user, auth, dateTask, +} from './configuracion.js'; + +const tasksContainer = document.getElementById('contenedor-publicaciones'); +const taskForm = document.getElementById('task-form'); + +let editStatus = false; +let id = ''; + +window.addEventListener('DOMContentLoaded', async () => { + dateTask((querySnapshot) => { + let html = ''; + + querySnapshot.forEach((doc) => { + const task = doc.data(); + // const fecha=Timestamp.fromDate(new Date()) + const likes = task.likes; + const likesNumber = likes.length; + const userId = user().uid; + const currentLike = likes.indexOf(userId); + let likeSrc = ''; + const likeImg = () => { + if (currentLike === -1) { + likeSrc = 'images/like-logo.png'; + } else { + likeSrc = './images/heart.png'; + } + }; + likeImg(); + + html += ` +
+

${task.name}

+

${task.createdDateTime.toDate().toLocaleString('es-ES', { + year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', + })}

+ `; + + if (task.uid === auth.currentUser.uid) { + html += ` + + +
+ +

${likesNumber}

+
+ `; + } else { + html += ` +
+ +

${likesNumber}

+
+
+ `; + } + }); + + tasksContainer.innerHTML = html; + + const userId = user().uid; + const botonLike = tasksContainer.querySelectorAll('.like-logo'); + + botonLike.forEach((btn) => { + btn.addEventListener('click', async (e) => { // Al hacer clic, se obtiene su identificador único a partir de su atributo 'data-id' + const id1 = e.target.dataset.id; + const doc = await getTask(id1); // se llama a la función 'getTask' pasándole ese identificador como argumento + const likes = doc.data().likes; + const currentLike = likes.indexOf(userId); + + if (currentLike === -1) { + tapLike(id1, userId); // se busca el valor 'userId' dentro de ese arreglo y se llama a la función 'tapLike' pasándole el identificador y el 'userId' + } else { + dislike(id1, userId); + } + }); + }); + + const btnsDelete = tasksContainer.querySelectorAll('.btn-delete'); + if (btnsDelete) { + btnsDelete.forEach((btn) => { + btn.addEventListener('click', ({ target: { dataset } }) => { + if (confirm('¿Estás segura de que deseas eliminar esta publicación?')) { + deleteTask(dataset.id); // se llama a la función deleteTask(dataset.id), pasándole como argumento el identificador de la tarea (que está almacenado en el atributo de datos dataset.id del botón) + } + }); + }); + } + + const btnsEdit = tasksContainer.querySelectorAll('.btn-edit'); + btnsEdit.forEach((btn) => { + btn.addEventListener('click', async (e) => { + const doc = await getTask(e.target.dataset.id); // "target" es utilizada para acceder al elemento que lanzó el evento click + const task = doc.data(); + + taskForm['task-description'].value = task.description; + + editStatus = true; + id = doc.id; + + taskForm['btn-publicar'].innerText = 'Publicar'; + }); + }); + }); +}); + +if (taskForm) { + taskForm.addEventListener('submit', (e) => { + e.preventDefault(); + + const description = taskForm['task-description']; + + if (description.value.trim() === '') { + alert('No se pueden publicar campos vacíos :('); + } else { + if (!editStatus) { + saveTask(description.value); + } else { + updateTask(id, { + description: description.value, + }); + + editStatus = false; + } + + taskForm.reset(); + } + }); +} diff --git a/src/firebase/singInGoogle.js b/src/firebase/singInGoogle.js new file mode 100644 index 00000000..20b6ceb3 --- /dev/null +++ b/src/firebase/singInGoogle.js @@ -0,0 +1,37 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-console */ +/* eslint-disable no-undef */ +// eslint-disable-next-line import/no-unresolved +import { signInWithPopup, GoogleAuthProvider } from 'https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js'; + +// const auth = getAuth(); +const provider = new GoogleAuthProvider(); + +export const authGoogle = async () => { + try { + const userResult = await signInWithPopup(auth, provider); + } catch (error) { + const errorCode = error.code; + const errorMessage = error.message; + const correo = error.customData.email; + } +}; + +export const signInWithGoogle = async (callback) => { + try { + const result = await signInWithPopup(auth, provider); + const credential = GoogleAuthProvider.credentialFromResult(result); + const token = credential.accessToken; + const user = result.user; + const email = result.user.email; + callback(true); + } catch (error) { + const credential = GoogleAuthProvider.credentialFromError(error); + callback(false); + } +}; + +export { + signInWithPopup, + GoogleAuthProvider, +}; diff --git a/src/images/1.png b/src/images/1.png new file mode 100644 index 00000000..45952c83 Binary files /dev/null and b/src/images/1.png differ diff --git a/src/images/2.png b/src/images/2.png new file mode 100644 index 00000000..6ab64a47 Binary files /dev/null and b/src/images/2.png differ diff --git a/src/images/3.png b/src/images/3.png new file mode 100644 index 00000000..1f6f5242 Binary files /dev/null and b/src/images/3.png differ diff --git a/src/images/4.png b/src/images/4.png new file mode 100644 index 00000000..c6177945 Binary files /dev/null and b/src/images/4.png differ diff --git a/src/images/Prototipo de baja_desktop.JPG b/src/images/Prototipo de baja_desktop.JPG new file mode 100644 index 00000000..68b6fe36 Binary files /dev/null and b/src/images/Prototipo de baja_desktop.JPG differ diff --git a/src/images/Prototipo de baja_mobile.JPG b/src/images/Prototipo de baja_mobile.JPG new file mode 100644 index 00000000..7bd08552 Binary files /dev/null and b/src/images/Prototipo de baja_mobile.JPG differ diff --git a/src/images/deletelogo.png b/src/images/deletelogo.png new file mode 100644 index 00000000..c7e70793 Binary files /dev/null and b/src/images/deletelogo.png differ diff --git a/src/images/deletelogo2.png b/src/images/deletelogo2.png new file mode 100644 index 00000000..a8f49646 Binary files /dev/null and b/src/images/deletelogo2.png differ diff --git a/src/images/editlogo.png b/src/images/editlogo.png new file mode 100644 index 00000000..a555540d Binary files /dev/null and b/src/images/editlogo.png differ diff --git a/src/images/editlogo2.png b/src/images/editlogo2.png new file mode 100644 index 00000000..6b1b3064 Binary files /dev/null and b/src/images/editlogo2.png differ diff --git a/src/images/favicon.png b/src/images/favicon.png new file mode 100644 index 00000000..2403cfcc Binary files /dev/null and b/src/images/favicon.png differ diff --git a/src/images/favicon_io/android-chrome-192x192.png b/src/images/favicon_io/android-chrome-192x192.png new file mode 100755 index 00000000..db1491d8 Binary files /dev/null and b/src/images/favicon_io/android-chrome-192x192.png differ diff --git a/src/images/favicon_io/android-chrome-512x512.png b/src/images/favicon_io/android-chrome-512x512.png new file mode 100755 index 00000000..3e8572b2 Binary files /dev/null and b/src/images/favicon_io/android-chrome-512x512.png differ diff --git a/src/images/favicon_io/apple-touch-icon.png b/src/images/favicon_io/apple-touch-icon.png new file mode 100755 index 00000000..0775d51c Binary files /dev/null and b/src/images/favicon_io/apple-touch-icon.png differ diff --git a/src/images/favicon_io/favicon-16x16.png b/src/images/favicon_io/favicon-16x16.png new file mode 100755 index 00000000..7f0ef229 Binary files /dev/null and b/src/images/favicon_io/favicon-16x16.png differ diff --git a/src/images/favicon_io/favicon-32x32.png b/src/images/favicon_io/favicon-32x32.png new file mode 100755 index 00000000..8d584f4e Binary files /dev/null and b/src/images/favicon_io/favicon-32x32.png differ diff --git a/src/images/favicon_io/favicon.ico b/src/images/favicon_io/favicon.ico new file mode 100755 index 00000000..d2d4bec3 Binary files /dev/null and b/src/images/favicon_io/favicon.ico differ diff --git a/src/images/favicon_io/site.webmanifest b/src/images/favicon_io/site.webmanifest new file mode 100755 index 00000000..45dc8a20 --- /dev/null +++ b/src/images/favicon_io/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/src/images/google buttons/google_signin_buttons/Google_signin_button.sketch b/src/images/google buttons/google_signin_buttons/Google_signin_button.sketch new file mode 100644 index 00000000..4f959883 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/Google_signin_button.sketch differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_disabled_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_disabled_hdpi.9.png new file mode 100644 index 00000000..9cc1d007 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_disabled_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_focus_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_focus_hdpi.9.png new file mode 100644 index 00000000..677b5c9f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_focus_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_normal_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_normal_hdpi.9.png new file mode 100644 index 00000000..2782fc60 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_normal_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_pressed_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_pressed_hdpi.9.png new file mode 100644 index 00000000..2aac381a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_dark_pressed_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_disabled_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_disabled_hdpi.9.png new file mode 100644 index 00000000..2d2ee9f3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_disabled_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_focus_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_focus_hdpi.9.png new file mode 100644 index 00000000..1c2e3448 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_focus_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_normal_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_normal_hdpi.9.png new file mode 100644 index 00000000..9faa971d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_normal_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_pressed_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_pressed_hdpi.9.png new file mode 100644 index 00000000..7fbfd686 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_light_pressed_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_disabled_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_disabled_hdpi.9.png new file mode 100644 index 00000000..082201ea Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_disabled_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_focus_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_focus_hdpi.9.png new file mode 100644 index 00000000..2a3c8937 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_focus_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_normal_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_normal_hdpi.9.png new file mode 100644 index 00000000..4a5ddfb7 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_normal_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_pressed_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_pressed_hdpi.9.png new file mode 100644 index 00000000..82d16422 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_dark_pressed_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_disabled_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_disabled_hdpi.9.png new file mode 100644 index 00000000..082201ea Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_disabled_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_focus_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_focus_hdpi.9.png new file mode 100644 index 00000000..d25d8d69 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_focus_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_normal_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_normal_hdpi.9.png new file mode 100644 index 00000000..4895b909 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_normal_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_pressed_hdpi.9.png b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_pressed_hdpi.9.png new file mode 100644 index 00000000..da4d1d29 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/hdpi/btn_google_signin_light_pressed_hdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_disabled_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_disabled_ldpi.9.png new file mode 100644 index 00000000..b29ee2b2 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_disabled_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_focus_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_focus_ldpi.9.png new file mode 100644 index 00000000..5665cead Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_focus_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_normal_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_normal_ldpi.9.png new file mode 100644 index 00000000..4a36d102 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_normal_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_pressed_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_pressed_ldpi.9.png new file mode 100644 index 00000000..3b433e17 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_dark_pressed_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_disabled_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_disabled_ldpi.9.png new file mode 100644 index 00000000..2d5d07aa Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_disabled_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_focus_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_focus_ldpi.9.png new file mode 100644 index 00000000..66cc7263 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_focus_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_normal_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_normal_ldpi.9.png new file mode 100644 index 00000000..27241e5d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_normal_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_pressed_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_pressed_ldpi.9.png new file mode 100644 index 00000000..79e6deea Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_light_pressed_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_disabled_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_disabled_ldpi.9.png new file mode 100644 index 00000000..a2bff53c Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_disabled_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_focus_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_focus_ldpi.9.png new file mode 100644 index 00000000..023a3d10 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_focus_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_normal_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_normal_ldpi.9.png new file mode 100644 index 00000000..84aa4ddd Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_normal_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_pressed_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_pressed_ldpi.9.png new file mode 100644 index 00000000..93f9773b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_dark_pressed_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_disabled_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_disabled_ldpi.9.png new file mode 100644 index 00000000..ee4ac3c3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_disabled_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_focus_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_focus_ldpi.9.png new file mode 100644 index 00000000..fa91320b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_focus_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_normal_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_normal_ldpi.9.png new file mode 100644 index 00000000..0e34de57 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_normal_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_pressed_ldpi.9.png b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_pressed_ldpi.9.png new file mode 100644 index 00000000..b0c48d16 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/ldpi/btn_google_signin_light_pressed_ldpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_disabled_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_disabled_mdpi.9.png new file mode 100644 index 00000000..b67ef7d1 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_disabled_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_focus_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_focus_mdpi.9.png new file mode 100644 index 00000000..086c6f12 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_focus_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_normal_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_normal_mdpi.9.png new file mode 100644 index 00000000..073f7dba Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_normal_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_pressed_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_pressed_mdpi.9.png new file mode 100644 index 00000000..885e1029 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_dark_pressed_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_disabled_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_disabled_mdpi.9.png new file mode 100644 index 00000000..b67ef7d1 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_disabled_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_focus_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_focus_mdpi.9.png new file mode 100644 index 00000000..c444d0de Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_focus_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_normal_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_normal_mdpi.9.png new file mode 100644 index 00000000..44d5229a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_normal_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_pressed_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_pressed_mdpi.9.png new file mode 100644 index 00000000..22767c35 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_light_pressed_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_disabled_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_disabled_mdpi.9.png new file mode 100644 index 00000000..b88019ed Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_disabled_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_focus_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_focus_mdpi.9.png new file mode 100644 index 00000000..5265221a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_focus_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_normal_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_normal_mdpi.9.png new file mode 100644 index 00000000..6b601919 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_normal_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_pressed_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_pressed_mdpi.9.png new file mode 100644 index 00000000..89267409 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_dark_pressed_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_disabled_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_disabled_mdpi.9.png new file mode 100644 index 00000000..b88019ed Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_disabled_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_focus_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_focus_mdpi.9.png new file mode 100644 index 00000000..2f0ebab4 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_focus_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_normal_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_normal_mdpi.9.png new file mode 100644 index 00000000..b8629053 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_normal_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_pressed_mdpi.9.png b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_pressed_mdpi.9.png new file mode 100644 index 00000000..62fae88e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/mdpi/btn_google_signin_light_pressed_mdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_disabled_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_disabled_tvdpi.9.png new file mode 100644 index 00000000..027bd41a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_disabled_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_focus_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_focus_tvdpi.9.png new file mode 100644 index 00000000..60563b05 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_focus_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_normal_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_normal_tvdpi.9.png new file mode 100644 index 00000000..f3f6462e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_normal_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_pressed_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_pressed_tvdpi.9.png new file mode 100644 index 00000000..e3c90d7d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_dark_pressed_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_disabled_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_disabled_tvdpi.9.png new file mode 100644 index 00000000..4be2d1a0 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_disabled_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_focus_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_focus_tvdpi.9.png new file mode 100644 index 00000000..663fca5c Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_focus_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_normal_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_normal_tvdpi.9.png new file mode 100644 index 00000000..cb08ac28 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_normal_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_pressed_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_pressed_tvdpi.9.png new file mode 100644 index 00000000..ff160cf9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_light_pressed_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_disabled_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_disabled_tvdpi.9.png new file mode 100644 index 00000000..3712b0c5 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_disabled_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_focus_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_focus_tvdpi.9.png new file mode 100644 index 00000000..00c238c5 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_focus_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_normal_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_normal_tvdpi.9.png new file mode 100644 index 00000000..83fba764 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_normal_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_pressed_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_pressed_tvdpi.9.png new file mode 100644 index 00000000..d558b527 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_dark_pressed_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_disabled_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_disabled_tvdpi.9.png new file mode 100644 index 00000000..3712b0c5 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_disabled_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_focus_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_focus_tvdpi.9.png new file mode 100644 index 00000000..0d77a1ab Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_focus_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_normal_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_normal_tvdpi.9.png new file mode 100644 index 00000000..e7a32aae Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_normal_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_pressed_tvdpi.9.png b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_pressed_tvdpi.9.png new file mode 100644 index 00000000..096f04b6 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/tvdpi/btn_google_signin_light_pressed_tvdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_disabled_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_disabled_xhdpi.9.png new file mode 100644 index 00000000..e62f3fbe Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_disabled_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_focus_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_focus_xhdpi.9.png new file mode 100644 index 00000000..ef5d01f8 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_focus_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_normal_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_normal_xhdpi.9.png new file mode 100644 index 00000000..8e9e3c10 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_normal_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_pressed_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_pressed_xhdpi.9.png new file mode 100644 index 00000000..9653cde0 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_dark_pressed_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_disabled_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_disabled_xhdpi.9.png new file mode 100644 index 00000000..91ca1e89 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_disabled_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_focus_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_focus_xhdpi.9.png new file mode 100644 index 00000000..bb2b41e9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_focus_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_normal_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_normal_xhdpi.9.png new file mode 100644 index 00000000..cfed2269 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_normal_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_pressed_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_pressed_xhdpi.9.png new file mode 100644 index 00000000..16210b45 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_light_pressed_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_disabled_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_disabled_xhdpi.9.png new file mode 100644 index 00000000..5cac64fe Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_disabled_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_focus_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_focus_xhdpi.9.png new file mode 100644 index 00000000..bd52cae7 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_focus_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_normal_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_normal_xhdpi.9.png new file mode 100644 index 00000000..e48e5a27 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_normal_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_pressed_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_pressed_xhdpi.9.png new file mode 100644 index 00000000..b1ed3e21 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_dark_pressed_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_disabled_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_disabled_xhdpi.9.png new file mode 100644 index 00000000..5cac64fe Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_disabled_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_focus_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_focus_xhdpi.9.png new file mode 100644 index 00000000..c3281b48 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_focus_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_normal_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_normal_xhdpi.9.png new file mode 100644 index 00000000..05d5f052 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_normal_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_pressed_xhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_pressed_xhdpi.9.png new file mode 100644 index 00000000..0f06349b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xhdpi/btn_google_signin_light_pressed_xhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_disabled_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_disabled_xxhdpi.9.png new file mode 100644 index 00000000..b158b056 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_disabled_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_focus_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_focus_xxhdpi.9.png new file mode 100644 index 00000000..34dfdca9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_focus_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_normal_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_normal_xxhdpi.9.png new file mode 100644 index 00000000..8a1b2d85 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_normal_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_pressed_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_pressed_xxhdpi.9.png new file mode 100644 index 00000000..19f00dee Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_dark_pressed_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_disabled_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_disabled_xxhdpi.9.png new file mode 100644 index 00000000..9817625b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_disabled_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_focus_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_focus_xxhdpi.9.png new file mode 100644 index 00000000..4b5bae0f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_focus_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_normal_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_normal_xxhdpi.9.png new file mode 100644 index 00000000..dde35a31 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_normal_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_pressed_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_pressed_xxhdpi.9.png new file mode 100644 index 00000000..4f1cd5ee Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_light_pressed_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_disabled_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_disabled_xxhdpi.9.png new file mode 100644 index 00000000..545fb143 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_disabled_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_focus_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_focus_xxhdpi.9.png new file mode 100644 index 00000000..6bc828ac Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_focus_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_normal_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_normal_xxhdpi.9.png new file mode 100644 index 00000000..3fb4c672 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_normal_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_pressed_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_pressed_xxhdpi.9.png new file mode 100644 index 00000000..c5096f73 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_dark_pressed_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_disabled_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_disabled_xxhdpi.9.png new file mode 100644 index 00000000..545fb143 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_disabled_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_focus_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_focus_xxhdpi.9.png new file mode 100644 index 00000000..5f2fdd9e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_focus_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_normal_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_normal_xxhdpi.9.png new file mode 100644 index 00000000..1bd2c74c Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_normal_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_pressed_xxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_pressed_xxhdpi.9.png new file mode 100644 index 00000000..b7c1c7a2 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxhdpi/btn_google_signin_light_pressed_xxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_disabled_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_disabled_xxxhdpi.9.png new file mode 100644 index 00000000..b93278d8 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_disabled_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_focus_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_focus_xxxhdpi.9.png new file mode 100644 index 00000000..68695db8 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_focus_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_normal_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_normal_xxxhdpi.9.png new file mode 100644 index 00000000..4fa3659f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_normal_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_pressed_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_pressed_xxxhdpi.9.png new file mode 100644 index 00000000..6416f32d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_dark_pressed_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_disabled_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_disabled_xxxhdpi.9.png new file mode 100644 index 00000000..79b569e1 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_disabled_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_focus_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_focus_xxxhdpi.9.png new file mode 100644 index 00000000..1105ca11 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_focus_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_normal_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_normal_xxxhdpi.9.png new file mode 100644 index 00000000..51061575 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_normal_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_pressed_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_pressed_xxxhdpi.9.png new file mode 100644 index 00000000..30dcbc4d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_light_pressed_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_disabled_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_disabled_xxxhdpi.9.png new file mode 100644 index 00000000..080e6741 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_disabled_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_focus_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_focus_xxxhdpi.9.png new file mode 100644 index 00000000..1fe9f821 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_focus_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_normal_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_normal_xxxhdpi.9.png new file mode 100644 index 00000000..3f895c26 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_normal_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_pressed_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_pressed_xxxhdpi.9.png new file mode 100644 index 00000000..070db16e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_dark_pressed_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_disabled_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_disabled_xxxhdpi.9.png new file mode 100644 index 00000000..080e6741 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_disabled_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_focus_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_focus_xxxhdpi.9.png new file mode 100644 index 00000000..955c0983 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_focus_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_normal_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_normal_xxxhdpi.9.png new file mode 100644 index 00000000..4265031d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_normal_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_pressed_xxxhdpi.9.png b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_pressed_xxxhdpi.9.png new file mode 100644 index 00000000..2dba882c Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/android/xxxhdpi/btn_google_signin_light_pressed_xxxhdpi.9.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_disabled_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_disabled_ios.png new file mode 100644 index 00000000..8bfda733 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_disabled_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_focus_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_focus_ios.png new file mode 100644 index 00000000..d0800784 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_focus_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_normal_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_normal_ios.png new file mode 100644 index 00000000..0bf2a89a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_normal_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_pressed_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_pressed_ios.png new file mode 100644 index 00000000..c8175ff9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_dark_pressed_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_disabled_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_disabled_ios.png new file mode 100644 index 00000000..8bfda733 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_disabled_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_focus_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_focus_ios.png new file mode 100644 index 00000000..a3e1f6c9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_focus_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_normal_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_normal_ios.png new file mode 100644 index 00000000..a6db39d3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_normal_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_pressed_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_pressed_ios.png new file mode 100644 index 00000000..1405af3f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_light_pressed_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_disabled_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_disabled_ios.png new file mode 100644 index 00000000..d4559fc9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_disabled_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_focus_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_focus_ios.png new file mode 100644 index 00000000..b4742f9b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_focus_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_normal_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_normal_ios.png new file mode 100644 index 00000000..ad1ed565 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_normal_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_pressed_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_pressed_ios.png new file mode 100644 index 00000000..a8470cf7 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_dark_pressed_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_disabled_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_disabled_ios.png new file mode 100644 index 00000000..d4559fc9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_disabled_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_focus_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_focus_ios.png new file mode 100644 index 00000000..015d60c8 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_focus_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_normal_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_normal_ios.png new file mode 100644 index 00000000..e646f90c Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_normal_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_pressed_ios.png b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_pressed_ios.png new file mode 100644 index 00000000..272fa0b0 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/1x/btn_google_signin_light_pressed_ios.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_disabled_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_disabled_ios@2x.png new file mode 100644 index 00000000..7569abef Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_disabled_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_focus_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_focus_ios@2x.png new file mode 100644 index 00000000..6974c66d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_focus_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_normal_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_normal_ios@2x.png new file mode 100644 index 00000000..4e790bb3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_normal_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_pressed_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_pressed_ios@2x.png new file mode 100644 index 00000000..9c9172bb Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_dark_pressed_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_disabled_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_disabled_ios@2x.png new file mode 100644 index 00000000..7569abef Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_disabled_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_focus_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_focus_ios@2x.png new file mode 100644 index 00000000..5ecda4e6 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_focus_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_normal_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_normal_ios@2x.png new file mode 100644 index 00000000..7aee0c86 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_normal_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_pressed_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_pressed_ios@2x.png new file mode 100644 index 00000000..ec3e15bf Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_light_pressed_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_disabled_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_disabled_ios@2x.png new file mode 100644 index 00000000..743a533f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_disabled_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_focus_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_focus_ios@2x.png new file mode 100644 index 00000000..d0be198d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_focus_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_normal_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_normal_ios@2x.png new file mode 100644 index 00000000..7ab0881b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_normal_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_pressed_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_pressed_ios@2x.png new file mode 100644 index 00000000..de8e2dd3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_dark_pressed_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_disabled_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_disabled_ios@2x.png new file mode 100644 index 00000000..743a533f Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_disabled_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_focus_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_focus_ios@2x.png new file mode 100644 index 00000000..49f1d37b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_focus_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_normal_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_normal_ios@2x.png new file mode 100644 index 00000000..75f128b6 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_normal_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_pressed_ios@2x.png b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_pressed_ios@2x.png new file mode 100644 index 00000000..d9cc87e1 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/2x/btn_google_signin_light_pressed_ios@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_disabled_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_disabled_ios@3x.png new file mode 100644 index 00000000..37ec706e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_disabled_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_focus_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_focus_ios@3x.png new file mode 100644 index 00000000..e8e09bcb Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_focus_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_normal_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_normal_ios@3x.png new file mode 100644 index 00000000..447331fa Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_normal_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_pressed_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_pressed_ios@3x.png new file mode 100644 index 00000000..17e722de Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_dark_pressed_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_disabled_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_disabled_ios@3x.png new file mode 100644 index 00000000..37ec706e Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_disabled_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_focus_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_focus_ios@3x.png new file mode 100644 index 00000000..c521fa01 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_focus_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_normal_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_normal_ios@3x.png new file mode 100644 index 00000000..d40b0ff6 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_normal_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_pressed_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_pressed_ios@3x.png new file mode 100644 index 00000000..e2553888 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_light_pressed_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_disabled_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_disabled_ios@3x.png new file mode 100644 index 00000000..fd69ab5a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_disabled_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_focus_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_focus_ios@3x.png new file mode 100644 index 00000000..cef51de9 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_focus_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_normal_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_normal_ios@3x.png new file mode 100644 index 00000000..b9e72f48 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_normal_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_pressed_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_pressed_ios@3x.png new file mode 100644 index 00000000..a592f53d Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_dark_pressed_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_disabled_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_disabled_ios@3x.png new file mode 100644 index 00000000..fd69ab5a Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_disabled_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_focus_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_focus_ios@3x.png new file mode 100644 index 00000000..2fa50b65 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_focus_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_normal_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_normal_ios@3x.png new file mode 100644 index 00000000..c75823c2 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_normal_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_pressed_ios@3x.png b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_pressed_ios@3x.png new file mode 100644 index 00000000..e2dbd9bc Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/ios/3x/btn_google_signin_light_pressed_ios@3x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/1.google-button.png b/src/images/google buttons/google_signin_buttons/web/2x/1.google-button.png new file mode 100644 index 00000000..c1e2c5c7 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/1.google-button.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_disabled_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_disabled_web@2x.png new file mode 100644 index 00000000..485757f3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_disabled_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_focus_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_focus_web@2x.png new file mode 100644 index 00000000..369a6ca2 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_focus_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_normal_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_normal_web@2x.png new file mode 100644 index 00000000..f27bb243 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_normal_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_pressed_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_pressed_web@2x.png new file mode 100644 index 00000000..4cb85e9b Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_dark_pressed_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_disabled_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_disabled_web@2x.png new file mode 100644 index 00000000..485757f3 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_disabled_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_focus_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_focus_web@2x.png new file mode 100644 index 00000000..510e6192 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_focus_web@2x.png differ diff --git a/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_pressed_web@2x.png b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_pressed_web@2x.png new file mode 100644 index 00000000..d01521e8 Binary files /dev/null and b/src/images/google buttons/google_signin_buttons/web/2x/btn_google_signin_light_pressed_web@2x.png differ diff --git a/src/images/heart.png b/src/images/heart.png new file mode 100644 index 00000000..64f702de Binary files /dev/null and b/src/images/heart.png differ diff --git a/src/images/home.png b/src/images/home.png new file mode 100644 index 00000000..057a36c1 Binary files /dev/null and b/src/images/home.png differ diff --git a/src/images/like-logo.png b/src/images/like-logo.png new file mode 100644 index 00000000..4e816649 Binary files /dev/null and b/src/images/like-logo.png differ diff --git a/src/images/log-out.png b/src/images/log-out.png new file mode 100644 index 00000000..6f1200aa Binary files /dev/null and b/src/images/log-out.png differ diff --git a/src/images/logo.png b/src/images/logo.png new file mode 100644 index 00000000..1b75dafd Binary files /dev/null and b/src/images/logo.png differ diff --git a/src/images/profilelogo.png b/src/images/profilelogo.png new file mode 100644 index 00000000..f3cf9ff7 Binary files /dev/null and b/src/images/profilelogo.png differ diff --git a/src/images/profilepic.png b/src/images/profilepic.png new file mode 100644 index 00000000..58af5ef4 Binary files /dev/null and b/src/images/profilepic.png differ diff --git a/src/images/user.png b/src/images/user.png new file mode 100644 index 00000000..6d330eec Binary files /dev/null and b/src/images/user.png differ diff --git a/src/images/woman-logo.png b/src/images/woman-logo.png new file mode 100644 index 00000000..736d348c Binary files /dev/null and b/src/images/woman-logo.png differ diff --git a/src/index.html b/src/index.html index 788db3c9..4a5b68c1 100644 --- a/src/index.html +++ b/src/index.html @@ -2,11 +2,19 @@ - + - Document + + + + Journey Mates - + +
+ + + - \ No newline at end of file + + \ No newline at end of file diff --git a/src/lib/index.js b/src/lib/index.js deleted file mode 100644 index d1930899..00000000 --- a/src/lib/index.js +++ /dev/null @@ -1,6 +0,0 @@ -// aqui exportaras las funciones que necesites - -export const myFunction = () => { - // aqui tu codigo - console.log('Hola mundo!'); -}; diff --git a/src/main.js b/src/main.js index ac27e91a..676894e0 100644 --- a/src/main.js +++ b/src/main.js @@ -1,5 +1,50 @@ -// Este es el punto de entrada de tu aplicacion +/* eslint-disable max-len */ +// eslint-disable-next-line import/no-cycle +import { Login } from './pages/login.js'; +// eslint-disable-next-line import/no-cycle, import/no-unresolved +import { Register } from './pages/Register.js'; +import { timeLine } from './pages/timeLine.js'; +import { profile } from './pages/profile.js'; -import { myFunction } from './lib/index.js'; +// se obtiene el elemento root del DOM, que es el contenedor raíz para la aplicación. +const root = document.getElementById('root'); +// se define el objeto routes que asocia cada ruta con su componente correspondiente +const routes = { + '/': Login, + '/login': Login, + '/register': Register, + '/timeLine': timeLine, + '/profile': profile, +}; -myFunction(); +// next reemplaza completamente el contenido del elemento root con el nuevo componente +export const next = (pathname) => { + window.history.pushState( + {}, + pathname, + window.location.origin + pathname, + ); + root.innerHTML = ''; + root.appendChild(routes[pathname]()); // se agrega el componente correspondiente +}; + +// onNavigate solo reemplaza el primer hijo del elemento root. +export const onNavigate = (pathname) => { + window.history.pushState( + {}, + pathname, + window.location.origin + pathname, + ); + root.removeChild(root.firstChild); + root.appendChild(routes[pathname]()); +}; +// component contiene el componente asociado con la ruta actual. +const component = routes[window.location.pathname]; + +// window.onpopstate, guarda una copia de la última navegación en el historial, se activa cuando se navega hacia atrás o hacia adelante en el historial del navegador. +window.onpopstate = () => { + root.removeChild(root.firstChild); + root.append(component()); +}; + +root.appendChild(component()); diff --git a/src/netlify.toml b/src/netlify.toml new file mode 100644 index 00000000..a1680b2f --- /dev/null +++ b/src/netlify.toml @@ -0,0 +1,3 @@ +[build] + command = "npm run build" + publish = "dist" diff --git a/src/pages/login.js b/src/pages/login.js new file mode 100644 index 00000000..e71bd9a0 --- /dev/null +++ b/src/pages/login.js @@ -0,0 +1,84 @@ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-alert */ +/* eslint-disable indent */ +/* eslint-disable no-console */ +/* eslint-disable no-restricted-globals */ +// import { onNavigate, next } from '../main.js'; +// import { inicioDeSesionEmail } from './inicioDeSesionCorreo'; +// import { signInWithGoogle } from '../firebase/singInGoogle.js'; +import { authGoogle, signInWithEmailAndPassword, auth } from '../firebase/configuracion.js'; +// eslint-disable-next-line import/no-cycle +import { next } from '../main.js'; + +export const Login = () => { + const divLogin = document.createElement('div'); + divLogin.setAttribute('id', 'container-div-login'); + const viewLogin = ` +
+
+ +
+ +
+
+

Journey Mates 🛫

+

Inicia sesión

+ +

O

+
+
+ + + + +
+ +

¿Aún no tienes una cuenta?

+ + + +
+ + +`; + divLogin.innerHTML = viewLogin; + + document.addEventListener('DOMContentLoaded', async () => { + const logInButton = document.getElementById('ingresar'); + logInButton.addEventListener('click', async (event) => { + event.preventDefault(); + + const email = document.getElementById('email').value; + const password = document.getElementById('password').value; + try { + const userCredential = await signInWithEmailAndPassword(auth, email, password); + + const user = userCredential.user; + const userId = user.uid; + next('/timeLine'); + location.reload(); + } catch (error) { + if (error.code === 'auth/email-already-in-use') { + alert('Este correo ya está registrado'); + } else if (error.code === 'auth/weak-password') { + alert('Tu contraseña no es segura'); + } else if (error.code === 'auth/invalid-email') { + alert('Este correo no existe o es inválido'); + } else if (error.code === 'auth/internal-error') { + alert('Completa todos los campos'); + } + } + }); + }); + + document.addEventListener('DOMContentLoaded', () => { + const googleButton = document.getElementById('inicio-sesion-google'); + googleButton.addEventListener('click', async (event) => { + event.preventDefault(); + await authGoogle(); + }); + }); + return divLogin; +}; + +export default Login; diff --git a/src/pages/profile.js b/src/pages/profile.js new file mode 100644 index 00000000..c34cdeda --- /dev/null +++ b/src/pages/profile.js @@ -0,0 +1,60 @@ +export const profile = () => { + const divProfile = document.createElement('div'); + divProfile.setAttribute('class', 'container-div-profile'); + const viewProfile = ` +
+
  • Perfil
  • +
  • + +
  • +
    +
    + + + + +
    + +

    Actualizar foto de perfil

    +
    + +
    +
    +

    Nombre

    +

    Edad

    +

    País de residencia

    +

    Ubicación actual

    +
    +
    +
    +
    + +
    +
    + + `; + divProfile.innerHTML = viewProfile; + return divProfile; +}; diff --git a/src/pages/register.js b/src/pages/register.js new file mode 100644 index 00000000..2286c073 --- /dev/null +++ b/src/pages/register.js @@ -0,0 +1,95 @@ +/* eslint-disable no-restricted-globals */ +// import { onNavigate } from "../../main.js"; +import { registerUser } from '../firebase/configuracion.js'; +import { next } from '../main.js'; + +export const Register = () => { + const divRegister = document.createElement('div'); + divRegister.setAttribute('class', 'container-div-register'); + const viewRegister = `
    +
    + +
    +
    +

    Journey Mates 🛫

    +

    Regístrate

    +
    +
    +
    +
    +
    +
    + +
    +
    +
    + +
    + + + +
    +
    `; + divRegister.innerHTML = viewRegister; + document.addEventListener('DOMContentLoaded', () => { + const registerButton = document.getElementById('register-button'); + registerButton.addEventListener('click', (event) => { + event.preventDefault(); + const email = document.getElementById('emailRegister').value; + const password = document.getElementById('passwordRegister').value; + const nombreUsuaria = document.getElementById('name-usuaria').value; + const pais = document.getElementById('paises').value; + const alertRegister = (valid) => { + if (valid) { + next('/timeLine'); + location.reload(); + } + }; + registerUser(email, password, nombreUsuaria, pais, alertRegister); + }); + }); + return divRegister; +}; +export default Register; diff --git a/src/pages/timeLine.js b/src/pages/timeLine.js new file mode 100644 index 00000000..68c21595 --- /dev/null +++ b/src/pages/timeLine.js @@ -0,0 +1,76 @@ +/* eslint-disable no-console */ +/* eslint-disable no-undef */ +/* eslint-disable import/no-cycle */ +import { signOutFirebase, auth } from '../firebase/configuracion.js'; + +export const timeLine = () => { + const divTimeLine = document.createElement('div'); + divTimeLine.setAttribute('class', 'container-div-timeLine'); + const viewTimeLine = ` +
    +
  • Timeline
  • +
  • + +
  • +
    + + + + + +
    +
    + +
    +

    +

    + + + +
    +
    +
    +
    +
    +
    +
    +
    + + +`; + divTimeLine.innerHTML = viewTimeLine; + + document.addEventListener('DOMContentLoaded', () => { + document.querySelector('#li-navbar-logout').addEventListener('click', () => { + signOutFirebase(auth); + }); + }); + + document.addEventListener('DOMContentLoaded', () => { + document.querySelector('#log-out').addEventListener('click', () => { + signOutFirebase(auth); + }); + }); + + return divTimeLine; +}; diff --git a/src/styles/desktop.css b/src/styles/desktop.css new file mode 100644 index 00000000..7e064a12 --- /dev/null +++ b/src/styles/desktop.css @@ -0,0 +1,197 @@ +/*Inicio de sesión*/ +body{ + font-family: 'Raleway', sans-serif; +} + +.logo-inicio-sesion { + margin: 4%; +} + +.logo { + width: 30rem; + height: 30rem; +} + +.title { + font-size: 3.3rem; +} + +.inicia-sesion-h2 { + font-size: 3rem; + font-size: 2.5rem; + margin: 2.5rem; +} + +.iniciar-sesion-google { + margin-top: 2.5rem; +} + +.ingresar { + width: 12rem; + height: 4rem; + cursor: pointer; + margin: 2.5rem; +} +/*Registro*/ + +.containerRegister { + display: grid; + grid-template-columns: 500px 450px; + padding: 1rem; + place-content: center; +} + +.section-inicio-sesion { + margin-right: 7rem; +} + +.fecha-nacimiento { + width: 10rem; +} + +/*Timeline-Muro*/ + +.contenedor-nav { + justify-content: center; +} + +.navbar { + justify-content: right; + width:100%; + background-color:#35123C; + position: inherit; + display: none; +} + +.navbar-desktop { + display: inline-flex; + justify-content: right; + width:100%; + background-color: #45174F; + position: inherit; + color: aliceblue; + font-size: .8rem; + text-decoration: none; +} + +.li-navbar{ + padding: 1rem; + font-size: 1.8rem; + margin-right: 2rem; + height: auto; + background-color: #45174F; +} + +.li-navbar:hover{ + transform: scale(.9); + transition: .2s; +} + +.li-navbar-logout{ + padding: 1rem; + font-size: 1.8rem; + margin-right: 2rem; + height: auto; + background-color: #45174F; +} + +.li-navbar-logout:hover { + transform: scale(.9); + transition: .2s; +} + +a:link { + text-decoration: none; + color: aliceblue; +} + +a:visited { + text-decoration: none; + color: aliceblue; +} + +.user-logo-publicaciones { + margin-right: 3rem; + width: 6rem; +} + +.contenedor-publicaciones { + text-align: end; + justify-content: center; + display: grid; + grid-template-columns: 110px 375px; + margin-top: 2rem; +} + +.input-recomendaciones { + padding: 1rem; + width: 30rem; +} + + +.btn-publicar { + margin: 1rem -1rem 2rem 0rem; + width: 7rem; + height: 3.5rem; + font-size: 1.5rem; + font-family: 'Raleway', sans-serif; +} + +.btn-publicar:hover { + + background-color: #E6D8E9; + color: #35123C; +} + +/*Sección de posts publicados en timeline*/ + +.div-post-publicado { + resize: none; + width: 39rem; + height: 12rem; + +} + +.btn-edit { + width: 1.2rem; +} + +.btn-delete { + width: 1.2rem; + margin-bottom: 1rem; +} + +.contenedor-likes { + display: flex; + align-items: center; + justify-content: center; + margin-left: auto; +} + +/*Perfil*/ + +.datos-personales { + text-align: center; + padding: 1rem; + font-size: 1.5rem; +} + +.about-me { + border-style: solid; + border-width: 1.5px; + border-radius: 10px; + width: 25%; + margin: auto; + margin-top: 2rem; +} + +.container { + display: grid; + grid-template-columns: 500px 450px; + padding: 1rem; + place-content: center; +} + +.textArea { + width: 30rem; +} \ No newline at end of file diff --git a/src/styles/style.css b/src/styles/style.css new file mode 100644 index 00000000..ca61aed4 --- /dev/null +++ b/src/styles/style.css @@ -0,0 +1,316 @@ +* { + box-sizing: border-box; + margin: 0%; + padding: 0%; +} + +html { + font-size: 62.5%; + scroll-behavior: smooth; +} + +body { + background-color: #492C4E; + font-family: 'Raleway', sans-serif; + color: aliceblue; + font-size: 1.7rem; +} + +/*Login*/ + +.title { + font-size: 2.5rem; + color: aliceblue; + margin: 1rem; +} + +.logo-inicio-sesion { + display: flex; + justify-content: center; + margin: 7%; +} + +.logo { + width: 27rem; + height: 27rem; + margin-top: 4rem; +} + +.section-inicio-sesion { + text-align: center; + margin-top: 4rem; +} + +.inicia-sesion-h2 { + font-size: 2rem; + color: #FFF799; + margin: 1.5rem 0rem 3rem 0rem; +} + +.logo-google { + width: 25rem; + cursor: pointer; +} + +.or { + color: aliceblue; + font-size: 2rem; +} + +input { + font-family: 'Raleway', sans-serif; + font-size: 1.8rem; + margin: 1rem; + padding: .8rem; + border-radius: 10px; + width: 25rem; +} + +button { + margin: 1rem; + padding: .8rem; + border-radius: 10px; + font-size: 1.8rem; + cursor: pointer; + color: #35123C; +} + +.ingresar { + cursor: pointer; + margin: 2.5rem; + color: #35123C; +} + +/*Register*/ + +.section-register { + text-align: center; + margin-top: 4rem; +} + +.container-paises { + margin-top: 2rem; + margin-bottom: .5rem; +} + +.paises { + font-family: 'Raleway', sans-serif; + margin: 1.6rem; + font-size: 1.7rem; + padding: 0.5rem; + border-radius: 10px; + color: #f6f6f6; + background-color: #35123C; + width: 18rem; +} + +/*Timeline-Muro*/ + +.contenedor-nav { + background-color: #35123C; + display: grid; + grid-template-columns: 300px 60px; +} + +.logo-nav { + margin: -1rem; + width: 4rem; +} + +.navbar { + display: grid; + grid-template-columns: 127px 127px 127px; + align-items: center; + top:92%; + width:100%; + background-color:#35123C; + position: fixed; +} + +.navbar-desktop { + display: none; +} + +.navbar-img { + width: 3rem; +} + +li { + font-family: 'Raleway', sans-serif; + font-size: 2.5rem; + background-color: #35123C; + height: 6rem; + text-align:center; + list-style: none; + padding: 1.5rem; +} + +.li-navbar{ + padding: 1rem; +} + +.li-navbar-logout { + padding: 1rem; +} + +.perfil-nav { + margin-left: 30%; +} + +/*Sección publicar 1*/ + +.seccion-publicar { + text-align: end; +} + +.contenedor-publicaciones { + display: grid; + grid-template-columns: 85px 300px; + margin-top: 2rem; +} + +.task-form { + margin-right: 1rem; +} + +.user-logo-publicaciones { + width: 5rem; + margin: 0.5rem; +} + +.input-recomendaciones { + height: 8rem; + width: 23rem; + font-size: 1.6rem; + resize: none; + border-radius: 8px; + padding: 1rem; + font-family: 'Raleway', sans-serif; +} + +.btn-publicar { + width: 7rem; + height: 3.5rem; + font-size: 1.5rem; + margin-bottom: 2rem; +} + +/*Sección publicar 2*/ + +.seccion-publicar2 { + text-align: end; +} + +.contenedor-publicaciones2 { + text-align: left; +} + +.contenedor-padre{ + align-items: center; + text-align: center; + margin-bottom: 1rem; +} +.pais-post{ + text-align: left; + margin-left: 30%; +} + +.name-post{ + margin-top: 3rem; +} + +.date{ + font-size: 1.3rem; + color: #D1FFAD; +} + +.div-post-publicado{ + background-color: aliceblue; + color: black; + width: 70%; + height: 10rem; + margin: 2rem 1rem 0.5rem 1rem; + border-radius: 8px; + padding: 1rem; + font-family: 'Raleway', sans-serif; + font-size: 1.2rem; +} + +.btn-edit{ + width: 1.5rem; + position:absolute; + margin-top: 2rem; + cursor: pointer; +} + +.btn-delete{ + width: 1.5rem; + cursor: pointer; + margin-bottom: 0.5rem; +} + +.contenedor-likes{ + display: grid; + grid-template-columns: 30px 30px; + align-items: self-end; + margin-left: 15%; + margin-bottom: 3rem; +} + +.like-logo{ + width: 25px; + cursor: pointer; +} + +p { + padding: 1px; +} + + /*Perfil*/ + + .foto-perfil { + text-align: center; + margin-top: 3rem; + font-size: 1.3rem; +} + +.user-logo { + width: 9rem; +} + +.p-actualizar-foto { + padding: .5rem; +} + +.about-me { + border-style:solid; + border-width: 1.5px; + border-radius: 10px; + width: 70%; + margin: auto; + margin-top: 2rem; + +} + +.datos-personales{ + font-size: 1.7rem; + text-align: center; + padding: 1rem; +} + +.input-about-me{ + text-align: center; + margin-top: 2rem; + font-family: 'Raleway', sans-serif; +} + +.textArea { + border-radius: 10px; + font-family: 'Raleway', sans-serif; + padding: 1rem; + margin-bottom: 1.5rem; + width: 27rem; + font-size: 1.8rem; +} + + diff --git a/test/auth.spec.js b/test/auth.spec.js new file mode 100644 index 00000000..742c3286 --- /dev/null +++ b/test/auth.spec.js @@ -0,0 +1,165 @@ +/* eslint-disable max-len */ +/* eslint-disable no-trailing-spaces */ +/* eslint-disable space-before-blocks */ +/* eslint-disable no-undef */ +/* eslint-disable consistent-return */ +/* eslint-disable prefer-promise-reject-errors */ +/* eslint-disable import/no-unresolved */ +/* eslint-disable no-unused-vars */ +/* eslint-disable no-shadow */ +/* eslint-disable arrow-body-style */ +/* eslint-disable import/no-duplicates */ +/* eslint-disable no-unused-expressions */ +// importamos la funcion que vamos a testear +// eslint-disable-next-line import/no-unresolved +import { + createUserWithEmailAndPassword, + auth, + onAuthStateChanged, + signInWithEmailAndPassword, + signOutFirebase, + signInWithPopup, +} from '../src/firebase/configuracion.js'; + +jest.mock('../src/firebase/configuracion.js', () => { + return { + auth: jest.fn(() => { + return { auth: 'TEST' }; + }), + signInWithEmailAndPassword: jest.fn((email, password) => { + if (!email || !password) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + signOutFirebase: jest.fn((auth) => { + // eslint-disable-next-line prefer-promise-reject-errors + if (!auth) return Promise.reject('no auth parameter'); + }), + createUserWithEmailAndPassword: jest.fn((email, password) => { + if (!email || !password) { + throw new Error('ERROR'); + } + return Promise.resolve({ userCredential: 'admin' }); + }), + sendEmailVerification: jest.fn((auth) => { + if (!auth) return Promise.reject(); + }), + updateProfile: jest.fn((displayName, auth) => { + if (!auth || !displayName) return Promise.reject('no displayName or auth'); + }), + signInWithPopup: jest.fn((auth, provider) => { + if (!auth || !provider) return Promise.reject('no auth or provider'); + return Promise.resolve({ user: 'user', credential: 'credential' }); + }), + }; +}); + +describe('Test for the inicioDeSesionEmail function', () => { + const email = 'journeymates@test.com'; + const password = 'journeymates123'; + + it('Should call signInWithEmailAndPassword', async () => { + await signInWithEmailAndPassword(auth, email, password); + expect(signInWithEmailAndPassword).toHaveBeenCalled(); + }); + + it('Should throw an error if executed without arguments', async () => { + try { + await signInWithEmailAndPassword(); + } catch (error) { + expect(error).toEqual(new Error('ERROR')); + } + }); + + it('Should call signInWithEmailAndPassword with auth, email and password arguments', async () => { + await signInWithEmailAndPassword(email, password); + expect(signInWithEmailAndPassword).toHaveBeenCalledWith(auth, email, password); + }); + + describe('Test for the registerUser function', () => { + const email = 'journeymates@test.com'; + const password = 'journeymates123'; + const Name = 'Journey Mates Team'; + const country = 'México'; + + it('Should call createUserWithEmailAndPassword', async () => { + await createUserWithEmailAndPassword(auth, email, password); + expect(createUserWithEmailAndPassword).toHaveBeenCalled(); + }); + + it('createUserWithEmailAndPassword should throw an error if the email is invalid or if it doesnt exist', async () => { + try { + await createUserWithEmailAndPassword(auth, email, password); + } catch (error) { + expect(error.message).toBe('Este correo no existe o es inválido'); + } + }); + + it('Should call createUserWithEmailAndPassword with auth, email and password arguments', async () => { + await createUserWithEmailAndPassword(email, password); + expect(createUserWithEmailAndPassword).toHaveBeenCalledWith(auth, email, password); + }); + + it('Should throw an error if the password is weak', async () => { + try { + await createUserWithEmailAndPassword(email, 'weak', 'Name', 'country', jest.fn()); + } catch (error) { + expect(error.message).toBe('Tu contraseña debe contener al menos 6 caracteres'); + } + }); + }); + + describe('Test for the signOut functions. The user should be able to sign out', () => { + it('signOut should be a function', () => { + expect(typeof signOutFirebase).toBe('function'); + }); + + it('should call signOut', async () => { + await signOutFirebase(auth); + expect(signOutFirebase).toHaveBeenCalled(); + }); + + it('Should call signOut', async () => { + await signOutFirebase(auth); + expect(signOutFirebase).toHaveBeenCalledWith(auth); + }); + + it('Should throw an error if signOutFirebase function doesnt have a parameter', async () => { + try { + const result = await signOutFirebase(); + expect(result).toBe(false); + } catch (error) { + expect(error).toBe('no auth parameter'); + } + }); + }); +}); + +describe('Test for the signInWithPopup function', () => { + const auth = 'TEST'; + const provider = 'google'; + + it('Should call signInWithPopup', async () => { + await signInWithPopup(auth, provider); + expect(signInWithPopup).toHaveBeenCalled(); + }); + + it('Should throw an error if executed without auth or provider', async () => { + try { + await signInWithPopup(); + } catch (error) { + expect(error).toEqual('no auth or provider'); + } + }); + + it('Should call signInWithPopup with auth and provider arguments', async () => { + await signInWithPopup(auth, provider); + expect(signInWithPopup).toHaveBeenCalledWith(auth, provider); + }); + + it('Should return the resolved value from signInWithPopup', async () => { + const result = await signInWithPopup(auth, provider); + expect(result).toEqual({ user: 'user', credential: 'credential' }); + }); +}); diff --git a/test/firestore.spec.js b/test/firestore.spec.js new file mode 100644 index 00000000..7dc967f7 --- /dev/null +++ b/test/firestore.spec.js @@ -0,0 +1,211 @@ +/* eslint-disable no-undef */ +/* eslint-disable no-console */ +/* eslint-disable no-shadow */ +/* eslint-disable arrow-body-style */ +/* eslint-disable object-curly-newline */ +/* eslint-disable semi */ +/* eslint-disable indent */ +/* eslint-disable object-curly-spacing */ +/* eslint-disable import/no-unresolved */ +// Test para Firestore + +import { + arrayRemove, + onSnapshot, + updateTask, + deleteTask, + arrayUnion, + collection, + deleteDoc, + updateDoc, + getTasks, + saveTask, + saveUser, + dislike, + tapLike, + getTask, + addDoc, + getDoc, + doc, + db, +} from '../src/firebase/configuracion.js'; + +jest.mock('../src/firebase/configuracion.js', () => { + return { + auth: jest.fn(() => { + return { auth: 'TEST' }; + }), + + addDoc: jest.fn(), + collection: jest.fn(), + conFirestore: jest.fn(), + onSnapshot: jest.fn(), + deleteDoc: jest.fn(), + getDoc: jest.fn(), + doc: jest.fn(), + updateDoc: jest.fn(), + arrayUnion: jest.fn(), + arrayRemove: jest.fn(), + + saveTask: jest.fn((description) => { + if (!description) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + saveUser: jest.fn((uid, email, pais) => { + if (!uid || !email || !pais) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + getTasks: jest.fn((collection) => { + if (!collection) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + getTask: jest.fn((id) => { + if (!id) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + deleteTask: jest.fn((id) => { + if (!id) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + updateTask: jest.fn((id, newFields) => { + if (!id || !newFields) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + dateTask: jest.fn((querySnapshot) => { + if (!querySnapshot) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + dislike: jest.fn((likes) => { + if (likes === undefined) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + + tapLike: jest.fn((id, newLike) => { + if (!id || !newLike) { + throw new Error('ERROR'); + } + return Promise.resolve({ user: 'admin' }); + }), + } +}); + +describe('Test for saveTask', () => { + it('saveTask should be a function', () => { + expect(typeof saveTask).toBe('function') + }); + + it('saveTask should call addDoc with its parameters.', async () => { + await saveTask('test description') + expect(addDoc).toHaveBeenCalledWith('test description') + }); + +describe('Test for saveUser', () => { + it('saveUser should be a function', () => { + expect(typeof saveUser).toBe('function') + }); + it('saveUser should call addDoc with its parameters.', () => { + saveTask('test description'); + expect(saveUser).toHaveBeenCalledWith( + collection(db, 'users'), + { uid: 'xErqSqwE', email: 'admin@test.com', likes: [] }, + ) + }) +}); + +describe('Test for getTasks', () => { + it('GetTasks should be a function', () => { + expect(typeof getTasks).toBe('function') + }); + it('getTasks should call onSnapshot and its parameters', () => { + getTask('callback'); + expect(onSnapshot).toHaveBeenCalledWith(collection(db, 'tasks'), 'callback') + }) +}); + +describe('Test for deleteTask', () => { + it('deleteTask should be a function', () => { + expect(typeof deleteTask).toBe('function') + }); + it('deleteTask should call deleteDco with its parameters', () => { + deleteTask('id'); + expect(deleteDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id')) + }) +}); + +describe('Test for getTask', () => { + it('getTask should be a function', () => { + expect(typeof getTask).toBe('function') + }); + it('getTask should call getDoc and its parameters', () => { + getTask('id'); + expect(getDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id')) + }) +}); + +describe('Test for updateTask', () => { + it('updateTask should be a function', () => { + expect(typeof updateTask).toBe('function') + }); + it('updateTask should call updateDoc with its parameters.', () => { + updateTask('id', 'edited post'); + expect(updateDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id'), 'edited post') + }) +}); + +describe('Test for dateTask', () => { + it('dateTask should be a function', () => { + expect(typeof updateTask).toBe('function') + }); + it('updateTask should call updateDoc with its parameters.', () => { + updateTask('id', 'edited post'); + expect(updateDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id'), 'edited post') + }) +}); + +describe('Test for tapLike', () => { + it('tapLike should be a function', () => { + expect(typeof tapLike).toBe('function') + }); + it('tapLike should call updateDoc and its parameters and add a like to a post', () => { + tapLike('id1', 'user'); + expect(updateDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id'), { + likes: arrayUnion('user'), + }) + }) +}); + +describe('Test for dislike', () => { + it('should be a function', () => { + expect(typeof dislike).toBe('function') + }); + it('should call updateDoc with its parameters and remove a like from a post.', () => { + dislike('id', 'user'); + expect(updateDoc).toHaveBeenCalledWith(doc(db, 'tasks', 'id'), { + likes: arrayRemove('user'), + }) + }) +}); +}) diff --git a/test/index.spec.js b/test/index.spec.js deleted file mode 100644 index 91f11a33..00000000 --- a/test/index.spec.js +++ /dev/null @@ -1,8 +0,0 @@ -// importamos la funcion que vamos a testear -import { myFunction } from '../src/lib/index'; - -describe('myFunction', () => { - it('debería ser una función', () => { - expect(typeof myFunction).toBe('function'); - }); -}); diff --git a/thumb.png b/thumb.png deleted file mode 100644 index 0828f34c..00000000 Binary files a/thumb.png and /dev/null differ