diff --git a/.firebase/hosting.cHVibGlj.cache b/.firebase/hosting.cHVibGlj.cache new file mode 100644 index 00000000..a1075e89 --- /dev/null +++ b/.firebase/hosting.cHVibGlj.cache @@ -0,0 +1,45 @@ +stylelint,1588134745023,f61f27bd17de546264aa58f40f3aafaac7021e0ef69c17f6b1b4cd7664a037ec +firebase-auth.js,1588638479680,1ea58dd4067ab3dcb247ee6ecb140623e9b679b0a1c86ba5568b655e49016ba6 +firebase.js,1588642479172,15e3772e5670a8fd82a0db1a30059f638fa1f9da2c1c050885e51b1da6c90023 +main.js,1588134745019,d78873193f8a1c3dc275ae2b602368cf4683f0be9e30aeb416a06c68ddcdebcc +style.css,1588638428947,adb5aabe709c60fc17f8355cb5842eaa25a7e9217292055e43b5eb77ff919a5d +index.html,1588642486099,69c7723acec9c9128e19de52e0495edea02d07e23874091d47de67e6086a0e75 +img/friends.svg,1587477962041,92c5d191e66d4924db26dcf589b6d08bfa71cbca5c5090fa62b58065b9ecea21 +img/location.svg,1587477962049,d61e129dec0d407e51cf2898cc1ab80438105646659878cc8ed8387e648dbf17 +img/icons/add-friend.svg,1587477962041,cc676a75086ffe45d09b6e6bb7b4fbbaf5fb9fa2e7e1af52e4fd3f80f320702e +img/icons/drug.svg,1587477962041,ddb00b9525216783432d1077a47e8b1e05b49794ebb8cde8fdfe958bc6dacdcc +img/icons/dog.svg,1587477962041,826e2225e83772f59f111662dc13536fa5e2571e62587c9e4bd81d153fc75fae +img/icons/imagotipo.svg,1587477962041,e5c749e32a8d0e316a03e27272daefb25eedc5a22a06e675daad57801cbe4b9a +img/icons/food.svg,1587477962041,c933b30da6366a794020cf0bd11a3599f71ab7f448c8f880ac768908e7b8d9c7 +img/icons/pen.svg,1587477962045,b0e3f276d57a4dfa7ec2cd96546c4e2c6fe9486d5dd1e489aadec07c3a37e168 +img/icons/logo.svg,1587477962045,6e05f06c8cb056c204e60375bb53aee6a9cd0dd938a6a39466f27032ac719520 +img/icons/isologo.svg,1587477962045,da5e64d739591aaf4cbc03f5c480de083840b25714e775bb3060de110ef4cee5 +img/icons/set.svg,1587477962049,709f747234b3c6dc32ceb071d0136be6c2efbf31ae09a01584f937761cfcea1d +img/icons/home-run.svg,1587477962041,d6c7a591a87b00f35a0b23062c120b29c3e1f42773dc411dea8d51230f6204f6 +view/404.js,1588134745031,b79df2620b6c03a591b6a8b505c4019d8ae4d2962a8773ce4577f698e786a4fd +view/follow.js,1588134745031,c250c5723a3e2d485ba6ce3a5bf14de238b2625274c7af91f82f1dbafa2ad0a1 +view/followers.js,1588134745031,49adf12942fd6fa71062fb1f87333af9e05e644facddb09f8a1a1f484035f1b1 +view/home.js,1588642701737,b3042fd2580c7fe6cc4a564e6c8e7a80df90ad39cbb9965134980395199eedd2 +view/index.js,1588134745035,a8b419b6ed9a8a8795a9a827422bb08ee49478e631e2351198210aafd2c940b2 +view/logup.js,1588266223696,c0c57d5880e36065013927f971cb9b7200c3f7576df8e20918645638cd30ca76 +view/login.js,1588638428947,7e4f31c2a629d04a0a93f09f63404ac528372a31c96b208d6d039d366598d607 +view/profile.js,1588638428951,5655a233be23f686ae32637be49695beab121b512a696e32a14c4550877dcea4 +view/reviews.js,1588134745039,e3b34f7dac0c15ae2dfa44a9e308858dbf09f9557336e3f50fbb610f0909cafd +view/saved.js,1588134745039,9c7f9bbab9c83d0e03c287f9a6db65f1a40125aa76607f9668bcb8c3105e5789 +view-controller/router.js,1588638428947,90d2038a7594492968b74e10d1c1537dcefa7d4097a075dcb0b73a94e2ce8f9d +view/post.js,1588134745039,375b6c74a8176b3489eb794e1bd7594b41b91c0bce15e0511c467ab73dddfbfa +img/favicon/favicon.ico,1587649558728,b54466550c112a3fa369034bdee23b38989893c24b4db78f74e4b1292c8436d2 +img/pictures/kari.jpeg,1587477962105,3119b778f713d9e68a23eaf96ac8dbc2da1c23ea44a37a5ef290bddeefa3322c +img/pictures/bren.jpeg,1587477962053,751d63e3bc711b5a67d01561d5a2ace4db7b8da8cdfbe593a8d4537a426ba9f1 +img/bg-login.svg,1587477962041,9ad62d6f23827ea129e5e190f26d452cbd5499e602e949769fbdbd24db531e2f +img/xel.jpeg,1587477962113,603e0556315d2beb512cbde36c311160727eaa32fd3d15b2083136acc185b53e +img/icons/loading.gif,1588033329990,3464939d423963dbeeea87725f042a24bd5102309c1433317f4614480e4d4a82 +img/pictures/helado2.jpg,1587477962085,26c694b35b6c639fc958483d8c2c6f41fb8f8e27cecaafa9d298bbd75bf80675 +img/pictures/helado1.jpg,1587477962081,e7d96e448d794dbb49bb44622c9fce41b1889a465558531d80022b3e423e1dd8 +img/pictures/dog_shower.jpg,1587477962073,fe50b3ac7085f8f1e5d44c069197ee8bb2af23c8f3570ec563cf231665f3fad1 +img/pictures/helado5.jpg,1587477962105,0e1e723bb0b759afd8a34d75dc240a68a03c9ddf206de7b538771753bac8d999 +img/pictures/helado4.jpg,1587477962097,8d6d735e429837433dbb6a3716fedb30b516e9881a9a3ed08eb77644937eb9fc +img/pictures/kids.jpg,1587477962113,cd58f8b69bf311ebcfede3ebeb5b6f0d81aec1cb9a7558295f411df26771cd94 +img/pictures/crafts2.jpg,1587477962069,1f4e2200b4c2d606a0708adc645387b966c81e16ea1f2debf0f0a4cdc9714b85 +img/pictures/helado3.jpg,1587477962093,4f113e34c6ab6466cb26290d81d93584ac26962b75a9fb0a7024e469623238bc +img/pictures/crafts.jpg,1587477962057,ae40c0f00d369e0a379e2ebab1f5011a9cce02b9d336b9c5a519ea56c125287d diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 00000000..b572cbd2 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "social-network-d33e4" + } +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..155422b0 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5503 +} \ No newline at end of file diff --git a/Readme.md b/Readme.md index ed84ec5c..48a82967 100644 --- a/Readme.md +++ b/Readme.md @@ -1,272 +1,77 @@ -# Creando una Red Social +# Civitas - SocialNetwork -Bienvenida a tu primer proyecto del track de Frontend en Laboratoria. +Civitas es una app mobile/web desarrollada y pensada como una plataforma de comunicación entre una comunidad, surgió como respuesta a la necesidad de interacción que se ha visto limitada por las medidas de aislamiento derivadas de la pandemia. -En este proyecto construirás una red social, cuya temáticas dejaremos a tu elección. +A través de ella se puede crear y compartir reseñas de actividades, lugares y servicios de manera local, dependiendo de la ubicación de cada usuario. De esta manera nuestro segundo objetivo es impulsar la economía local. -Aquí algunas ideas para inspirarte: +## Sketchs -- Alimentación -- Feminismo -- Educación -- Salud -- Energías Renovables +Se aterrizó indivualmente la idea de las pantallas para identificar elementos esenciales para reunir en el prototipo de alta fidelidad. -Las **caraterísticas técnicas** de tu aplicación serán las siguientes: -- Debe ser una Single-Page Application [SPA](https://dzone.com/articles/how-single-page-web-applications-actually-work) ([versión traducida](https://dzone.com/articles/how-single-page-web-applications-actually-work)) -- Debe ser diseñada con un enfoque [mobile first](https://darwindigital.com/mobile-first-versus-responsive-web-design/) ([versión traducida](https://translate.google.com/translate?hl=&sl=auto&tl=es&u=https%3A%2F%2Fdarwindigital.com%2Fmobile-first-versus-responsive-web-design)) -- Debe permitir la persintencia de datos - -Para implementar tu aplicación usarás *HTML5*, *CCS3* o *SASS*, *Vanilla JavaScript(ES6+)*, *Firebase* o *LocalStogarge* + + + -## Objetivo +## Prototipo de alta fidelidad -El objetivo de este proyecto es construir una Red Social, Single-Page Application (SPA), responsiva en la que podamos escribir, leer, actualizar y eliminar datos. +Integramos los elementos de cada sketch que aportaban más valor a la propuesta de la aplicación, optimizando la navegación y la experiencia del usuario al interactuar con la misma, todo esto tomando en cuenta el feedback recibido por los coaches y las compañeras. -Para ello deberás poner en juego tu creatividad para generar ideas que lleven a una solución original y valiosa del problema, trabajando en equipo buscando feedback constante. - -En otras palabras, seguirás afianzando todo lo aprendido en el Common Core, pero en particular verás : - -### Planificación - -* Te recomendamos utilizar *projects*, *issues* y *milestones* de GitHub para gestionar la planificación de tu proyecto. Estos recursos serán la fuente de organización de tu equipo y a través de estas herramientas tus coaches podrán ver el avance del proyecto y darte feedback. - -* Escribir, de manera colaborativa, las **Definiciones de terminado** y **Criterios de Aceptación** por cada **Historia de usuario** que te daremos para este proyecto y que se deberán ver reflejadas en tu planificación. - -* **Priorizar** la implementación de tus funcionalidades, en función al esfuerzo que demandan en relación al valor que le aportan al usuario, y ejecutar en equipo todas las historias de usuario dentro del tiempo estimado para cada sprint y que finalmente se vean reflejadas en publicaciones completamentamente funcionales al final de cada sprint. - -* Adquirir la disciplina de la completitud, terminando una historia de usuario antes de pasar a la siguiente (es decir, que cumple con *Definición de Terminado* y *Criterios de Aceptación* contemplando todos los puntos que son objetivos de aprendizaje para este proyecto). - -### Desarrollo frontend - -#### Arquitectura de la aplicación - -- Diseñar la arquitectura de tu aplicación, modularizando tu código a través de *es modules* ([`import`](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/import) y [`export`](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/export)) - -- Familiarizarte con el patrón modelo - vista - controlador ([MVC](https://es.wikipedia.org/wiki/Modelo%E2%80%93vista%E2%80%93controlador)). - -#### Tecnologías HTML5 y CSS3/SASS - -* Aplicar HTML5 semántico en tu proyecto. -* Aplicar y reforzar los conceptos fundamentales de CSS3. -* Implementar selectores de clase evitando la redundancia de estilos en CCS3. -* Utilizar `flexbox` para lograr un diseño `mobile first`, implementando un layout que te permita crear un diseño adaptativo para **mobile y desktop** - -A continuación te proporcionamos el layout (diseño) de la vista mobile y desktop que deberás replicar visualmente y cuyo contenido, colores y fuentes de texto, dejaremos a tu elección. - -* Vista mobile - - ![mobile](https://user-images.githubusercontent.com/32286663/56174616-ec9f6100-5fb8-11e9-9edb-d5ef7c251d9c.png) - -* Vista Desktop - - ![desktop](https://user-images.githubusercontent.com/32286663/56174626-fcb74080-5fb8-11e9-8854-26e8d9c4e25f.png) - -#### JavaScript (ES6+) - -* Utilizar modulos de ES6 para poder modularizar tu código JavaScript. -* Reforzar tu conocimiento sobre el uso de Template literals (Template strings). -* Reforzar tu conocimiento de la manipulacion de los elementos del DOM a traves JavaScript. -* Implementar un sistema de rutas para cambiar de una vista a otra de manera dinámica (SPA). -* Testear la lógica de tu aplicación, con Jest cuidando que el coverage pase el 90% de statements (sentencias), functions (funciones), lines (líneas), y branches (ramas). - -### Persistencia de datos - -En los proyectos anteriores solo has consumido (leído) datos, por ejemplo, a través de un archivo `json` o utilizando `fetch`. - -En este proyecto diseñarás la estructura de esos datos, la forma de consultarlos, actualizarlos, modificarlos y eliminarlos según los requerimiento del usuario. Para llevarlo a cabo utilizaras `Firestore` de `Firebase` o `LocalStogarge` una `Web Storage API` - -#### Firebase - -El objetivo de usar Firestore en este proyecto, es que aprendes a manejar y persistir datos a traves de una base de datos no relacional, en tiempo real y puedas implementar operaciones CRUD (Creación, Lectura, Actualización y eliminación) de datos. - -## Consideraciones generales del proyecto - -* Este proyecto debe ser desarrollado en equipos de trabajo de 3 integrantes. - -* La duración propuesta del proyecto es **3 sprints**, con una duración de una semana cada uno. - -* Te daremos las **historias de usuario** con el fin de presentarte los requerimientos y funcionalidades que desea el usuario final. - -* La **planificación es vital**, para ello te recomendamos utilizar el flujo de trabajo colaborativo que nos ofrecen los projects de GitHub, para que puedas **escribir tus definiciones de terminado** y **criterios de aceptación** por cada historia de usuario con el objetivo que determinen, en equipo, **qué hacer** en el sprint y **cómo se realizará**. - -* Para que todas las miembros de tu equipo puedan lograr los objetivos de aprendizaje, deberán determinar cuál será la estrategia de desarrollo que utilizarán: división por sub-historias, pair programming, code reviews, etc. - -## Restricciones Técnicas - -* Debes utilizar `flexbox` o `CSSGrid` para posicionar tus elementos. Si está permitido el uso de frameworks de CCS (bootstrap), y de componentes flotantes. - -* Ya te damos un diseño (layout) de la vista mobile y desktop, queremos que lo repliques a nivel *pixel perfect*, el contenido, paleta de colores y fuentes, depende de la temática que van a elegir como equipo. La implementación de ese layout deberá formar parte de la *definición de terminado* de tus historias de usuario. - -* Los test son **fundamentales** y deberán formar parte de tu definición de terminado, te recomendamos que comiences a implementarlos desde el comienzo. - -## Historias de Usuario - -* Como usuario nuevo debo poder crear una cuenta con email y password válidos para poder iniciar sesion e ingresar a la red social. - -* Como usuario nuevo debo poder tener la opción de iniciar sesión con mi cuenta de Google o Facebook para ingresar a la red social sin necesidad de crear una cuenta de email válido. - -* Como usuario loggeado debo poder crear, guardar, modificar en el mismo lugar (in place) y eliminar una publicación (post) privada o pública, que puede ser una frase o una imagen. - -* Como usuario loggeado debo poder ver todos los posts públicos y privados que he creado hasta ese momento, desde el más reciente hasta el más antiguo, así como la opción de poder cambiar la configuración de privacidad de mis post. - -* Yo como usuario loggeado, puedo dar like y llevar un conteo de likes en mi publicación así como poder escribir, guardar, editar o eliminar un comentario en mi publicación. - -* Al final debo poder ingresar a la red social y poder visualizar los datos de mi perfil creado o editarlos. - -* Te dejamos un ejemplo de cómo definir criterios de aceptación y definiciones de terminado para una H.U. Si se te complica definirlas o no tienes idea de que considerar para cada H.U. es de gran ayuda revisar redes sociales como `facebok`, `twitter`, `instagram`, `devopedia` o la red social que más te guste y puedas evaluar qué consideran en cada funcionalidad para darla como terminada y aceptada. - - > Como usuario nuevo debo poder crear una cuenta con email y password para - > poder iniciar sesion. Por otro lado, necesito también tener la opción de - > iniciar sesión con mi cuenta de Google o Facebook. - > - > **Criterios de aceptación** - > - Si el mail o password no es válido, al momento de logearme, debo poder - > ver un mensaje de error. - > - Debe ser visible si hay algún mensaje de error. - > - Debo poder ver esta página de creación en Móviles y desktop (responsive). - > - No debe necesitar recargar la página para crear una cuenta (SPA). - > - > **Definición de terminado** - > - La funcionalidad cumple satisface los criterios de aceptación. - > - La funcionalidad tiene _test unitarios_. - > - El diseño visual corresponde al prototipo de alta fidelidad. - > - El código de esta funcionalidad recibió code review. - > - La funcionalidad esta desplegada y pública para ser probada. - > - La funcionalidad fue probada manualmente. - > - Se hicieron pruebas de usuabilidad y se implementó el feedback si se - > consideró necesario. +![Propuesta final](img_readme/figma1.png) +![Propuesta final](img_readme/figma2.png) ## Objetivos de aprendizaje -Antes de empezar el proyecto, recuerda agregar tus objetivos de aprendizaje pendientes de tu proyecto -anterior en la siguiente sección. - ### Objetivos de aprendizajes pendientes - ### HTML y CSS -* [ ] [HTML semántico](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) -* [ ] [CSS `flexbox`](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -* [ ] Construir tu aplicación respetando el diseño realizado (maquetación). +- [x] [HTML semántico](https://developer.mozilla.org/en-US/docs/Glossary/Semantics#Semantics_in_HTML) +- [x] [CSS `flexbox`](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) +- [x] Construir tu aplicación respetando el diseño realizado (maquetación). ### DOM y Web APIs -* [ ] [Manipulación dinámica del DOM](https://developer.mozilla.org/es/docs/Referencia_DOM_de_Gecko/Introducci%C3%B3n) -* [ ] [History API](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) -* [ ] [`localStorage`] +- [x] [Manipulación dinámica del DOM](https://developer.mozilla.org/es/docs/Referencia_DOM_de_Gecko/Introducci%C3%B3n) +- [x] [History API](https://developer.mozilla.org/es/docs/DOM/Manipulando_el_historial_del_navegador) +- [x] [`localStorage`] ### Javascript -* [ ] [Uso de callbacks](https://developer.mozilla.org/es/docs/Glossary/Callback_function) -* [ ] [Consumo de Promesas](https://scotch.io/tutorials/javascript-promises-for-dummies#toc-consuming-promises) -* [ ] Uso ES modules -([`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) -| [`export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)) +- [x] [Uso de callbacks](https://developer.mozilla.org/es/docs/Glossary/Callback_function) +- [x] [Consumo de Promesas](https://scotch.io/tutorials/javascript-promises-for-dummies#toc-consuming-promises) +- [x] Uso ES modules + ([`import`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import) + | [`export`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)) ### Firebase -* [ ] [Firestore](https://firebase.google.com/docs/firestore) -* [ ] [Firebase Auth](https://firebase.google.com/docs/auth/web/start) -* [ ] [Firebase security rules](https://firebase.google.com/docs/rules) -* [ ] [Uso de onSnapshot](https://firebase.google.com/docs/firestore/query-data/listen) -| [onAuthStateChanged](https://firebase.google.com/docs/auth/web/start#set_an_authentication_state_observer_and_get_user_data) +- [x] [Firestore](https://firebase.google.com/docs/firestore) +- [x] [Firebase Auth](https://firebase.google.com/docs/auth/web/start) +- [x] [Firebase security rules](https://firebase.google.com/docs/rules) +- [x] [Uso de onSnapshot](https://firebase.google.com/docs/firestore/query-data/listen) + | [onAuthStateChanged](https://firebase.google.com/docs/auth/web/start#set_an_authentication_state_observer_and_get_user_data) ### Testing -* [ ] [Testeo de tus funciones](https://jestjs.io/docs/es-ES/getting-started) -* [ ] [Testeo asíncrono](https://jestjs.io/docs/es-ES/asynchronous) -* [ ] [Mocking](https://jestjs.io/docs/es-ES/manual-mocks) +- [ ] [Testeo de tus funciones](https://jestjs.io/docs/es-ES/getting-started) +- [ ] [Testeo asíncrono](https://jestjs.io/docs/es-ES/asynchronous) +- [x] [Mocking](https://jestjs.io/docs/es-ES/manual-mocks) ### Colaboración en Github -* [ ] Branches -* [ ] Pull Requests -* [ ] Tags - -### Organización en Github +- [x] Branches +- [x] Pull Requests +- [ ] Tags -* [ ] Projects -* [ ] Issues -* [ ] Labels -* [ ] Milestones +- [x] Projects +- [ ] Issues +- [ ] Labels +- [ ] Milestones ### Buenas prácticas de desarrollo -* [ ] Modularización -* [ ] Nomenclatura / Semántica -* [ ] Linting - -*** - -## Recursos - -### 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 ellas. - -### 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 [Firestore](https://firebase.google.com/docs/firestore) o de forma -local utilizando`localStorage`. - -### Autenticación y autorización - -Hasta el momento, los proyectos han sido pensados como recursos públicos, donde todos -los usuarios compartían un mismo rol y la misma información. - -En este proyecto tendrás que diferenciar la información a mostrar y modificar, -dependiendo de la identidad del usuario. -De la misma manera deberás crear reglar de autorización para el acceso a los -datos. - -Para esto utilizaras respectivamente -[`Firebase authentication`](https://firebase.google.com/docs/auth/) y -[`Firestore security rules`](https://firebase.google.com/docs/firestore/security/get-started) - -### CSS - -En este proyecto queremos que ganes confianza y experiencia con CSS profesional, -por eso usarás [`flexbox`](https://css-tricks.com/snippets/css/a-guide-to-flexbox/) -para posicionar tus elementos. - -Recuerda que no puedes usar frameworks CSS, sólo *vanilla css* o [*sass*](https://sass-lang.com/). - -### Otras: - -* [Pildora SPA](https://www.loom.com/share/fa63a8ad0e9a43428222c15b6f6613d3) -* [Repositorio de pildora de SPA](https://github.com/betsyvies/bootcamp-spa) -* [Pildora de mock Firebase](https://www.youtube.com/watch?v=06myVn41OTY&t=1s) -* [Repositorio de pildora de mock Firebase](https://github.com/Danielalab/2018-2-Testing) -* [Pildora MVC](https://github.com/merunga/todomvc-vanillajs) -* [Modulos: Export](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/export) -* [Modulos: Import](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Sentencias/import) -* [Diseño web, responsive design y la importancia del mobile first - Media Click](https://www.mediaclick.es/blog/diseno-web-responsive-design-y-la-importancia-del-mobile-first/) -* [Mobile First: el enfoque actual del diseño web móvil - 1and1](https://www.1and1.es/digitalguide/paginas-web/diseno-web/mobile-first-la-nueva-tendencia-del-diseno-web/) -* [Mobile First - desarrolloweb.com](https://desarrolloweb.com/articulos/mobile-first-responsive.html) -* [Mobile First - ZURB](https://zurb.com/word/mobile-first) -* [Mobile First Is NOT Mobile Only - Nielsen Norman Group](https://www.nngroup.com/articles/mobile-first-not-mobile-only/) +- [x] Modularización +- [x] Nomenclatura / Semántica +- [ ] Linting -*** +--- diff --git a/_mocks_/firebase-mock.js b/_mocks_/firebase-mock.js new file mode 100644 index 00000000..e69de29b diff --git a/firebase.json b/firebase.json new file mode 100644 index 00000000..e7829392 --- /dev/null +++ b/firebase.json @@ -0,0 +1,10 @@ +{ + "hosting": { + "public": "public", + "ignore": [ + "firebase.json", + "**/.*", + "**/node_modules/**" + ] + } +} diff --git a/img_readme/figma1.png b/img_readme/figma1.png new file mode 100644 index 00000000..03736067 Binary files /dev/null and b/img_readme/figma1.png differ diff --git a/img_readme/figma2.png b/img_readme/figma2.png new file mode 100644 index 00000000..f5499ed8 Binary files /dev/null and b/img_readme/figma2.png differ diff --git a/img_readme/h5.png b/img_readme/h5.png new file mode 100644 index 00000000..8789b5ce Binary files /dev/null and b/img_readme/h5.png differ diff --git a/img_readme/sketch_Bren.jpg b/img_readme/sketch_Bren.jpg new file mode 100644 index 00000000..a1700925 Binary files /dev/null and b/img_readme/sketch_Bren.jpg differ diff --git a/img_readme/sketch_Kari.jpg b/img_readme/sketch_Kari.jpg new file mode 100644 index 00000000..fac6f257 Binary files /dev/null and b/img_readme/sketch_Kari.jpg differ diff --git a/img_readme/sketch_Xel.jpg b/img_readme/sketch_Xel.jpg new file mode 100644 index 00000000..5c3094cc Binary files /dev/null and b/img_readme/sketch_Xel.jpg differ diff --git a/package.json b/package.json index 9a365577..076cbe5a 100644 --- a/package.json +++ b/package.json @@ -14,23 +14,52 @@ "eslint": "eslint --ext .js src/ test/", "stylelint": "stylelint --aei src/**/*.css", "pretest": "npm run htmlhint && npm run eslint && npm run stylelint", - "test": "jest --coverage", + "test:coverage": "jest --coverage", + "test:watch": "jest --watch", "start": "serve src/" }, "devDependencies": { "@babel/core": "^7.2.2", "@babel/plugin-transform-modules-commonjs": "^7.2.0", "babel-core": "^7.0.0-bridge.0", - "babel-jest": "^24.8.0", + "babel-jest": "^24.9.0", + "babel-preset-env": "^1.7.0", "eslint": "^6.0.1", "eslint-config-airbnb-base": "^13.2.0", "eslint-plugin-import": "^2.18.2", "eslint-plugin-jest": "^22.1.2", + "firestore-jest-mock": "^0.3.0", "htmlhint": "^0.11.0", - "jest": "^24.8.0", - "regenerator-runtime": "^0.13.1", + "jest": "^24.9.0", + "mock-cloud-firestore": "^0.12.0", + "regenerator-runtime": "^0.13.5", "serve": "^11.0.2", "stylelint": "^10.1.0", "stylelint-config-recommended": "^2.2.0" - } -} \ No newline at end of file + }, + "dependencies": { + "bulma": "^0.8.2", + "firebase-admin": "^8.11.0", + "mockfirebase": "^0.12.0" + }, + "settings": { + "import/resolver": { + "node": { + "paths": ["src"], + "extensions": [".js", ".ts", ".d.ts"] + } + } + }, + "directories": { + "test": "test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/Kari2406/CDMX009-Social-Network.git" + }, + "author": "", + "bugs": { + "url": "https://github.com/Kari2406/CDMX009-Social-Network/issues" + }, + "homepage": "https://github.com/Kari2406/CDMX009-Social-Network#readme" +} diff --git a/public/firebase-auth.js b/public/firebase-auth.js new file mode 100644 index 00000000..5ac0e197 --- /dev/null +++ b/public/firebase-auth.js @@ -0,0 +1,57 @@ +// Firebase auth functions + +// Login with email +export const emailLoginFb = (userEmail, userPassword) => { + firebase.auth().signInWithEmailAndPassword(userEmail, userPassword); +}; + +// Login with google +export const googleLogin = () => { + const provider = new firebase.auth.GoogleAuthProvider(); + return firebase.auth().signInWithRedirect(provider); +}; +// Login with facebook +export const facebookLogin = () => { + const provider = new firebase.auth.FacebookAuthProvider(); + return firebase.auth().signInWithRedirect(provider); +}; +// Logup with email +export const emailLogup = (userEmail, userPassword) => { + firebase.auth().createUserWithEmailAndPassword(userEmail, userPassword); +}; +// Sign out +export const logOut = () => { + firebase.auth().signOut(); +}; + + // Observator +let displayName; +let photoURL; + +const observatorState = () => { + firebase.auth().onAuthStateChanged((user) => { + const menu = document.querySelector('.menu'); + if (user) { + const menuPic = document.querySelector('#user-photoURL'); + const menuName = document.querySelector('#user-displayName'); + const deskPic = document.querySelector('#userdesk-photoURL'); + const deskName = document.querySelector('#userdesk-displayName'); + menuName.innerHTML = user.displayName; + menuPic.innerHTML = ``; + deskName.innerHTML = user.displayName; + deskPic.innerHTML = ``; + displayName = user.displayName; + photoURL = user.photoURL; + localStorage.setItem('nameStorage', displayName); + localStorage.setItem('URLStorage', photoURL); + window.open('#/home', '_self'); + menu.classList.remove('hide'); + console.log('estas activo', user); + } else { + console.log('no estas activo'); + window.open('#/login', '_self'); + } + }); +} +observatorState(); + \ No newline at end of file diff --git a/public/firebase.js b/public/firebase.js new file mode 100644 index 00000000..c9e4975d --- /dev/null +++ b/public/firebase.js @@ -0,0 +1,213 @@ +// Firebase init +const db = firebase.firestore(); + +const savePost = document.querySelector('#savePost'); +const displayName = localStorage.getItem('nameStorage'); +const photoURL = localStorage.getItem('URLStorage'); +let url; +let day; +let post; +let comment; + +// Initialize Cloud Firestore through Firebase +const st = firebase.storage(); +export const collectionPost = db.collection('newPosts'); +console.log(collectionPost) + +const timeSnap = () => { + const now = new Date(); + const date = [now.getMonth() + 1, now.getDate(), now.getFullYear()]; + const time = [now.getHours(), now.getMinutes(), now.getSeconds()]; + day = `${date.join('/')} ${time.join(':')}`; +}; + +// Add users +savePost.onclick = () => { + timeSnap(); + const title = document.querySelector('#recipientTitle').value; + const activity = document.querySelector('#recipientActivity').value; + const location = document.querySelector('#recipientLocation').value; + const description = document.querySelector('#recipientDescription').value; + + return collectionPost.add({ + title, + activity, + location, + description, + image: url, + date: day, + displayName, + photoURL, + }) + .then(() => { + document.querySelector('#recipientTitle').value = ''; + document.querySelector('#recipientActivity').value = ''; + document.querySelector('#recipientLocation').value = ''; + document.querySelector('#recipientDescription').value = ''; + }) + .catch((error) => { + console.error('Error adding document: ', error); + }); +}; + +// Add image +const fileInput = document.querySelector('#file'); +fileInput.onchange = (e) => { + console.log(e.target.files); + const file = e.target.files[0]; + st.ref('img').child(file.name).put(file) + .then(snap => snap.ref.getDownloadURL()) + .then((link) => { + url = link; + const img = document.createElement('img'); + img.src = link; + }) + .catch((error) => { + const errorMessage = error.message; + console.log(errorMessage); + alert('Necesitas iniciar sesión para poder publicar un post.'); + }); +}; + +// Read documents +export const render = () => { + post = document.querySelector('#contentCreated'); + db.collection('newPosts').onSnapshot((querySnapshot) => { + post.innerHTML = ''; + querySnapshot.forEach((doc) => { + console.log(`${doc.id} => ${doc.data().title}`); + post.innerHTML + += `
+
+
+ +
+
+
+ +

${doc.data().displayName}

+
+
+
${doc.data().title}
+ + + + +
+
+

#${doc.data().activity}

+

${doc.data().location}

+
+

${doc.data().description}

+
+

+ ${doc.data().date} +

+ + +

+
+
+
+ + +
+
+
+
+ `; + + // delete post + const deletebutton = document.querySelectorAll('.js-delete'); + const deletePost = (e) => { + console.log(e.target.id); + db.collection('newPosts').doc(e.target.id).delete() + .then(() => { + console.log('Lo borraste, eres chido'); + }) + .catch((error) => { + console.log('No pudiste, ponte chido', error); + }); + }; + deletebutton.forEach(btn => btn.addEventListener('click', deletePost)); + + // edit post + const btnEdit = document.querySelectorAll('.js-edit'); + const actionEdit = (e) => { + const modal = document.querySelector('#exampleModal'); + modal.classList.toggle('show'); // deberiamos rellenarlo con la data actual del doc + modal.style = 'display:inherit;'; + const titleInput = document.querySelector('#recipientTitle'); + titleInput.value = e.target.getAttribute('data-title'); + const activityInput = document.querySelector('#recipientActivity'); + activityInput.value = e.target.getAttribute('data-activity'); + const locationInput = document.querySelector('#recipientLocation'); + locationInput.value = e.target.getAttribute('data-location'); + const descriptionInput = document.querySelector('#recipientDescription'); + descriptionInput.value = e.target.getAttribute('data-description'); + const id = e.target.id; + + const btnSaveEdit = document.querySelector('#savePost'); + btnSaveEdit.onclick = () => { + const title = document.querySelector('#recipientTitle').value; + const activity = document.querySelector('#recipientActivity').value; + const location = document.querySelector('#recipientLocation').value; + const description = document.querySelector('#recipientDescription').value; + + console.log(title); + console.log(id); + // return + return db.collection('newPosts') + .doc(id) + .update({ + title, + activity, + location, + description, + }) + .then(() => { + console.log('Document successfully written!'); + modal.style = 'display: none'; // esto no debemos solo quitar show y poner style none + // REcolocar el listener del boton (click) con el callback original (publicar) + btnEdit.innerHTML = 'Guardar'; + titleInput.value = ''; + activityInput.value = ''; + locationInput.value = ''; + descriptionInput.value = ''; + btnSaveEdit.addEventListener('click', savePost); + }) + .catch((error) => { + console.error('Error writing document: ', error); + }); + }; + const closeModal = document.querySelector('#modalClose'); + const actionClose = () => { + modal.style = 'display:none'; + }; + closeModal.addEventListener('click', actionClose); + }; + btnEdit.forEach(actionUpdate => actionUpdate.addEventListener('click', actionEdit)); + + // add comment + + const addComment = document.querySelectorAll('.addComment'); + const writeComment = (e) => { + comment = document.querySelectorAll('.newPostComment').value; + db.collection('newPosts').doc(e.target.id).collection('comments').add({ + comment, + }) + .then(() => { + console.log('Document successfully written!'); + }) + .catch((error) => { + console.error('Error writing document: ', error); + }); + }; + addComment.forEach(write => write.addEventListener('click', writeComment)); + }); + }); +}; + +render(); diff --git a/public/img/bg-login.svg b/public/img/bg-login.svg new file mode 100644 index 00000000..bcdac845 --- /dev/null +++ b/public/img/bg-login.svg @@ -0,0 +1 @@ +Recurso 1 \ No newline at end of file diff --git a/public/img/favicon/favicon.ico b/public/img/favicon/favicon.ico new file mode 100644 index 00000000..8f3580d6 Binary files /dev/null and b/public/img/favicon/favicon.ico differ diff --git a/public/img/friends.svg b/public/img/friends.svg new file mode 100644 index 00000000..cce7d7cf --- /dev/null +++ b/public/img/friends.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/icons/add-friend.svg b/public/img/icons/add-friend.svg new file mode 100644 index 00000000..cc93958d --- /dev/null +++ b/public/img/icons/add-friend.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/icons/dog.svg b/public/img/icons/dog.svg new file mode 100644 index 00000000..9ab9753b --- /dev/null +++ b/public/img/icons/dog.svg @@ -0,0 +1,2 @@ + + diff --git a/public/img/icons/drug.svg b/public/img/icons/drug.svg new file mode 100644 index 00000000..ccd367c0 --- /dev/null +++ b/public/img/icons/drug.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/img/icons/food.svg b/public/img/icons/food.svg new file mode 100644 index 00000000..eb473aff --- /dev/null +++ b/public/img/icons/food.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/img/icons/home-run.svg b/public/img/icons/home-run.svg new file mode 100644 index 00000000..bcf4c64c --- /dev/null +++ b/public/img/icons/home-run.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/public/img/icons/imagotipo.svg b/public/img/icons/imagotipo.svg new file mode 100644 index 00000000..b509265b --- /dev/null +++ b/public/img/icons/imagotipo.svg @@ -0,0 +1 @@ +imagotipo \ No newline at end of file diff --git a/public/img/icons/isologo.svg b/public/img/icons/isologo.svg new file mode 100644 index 00000000..914972b8 --- /dev/null +++ b/public/img/icons/isologo.svg @@ -0,0 +1 @@ +isologo \ No newline at end of file diff --git a/public/img/icons/loading.gif b/public/img/icons/loading.gif new file mode 100644 index 00000000..83cc62fc Binary files /dev/null and b/public/img/icons/loading.gif differ diff --git a/public/img/icons/logo.svg b/public/img/icons/logo.svg new file mode 100644 index 00000000..f6b4fc90 --- /dev/null +++ b/public/img/icons/logo.svg @@ -0,0 +1 @@ +logo \ No newline at end of file diff --git a/public/img/icons/pen.svg b/public/img/icons/pen.svg new file mode 100644 index 00000000..6fb84ac1 --- /dev/null +++ b/public/img/icons/pen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/icons/set.svg b/public/img/icons/set.svg new file mode 100644 index 00000000..d9c5ce29 --- /dev/null +++ b/public/img/icons/set.svg @@ -0,0 +1,2 @@ + + diff --git a/public/img/location.svg b/public/img/location.svg new file mode 100644 index 00000000..e7841479 --- /dev/null +++ b/public/img/location.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/img/pictures/bren.jpeg b/public/img/pictures/bren.jpeg new file mode 100644 index 00000000..fdbe0eaa Binary files /dev/null and b/public/img/pictures/bren.jpeg differ diff --git a/public/img/pictures/crafts.jpg b/public/img/pictures/crafts.jpg new file mode 100644 index 00000000..a0cbab05 Binary files /dev/null and b/public/img/pictures/crafts.jpg differ diff --git a/public/img/pictures/crafts2.jpg b/public/img/pictures/crafts2.jpg new file mode 100644 index 00000000..471162a6 Binary files /dev/null and b/public/img/pictures/crafts2.jpg differ diff --git a/public/img/pictures/dog_shower.jpg b/public/img/pictures/dog_shower.jpg new file mode 100644 index 00000000..a172d012 Binary files /dev/null and b/public/img/pictures/dog_shower.jpg differ diff --git a/public/img/pictures/helado1.jpg b/public/img/pictures/helado1.jpg new file mode 100644 index 00000000..0fa88699 Binary files /dev/null and b/public/img/pictures/helado1.jpg differ diff --git a/public/img/pictures/helado2.jpg b/public/img/pictures/helado2.jpg new file mode 100644 index 00000000..57d71382 Binary files /dev/null and b/public/img/pictures/helado2.jpg differ diff --git a/public/img/pictures/helado3.jpg b/public/img/pictures/helado3.jpg new file mode 100644 index 00000000..5c4c6faa Binary files /dev/null and b/public/img/pictures/helado3.jpg differ diff --git a/public/img/pictures/helado4.jpg b/public/img/pictures/helado4.jpg new file mode 100644 index 00000000..c36dd76e Binary files /dev/null and b/public/img/pictures/helado4.jpg differ diff --git a/public/img/pictures/helado5.jpg b/public/img/pictures/helado5.jpg new file mode 100644 index 00000000..7953e594 Binary files /dev/null and b/public/img/pictures/helado5.jpg differ diff --git a/public/img/pictures/kari.jpeg b/public/img/pictures/kari.jpeg new file mode 100644 index 00000000..5e59e82d Binary files /dev/null and b/public/img/pictures/kari.jpeg differ diff --git a/public/img/pictures/kids.jpg b/public/img/pictures/kids.jpg new file mode 100644 index 00000000..6c8c1f0f Binary files /dev/null and b/public/img/pictures/kids.jpg differ diff --git a/public/img/xel.jpeg b/public/img/xel.jpeg new file mode 100644 index 00000000..c8775425 Binary files /dev/null and b/public/img/xel.jpeg differ diff --git a/public/index.html b/public/index.html new file mode 100644 index 00000000..04fb2a55 --- /dev/null +++ b/public/index.html @@ -0,0 +1,251 @@ + + + + + + + + Civitas + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ + + +
+

Comida

+
+
+
+ + + +
+

Salud

+
+
+
+ + + +
+

Mascotas

+
+
+
+ + + +
+

En casa

+
+
+
+
+ + +
+
+ + + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ +

+
+ +
+
+
+
+
+
+
+
+
+ + + + + + + + + + + \ No newline at end of file diff --git a/public/main.js b/public/main.js new file mode 100644 index 00000000..e9e81317 --- /dev/null +++ b/public/main.js @@ -0,0 +1,7 @@ +import { changeTmp } from './view-controller/router.js'; + +const init = () => { + changeTmp(window.location.hash); + window.addEventListener('hashchange', () => changeTmp(window.location.hash)); +}; +window.addEventListener('load', init); diff --git a/public/style.css b/public/style.css new file mode 100644 index 00000000..97572e01 --- /dev/null +++ b/public/style.css @@ -0,0 +1,506 @@ +* { + box-sizing: border-box; + font-family: "Raleway", sans-serif; +} +h3 { + text-align: center; + letter-spacing: 2px; + color: #333a48; + font-size: 1.4em !important; + font-weight: 600 !important; +} +h4 { + letter-spacing: 0.07em; + text-align: left; + color: #333a48; + font-size: 1.1em !important; + font-weight: 700 !important; +} +h5 { + letter-spacing: 0.05em; + text-align: left; + color: #071013; + font-size: 1.1em !important; + font-weight: 700 !important; +} +.hide { + display: none !important; +} +.hover-yellow:hover { + color: #ffb82e; +} +.hover-yellow-bg:hover { + background-color: #ffb82e; +} +.bg-img { + background-image: linear-gradient( + to right, + rgba(0, 0, 0, 0.1), + rgba(0, 0, 0, 0.1) + ), + url(./img/bg-login.svg); + background-attachment: fixed; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; + min-height: 100vh; +} +.card-align { + display: flex; + justify-content: center; + align-items: center; +} +.form-container { + padding: 35px 0px; + background-color: rgba(255, 255, 255, 0.9); + border: 1px solid #ffffff; + box-sizing: border-box; + border-radius: 20px; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); +} +.logo-civitas { + display: flex; + justify-content: center; + margin: 25px; +} +.logo-civitas img { + width: 30%; +} +.login-form { + margin: 20px 20px; +} +.desktop-logo img { + left: 50%; + width: 50%; +} +.login-input { + margin: 12px 0px; + padding-left: 10px; + background: #ffffff; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 6px; + height: 42px; + border: none; + width: 100%; + font-size: 1em; + letter-spacing: 1px; +} +.submit-button { + background: #333a48; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 6px; + height: 38px; + color: #fff; + width: 100%; + border: none; + font-size: 1em; + letter-spacing: 1px; + margin: 20px 0px; +} +.submit-button-comments { + background: #333a48; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 6px; + height: 38px; + color: #fff; + width: 25%; + border: none; + font-size: 0.8em; + letter-spacing: 1px; + margin: 20px 0px; +} +.submit-button:hover { + background-color: #ffb82e; +} +.forgotten-password { + color: #ffb82e !important; + font-size: 0.9em; + font-weight: 600; +} +.input-container { + position: relative; +} +.eye-icon { + position: relative; + color: #333a48; +} +.fa-eye { + position: absolute; + top: 40%; + left: 91%; +} +.eye-icon:hover { + color: rgb(81, 136, 153); +} +.forgotten-password:hover { + color: #333a48; +} +.scial-mdia-prgph { + text-align: center; + font-size: 0.9em; + color: #333a48; + font-family: "Raleway", sans-serif; + font-weight: 600; +} +.scial-mdia-btn { + display: flex; + justify-content: space-around; + margin: 30px 15px; +} +.facebook { + padding: 16px 29px; + background: #345ca5; + border-radius: 6px; + color: #fff; + border: none; +} +.facebook:hover { + background: #4d74bd; +} +.fab { + padding-right: 12px; +} +.google { + padding: 16px 36px; + background: #fff; + border-radius: 6px; + color: rgb(71, 71, 71); + border: 1px solid rgb(82, 82, 82); +} +.google:hover { + background: rgb(230, 230, 230); +} +.fa-google { + color: #3b5998; +} +/* Menu */ +.user-img { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding-top: 100px; +} +.user-img img { + width: 40%; + border-radius: 50%; + margin: 10px 0px; +} +.menu-container { + padding: 15%; +} +.my-navbar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + margin-bottom: 0; + list-style: none; +} +.flex-connection a { + color: black; +} +.categories-btn p { + margin-top: 5px; +} + +.flex-connection a p { + padding: 0px 8px; + text-align: center; +} +.my-navbar li a { + text-decoration: none; + color: #fff; + font-size: 1.1em; + border-bottom: 1px solid rgba(255, 255, 255, 0.3); +} +.white h3 { + color: #fff; +} +.bg-nav { + background-color: #333a48; + position: absolute; + z-index: 100; +} +nav .bg-nav { + z-index: 100; +} +.nav-item { + margin: 3px; + position: relative; +} +.menu-icons { + color: #ffb82e; + position: absolute; + left: 90%; +} +.profile-icons { + color: #ffb82e; +} + +.set-icon img { + width: 22px; +} +.exit { + float: right; +} +/* header */ +.header-size { + width: 100%; + height: 70px; + position: fixed; + background-color: #fff; + z-index: 2; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.1); +} +.header-container { + padding-top: 20px; + display: flex !important; + justify-content: space-between; +} +.nav-link- { + display: flex; + justify-content: center; + margin: 5px; +} +.logo-civitas-dashboard { + display: flex; + justify-content: center; +} +.logo-civitas-dashboard img { + width: 25%; + padding-bottom: 5px; +} +.new-post-icon a { + font-size: 1.4em; + color: #071013; +} +.new-post-icon a:hover { + color: #ffb82e; +} +.menu-btn { + background-color: #fff; + border: none; + color: #000 !important; +} +.menu-btn:visited { + border: none; +} +.bars-icon { + margin: 10px; + font-size: 1.5em; + color: #071013; +} +.bars-icon:hover { + color: #ffb82e; +} +.logout-icon { + color: #fff; + position: relative; + left: 85%; +} +.logout-icon i { + font-size: 1.4em; +} +/* categories buttons */ +.header-2 { + padding-top: 80px; +} +.categories-btn { + padding: 20px 0px !important; + display: flex; + justify-content: space-between; + font-size: 0.9em; + text-align: center; +} +.categorie-btn { + background-color: #fff; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + padding: 15px; + border-radius: 7px; +} +.categorie-btn:hover { + background-color: #ffb82e; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + padding: 15px; + border-radius: 7px; +} +.categorie-btn img { + width: 30px; + color: #333a48; +} +.filters { + display: flex; + justify-content: space-between; +} +.search-input-container { + width: 80%; + position: relative; +} +.search-input { + padding-left: 10px; + background: #ffffff; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 6px; + height: 42px; + border: none; + width: 100%; + font-size: 1em; + letter-spacing: 1px; +} +.filters-icon { + display: flex; + justify-content: center; + align-items: center; + color: #fff; + background-color: #333a48; + border-radius: 4px; +} +.fa-filter { + margin: 8px 12px; +} +.fa-search { + position: absolute; + top: 32%; + right: 4%; + color: #9e9e9e; +} +/*Post*/ +.img-edit { + width: 20px; +} +.img-add-friend { + width: 10%; +} +/* Modal posts */ +.modal-img { + display: flex; + justify-content: center !important; + align-items: center !important; + height: 300px; +} +/* view-dashboard-posts */ +.info-user-desktop { + display: none; +} +.card-user-desk { + position: relative; +} +.user-img-desktop { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.user-img-desktop img { + width: 45%; + border-radius: 50%; + margin: 20px 0px; +} +.card-post { + position: relative; + background-color: #fff; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + border-radius: 10px; + margin-top: 25px; +} +.img-post img { + width: 100%; + border-radius: 10px 10px 0px 0px; +} +.info-post { + padding: 15px; +} +.header-post { + display: flex; + justify-content: space-between; +} +.edit-delete-icons i { + padding: 5px; +} +.subtitle-post { + display: flex; + flex-direction: row; +} +.info-user { + display: flex; + flex-direction: row; + align-items: center; + padding-bottom: 10px; +} +.info-user img { + border-radius: 50%; + width: 30px; + margin-right: 10px; +} +.flex-row { + display: flex; + justify-content: space-between; +} +.flex-row-likes { + display: flex; + flex-direction: row; +} +.fa-heart { + margin: 5px; +} +.fa-map-marker-alt { + margin-left: 20px; +} +/*Profile*/ +.flex-profile-name { + margin: 5px 0px; + display: flex; + justify-content: center; +} +.flex-connection { + display: flex; + flex-direction: row; + justify-content: center; +} +.categories-btn- { + padding: 20px 40px !important; + display: flex; + justify-content: space-around; + font-size: 0.9em; + text-align: center; +} +.categorie-btn- { + background-color: #fff; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + padding: 3px; + border-radius: 8px; +} +/* Media querys*/ +@media screen and (min-width: 450px) { + .facebook { + padding: 14px 24px; + } + .google { + padding: 14px 32px; + } +} +@media screen and (min-width: 769px) { + .hide { + display: block; + } + .info-user-desktop { + position: fixed; + border-radius: 15px; + box-shadow: 1px 4px 4px rgba(0, 0, 0, 0.25); + display: block; + width: 370px; + top: 11%; + } + .submit-button-comments { + width: 15%; + } + .user-img img { + width: 25%; + border-radius: 50%; + margin: 10px 0px; + } +} +.errorMessage { + font-size: 2px; +} diff --git a/public/stylelint b/public/stylelint new file mode 100644 index 00000000..e69de29b diff --git a/public/view-controller/router.js b/public/view-controller/router.js new file mode 100644 index 00000000..8c368932 --- /dev/null +++ b/public/view-controller/router.js @@ -0,0 +1,29 @@ +import { components } from '../view/index.js'; + +export const changeTmp = (hash) => { + const id = hash.split('/')[1]; + const sectionMain = document.querySelector('#contentCreated'); + const sectionRoot = document.querySelector('#roots'); + sectionMain.innerHTML = ''; + sectionRoot.innerHTML = ''; + + switch (hash) { + case '': + case '#': + case '#/': + case '#/login': + { return sectionRoot.appendChild(components.login()); } + case '#/profile': + { return sectionRoot.appendChild(components.profile()); } + case '#/logup': + case '#/home': + case '#/reviews': + case '#/saved': + case '#/followers': + case '#/follow': + + { return sectionMain.appendChild(components[id]()); } + default: + return sectionMain.appendChild(components.different()); + } +}; diff --git a/public/view/404.js b/public/view/404.js new file mode 100644 index 00000000..b9599c58 --- /dev/null +++ b/public/view/404.js @@ -0,0 +1,12 @@ +export default () => { + const viewDifferent = ` +

404

+

Página no encontrada

+

El archivo especificado no se encontró en este sitio web. Por favor, compruebe la URL para errores y vuelva a intentarlo. +

+ `; + const divElemt = document.createElement('div'); + divElemt.setAttribute('id', 'message'); + divElemt.innerHTML = viewDifferent; + return divElemt; +}; diff --git a/public/view/follow.js b/public/view/follow.js new file mode 100644 index 00000000..5ccd416c --- /dev/null +++ b/public/view/follow.js @@ -0,0 +1,21 @@ +export default () => { + const viewConexions = ` +
+ 5 Seguidores + 3 Seguidores +
+ +
+

Bren Carranco

+

Karina Sanchez

+
+ `; + // Hide header + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewConexions; + return divElemt; +}; diff --git a/public/view/followers.js b/public/view/followers.js new file mode 100644 index 00000000..19c34a16 --- /dev/null +++ b/public/view/followers.js @@ -0,0 +1,20 @@ +export default () => { + const viewConexions = ` +
+ 5 Seguidores + 3 Seguidores +
+ +
+

Karina Sanchez

+

Bren Carranco

+
+ `; + // Hide header + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewConexions; + return divElemt; +}; diff --git a/public/view/home.js b/public/view/home.js new file mode 100644 index 00000000..d7f5bc48 --- /dev/null +++ b/public/view/home.js @@ -0,0 +1,18 @@ +import { render } from '../firebase.js'; +import { logOut } from '../firebase-auth.js'; + + +export default () => { + const viewHome = render(); + + // Show header + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.remove('hide'); + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewHome; + return divElemt; +}; + // Log out function +const logoutBtn = document.querySelector('#logout'); +logoutBtn.addEventListener('click', logOut); diff --git a/public/view/index.js b/public/view/index.js new file mode 100644 index 00000000..b56e8ff5 --- /dev/null +++ b/public/view/index.js @@ -0,0 +1,23 @@ +import Home from './home.js'; +import Profile from './profile.js'; +import Login from './login.js'; +import Logup from './logup.js'; +import Reviews from './reviews.js'; +import Saved from './saved.js'; +import Followers from './followers.js'; +import Follow from './follow.js'; +import Different from './404.js'; + +const components = { + home: Home, + profile: Profile, + login: Login, + logup: Logup, + reviews: Reviews, + saved: Saved, + followers: Followers, + follow: Follow, + different: Different, +}; + +export { components }; diff --git a/public/view/login.js b/public/view/login.js new file mode 100644 index 00000000..33a3bab3 --- /dev/null +++ b/public/view/login.js @@ -0,0 +1,90 @@ +import { emailLoginFb, facebookLogin, googleLogin } from '../firebase-auth.js'; + +export default () => { + const root = document.querySelector('#roots'); + const viewLogin = ` +
+
+
+
+
+
+ +
+

Inicia sesión

+ +

Puedes ingresar con:

+
+ + +
+

+ ¿No tienes una cuenta? + Regístrate ahora +

+
+
+
+
+ `; + const divElemt = document.createElement('div'); + divElemt.innerHTML = viewLogin; + root.appendChild(divElemt); + + const loginBtn = document.querySelector('#login-submit'); + loginBtn.onclick = () => { + const emailLogin = document.querySelector('#email-login').value; + const passwordLogin = document.querySelector('#password-login').value; + console.log(emailLogin, passwordLogin); + emailLoginFb(emailLogin, passwordLogin) + .catch((error) => { + // Errores + const errorCode = error.code; + const errorMessage = error.message; + console.log(errorCode); + console.log(errorMessage); + }); + }; + + // Hide header elements + const dashHeader = document.querySelector('#dashboardHeader'); + const menuH = document.querySelector('#menuH'); + const postHide = document.querySelector('#contentCreated'); + postHide.classList.add('hide'); + dashHeader.classList.add('hide'); + menuH.classList.add('hide'); + + // Login + const googleBtns = document.querySelector('.google'); + googleBtns.addEventListener('click', googleLogin); + + const fbBtns = document.querySelector('.facebook'); + fbBtns.addEventListener('click', facebookLogin); + + return divElemt; +}; diff --git a/public/view/logup.js b/public/view/logup.js new file mode 100644 index 00000000..f3d666cf --- /dev/null +++ b/public/view/logup.js @@ -0,0 +1,91 @@ +import { + facebookLogin, googleLogin, emailLogup, +} from '../firebase-auth.js'; + +export default () => { + const root = document.querySelector('#roots'); + const viewLogup = ` +
+
+
+
+
+
+
+ +
+

¡Únete a la comunidad!

+ +

O crear cuenta con:

+
+ + +
+
+
+
+
+
+
+
+ `; + + const divElemt = document.createElement('div'); + divElemt.innerHTML = viewLogup; + root.appendChild(divElemt); + + // Hide headers + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + + // Login + const googleBtns = document.querySelector('.google'); + googleBtns.addEventListener('click', googleLogin); + + const fbBtns = document.querySelector('.facebook'); + fbBtns.addEventListener('click', facebookLogin); + + const emailBtns = document.querySelector('#email-submit'); + emailBtns.addEventListener('click', emailLogup); + + return divElemt; +}; diff --git a/public/view/post.js b/public/view/post.js new file mode 100644 index 00000000..29f70829 --- /dev/null +++ b/public/view/post.js @@ -0,0 +1,25 @@ +export default () => { + const viewPost = ` +
+ + + + + + +
+
+

Tips para un buen baño

+

#mascotas

+

hace 3 horas

+
+
+
+
+ `; + + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewPost; + return divElemt; +}; diff --git a/public/view/profile.js b/public/view/profile.js new file mode 100644 index 00000000..8342b912 --- /dev/null +++ b/public/view/profile.js @@ -0,0 +1,70 @@ +export default () => { + const viewProfile = ` +
+
+
+ member +
+
+
+

${localStorage.getItem('nameStorage')}

+ +
+ +
+
+
+ +
+
+ +
+
+ +
+
+
; +
+ +
+ `; + + // Hide header elements + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + const cardUser = document.querySelector('.card-user-desk'); + cardUser.classList.add('hide'); + + + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewProfile; + return divElemt + +}; + diff --git a/public/view/reviews.js b/public/view/reviews.js new file mode 100644 index 00000000..bd0636b3 --- /dev/null +++ b/public/view/reviews.js @@ -0,0 +1,63 @@ +export default () => { + const viewNewReview = ` +
+
+ member +
+
+

${localStorage.getItem('nameStorage')}

+ + +
+
+ 5
Seguidores

+ 3
Seguidores
+
+
+ + + + + + + + + + + + + + + +
+
+
+
+
+ +
+

+ Karina Sr
+ Los bowls +

+

#comida
+ Hace 2 hrs +

+
+
+ + 4.4 + +
+
+ `; + + // Hide header + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewNewReview; + return divElemt; +}; diff --git a/public/view/saved.js b/public/view/saved.js new file mode 100644 index 00000000..0e6c0c36 --- /dev/null +++ b/public/view/saved.js @@ -0,0 +1,65 @@ +export default () => { + const viewSaved = ` +
+
+ member +
+
+
+

${localStorage.getItem('nameStorage')}

+ + +
+
+ 5
Seguidores

+ 3
Seguidores
+
+
+
+ + + + + + + + + + + + + + + +
+
+
+
+
+ +
+

+ Karina Sr
+ Los bowls +

+

#comida
+ Hace 2 hrs +

+
+ + 4.4 + +
+
+
+ `; + + // Hide header + const dashHeader = document.querySelector('#dashboardHeader'); + dashHeader.classList.add('hide'); + + const divElemt = document.createElement('div'); + divElemt.classList.add('position'); + divElemt.innerHTML = viewSaved; + return divElemt; +}; diff --git a/src/.vscode/settings.json b/src/.vscode/settings.json new file mode 100644 index 00000000..6f3a2913 --- /dev/null +++ b/src/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} \ No newline at end of file diff --git a/src/example.js b/src/example.js deleted file mode 100644 index 52d2c7ea..00000000 --- a/src/example.js +++ /dev/null @@ -1,3 +0,0 @@ -export const example = () => { - // aquí tu código -} \ No newline at end of file diff --git a/src/index.html b/src/index.html deleted file mode 100644 index bb6937cc..00000000 --- a/src/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Document - - - - - \ No newline at end of file diff --git a/src/index.js b/src/index.js deleted file mode 100644 index 35868bab..00000000 --- a/src/index.js +++ /dev/null @@ -1,3 +0,0 @@ -import { example } from './example.js'; - -example(); diff --git a/test/example.spec.js b/test/example.spec.js index 1aca05e9..a9eeaf9c 100644 --- a/test/example.spec.js +++ b/test/example.spec.js @@ -1,7 +1,54 @@ -import { example } from '../src/example.js'; +/* global firebase */ -describe('example', () => { - it('debería ser una función', () => { - expect(typeof example).toBe('function'); +/* const { firebasemock } = require('firestore-jest-mock'); + +global.firebase = new firebasemock.MockFirebase(); +const mockfirestore = new firebasemock.MockFirestore(); +mockfirestore.autoFlush(); +mockauth.autoFlush(); + +global.firebase = firebasemock.MockFirebaseSdk( + () => null, + () => mockauth, + () => mockfirestore, +); */ + +/* import { + emailLoginFb, +} from '../src/firebase-auth.js'; + +const firebasemock = require('firebase-jest-mock'); + +const mockauth = new firebasemock.MockFirebase(); +const mockfirestore = new firebasemock.MockFirestore(); +mockfirestore.autoFlush(); +mockauth.autoFlush(); + +global.firebase = firebasemock.MockFirebaseSdk( + () => null, + () => mockauth, + () => mockfirestore, +); + + +describe('login with email', () => { + it('must be a function', () => { + expect(typeof emailLoginFb).toBe('function'); + }); + it('Debería poder iniciar sesion', () => emailLoginFb('test@test.com', 'abcd1234') + .then((user) => { + expect(user.email).toBe('test@test.com'); + })); +}); + */ + + // import { example } from '../src/example.js'; +function suma(a, b) { + return a + b; +} + +describe('suma', () => { + it('sumar 2 + 2 es igual a 4', () => { + expect(suma(2, 2)).toBe(4); }); }); \ No newline at end of file