From e1b826771e6d22d3e1c58ef70dbe9f47815d6f80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Fri, 23 Dec 2022 16:23:41 -0300 Subject: [PATCH 01/73] =?UTF-8?q?creaci=C3=B3n=20de=20modal=20sign=20up,?= =?UTF-8?q?=20se=20crea=20style.css?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 4 ++-- src/index.html | 30 ++++++++++++++++++++++++++++++ src/main.js | 16 ++++++++++++++++ src/style.css | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/style.css diff --git a/package.json b/package.json index 0c72f6c8..5e00e58f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "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" }, @@ -40,4 +40,4 @@ "version": "5.5.0", "commit": "51e941edf1cc991930aefd7dd9c406a7c43741c1" } -} \ No newline at end of file +} diff --git a/src/index.html b/src/index.html index 788db3c9..e9328785 100644 --- a/src/index.html +++ b/src/index.html @@ -1,12 +1,42 @@ + Document + + + + + + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js index ac27e91a..108981e2 100644 --- a/src/main.js +++ b/src/main.js @@ -3,3 +3,19 @@ import { myFunction } from './lib/index.js'; myFunction(); + +const openModalSU = () => { + modalSU.style.display = 'flex'; + } + +const closeModalSU = () => { + modalSU.style.display = 'none'; + } + +const btnOpenModalSU = document.getElementById('botonRegistrar'); +btnOpenModalSU.addEventListener('click', openModalSU); + +const btnCloseModalSU = document.getElementById('botonCerrarModal'); +btnCloseModalSU.addEventListener('click', closeModalSU); + + diff --git a/src/style.css b/src/style.css new file mode 100644 index 00000000..9f15713b --- /dev/null +++ b/src/style.css @@ -0,0 +1,35 @@ +.modal { + display: none; + /* Hidden by default */ + background: rgba(0, 0, 0, 0.4); + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + top: 0; + left: 0; + position: fixed; + padding: 20px; + justify-content: center; + align-items: center; + z-index: 2; + /*posicionarlo hacia el frente, por encima de todos los elementos*/ + + } + + .modal-container { + background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); + width: 90%; + height: 60%; + font-family: 'Poppins light', sans-serif; + /*(sans-serif=sin) serifaslos medios impresos necesitan serifas(las puntitas de las letras que las hacen mas elegantes y que dan la impresion de estar conectadas)*/ + font-size: .75rem; + padding: 20px; + border-radius: 15px; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; + } \ No newline at end of file From 93f2ef936deff66f2244086ac40adcdc55f2219b Mon Sep 17 00:00:00 2001 From: Valmontx Date: Sat, 24 Dec 2022 00:17:40 -0500 Subject: [PATCH 02/73] add: nueva rama login --- src/index.html | 12 +++++++++--- src/main.js | 11 +++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/index.html b/src/index.html index 788db3c9..ad8c38a1 100644 --- a/src/index.html +++ b/src/index.html @@ -4,9 +4,15 @@ + Document - - + + + + + + + - \ No newline at end of file + diff --git a/src/main.js b/src/main.js index ac27e91a..a034ec8f 100644 --- a/src/main.js +++ b/src/main.js @@ -3,3 +3,14 @@ import { myFunction } from './lib/index.js'; myFunction(); + + + + + +const abrirModal = document.getElementById('btnAbrirModal') +abrirModal.addEventListener('click', (e) => { + e.target.value + console.log('hola') +}); + From 3a2e1a739cdd868087d9b21608b6b719067bc498 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 27 Dec 2022 11:04:12 -0500 Subject: [PATCH 03/73] =?UTF-8?q?incorporacion=20del=20modal=20SignIn=20y?= =?UTF-8?q?=20autenticacion=20con=20firebase=20usando=20correo=20y=20contr?= =?UTF-8?q?ase=C3=B1a?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/index.html | 67 ++++++++++++++++++++++++++++ src/lib/index.js | 3 +- src/main.js | 111 +++++++++++++++++++++++++++++++++++++++++++++++ src/style.css | 55 +++++++++++++++++++++++ 4 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 src/style.css diff --git a/src/index.html b/src/index.html index 788db3c9..2b0b6343 100644 --- a/src/index.html +++ b/src/index.html @@ -1,12 +1,79 @@ + + Document + +

Red Social NVJ

+ + + + + + + + + \ No newline at end of file diff --git a/src/lib/index.js b/src/lib/index.js index d1930899..304299f8 100644 --- a/src/lib/index.js +++ b/src/lib/index.js @@ -2,5 +2,6 @@ export const myFunction = () => { // aqui tu codigo - console.log('Hola mundo!'); + // console.log('Hola mundo!'); }; + diff --git a/src/main.js b/src/main.js index ac27e91a..95a9c8d1 100644 --- a/src/main.js +++ b/src/main.js @@ -3,3 +3,114 @@ import { myFunction } from './lib/index.js'; myFunction(); + +//funciones de apertura y cerrado del modal de SU +const openModalSU = () => { + modalSU.style.display = 'flex'; +} + +const closeModalSU = () => { + modalSU.style.display = 'none'; +} +const btnOpenModalSU = document.getElementById('botonRegistrar'); +btnOpenModalSU.addEventListener('click', openModalSU); + +const btnCloseModalSU = document.getElementById('botonCerrarModalSU'); +btnCloseModalSU.addEventListener('click', closeModalSU); + +//funciones de apertura y cerrado del modal de SI +const openModalSI = () => { + modalSI.style.display = 'flex'; +} + +const closeModalSI = () => { + modalSI.style.display = 'none'; +} + +const btnOpenModalSI = document.getElementById('botonLoguear'); +btnOpenModalSI.addEventListener('click', openModalSI); + +const btnCloseModalSI = document.getElementById('botonCerrarModalSI'); +btnCloseModalSI.addEventListener('click', closeModalSI); + +// Import the functions you need from the SDKs you need +import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; +import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; + +// TODO: Add SDKs for Firebase products that you want to use +// https://firebase.google.com/docs/web/setup#available-libraries + +// Your web app's Firebase configuration +const firebaseConfig = { + apiKey: "AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo", + authDomain: "redsocialnvj-47db7.firebaseapp.com", + projectId: "redsocialnvj-47db7", + storageBucket: "redsocialnvj-47db7.appspot.com", + messagingSenderId: "161909447570", + appId: "1:161909447570:web:b126b68b577520ab947f4b" +}; + +// Initialize Firebase +const app = initializeApp(firebaseConfig); +const auth = getAuth(app); + + +//SIGN UP +const signupForm = document.getElementById('formularioSU'); +signupForm.addEventListener('submit', (e) => { + e.preventDefault(); //para cancelar el evento de reinicio del formulario + + const signupEmail = document.getElementById('idCorreoSU').value; + const signupPassword = document.getElementById('idContraseñaSU').value; + + //función de Firebase para registrar un usuario + + createUserWithEmailAndPassword(auth, signupEmail, signupPassword) + .then((userCredential) => { + // Signed in + const user = userCredential.user; + // ... + }) + .catch((error) => { + const errorCode = error.code; + const errorMessage = error.message; + // .. + }); + + // console.log(signupEmail,signupPassword) + console.log('signUp'); + //clear the form + signupForm.reset(); + //close the modal + closeModalSU(); +}) + + +//SIGN IN + +const signinForm = document.getElementById('formularioSI'); +signinForm.addEventListener('submit', (e) => { + e.preventDefault(); + const email=document.getElementById('idCorreoSI').value; + const password= document.getElementById('idContraseñaSI').value; + //console.log(email,password) + + signInWithEmailAndPassword(auth, email, password) + + .then((userCredential) => { + // Signed in + const user = userCredential.user; + }) + .catch((error) => { + const errorCode = error.code; + const errorMessage = error.message; + // .. + }); + //clear the form + signinForm.reset(); + + //close the modal + closeModalSI(); + console.log('sign in') +}) + diff --git a/src/style.css b/src/style.css new file mode 100644 index 00000000..96f44eec --- /dev/null +++ b/src/style.css @@ -0,0 +1,55 @@ +.modal { + display: none; + /* Hidden by default */ + background: rgba(0, 0, 0, 0.4); + width: 100%; + /* Full width */ + height: 100%; + /* Full height */ + top: 0; + left: 0; + position: fixed; + padding: 20px; + justify-content: center; + align-items: center; + z-index: 2; + /*posicionarlo hacia el frente, por encima de todos los elementos*/ + +} + +.modal-container { + background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); + width: 50%; + height: 50%; + font-family: 'Poppins light', sans-serif; + /*(sans-serif=sin) serifaslos medios impresos necesitan serifas(las puntitas de las letras que las hacen mas elegantes y que dan la impresion de estar conectadas)*/ + font-size: .75rem; + padding: 20px; + border-radius: 15px; + position: relative; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 20px; +} + +.modal-container h2{ + text-align: center; +} +.close-modal { /*estilo a los botones de cerrar los modales usando su clase*/ + background: rgb(233, 172, 148); + width: 36px; + height: 36px; + display: flex; + justify-content: center; + align-items: center; + color: #fff; + font-size: 1.3 rem; + border-radius: 50%; + position: absolute; + /*absolute*/ + right: 5px; + top: 5px; + cursor: pointer; +} \ No newline at end of file From 4dd7b149fc2f532370ed3231cbd71c6cf58a7432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 27 Dec 2022 15:27:05 -0300 Subject: [PATCH 04/73] se agrega mensaje de error en sign up --- src/main.js | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main.js b/src/main.js index c7c5e002..e3f3770e 100644 --- a/src/main.js +++ b/src/main.js @@ -66,23 +66,27 @@ signupForm.addEventListener('submit', (e) => { createUserWithEmailAndPassword(auth, signupEmail, signupPassword) .then((userCredential) => { + // Signed in const user = userCredential.user; // ... + //Clear the form + signupForm.reset(); + signupForm.querySelector('.message-error').innerHTML = ''; + }) .catch((error) => { - const errorCode = error.code; + // const errorCode = error.code; const errorMessage = error.message; - // .. + signupForm.querySelector('.message-error').innerHTML = errorMessage; }); // console.log(signupEmail,signupPassword) console.log('signUp'); - //clear the form - signupForm.reset(); - //close the modal - closeModalSU(); + }) +//close the modal +closeModalSU(); //SIGN IN From 215b1295993ab9e0b9eab02a5bb4226fd605cc46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 27 Dec 2022 18:06:47 -0300 Subject: [PATCH 05/73] se agrega mensaje de error personalizado con error.Code a Signup --- src/main.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main.js b/src/main.js index e3f3770e..06cfe82a 100644 --- a/src/main.js +++ b/src/main.js @@ -69,16 +69,21 @@ signupForm.addEventListener('submit', (e) => { // Signed in const user = userCredential.user; - // ... //Clear the form signupForm.reset(); signupForm.querySelector('.message-error').innerHTML = ''; }) .catch((error) => { - // const errorCode = error.code; + const errorCode = error.code; const errorMessage = error.message; - signupForm.querySelector('.message-error').innerHTML = errorMessage; + + if(errorCode === 'auth/email-already-in-use'){ + signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' + }else if(errorCode === 'auth/weak-password'){ + signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } + //signupForm.querySelector('.message-error').innerHTML = errorMessage; }); // console.log(signupEmail,signupPassword) From 05dc03053c88616893c573b5cb03d96c7ab43ce6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Wed, 28 Dec 2022 12:36:54 -0300 Subject: [PATCH 06/73] se agrega errores con errorCode y errorMessage a Signin --- package.json | 3 +++ src/main.js | 26 ++++++++++++++++++-------- src/style.css | 12 ++++++++++++ 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 5e00e58f..4bc3c714 100644 --- a/package.json +++ b/package.json @@ -39,5 +39,8 @@ "createdAt": "2022-11-30T16:52:37.204Z", "version": "5.5.0", "commit": "51e941edf1cc991930aefd7dd9c406a7c43741c1" + }, + "dependencies": { + "firebase": "^9.15.0" } } diff --git a/src/main.js b/src/main.js index 06cfe82a..debe943b 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,7 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { getAuth, onAuthStateChanged, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -82,8 +82,10 @@ signupForm.addEventListener('submit', (e) => { signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' }else if(errorCode === 'auth/weak-password'){ signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + }else { + signupForm.querySelector('.message-error').innerHTML = errorMessage; } - //signupForm.querySelector('.message-error').innerHTML = errorMessage; + }); // console.log(signupEmail,signupPassword) @@ -108,17 +110,25 @@ signinForm.addEventListener('submit', (e) => { .then((userCredential) => { // Signed in const user = userCredential.user; + signinForm.reset(); + signinForm.querySelector('.message-error').innerHTML = ''; }) .catch((error) => { const errorCode = error.code; const errorMessage = error.message; - // .. + + if(errorCode === 'auth/user-not-found'){ + signinForm.querySelector('.message-error').innerHTML = 'El usuario no se encuentra registrado' + }else if(errorCode === 'auth/wrong-password'){ + signinForm.querySelector('.message-error').innerHTML = 'La contraseña no corresponde al usuario' + }else { + signinForm.querySelector('.message-error').innerHTML = errorMessage; + } }); //clear the form - signinForm.reset(); - + // signinForm.reset(); + console.log('se loguea') +}) //close the modal closeModalSI(); - console.log('sign in') -}) - + console.log('sign in'); \ No newline at end of file diff --git a/src/style.css b/src/style.css index 3695d01f..91fe7ab0 100644 --- a/src/style.css +++ b/src/style.css @@ -91,3 +91,15 @@ h2 { padding-left:15px ; cursor: pointer; } + +.message-error{ + font-size: 12px; + font-family: sans-serif; + margin-top: 30px; + color: whitesmoke; + text-align:justify; + background-color: orangered; + border-radius: 5px; + width: 100%; + padding: 0px 5px; +} \ No newline at end of file From 91272d9ea759c3ba6afc4bbdf8f4365747936d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Wed, 28 Dec 2022 12:49:46 -0300 Subject: [PATCH 07/73] se agrega boton Logout al index.html, funcional en main.js --- src/index.html | 3 ++- src/main.js | 12 ++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/index.html b/src/index.html index ee9b8c6d..09b92d3f 100644 --- a/src/index.html +++ b/src/index.html @@ -71,7 +71,8 @@

Sign in

- + + diff --git a/src/main.js b/src/main.js index debe943b..ef78a420 100644 --- a/src/main.js +++ b/src/main.js @@ -127,8 +127,16 @@ signinForm.addEventListener('submit', (e) => { }); //clear the form // signinForm.reset(); - console.log('se loguea') + console.log('sign in'); }) //close the modal closeModalSI(); - console.log('sign in'); \ No newline at end of file + + + const logout = document.getElementById('salir'); + logout.addEventListener('click', e =>{ + e.preventDefault(); + auth.signOut().then( () => { + console.log('SignOut') + }) + }); \ No newline at end of file From 1b4cef0fbad62c76ebbe210e6411b21b7cd716a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Wed, 28 Dec 2022 12:55:07 -0500 Subject: [PATCH 08/73] logout y login con Google --- src/index.html | 14 +++++++-- src/main.js | 80 ++++++++++++++++++++++++++++++++++++++++---------- src/style.css | 8 +++++ 3 files changed, 84 insertions(+), 18 deletions(-) diff --git a/src/index.html b/src/index.html index ee9b8c6d..71ee261d 100644 --- a/src/index.html +++ b/src/index.html @@ -8,7 +8,7 @@ Document - + @@ -36,12 +36,13 @@

Sign up

- + + + + + + - + \ No newline at end of file diff --git a/src/main.js b/src/main.js index c7c5e002..16ee2d3d 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,7 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -18,7 +18,6 @@ const firebaseConfig = { appId: "1:161909447570:web:b126b68b577520ab947f4b" }; - /*abrieno modal sign up*/ const openModalSU = () => { modalSU.style.display = 'flex'; @@ -66,22 +65,32 @@ signupForm.addEventListener('submit', (e) => { createUserWithEmailAndPassword(auth, signupEmail, signupPassword) .then((userCredential) => { - // Signed in + // Signed up const user = userCredential.user; - // ... + //close the modal + closeModalSU(); + + //clear the form + signupForm.reset(); + signupForm.querySelector('.message-error').innerHTML = ''; + }) .catch((error) => { const errorCode = error.code; const errorMessage = error.message; - // .. + + //personalizando los mensajes de los 2 errores mas comunes + if (errorCode === 'auth/email-already-in-use') { + signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' + } else if (errorCode === 'auth/weak-password') { + signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } else { + signupForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + } }); // console.log(signupEmail,signupPassword) console.log('signUp'); - //clear the form - signupForm.reset(); - //close the modal - closeModalSU(); }) @@ -99,17 +108,58 @@ signinForm.addEventListener('submit', (e) => { .then((userCredential) => { // Signed in const user = userCredential.user; + closeModalSI(); + + console.log('sign in') + //clear the form + signinForm.reset(); + signinForm.querySelector('.message-error').innerHTML = ''; + }) .catch((error) => { const errorCode = error.code; const errorMessage = error.message; - // .. + + //personalizando los mensajes de los 2 errores mas comunes + if (errorCode === 'auth/user-not-found') { + signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado' + } else if (errorCode === 'auth/wrong-password') { + signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario' + } else { + signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + } }); - //clear the form - signinForm.reset(); + //console.log(email,password) + +}) + - //close the modal - closeModalSI(); - console.log('sign in') +//LOG OUT +const logout = document.getElementById('salir'); + +logout.addEventListener('click', e => { + e.preventDefault(); + auth.signOut().then(() => + console.log('sign out')) +}) + + +//GOOGLE LOGIN +const googleButton = document.getElementById('entrarGoogle') +googleButton.addEventListener('click', e => { + + const provider = new GoogleAuthProvider(); + + signInWithPopup(auth, provider) + .then(result => { + const user = result.user; + closeModalSI(); + console.log('sign in Google') + signinForm.querySelector('.message-error').innerHTML = ''; + }) + .catch((error) => { + const errorMessage = error.message; + signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + }) }) diff --git a/src/style.css b/src/style.css index 3695d01f..617d1175 100644 --- a/src/style.css +++ b/src/style.css @@ -91,3 +91,11 @@ h2 { padding-left:15px ; cursor: pointer; } + +.message-error{ + font-size: 12px; + font-family: sans-serif; + margin-top: 30px; + color: brown; + text-align:justify; +} From a4716074a8eafadc25a920cd718ea39bde357d23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Wed, 28 Dec 2022 15:01:13 -0300 Subject: [PATCH 09/73] login with google --- src/index.html | 2 ++ src/main.js | 68 ++++++++++++++++++++++++++++++++------------------ 2 files changed, 46 insertions(+), 24 deletions(-) diff --git a/src/index.html b/src/index.html index 09b92d3f..5436db62 100644 --- a/src/index.html +++ b/src/index.html @@ -65,6 +65,8 @@

Sign in

+ + diff --git a/src/main.js b/src/main.js index ef78a420..f0a3945a 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,7 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, onAuthStateChanged, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { getAuth, GoogleAuthProvider, signInWithPopup, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -69,6 +69,8 @@ signupForm.addEventListener('submit', (e) => { // Signed in const user = userCredential.user; + //close the modal + closeModalSU(); //Clear the form signupForm.reset(); signupForm.querySelector('.message-error').innerHTML = ''; @@ -78,22 +80,20 @@ signupForm.addEventListener('submit', (e) => { const errorCode = error.code; const errorMessage = error.message; - if(errorCode === 'auth/email-already-in-use'){ + if (errorCode === 'auth/email-already-in-use') { signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' - }else if(errorCode === 'auth/weak-password'){ + } else if (errorCode === 'auth/weak-password') { signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' - }else { + } else { signupForm.querySelector('.message-error').innerHTML = errorMessage; } - + }); // console.log(signupEmail,signupPassword) console.log('signUp'); - + }) -//close the modal -closeModalSU(); //SIGN IN @@ -110,6 +110,11 @@ signinForm.addEventListener('submit', (e) => { .then((userCredential) => { // Signed in const user = userCredential.user; + //close the modal + closeModalSI(); + + console.log('sign in'); + signinForm.reset(); signinForm.querySelector('.message-error').innerHTML = ''; }) @@ -117,26 +122,41 @@ signinForm.addEventListener('submit', (e) => { const errorCode = error.code; const errorMessage = error.message; - if(errorCode === 'auth/user-not-found'){ + if (errorCode === 'auth/user-not-found') { signinForm.querySelector('.message-error').innerHTML = 'El usuario no se encuentra registrado' - }else if(errorCode === 'auth/wrong-password'){ + } else if (errorCode === 'auth/wrong-password') { signinForm.querySelector('.message-error').innerHTML = 'La contraseña no corresponde al usuario' - }else { + } else { signinForm.querySelector('.message-error').innerHTML = errorMessage; } }); - //clear the form - // signinForm.reset(); - console.log('sign in'); + }) - //close the modal - closeModalSI(); - - - const logout = document.getElementById('salir'); - logout.addEventListener('click', e =>{ - e.preventDefault(); - auth.signOut().then( () => { - console.log('SignOut') + +//------------LOGOUT-------------- +const logout = document.getElementById('salir'); +logout.addEventListener('click', e => { + e.preventDefault(); + auth.signOut().then(() => { + console.log('SignOut') + }) +}); + +//----------GOOGLE LOGIN-------- +const googleButton = document.getElementById('entrarGoogle') +googleButton.addEventListener('click', e => { + + const provider = new GoogleAuthProvider(); + + signInWithPopup(auth, provider) + .then(result => { + const user = result.user; + closeModalSI(); + console.log('google sign in') + signinForm.querySelector('.message-error').innerHTML = ''; + }) + .catch((error) => { + const errorMessage = error.message; + signinForm.querySelector('.message-error').innerHTML = errorMessage; }) - }); \ No newline at end of file +}) From a9ab96738f7bd4c138332325c6f38b46a962d352 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Thu, 29 Dec 2022 13:30:16 -0500 Subject: [PATCH 10/73] validacion con la funcion validarCorreo que usa la expresion regular --- src/index.html | 12 +++-- src/main.js | 134 ++++++++++++++++++++++++++++++++++++------------- src/style.css | 20 ++++++-- 3 files changed, 121 insertions(+), 45 deletions(-) diff --git a/src/index.html b/src/index.html index ee9b8c6d..f78e61fe 100644 --- a/src/index.html +++ b/src/index.html @@ -34,14 +34,13 @@

Sign up

- -

- +

+ + + + + diff --git a/src/main.js b/src/main.js index c7c5e002..ea9152b7 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,8 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, + sendEmailVerification} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -28,14 +29,13 @@ const closeModalSU = () => { modalSU.style.display = 'none'; } - const btnOpenModalSU = document.getElementById('botonRegistrar'); btnOpenModalSU.addEventListener('click', openModalSU); const btnCloseModalSU = document.getElementById('botonCerrarModalSU'); btnCloseModalSU.addEventListener('click', closeModalSU); -//funciones de apertura y cerrado del modal de SI +// open-close modal Sing in const openModalSI = () => { modalSI.style.display = 'flex'; } @@ -53,63 +53,125 @@ btnCloseModalSI.addEventListener('click', closeModalSI); const app = initializeApp(firebaseConfig); const auth = getAuth(app); +// Validacion correo +function validarCorreo (valorCorreo) { + + let expReg = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + if ( expReg.test(valorCorreo) === true ){ + console.log('si es valido'); + return true + } else { + console.log('No es valido'); + return false + } +} //SIGN UP const signupForm = document.getElementById('formularioSU'); signupForm.addEventListener('submit', (e) => { e.preventDefault(); //para cancelar el evento de reinicio del formulario - - const signupEmail = document.getElementById('idCorreoSU').value; + const valorCorreo = document.getElementById('idCorreoSU').value; + const posiblcorreo = validarCorreo(valorCorreo) + let signupEmail = ""; + if(posiblcorreo === true){ + signupEmail = valorCorreo; + } else { + signupEmail = ""; + } + const signupPassword = document.getElementById('idContraseñaSU').value; //función de Firebase para registrar un usuario createUserWithEmailAndPassword(auth, signupEmail, signupPassword) .then((userCredential) => { - // Signed in + const user = userCredential.user; - // ... + if(user){ + user.sendEmailVerification(auth.currentUser); + } + closeModalSU(); + + signupForm.reset(); + signupForm.querySelector('.message-error').innerHTML = ""; + }) .catch((error) => { - const errorCode = error.code; + const errorCode = error.code const errorMessage = error.message; - // .. - }); - - // console.log(signupEmail,signupPassword) - console.log('signUp'); - //clear the form - signupForm.reset(); - //close the modal - closeModalSU(); -}) - + + if( errorCode === 'auth/email-already-in-use'){ + signupForm.querySelector('.message-error').innerHTML = 'El email ya se encuentra registrado' + }else if(errorCode === 'auth/weak-password'){ + signupForm.querySelector('.message-error').innerHTML = ' Debe tener al menos 6 carácteres' + } + + }); + console.log('signUp'); + +}); //SIGN IN const signinForm = document.getElementById('formularioSI'); signinForm.addEventListener('submit', (e) => { - e.preventDefault(); - const email = document.getElementById('idCorreoSI').value; - const password = document.getElementById('idContraseñaSI').value; - //console.log(email,password) - - signInWithEmailAndPassword(auth, email, password) + e.preventDefault(); + const email = document.getElementById('idCorreoSI').value; + const password = document.getElementById('idContraseñaSI').value; + signInWithEmailAndPassword(auth, email, password) .then((userCredential) => { - // Signed in + const user = userCredential.user; + closeModalSI(); + + signinForm.reset(); + signinForm.querySelector('.message-error').innerHTML = ""; + }) + .catch((error) =>{ + const errorCode = error.code + const errorMessage = error.message; + if (errorCode === 'auth/user-not-found') { + signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado' + } else if (errorCode === 'auth/wrong-password') { + signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario' + } else { + signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + } + }); + + console.log('signIn') +}); + +//LOGOUT +const logout = document.getElementById('salir'); +logout.addEventListener('click', e => { + e.preventDefault(); + auth.signOut().then( () => { + console.log('sign out') + }) +}); + +//GOOGLE LOGIN +const googleButton = document.getElementById('entrarGoogle') +googleButton.addEventListener('click', e => { + + const provider = new GoogleAuthProvider(); + + signInWithPopup(auth, provider) + .then(result => { + const user = result.user; + closeModalSI(); + console.log('sign in Google') + signinForm.querySelector('.message-error').innerHTML = ''; }) .catch((error) => { - const errorCode = error.code; const errorMessage = error.message; - // .. - }); - //clear the form - signinForm.reset(); - - //close the modal - closeModalSI(); - console.log('sign in') -}) + signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + }) +}); + + + + diff --git a/src/style.css b/src/style.css index 3695d01f..be6cc86d 100644 --- a/src/style.css +++ b/src/style.css @@ -37,11 +37,12 @@ input { background: transparent; backdrop-filter: blur(3px); border-radius: 7px; - width: 108%; + width: 200px; height: 35px; border: transparent; margin: 0 0 30px 0; cursor: pointer; + } input:hover, @@ -74,20 +75,29 @@ h2 { backdrop-filter: blur(3px); border:none; width: 45%; - height: 25px -} + height: 25px; + } .close-modal { margin-bottom: 30px; margin-left: 320px; - width: 6%; + width: 20px; height: 25px; border: transparent; color: rgb(90, 86, 86); background-color: transparent; position: absolute; top: 10px; - padding-left:15px ; + padding-left: 18px ; cursor: pointer; } + +.message-error{ + font-size: 12px; + font-family: sans-serif; + margin-top: 30px; + color: brown; + text-align:justify; + +} \ No newline at end of file From f160704ea8ac2ab45830773b43e7fe9bb93ef7bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Fri, 30 Dec 2022 10:45:08 -0500 Subject: [PATCH 11/73] =?UTF-8?q?estilo=20al=20bot=C3=B3n=20de=20ingresar?= =?UTF-8?q?=20con=20Google=20y=20enviar=20mail=20para=20la=20validaci?= =?UTF-8?q?=C3=B3n=20del=20registro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/img/google.png | Bin 0 -> 19386 bytes src/index.html | 2 +- src/main.js | 69 +++++++++++++++++++++++++++++++++++++++++++-- src/style.css | 42 ++++++++++++++++++++------- 4 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 src/img/google.png diff --git a/src/img/google.png b/src/img/google.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbfe00de73ad15d9fb90848fb714a1dae1ceb6a GIT binary patch literal 19386 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�?e zv5elec4HK~yPTY+FXvM(EDm@rXL`x)r|^YH)7>sRdTSsY1mM&Q^|Cwz_mqms4n%xwoQEOkOL z2Ss%MgkR0)F!Fy6%UXQ!=#m+7%0@bMyIZ8Q*RZjyFMeUC_4o`3q%kL?_zJ$Iu`h^7 zCbBvn6`8D!^1(LCFkE4HA%XEfmvl+KM@35mppFOlG5#r0PkugZG&m)S^MkG{rX(0z9PD=d+8|IfNna_mmr`IFFmPv3dJE6ox&E!9C4cMC>l~*BY*+2Z zghW7U6XPh1W91TetIU2-o^E#Ke&IWF1n4}!Z&z|g?hTeqNwqWUtTjU7546m5<>l&8 z(xCzW3<4*l$c0n?WEQf$QG^9bQGDhl>YS|*FzWjGE%?%ZK?>O`xkOB6?=wmei@ ze|PV;as!SYWOe#<1Oq-u@eOY(zkg<*)UgDmK;CwDW*$`-*qvT3o9Ny&thUn^8L96G zT&k+FY|=Ih6a?o^1#+1<7UZFg!-sj!FP~u+yXu)s)g5mJ|7COit z7#iB3ig6ACy3I9;x6={0bt+tB>HpsO_G*U-&HXD$!~1Hf;VA`PR~d%G0VI8mP@01~ zm8x~{?dC&zP5Nu)DW}*XAd$Qor)M>Kq_gff06mf0#gqD35gkZYBB9UB)~lIL(&;5Dk7PNVYrZt zqg1KWz^EMS!B7W`Q{unZG=6Vu(E%+kDD{r#<}XH|MWEesv<<#bg>aSE@_=6${+jNG z=UY6#*Xdfn6!`vQU=?Kh`^eOolO_BIh+~%_x*uDgGQN=qC@Q{9Nck_M|(IRCK!nD_6LZ0JOo7B_q@K&*@|5FFQuZB#*4B$bFmP#6WPfk-ev{$p`R+fbsJ&3X;g|sb14Mz`yhbnmH}I7mM@Bj66}0m=4;!szqD- zf#y{*1Rx(MSUQZ&iq;&4(Aymbqd40_aHLTjz+6x^gS82vt$IskPCUp>WuBHf+x|-O} z{3m8igulSYh+^@XqhyiY(fo#hs3stn*) z)fv#=8hyK687f57bRM->9c8WRAv~p1RIw=!~0Rv4PBRFq(rOaba}A=vzeDSsRmz9qMGN!9gqalps%JL5ibv)* zO*cy;lAjN5ZlwO3Zjhl*CR7IV2Qp9j-QO>aszu;}M14&ox1AZ9PIa$@ZFZRc7xoob z*vUi2jA*paLF&>9=%UU?tXdVNXzVd_&?qkSY4&?de~zaGQgC#xH$Jsa`^_BS^ev#R z^Y+WT&#@5FDAoyaKVv)ZT>_S|^~bXK?sc7{@5@{?RR#~u*6ajp^I?GO$5C5%rVn&g zQ*E?$hu9z+;;aihYieC2teR$gTh%q)NCGoHHPX2LgX0__cvrxUL*(+wKly8|vrP7d zbSc+0GuA}xudCMoTdXL2iKRoCU7x$$xA6=?d_MLrVe@?@b&bsYfUQ$4^FBU=oT3T! zyv%2Ik_PM;hiEc?eW$av%tEzxMV?E`we9yc#qzz8wVnHMKO7p@S#y8`M^OVLm97k4 z30S$ijKpleJnJpf_yO3UxHgLg9^ZZ!=Tn~b$#Fon90e1*% z_zl?UCj#oRPd49vej_VrJTo777l8|zS0iN9{P@NWLrO*!lO38l~r|XVz7|iEd>!&UqmTW*_t7(rpm1KuO*95IOGkxAMG(q70D9{!-1K*oL+b zdi=u*0UPvXnp8cVB{H!Lb3rIDg@7WXa(&f5EVoOr-WJw4U>MD7i#m0>e|&t5LIa#$ znRwGugxCQLeG{@@0chfCaVKL?GIi2zH$Znl=}-_Ad-tgNc~$@790UjT@&L-yP~oPZ znFa_ESQTTqX6}4RbPvH&{7bR*;;P;Q1x-vOsEBbBee1Xvay&%Rh`XOxfLMKHkeiET zsrygz>0<}e*R+#sV*pl2do`x*zQJj9YoWKqR(F71*qs%3i698MReGW+Iin(+7gPYn zR1&bwxkUvSPP|>N=96=VePnO1As;1nEIrafqGKON)fp|;}hnw^z=JCk7Z}5aeV%z z>Vwztwc?kG=0WyOOi zfIni5jEuA*ZiIeCO%ETcf+naY0ajxo`>j)ig!d(P22u5cRF6MkRj7zrI>+IeInuRL zZFe$F3wpz`t54cDD(4+eggFRYsXUrGC2QfDdn_b6iI0;ehh_Sl;}jm8l~l2EYf$t_ z^WWxlc>XuZo8nd9h>AgfwKeCfUpd_}y9tG9pFTZF?q_q_?hw=g8r6G z0o{;3XCzenYkQNtj)L?$d5yDV=k~Vux0TP~t#9u71H8g!_s@k`*SkhZ`0Wd)ewoG3Z!Z^v$gf_s>d z`)drSmn z@yLdD4!~5Nd2owI2m+qgyBVVT9Kv0cIg&)j*&Vsj!vGvT@E)~BO^T9V=w# zIb>01>67mZJzv=WIbf?Uozbo4S{5NLAC7eCu)QE{8Hc6PO4qfi&NP;0LIhkLSf{G83zA$*;XoQ?F-MToMcr7~EeiHQR_Zmd??C2_1BKh2!GawbS={ zX9#aBb?PKBKjr^kBE9@Y-G~HG=I8==d{thgm_4v8y<{e^?QWu(*8JRdK}1WGUR}2R z*ZB4(amEa}7D2YoRmCLA$)=ef-;Ne(;y+mG>u=37c-5L)`1kuDJ?H%p=i4*Ffy=sh6aY zV(!%t9lC~K9SvLd8?_c&!F<*&bMyd}yzV+BE5vG#l4sJpB0Fqw+02Kcd@tlatqC8~ zfX&NADgY&-s$rA2NfD)*jS(%9t!8_XY6=}MwD>wJn_gj7A9Yk13wgVhV5zk}Zsr;3 z4=y$)A{^ggX-g8&mvRy`_tl^`sRkfkXpTNf=%T2E*l@^5Fzs?RJ+c<+7>9%|J+=Ys z)?M6vg>XgjN%z0suY?56mJFea5Vl~R6FXG5-jpOfnc@0RZ=ha)5s!ip$^-kaMI!&3 zH|N0;@gVQA(4d5yQ5v*^sPiWUUxJuDZh?4fs0wW9TP3wstg%Y5E-?b&(OkR1*e1RT zfjiL`DStShLRG~c2i}MG%QtH;De1guXaY?rHpAkvH?DJ9kFo_X6Gc6MUIiS|mprI( zoKpTjY}~XX2OzZA+e|QfT}EUdkGntnde}_dDjJg7sHNk%e2vqfM{q=-h5A@S(G-DI zh1*pH;G`odDUO>eEoW`>-mkI0qE*w`wc2Z%;P zr7z;#WyYfH-!w1505E-JQfxtvGxN)@=?xeD@nyMTcIithh5>hAqF`%Y$j zQM>9Ycj;!9u7>h$v;8IS(;VBPr^^d}v1R+G$MY;!QSkf$4Ss1xh7yeUqyMH6AAK>pxT+$W#xjE!sh{qc9x$J?(y)MrDz zZ}Dv2i(PEJss=H^Mk`~@B7e^RyjKmDCZqiiB!6i+Ji|Qa5YRoM{Q7e8Q`(+2q*e1x zwOnkceiGE>JPH{8ZPS^c23GeBNlJQ;aOJv0wkk}yH!}W?5J4+6;^C!~5I6Fx>AEc+`K6YY zZj!A^$FR+qyemH<&-_DGO~H(5*1jpU1KIPV+Wy8vJGqiQTwaK}(~M3C*!I4A!Ye$V za7{GPXjM-&);aCAZS9rB8Pf`@KTGcaCGwlv*#y{CE+HJlAWkHKH*4vlj=xYfqQ+(E z3VrG@G)2nAI#cfx2bM?D-<;|W!}?hg|Fp|)QivyhPj+l=UXe=^t$tL#Rc$phfKnNU z3O@L&1O?(`8R}290V!(b#V^UurRzhx4qHj$-y2=lbK>}GbXHxn?qJ)u+vb($=y`&* zBTuqcW@oQJRm0byBG>yx)y*~+iVAG+Wn=GGDmnuIRgM0t9Zv1wA)sQkNII+Ue;3{| zFQQ9X(m8cNXy##{$*@fGmH4i_sqRoTfpvjt2nJ{tWUvhzG!=Cc!6L0et%!)ZL&x5X zPW!Tml%-QAYtqX(TmFO*DfRwAQu0S_(L(!jta7E&j%XfQy51d@o}sQksE=aMOKRK7AMvzeJKoO9i-kq;~Tcv?=D#?P<&vHNF*fv%Z z_EoKg%IH!Y7qv=$j5;MutcxEH-A|se<=gyhG4}SV;Z1<%3hq^|A?t@Sz|HRM@Cudc z_z};yoF%$bGxKME=e;wYx#s67j(drv-_zjIUgV33_`ckn-kbyh6IGv+(^=dzsM5$Z zQQl!a{)29?wz3~RWHuU7YB`>ll}fdaRT28UjCoH#`e9hubL?4O5r&&lavHOlk7|qH z0p3h9x7PKjFi=sW_KLu4)0_95>dYSVk1R7Y|DayPWm@2%gw&1x)#FKr)uU-lZVf>|9;=dQEk>dAD?#=qHCkN zs9gTpCE5JkFGJcHwqr~Dgw0bW=05Q&^QjN$4xSAawB^A7ddG&RLq}r{F{!8lTr0&s z7I^;2(a%+FR-swgZtmjn&fT{xH*#z?XLBDNUG#S69;*1Rfqk0U=rr5+IjcvBz~$Fm z326$N%-7YFbvrqd{Ak6wY%lk_dL3a)=WEF(>r*^U$=#nn$d_LFT}#iG>8fPWKX!EM zlkzsxuG7)WqUQ1Ko%@F3fT@$co9j~yeX@_AsBhr3Qt)x=TJHDEv@C)35b#~8WoG_- zNpXY!%pLF8U%k6Xe;m&}`%0^X?{UMrepEuMW?p|qpgz27v|ag zL6VDz=Pxk9P0Vu5@ASXd{+#1YB)a-J?$#Mx-@BGS#0GmYk%Vm#{Mu%?*Oa(mn})X0 zZIb-{BWp(zBCd7#KjI?x&A<9hR0ajA;=JhhahbbE1gGyFss{I5J!hwd>(tZ~!!OZ4 zAC?jA_G#p{-uN5TyB)wpm9?vN)KHXU=)NnMO$i>>UM}mxnp4i+B3xzixP+VMboN&W znagyXlKSyf;IYJ!jloX2N10tu)g$fUtBiJHp$0A%M+!I7&-sXHy8g*GHt~Y-hTEa0 z%a$%doq``Frf+Ll!FG#>O6hjHTb7R@s7UVH+v__pnA#!byZhE;{44r0#gC=#dz<0ijv(yE2Ho4Y7JRx$|2yEry-8$di+}-yFhu7x+RLVE9H)I=_R^O1XpFPY2nZe|pHYn>n;l3BO0 z6|Nd$JtOE(`4ct?AYJMd$Zv+YJaJmud#+BNYCIrwg^M@bR6iEuOIo^<;vuybq_9zW zd6s?6@drFp^+CwjkauGf%e_0AiOG2J^QzM%3>$=_A-dV>hqL=xiPgr|P`T0!W^tOalE^2C`wgtAS%|5H zLQSUZ?BFMouO~1O&oTeTww?=4Sq28RF?#SoaGYp|I(HfBm`gc`(el?L>O=9~h&o=d zrP-JLI2^I0`5whxsYEWx^qd^PjKGT?(-zAT!w4rP@;pus(9p{clkn>5m`*_ln0$p= za47W|<$m1g42vGYnp*s=@zK&muT`G}tkJJ?ZTk869CsYPIANO9Au*>u?D}`#V`NWf z#*LA)aHFa%{0*OW)3SrEq9WxNbQa0C z(J?0OA&#ox^3Xf?JEAA2h3glLe?K%wXyn7|vXw)L$;Eeu#C3fpEJ$?w&3BuA{e9!k zj47d`7Jw?vyBrsChJ5q^5)~2WQOLeFmjK1;I)h9~oF1`K7AZ`EF6FcDZ}G`PAp%My z`A1TtvG>u_Agpq!_T-!zn%{-N8=E4nLrj6;bt zTZ|8&HU%UFJBUEftcn}gq`!t~LSBg??C-bBst#p&%@5$!NX9)1;e9(csBZpwn^k9? zUT2lhj&Gl$V$zpf$p!beztK1-ET2{UZ1(AP7 zAkd%f^WrOEdABa2gP=YF^6=8zEEUp8lL`$z=zw|J_z%LCMXPk-Zcqz{^4X-M!h7tf zv$#$;U#c&EbztT`SK>pX*q5VK_cQ;l_v`vX_>+o*=6rGK7D-pjha8v}sVj1_@rSOgBH4cvAo7%=3pTb2PZYSyuuvXunHHcLjH1Bn753TMP0dtAlg3fO7 zI!_bMX>LWdD&2{0^&mZ^fRc9_7X^}XAJwa!p7EJ)qn{8Ac2jnZvboCa^QoUhGiV|H zL?CdH7n?e&wFB6o_6vUS2&1006Dhz4C{ZJ2 zwmL6N2b536j<$OR*GbLUYHQX;kTEOsf3{IJu4E?Q^h7~-1*#GndWFEHyej;@%<|r@ zj*sG;)lH@U?)`1rNUGLA_9khE-hWDLxvE7-N?;k+Bz+JiFHGqg3kl3n7vbr=PK)o5 zTib{|)`AC$+D)Zt40<6It4L)9P1T+wTcAKcTtTWypM04>Mq z{{`@bni}vvbKfqvVOU77&kT}N>i4N#KawRe>|db7fh>+&HD6pZ=QhA$J2dbx#Wn4r)OR%>+Nu3>tn>Cc zddTXTMJYu-dEtNEh*Oi7E!so3=o_ORT+T7xE>zIX`<7&|Uyh|hp`ght)ZX8kc)+Wj z3I7ODtN3Z^%2>6|g761p_a)1endVQ>Zr?yf3i4dR+K{_B$pQj51q0x(Re=0uUNeiC z{8EXQRLt)yk@uoqO#hi)8CswF*$g$=-W5`~MRO{{{o zrc4vx5)8Ik(zdR)d(d!NKp^2G_)Xjze0&1!Vd3u;QI1U1gvr8ACA|9ENo~zRWNvoO zjM(v>%>1~^NS^UP51qtg{*P)R@SrD5m&Km4vE>-2+I+Hyy<$wmFLSVPE4OwvG$_8l z5G8h#``zG`MdAf}7fTDW`nMPSIc518>Iu1aD|ffk{?*K{MRLJKeh-hx?2I1x9eJ-v z?`$-+d&(Ro&c|0ylV3l69}L$Fpex4iY)iXz!yPJ>dL9#{z=H5_4# zCym|`8p4^on7Wi0u~vRp*A*$8~e< zZ{%q{1Og@}fp7eiG-X$vT23@oMx<~t*JkhfC}Jj?pQ9$y?-X8Bw_eM)e+aVfY45~W zygT@m-jeb?S?UJtUOxY=t%^U{*)m4czvlj8HmxPNTuIwO)s;IT9f6J?L3&)C zDc_wm^4)e_!{9KRo)LU4^v1-s_+8(o&_VHn1?!5XoxzM)~)<23H*zGU?RU-YEzC{=2D4~rOa`UawR5BP~1~9JmC^*qK030!7M#x?&XRZ zh&q|(sHqj==(yrGxR(3O;EJN=lBt+qn!n-uetzfPciy}Ar+4m`9ALJ8Pl=r76TdZL5v%;GR&tIejPm&#?cFrRz?Qb@Mp{1vK}JNBY)WQ(E8hz^zn9mDlO zXcvPKyzsUfeGj+W^1}iAi`-r`g z@I22lJh1O{y;IxoRywg2W34)>ijo;fg3<;S{ZjJia%YtDUSfNE%f8F zOs(96o={Gb0Y?QTtEmbD#K4d+_et7ea@yMm;}R`Q@GP!V%1(RtUjOjaJ2JOrpTU0_ zi3i7Qd`tc5JFQL{du6Oq2H)|Vl$lXhDEVf9>1t|fw1={-icEpTa3Yje&6|j6gJDRI ztdii~==oRjak`AcZ@in**`Szy?kPng3Ij@AE|B?t4AGm2is=|Y`Q|HM! zR|4FGd;KXCuc^@{s4tIFGmTwy*4pLA@gCFoe;<0{=;vm7pjW7F-LrJq z$^kuZby2G6Ki(5GZ=r1&cOq-`)8-y8n0CS(VkXe9$d9UG`Oj9M?THIlNfr>r!=n{Gzd*_ksQS9yy80NpW#jn+IlFF}c;lWg!YxA9L*<3b~YD7(K{Mv(Guxz@^051i4<@qr_ zGerhgN7Q3(IEiM=rJC}$1-_GoT6~vnYT#154xFJ2A;v*zWd@Dxipxaw27P;jL&;^0 z@N(Pjo#es%lP*6tW<=OCJz7s$O5vr`jv+wP_`ksFhVD~7*1K<6nHIjMa87oB4$rDp zNt!UgSSe6vf4FW3XvD>3O0R-RaBRkc&g$~w4v#sXUocauKd{WY7^{GpfbG>VU+{2ZrQ8zR7HCadGOh zY=N}pIVphm^ALV+olqJqu=cTxP4F6o<1#633wKwY>tIc;&1bvay^wpB<6dLWR5z90 z1}vrX`e`@JA)wvT`eS({LBaN-MqpX4se1`&Jx_D7CF7KZmy{czH(*xMuu(J1-k0}Y zhed{n{$8F_?l#|mUnG2|-3pa09=GDy4iU>OTp9eXGlfTt$5{~{A&jjGYXGVw5@ba`mz0t;b z1rI&0>%c$Wz3YBydNxx6??yX&4l5FwtUKCTRQTm2r^akXeVF3}dek?*Rk-wK9IVg{ zNuBx9xg>lEgp5*KOv}BZUKzU@P;?{n`2* R$^AQ^6~^Y;8w<||{{uZcCKdny literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index 71ee261d..1fc1af75 100644 --- a/src/index.html +++ b/src/index.html @@ -67,7 +67,7 @@

Sign in

- + diff --git a/src/main.js b/src/main.js index 4b537b9e..f3a82dec 100644 --- a/src/main.js +++ b/src/main.js @@ -3,7 +3,7 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, onAuthStateChanged, sendEmailVerification } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries @@ -52,14 +52,76 @@ btnCloseModalSI.addEventListener('click', closeModalSI); const app = initializeApp(firebaseConfig); const auth = getAuth(app); +//construyendo un observador de Auth +onAuthStateChanged(auth, (user) => { + if (user) { + // User is signed in, see docs for a list of available properties + // https://firebase.google.com/docs/reference/js/firebase.User + var email =user.email; + const uid = user.uid; + + var emailVerified=user.emailVerified; + if(emailVerified===false){ + console.log('Email no verificado'); + } else{ + console.log('Email verificado'); + } + // ... + } else { + // User is signed out + // ... + } +}); + + + + + + + + + + +function validarCorreo(correo) { + let expReg = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + let valido = expReg.test(correo); + console.log(valido); + if (valido === true) { + console.log('valido') + return true; + } if (valido === false) { + console.log('invalido') + return false; + } +} + + + +function verificarSendingMail(){ + sendEmailVerification(auth.currentUser) + .then(() => { + // Email verification sent! + // ... + }) + } + + + //SIGN UP const signupForm = document.getElementById('formularioSU'); signupForm.addEventListener('submit', (e) => { e.preventDefault(); //para cancelar el evento de reinicio del formulario - - const signupEmail = document.getElementById('idCorreoSU').value; + const valorCorreo = document.getElementById('idCorreoSU').value; + const posibleCorreo = validarCorreo(valorCorreo); + var signupEmail = ''; + if (posibleCorreo === true) { + signupEmail = valorCorreo; + } else { + signupEmail = ''; + } const signupPassword = document.getElementById('idContraseñaSU').value; + //función de Firebase para registrar un usuario @@ -67,6 +129,7 @@ signupForm.addEventListener('submit', (e) => { .then((userCredential) => { // Signed up const user = userCredential.user; + verificarSendingMail(); //close the modal closeModalSU(); diff --git a/src/style.css b/src/style.css index 617d1175..4003dfc7 100644 --- a/src/style.css +++ b/src/style.css @@ -45,7 +45,8 @@ input { } input:hover, -.btnSubmit:hover ,.btnGoogle:hover { +.btnSubmit:hover, +.btnGoogle:hover { background: rgba(245, 236, 236, 0.7); } @@ -53,26 +54,29 @@ h2 { text-align: center; font-family: sans-serif; font-weight: 50px; - top:80px; + top: 80px; padding-left: 38px; position: absolute; color: whitesmoke; letter-spacing: 4px; } -.correo , .contraseña, .user-name{ + +.correo, +.contraseña, +.user-name { letter-spacing: 1px; - color:rgb(27, 27, 27); - + color: rgb(27, 27, 27); + } .btnSubmit { background: transparent; border-radius: 7px; - color:rgb(104, 104, 97); + color: rgb(104, 104, 97); letter-spacing: 2px; backdrop-filter: blur(3px); - border:none; + border: none; width: 45%; height: 25px } @@ -88,14 +92,32 @@ h2 { background-color: transparent; position: absolute; top: 10px; - padding-left:15px ; + padding-left: 15px; cursor: pointer; } -.message-error{ +.message-error { font-size: 12px; font-family: sans-serif; margin-top: 30px; color: brown; - text-align:justify; + text-align: justify; } + +.logoGoogle { + width: 17px; + height: 17px; + /*padding: 1%;*/ + margin: 0 0.5rem 0 0.5rem; +} + +.btnGoogle { + /* background: transparent;*/ + background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); + width: 108%; + height: 35px; + border-radius: 7px; + text-align: center; + border: 2px blue; + border-style: solid; +} \ No newline at end of file From f96a3ef60d2ae8dc06910b7817c2f76baf7a196c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Fri, 30 Dec 2022 10:46:30 -0500 Subject: [PATCH 12/73] =?UTF-8?q?estilo=20al=20bot=C3=B3n=20de=20ingresar?= =?UTF-8?q?=20con=20Google=20y=20enviar=20mail=20para=20la=20validaci?= =?UTF-8?q?=C3=B3n=20del=20registro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main.js b/src/main.js index f3a82dec..e821a3b6 100644 --- a/src/main.js +++ b/src/main.js @@ -106,8 +106,6 @@ function verificarSendingMail(){ } - - //SIGN UP const signupForm = document.getElementById('formularioSU'); signupForm.addEventListener('submit', (e) => { From e212e7991da3cb025e310944083286f6f913eb27 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Fri, 30 Dec 2022 11:04:01 -0500 Subject: [PATCH 13/73] actualizacion para hacer pull --- src/index.html | 27 +-------------------------- src/main.js | 10 ++++------ 2 files changed, 5 insertions(+), 32 deletions(-) diff --git a/src/index.html b/src/index.html index 24c05476..88f67c53 100644 --- a/src/index.html +++ b/src/index.html @@ -34,23 +34,13 @@

Sign up

-<<<<<<< HEAD

-======= - -

- ->>>>>>> fa6d540529005f351d25f51b55a4bc819197709c -<<<<<<< HEAD -======= - ->>>>>>> fa6d540529005f351d25f51b55a4bc819197709c - - - - - - - - - - + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 46a277e7..8737093a 100644 --- a/src/main.js +++ b/src/main.js @@ -72,10 +72,10 @@ signupForm.addEventListener('submit', (e) => { const valorCorreo = document.getElementById('idCorreoSU').value; const posiblcorreo = validarCorreo(valorCorreo) let signupEmail = ""; - if(posiblcorreo === true){ + if (posiblcorreo === true){ signupEmail = valorCorreo; } else { - signupEmail = ""; + signupEmail = ""; } const signupPassword = document.getElementById('idContraseñaSU').value; @@ -86,9 +86,7 @@ signupForm.addEventListener('submit', (e) => { .then((userCredential) => { const user = userCredential.user; - if(user){ - user.sendEmailVerification(auth.currentUser); - } + closeModalSU(); signupForm.reset(); @@ -101,7 +99,7 @@ signupForm.addEventListener('submit', (e) => { //personalizando los mensajes de los 2 errores mas comunes if (errorCode === 'auth/email-already-in-use') { - signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' + signupForm.querySelector('.message-error').innerHTML = 'El email ya se encuentra registrado' } else if (errorCode === 'auth/weak-password') { signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' } else { From e6743012c8e211b93782d5250479de1cc1c3e7c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 3 Jan 2023 09:29:04 -0500 Subject: [PATCH 14/73] =?UTF-8?q?verificaci=C3=B3n=20de=20la=20cuenta=20de?= =?UTF-8?q?l=20usuario=20a=20trav=C3=A9s=20de=20mail=20enviado=20a=20su=20?= =?UTF-8?q?correo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 71 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 25 deletions(-) diff --git a/src/main.js b/src/main.js index b2ae9fc7..90243de4 100644 --- a/src/main.js +++ b/src/main.js @@ -49,26 +49,29 @@ btnCloseModalSI.addEventListener('click', closeModalSI); // Initialize Firebase const app = initializeApp(firebaseConfig); -const auth = getAuth(app); +const auth = getAuth(); //construyendo un observador de Auth onAuthStateChanged(auth, (user) => { if (user) { // User is signed in, see docs for a list of available properties // https://firebase.google.com/docs/reference/js/firebase.User - var email =user.email; - const uid = user.uid; + var email = user.email; + const uid = user.uid; //código único del usuario asignado por Firebase - var emailVerified=user.emailVerified; - if(emailVerified===false){ + //El usuario se encuentra logueado + console.log('auth:sign in'); + + var emailVerified = user.emailVerified; + if (emailVerified === false) { console.log('Email no verificado'); - } else{ + } else { console.log('Email verificado'); } // ... } else { - // User is signed out - // ... + //el suusario no se encuentra logueado + console.log('auth: log out') } }); @@ -89,13 +92,13 @@ function validarCorreo(correo) { -function verificarSendingMail(){ +function verificarSendingMail() { sendEmailVerification(auth.currentUser) .then(() => { // Email verification sent! // ... }) - } +} //SIGN UP @@ -111,16 +114,23 @@ signupForm.addEventListener('submit', (e) => { signupEmail = ''; } const signupPassword = document.getElementById('idContraseñaSU').value; - + //función de Firebase para registrar un usuario createUserWithEmailAndPassword(auth, signupEmail, signupPassword) .then((userCredential) => { - + const user = userCredential.user; + + //actualizar los datos + // user.updateProfile({ + // displayName: nombres + // }) + verificarSendingMail(); - //close the modal + alert('por favor verifica el buzón de tu correo para verificar tu cuenta'); + closeModalSU(); signupForm.reset(); signupForm.querySelector('.message-error').innerHTML = ""; @@ -149,20 +159,31 @@ signupForm.addEventListener('submit', (e) => { const signinForm = document.getElementById('formularioSI'); signinForm.addEventListener('submit', (e) => { - e.preventDefault(); - const email = document.getElementById('idCorreoSI').value; - const password = document.getElementById('idContraseñaSI').value; + e.preventDefault(); + const email = document.getElementById('idCorreoSI').value; + const password = document.getElementById('idContraseñaSI').value; - signInWithEmailAndPassword(auth, email, password) + signInWithEmailAndPassword(auth, email, password) .then((userCredential) => { - + const user = userCredential.user; + + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (user.emailVerified) { + //Materialize.toast(`Bienvenido ${user.displayName}`, 5000) + console.log('Bienvenid@') + } else { + auth.signOut() + // Materialize.toast(`Por favor realiza la verificación de tu cuenta `, 5000) + console.log('Por favor realiza la verificación de tu cuenta') + } + closeModalSI(); - + signinForm.reset(); signinForm.querySelector('.message-error').innerHTML = ""; }) - .catch((error) =>{ + .catch((error) => { const errorCode = error.code const errorMessage = error.message; if (errorCode === 'auth/user-not-found') { @@ -172,17 +193,17 @@ signinForm.addEventListener('submit', (e) => { } else { signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores } - }); - - console.log('signIn') + }); + + console.log('signIn') }); //LOGOUT const logout = document.getElementById('salir'); logout.addEventListener('click', e => { e.preventDefault(); - auth.signOut().then( () => { - console.log('sign out') + auth.signOut().then(() => { + console.log('sign out') }) }); From a442f837b00e707b4afddab2306172f859964c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 3 Jan 2023 11:51:16 -0300 Subject: [PATCH 15/73] =?UTF-8?q?actualizaci=C3=B3n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main.js b/src/main.js index b2ae9fc7..6b230683 100644 --- a/src/main.js +++ b/src/main.js @@ -49,7 +49,7 @@ btnCloseModalSI.addEventListener('click', closeModalSI); // Initialize Firebase const app = initializeApp(firebaseConfig); -const auth = getAuth(app); +const auth = getAuth(); //construyendo un observador de Auth onAuthStateChanged(auth, (user) => { @@ -59,6 +59,9 @@ onAuthStateChanged(auth, (user) => { var email =user.email; const uid = user.uid; + //El usuario se ha logueado + console.log('auth: sign in') + var emailVerified=user.emailVerified; if(emailVerified===false){ console.log('Email no verificado'); @@ -67,8 +70,7 @@ onAuthStateChanged(auth, (user) => { } // ... } else { - // User is signed out - // ... + console.log('auth: sign out') } }); From 5fc9fcc0eb8c20d128d1b9923e9c3539db6ba03b Mon Sep 17 00:00:00 2001 From: Valmontx Date: Wed, 4 Jan 2023 11:53:00 -0500 Subject: [PATCH 16/73] actualizacion --- src/img/fondo10.png | Bin 0 -> 125074 bytes src/index.html | 37 +++++++++---- src/main.js | 79 ++++++++++++++++----------- src/post.js | 30 +++++++++++ src/style.css | 128 +++++++++++++++++++++++++++++++++----------- 5 files changed, 199 insertions(+), 75 deletions(-) create mode 100644 src/img/fondo10.png create mode 100644 src/post.js diff --git a/src/img/fondo10.png b/src/img/fondo10.png new file mode 100644 index 0000000000000000000000000000000000000000..6ce763a7a033a3946b834701a2dbbd887824273a GIT binary patch literal 125074 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 z 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 l;gDH)LLX&Q4_x^<^4M6<&`G3$ye|G=? literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index 20ff4b62..005eb43f 100644 --- a/src/index.html +++ b/src/index.html @@ -8,15 +8,26 @@ Document + -

Red Social NVJ

+

+ +
+ +
- + + - - + + diff --git a/src/main.js b/src/main.js index 7fb1a369..e5fc57cf 100644 --- a/src/main.js +++ b/src/main.js @@ -3,6 +3,7 @@ import { myFunction } from './lib/index.js'; myFunction(); // Import the functions you need from the SDKs you need import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; +// import { getFirestore } from "https://www.gstatic.com/firebasejs/8.10.1/firebase-firestore.js"; import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, onAuthStateChanged, sendEmailVerification } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; // TODO: Add SDKs for Firebase products that you want to use @@ -49,30 +50,35 @@ btnCloseModalSI.addEventListener('click', closeModalSI); // Initialize Firebase const app = initializeApp(firebaseConfig); -const auth = getAuth(app); +const auth = getAuth(); +// Initialize Cloud Firestore and get a reference to the service +// const fs = getFirestore(app); //construyendo un observador de Auth onAuthStateChanged(auth, (user) => { if (user) { // User is signed in, see docs for a list of available properties // https://firebase.google.com/docs/reference/js/firebase.User - var email =user.email; + var email = user.email; const uid = user.uid; + // El usuario se encuentra logueado + console.log('auth: sign in') - var emailVerified=user.emailVerified; - if(emailVerified===false){ - console.log('Email no verificado'); - } else{ + var emailVerified = user.emailVerified; + if (emailVerified === false) { + alert('Email no verificado'); + } else { console.log('Email verificado'); } - // ... - } else { - // User is signed out - // ... + + } else { + // El usuario no se encuentra logueado + console.log('auth: logout') } -}); + +}); function validarCorreo(correo) { let expReg = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; @@ -89,13 +95,13 @@ function validarCorreo(correo) { -function verificarSendingMail(){ +function verificarSendingMail() { sendEmailVerification(auth.currentUser) .then(() => { // Email verification sent! // ... }) - } +} //SIGN UP @@ -105,22 +111,22 @@ signupForm.addEventListener('submit', (e) => { const valorCorreo = document.getElementById('idCorreoSU').value; const posiblcorreo = validarCorreo(valorCorreo) let signupEmail = ""; - if (posiblcorreo === true){ - signupEmail = valorCorreo; + if (posiblcorreo === true) { + signupEmail = valorCorreo; } else { - signupEmail = ""; + signupEmail = ""; } const signupPassword = document.getElementById('idContraseñaSU').value; - + //función de Firebase para registrar un usuario createUserWithEmailAndPassword(auth, signupEmail, signupPassword) .then((userCredential) => { - + const user = userCredential.user; verificarSendingMail(); - //close the modal + alert('por favor verifica su correo en su bandeja de entrada') closeModalSU(); signupForm.reset(); signupForm.querySelector('.message-error').innerHTML = ""; @@ -134,12 +140,14 @@ signupForm.addEventListener('submit', (e) => { if (errorCode === 'auth/email-already-in-use') { signupForm.querySelector('.message-error').innerHTML = 'El email ya se encuentra registrado' } else if (errorCode === 'auth/weak-password') { - signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + signupForm.querySelector('.message-error').innerHTML = 'La contraseña debe tener al menos 6 carácteres' } else { signupForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores } }); + + // console.log(signupEmail,signupPassword) console.log('signUp'); }) @@ -149,20 +157,27 @@ signupForm.addEventListener('submit', (e) => { const signinForm = document.getElementById('formularioSI'); signinForm.addEventListener('submit', (e) => { - e.preventDefault(); - const email = document.getElementById('idCorreoSI').value; - const password = document.getElementById('idContraseñaSI').value; + e.preventDefault(); + const email = document.getElementById('idCorreoSI').value; + const password = document.getElementById('idContraseñaSI').value; - signInWithEmailAndPassword(auth, email, password) + signInWithEmailAndPassword(auth, email, password) .then((userCredential) => { - + const user = userCredential.user; - closeModalSI(); + if(user.emailVerified){ + alert('por favor verifica su correo en su bandeja de entrada') + console.log('@bienvenido') + }else{ + auth.signOut() + } + closeModalSI(); + signinForm.reset(); signinForm.querySelector('.message-error').innerHTML = ""; }) - .catch((error) =>{ + .catch((error) => { const errorCode = error.code const errorMessage = error.message; if (errorCode === 'auth/user-not-found') { @@ -172,17 +187,17 @@ signinForm.addEventListener('submit', (e) => { } else { signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores } - }); - - console.log('signIn') + }); + + console.log('signIn') }); //LOGOUT const logout = document.getElementById('salir'); logout.addEventListener('click', e => { e.preventDefault(); - auth.signOut().then( () => { - console.log('sign out') + auth.signOut().then(() => { + console.log('sign out') }) }); diff --git a/src/post.js b/src/post.js new file mode 100644 index 00000000..fdff0047 --- /dev/null +++ b/src/post.js @@ -0,0 +1,30 @@ +class Post { + constructor() { + this.fs = firebase.firestore() + const settings = {timestampsInSnapShots : true } + this.fs.settings(settings) + } + +crearPost (uid, titulo , descripcion ) { +return this.fs.colection('post').add({ + uid: uid, + autor: autor, + titulo: titulo, + descripcion: descripcion, + fecha: firebase.firestore.FieldValue.serverTimestamp() + +}) +.then(refDoc => { // si la creacion fue existosa retorna el el id del post creado del firestore + console.log(`Id del post => ${refDoc.id}`) +}).catch (error =>{ +console.error(`Error creaando el post => ${error}`) +}) + +} +consultarTodosPost() { + +} +consultarPostsxUsuario (emailUser){ + +} +} \ No newline at end of file diff --git a/src/style.css b/src/style.css index 01fd774e..73ef6532 100644 --- a/src/style.css +++ b/src/style.css @@ -1,3 +1,4 @@ +@import url('https://fonts.googleapis.com/css2?family=ABeeZee&display=swap'); * { margin: 0; padding: 0; @@ -5,7 +6,7 @@ .modal { display: none; - background: url(img/fondo3.png); + background: url(img/fondo10.png); background-size: cover; background-position: center; width: 100%; @@ -16,6 +17,7 @@ padding: 15px; justify-content: center; align-items: center; + } @@ -31,35 +33,50 @@ flex-direction: column; align-items: center; justify-content: center; + } input { - background: transparent; - backdrop-filter: blur(3px); - border-radius: 7px; + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(15px); + border-radius: 5px; width: 200px; height: 35px; border: transparent; margin: 0 0 30px 0; cursor: pointer; + display: block; + padding-inline-start: 0.75em; + padding-inline-end: 0.75em; + min-inline-size: min-content; + margin: 35px 0 0 0; + + + } input:hover, -.btnSubmit:hover, -.btnGoogle:hover { - background: rgba(245, 236, 236, 0.7); -} +.btnSubmit:hover + { + background: rgba(245, 236, 236, 0.5); + } + + .btnGoogle:hover{ + background: rgb(41, 41, 248); + } h2 { text-align: center; - font-family: sans-serif; font-weight: 50px; top: 80px; - padding-left: 38px; + padding-left: 40px; position: absolute; color: whitesmoke; letter-spacing: 4px; + margin: 0 0px 0 20px; + font-family: 'ABeeZee', sans-serif; + } .correo, @@ -67,19 +84,23 @@ h2 { .user-name { letter-spacing: 1px; color: rgb(27, 27, 27); + } .btnSubmit { - background: transparent; - border-radius: 7px; - color: rgb(104, 104, 97); + background: rgba(255, 255, 255, 0.2); + border-radius: 6px; + color: rgb(83, 83, 81); letter-spacing: 2px; backdrop-filter: blur(3px); border: none; width: 45%; - height: 25px; + height: 30px; + margin: 30px 35px 20px 60px; + cursor: pointer; + } @@ -89,7 +110,7 @@ h2 { width: 20px; height: 25px; border: transparent; - color: rgb(90, 86, 86); + color: rgb(48, 46, 46); background-color: transparent; position: absolute; top: 10px; @@ -100,29 +121,72 @@ h2 { .message-error { font-size: 12px; font-family: sans-serif; - margin-top: 30px; - color: whitesmoke; + color: rgb(134, 6, 6); text-align:justify; - background-color: orangered; - border-radius: 5px; - width: 100%; - padding: 0px 5px; + position: relative; + top: 70px; } .logoGoogle { - width: 17px; - height: 17px; - /*padding: 1%;*/ - margin: 0 0.5rem 0 0.5rem; + width: 25px; + height: 24px; + padding: 2px 2px 1px 1px; + position: absolute; + left: 80px; + border: 1px solid white; + background-color: white; + border-radius: 3px; + } .btnGoogle { - /* background: transparent;*/ - background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); - width: 108%; + background:rgb(52, 52, 250); + width: 100%; height: 35px; - border-radius: 7px; + border-radius: 5px; + border: none; + color:beige; text-align: center; - border: 2px blue; - border-style: solid; -} \ No newline at end of file + margin-inline: 3px; + cursor: pointer; + line-height: 30px; + padding-inline-start: 20px; + + +} +.buttonSI:hover, .buttonSU:hover , .buttonLO:hover{ + color:rgb(243, 171, 62); +} + +.navBar{ + + padding: 15px; + width: 97%; + height: 10px; + text-align: right; + + +} +.buttonSI, .buttonSU , .buttonLO{ + display: inline-block; + color: rgb(73, 41, 11); + font-family: sans-serif; + cursor: pointer; + margin: 1px 15px 10px 15px; + font-family: 'ABeeZee', sans-serif; + } +body{ + background-color: rgb(250, 244, 234); + + + +} +.header{ + width: 100%; + height: 50px; + background-color: rgb(245, 237, 204); + background-size: cover; + background-position:center; + +} + From ab1ea38750605e19c3e5b69d297337158a5d8b44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Wed, 11 Jan 2023 12:50:57 -0500 Subject: [PATCH 17/73] =?UTF-8?q?separaci=C3=B3n=20de=20archivos(creaci?= =?UTF-8?q?=C3=B3n=20de=20archivos=20config.js,=20methods.js)=20y=20funcio?= =?UTF-8?q?nando=20login=20y=20registro=20sin=20errores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- src/index.html | 26 +++- src/js/firebase/config.js | 19 +++ src/js/firebase/methods.js | 113 +++++++++++++++ src/main.js | 278 +++++++++++++++---------------------- src/post.js | 25 ++++ src/style.css | 55 +++++++- 7 files changed, 339 insertions(+), 179 deletions(-) create mode 100644 src/js/firebase/config.js create mode 100644 src/js/firebase/methods.js create mode 100644 src/post.js diff --git a/.gitignore b/.gitignore index 47735411..471a9bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ coverage/ node_modules/ .yarn.lock -package-lock.json \ No newline at end of file +package-lock.json diff --git a/src/index.html b/src/index.html index 14793d30..ba65e0e9 100644 --- a/src/index.html +++ b/src/index.html @@ -8,15 +8,28 @@ Document - +

Red Social NVJ

+ + +
+ + + + - + diff --git a/src/js/firebase/config.js b/src/js/firebase/config.js new file mode 100644 index 00000000..118bd52e --- /dev/null +++ b/src/js/firebase/config.js @@ -0,0 +1,19 @@ +// Import the functions you need from the SDKs you need +import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; + + +const firebaseConfig = { + apiKey: 'AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo', + authDomain: 'redsocialnvj-47db7.firebaseapp.com', + projectId: 'redsocialnvj-47db7', + storageBucket: 'redsocialnvj-47db7.appspot.com', + messagingSenderId: '161909447570', + appId: '1:161909447570:web:b126b68b577520ab947f4b', + }; + + // Initialize Firebase +// console.log('app', app) +export const init = () =>{ + const app = initializeApp(firebaseConfig); + +} diff --git a/src/js/firebase/methods.js b/src/js/firebase/methods.js new file mode 100644 index 00000000..b10c8e62 --- /dev/null +++ b/src/js/firebase/methods.js @@ -0,0 +1,113 @@ +import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, onAuthStateChanged, sendEmailVerification } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; + + +// construyendo un observador de Auth +export const verifiedWithEmail = (auth) => { + onAuthStateChanged(auth, (user) => { + if (user) { + // User is signed in, see docs for a list of available properties + // https://firebase.google.com/docs/reference/js/firebase.User + var email = user.email; + const uid = user.uid; // código único del usuario asignado por Firebase + + // El usuario se encuentra logueado + console.log('auth:sign in'); + + var emailVerified = user.emailVerified; + if (emailVerified === false) { + console.log('Email no verificado'); + } else { + console.log('Email verificado'); + } + // ... + } else { + // el suusario no se encuentra logueado + console.log('auth: log out') + } + }); +} + +export const verificarSendingMail = (auth) => { + sendEmailVerification(auth.currentUser) + .then(() => { + // Email verification sent! + // ... + }); +} + +export const register = (auth, signupEmail, signupPassword) => { + createUserWithEmailAndPassword(auth, signupEmail, signupPassword) + .then((userCredential) => { /*está implícita una promesa*/ + const user = userCredential.user; + + console.log(user); + verificarSendingMail(auth); + alert('por favor verifica el buzón de tu correo para verificar tu cuenta'); + + // closeModalSU(); + // signupForm.reset(); + // signupForm.querySelector('.message-error').innerHTML = ''; + }) + .catch((error) => { + const errorCode = error.code; + const errorMessage = error.message; + + // personalizando los mensajes de los 2 errores mas comunes + // if (errorCode === 'auth/email-already-in-use') { + // signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' + // } else if (errorCode === 'auth/weak-password') { + // signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + // } else { + // signupForm.querySelector('.message-error').innerHTML = errorMessage; // mensajes por defecto de los otros posibles errores + // } + console.log(errorMessage) + }); +} + + +export const login = (auth, email, password) => { + return new Promise((resolve, reject) => { + return signInWithEmailAndPassword(auth, email, password) + .then(({ user }) => resolve(user)) /*desestructuración del objeto user*/ + .catch(error => reject(error)) + }) +} + + + + + + + + +export const logOut = (auth) => { + auth.signOut().then(() => { + console.log('sign out'); + }); +} + + +export const loginWithGoogle = (auth) => { + const provider = new GoogleAuthProvider(); + + signInWithPopup(auth, provider) + .then(result => { + const user = result.user; + // closeModalSI(); + console.log('sign in Google'); + // signinForm.querySelector('.message-error').innerHTML = ''; + }) + .catch((error) => { + const errorMessage = error.message; + + // personalizando los mensajes de los 2 errores mas comunes + // if (errorCode === 'auth/user-not-found') { + // signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado'; + // } else if (errorCode === 'auth/wrong-password') { + // signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario'; + // } else { + // signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores + // } + console.log(errorMessage); + }); +} \ No newline at end of file diff --git a/src/main.js b/src/main.js index 90243de4..a4ac3f41 100644 --- a/src/main.js +++ b/src/main.js @@ -1,31 +1,32 @@ -// Este es el punto de entrada de tu aplicacion -import { myFunction } from './lib/index.js'; -myFunction(); -// Import the functions you need from the SDKs you need -import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -import { getAuth, createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithPopup, GoogleAuthProvider, onAuthStateChanged, sendEmailVerification } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; + +// Import the functions of Firestore for posting +import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; + +import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { init } from "./js/firebase/config.js"; +import { login, register } from "./js/firebase/methods.js"; + +init(); +const auth = getAuth(); + // TODO: Add SDKs for Firebase products that you want to use // https://firebase.google.com/docs/web/setup#available-libraries // Your web app's Firebase configuration -const firebaseConfig = { - apiKey: "AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo", - authDomain: "redsocialnvj-47db7.firebaseapp.com", - projectId: "redsocialnvj-47db7", - storageBucket: "redsocialnvj-47db7.appspot.com", - messagingSenderId: "161909447570", - appId: "1:161909447570:web:b126b68b577520ab947f4b" -}; -/*abrieno modal sign up*/ + +const modalSI = document.querySelector('#modalSI'); +const modalSU = document.querySelector('#modalSU'); + +/* abrieno modal sign up */ const openModalSU = () => { modalSU.style.display = 'flex'; -} +}; const closeModalSU = () => { modalSU.style.display = 'none'; -} +}; const btnOpenModalSU = document.getElementById('botonRegistrar'); btnOpenModalSU.addEventListener('click', openModalSU); @@ -33,81 +34,48 @@ btnOpenModalSU.addEventListener('click', openModalSU); const btnCloseModalSU = document.getElementById('botonCerrarModalSU'); btnCloseModalSU.addEventListener('click', closeModalSU); -// open-close modal Sing in +// open-close modal Sing in const openModalSI = () => { modalSI.style.display = 'flex'; -} +}; const closeModalSI = () => { modalSI.style.display = 'none'; -} +}; const btnOpenModalSI = document.getElementById('botonLoguear'); btnOpenModalSI.addEventListener('click', openModalSI); const btnCloseModalSI = document.getElementById('botonCerrarModalSI'); btnCloseModalSI.addEventListener('click', closeModalSI); -// Initialize Firebase -const app = initializeApp(firebaseConfig); -const auth = getAuth(); -//construyendo un observador de Auth -onAuthStateChanged(auth, (user) => { - if (user) { - // User is signed in, see docs for a list of available properties - // https://firebase.google.com/docs/reference/js/firebase.User - var email = user.email; - const uid = user.uid; //código único del usuario asignado por Firebase - - //El usuario se encuentra logueado - console.log('auth:sign in'); - - var emailVerified = user.emailVerified; - if (emailVerified === false) { - console.log('Email no verificado'); - } else { - console.log('Email verificado'); - } - // ... - } else { - //el suusario no se encuentra logueado - console.log('auth: log out') - } -}); +// Initialize Cloud Firestore and get a reference to the service +//const fs = getFirestore(app); function validarCorreo(correo) { - let expReg = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; - let valido = expReg.test(correo); + const expReg = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + const valido = expReg.test(correo); console.log(valido); if (valido === true) { - console.log('valido') + console.log('valido'); return true; } if (valido === false) { - console.log('invalido') + console.log('invalido'); return false; } } -function verificarSendingMail() { - sendEmailVerification(auth.currentUser) - .then(() => { - // Email verification sent! - // ... - }) -} - - -//SIGN UP +// SIGN UP const signupForm = document.getElementById('formularioSU'); signupForm.addEventListener('submit', (e) => { - e.preventDefault(); //para cancelar el evento de reinicio del formulario + let signupEmail = ''; + e.preventDefault(); // para cancelar el evento de reinicio del formulario const valorCorreo = document.getElementById('idCorreoSU').value; const posibleCorreo = validarCorreo(valorCorreo); - var signupEmail = ''; if (posibleCorreo === true) { signupEmail = valorCorreo; } else { @@ -115,130 +83,108 @@ signupForm.addEventListener('submit', (e) => { } const signupPassword = document.getElementById('idContraseñaSU').value; + // función de Firebase para registrar un usuario +register(auth, valorCorreo, signupPassword ); - //función de Firebase para registrar un usuario - createUserWithEmailAndPassword(auth, signupEmail, signupPassword) - .then((userCredential) => { + // console.log(signupEmail,signupPassword) + console.log('signUp'); +}); - const user = userCredential.user; +// SIGN IN - //actualizar los datos - // user.updateProfile({ - // displayName: nombres - // }) +const signinForm = document.getElementById('formularioSI'); +signinForm.addEventListener('submit', async (e) => { + e.preventDefault(); + const emailInput = document.getElementById('idCorreoSI').value; + const passwordInput = document.getElementById('idContraseñaSI').value; + try { + const { emailVerified, email } = await login(auth, emailInput, passwordInput) + // console.log(resp); + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (emailVerified) { + console.log('Bienvenid@', email); + } else { + auth.signOut(); + console.log('Por favor realiza la verificación de tu cuenta'); + } + // console.log(emailVerified) /* verificando el observador */ - verificarSendingMail(); - alert('por favor verifica el buzón de tu correo para verificar tu cuenta'); + closeModalSI(); - closeModalSU(); - signupForm.reset(); - signupForm.querySelector('.message-error').innerHTML = ""; + signinForm.reset(); + signinForm.querySelector('.message-error').innerHTML = ''; - }) - .catch((error) => { - const errorCode = error.code - const errorMessage = error.message; + } catch ({ code, message }) { + // console.log('error', error.message, error.code, error.response) - //personalizando los mensajes de los 2 errores mas comunes - if (errorCode === 'auth/email-already-in-use') { - signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' - } else if (errorCode === 'auth/weak-password') { - signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' - } else { - signupForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores - } - }); + if (code === 'auth/user-not-found') { + signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado'; + } else if (code === 'auth/wrong-password') { + signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario'; + } else { + signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores + } + } - // console.log(signupEmail,signupPassword) - console.log('signUp'); -}) -//SIGN IN -const signinForm = document.getElementById('formularioSI'); -signinForm.addEventListener('submit', (e) => { - e.preventDefault(); - const email = document.getElementById('idCorreoSI').value; - const password = document.getElementById('idContraseñaSI').value; - - signInWithEmailAndPassword(auth, email, password) - .then((userCredential) => { - - const user = userCredential.user; - - /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ - if (user.emailVerified) { - //Materialize.toast(`Bienvenido ${user.displayName}`, 5000) - console.log('Bienvenid@') - } else { - auth.signOut() - // Materialize.toast(`Por favor realiza la verificación de tu cuenta `, 5000) - console.log('Por favor realiza la verificación de tu cuenta') - } - - closeModalSI(); - - signinForm.reset(); - signinForm.querySelector('.message-error').innerHTML = ""; - }) - .catch((error) => { - const errorCode = error.code - const errorMessage = error.message; - if (errorCode === 'auth/user-not-found') { - signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado' - } else if (errorCode === 'auth/wrong-password') { - signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario' - } else { - signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores - } - }); - - console.log('signIn') + + console.log('signIn'); }); -//LOGOUT +// LOGOUT const logout = document.getElementById('salir'); -logout.addEventListener('click', e => { +logout.addEventListener('click', (e) => { e.preventDefault(); - auth.signOut().then(() => { - console.log('sign out') - }) + }); -//GOOGLE LOGIN +// GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') -googleButton.addEventListener('click', e => { - - const provider = new GoogleAuthProvider(); - - signInWithPopup(auth, provider) - .then(result => { - const user = result.user; - closeModalSI(); - console.log('sign in Google') - signinForm.querySelector('.message-error').innerHTML = ''; - }) - .catch((error) => { - const errorMessage = error.message; - - //personalizando los mensajes de los 2 errores mas comunes - if (errorCode === 'auth/user-not-found') { - signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado' - } else if (errorCode === 'auth/wrong-password') { - signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario' - } else { - signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores - } - }); - //console.log(email,password) - -}) - - - +googleButton.addEventListener('click', () => { + // console.log(email,password) +}); +// function soyAsincrona(){ +// setTimeout(function () { +// console.log('Estoy siendo asíncrona'); +// }, 1000); +// } +// console.log('iniciando proceso...'); +// soyAsincrona(); +// console.log('Terminando proceso...'); + +// function hola (nombre, miCallback){ +// setTimeout(function(){ +// console.log('Hola ' +nombre); +// miCallback(nombre); +// }, 6000); +// } + + + + +// function hola (nombre, miCallback){ +// setTimeout(function(){ +// console.log('Hola ' +nombre); +// miCallback(nombre); +// }, 6000); +// } + +// function adios(nombre, otroCallback){ +// setTimeout(function(){ +// console.log('Adios ' +nombre); +// otroCallback(); +// }, 1000); +// } +// console.log('iniciando proceso'); +// hola('Carlos', function(nombre){ +// adios(nombre, function(){ +// console.log('Terminando proceso...') +// }); +// }); diff --git a/src/post.js b/src/post.js new file mode 100644 index 00000000..29e71450 --- /dev/null +++ b/src/post.js @@ -0,0 +1,25 @@ +class Post { + constructor() { + this.fs = firebase.firestore(); + const settings = { timestampsInSnapshots: true } // fecha válida. timestampsInSnapshots(de firestore viene como timestamp y este métoso lo convierte a datetime que ocupa Js ) + this.fs.settings(settings); + } + crearPost(uid, emailUser, titulo, descripcion) { + return this.fs.collection('posts').add({ // adición de un post. También podemos utilizar nuestro propio Id usando: .doc("key").set({ + uid: uid, + autor: autor, + titulo: titulo, + descripcion: descripcion, + fecha: firebase.firestore.FieldValue.serverTimestamp() + }) + .then(refDoc => { // si la inserción(creación del post) fue exitosa debería dar en la consola el id del post que debería venir del firestore + console.log(`Id del post =>${refDoc.id}`) + }).catch(error => { + console.log(`Error de creación del post =>${error}`); + }) + } + consultarTodosPost() { + } + consultarPostxUsuario(emailUser) { + } +} diff --git a/src/style.css b/src/style.css index 01fd774e..73d7b904 100644 --- a/src/style.css +++ b/src/style.css @@ -3,6 +3,14 @@ padding: 0; } +h1 { + position: fixed; + top: 10px; + left: 10px; +} + + + .modal { display: none; background: url(img/fondo3.png); @@ -42,7 +50,7 @@ input { border: transparent; margin: 0 0 30px 0; cursor: pointer; - + } input:hover, @@ -80,7 +88,7 @@ h2 { border: none; width: 45%; height: 25px; - } +} .close-modal { @@ -93,7 +101,7 @@ h2 { background-color: transparent; position: absolute; top: 10px; - padding-left: 18px ; + padding-left: 18px; cursor: pointer; } @@ -102,7 +110,7 @@ h2 { font-family: sans-serif; margin-top: 30px; color: whitesmoke; - text-align:justify; + text-align: justify; background-color: orangered; border-radius: 5px; width: 100%; @@ -113,16 +121,49 @@ h2 { width: 17px; height: 17px; /*padding: 1%;*/ - margin: 0 0.5rem 0 0.5rem; + margin: 0 0.5rem 0 0.5rem; } .btnGoogle { - /* background: transparent;*/ + /* background: transparent;*/ background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); width: 108%; height: 35px; border-radius: 7px; text-align: center; - border: 2px blue; + border: 2px blue; border-style: solid; +} + +body { + font-family: sans-serif; +} + +/* BARRA NAVEGACIÓN */ + +.navBar { + background-color: rgb(154, 116, 190); + height: 50px; + width: 100%; + font-size: 30px; + top: 80px; + left: 0; + justify-content: center; + position: absolute; +} + +li a { + text-decoration: none; /*para quitar el subrayado*/ + color: white; + text-decoration: none; + list-style: none; + margin: 0 15px 0 15px; + padding-top: 10px; +} + +.nav { + justify-content: space-between; + color: white; + display: inline; + padding-top: 10px; } \ No newline at end of file From 8d99c6681c0b27973102f7540796e6b5274e2f90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Thu, 12 Jan 2023 11:09:26 -0300 Subject: [PATCH 18/73] se espera main y archivos de firebase separados --- .eslintrc | 3 +- .gitignore | 3 +- src/index.html | 14 ++++- src/lib/index.js | 7 --- src/main.js | 154 ++++++++--------------------------------------- src/style.css | 24 ++++++++ 6 files changed, 65 insertions(+), 140 deletions(-) delete mode 100644 src/lib/index.js diff --git a/.eslintrc b/.eslintrc index a731d53c..4dab094c 100644 --- a/.eslintrc +++ b/.eslintrc @@ -26,6 +26,7 @@ "jest/no-focused-tests": "error", "jest/no-identical-title": "error", "jest/prefer-to-have-length": "warn", - "jest/valid-expect": "error" + "jest/valid-expect": "error", + "import/no-unresolved": 0, } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 47735411..2c0ae696 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ coverage/ node_modules/ .yarn.lock -package-lock.json \ No newline at end of file +package-lock.json +firebase.js diff --git a/src/index.html b/src/index.html index 14793d30..93353fee 100644 --- a/src/index.html +++ b/src/index.html @@ -13,10 +13,17 @@

Red Social NVJ

+ - - + + - - + + - + \ No newline at end of file diff --git a/src/js/index.js b/src/js/index.js new file mode 100644 index 00000000..b28b04f6 --- /dev/null +++ b/src/js/index.js @@ -0,0 +1,3 @@ + + + diff --git a/src/js/router.js b/src/js/router.js new file mode 100644 index 00000000..e69de29b diff --git a/src/js/routes.js b/src/js/routes.js new file mode 100644 index 00000000..5bd95fc2 --- /dev/null +++ b/src/js/routes.js @@ -0,0 +1,13 @@ +import {home} from '/components/home.js'; +import {register} from '/components/register.js' +import {login} from '/components/login.js' + +const rootDiv = document.getElementById('root'); +const routes = { +'/':home, +'/register': register, +'/login': login, +}; + +const componentes = routes[window.location.pathname]; +rootDiv.appendChild(componentes()); \ No newline at end of file diff --git a/src/js/firebase/config.js b/src/lib/firebase/config.js similarity index 100% rename from src/js/firebase/config.js rename to src/lib/firebase/config.js diff --git a/src/js/firebase/methods.js b/src/lib/firebase/methods.js similarity index 76% rename from src/js/firebase/methods.js rename to src/lib/firebase/methods.js index abb3996f..aa215b3a 100644 --- a/src/js/firebase/methods.js +++ b/src/lib/firebase/methods.js @@ -4,6 +4,7 @@ import { createUserWithEmailAndPassword, signInWithEmailAndPassword, signInWithP // construyendo un observador de Auth export const verifiedWithEmail = (auth) => { onAuthStateChanged(auth, (user) => { + if (user) { // User is signed in, see docs for a list of available properties // https://firebase.google.com/docs/reference/js/firebase.User @@ -30,7 +31,7 @@ export const verifiedWithEmail = (auth) => { export const verificarSendingMail = (auth) => { sendEmailVerification(auth.currentUser) .then(() => { - // Email verification sent! + alert('Por avor verificar su gmail') // ... }); } @@ -54,11 +55,11 @@ export const login = (auth, email, password) => { } - export const logOut = (auth) => { + /* export const logOut = (auth) => { auth.signOut().then(() => { console.log('sign out'); }); - } + }*/ export const loginWithGoogle = (auth) => { @@ -72,16 +73,6 @@ export const login = (auth, email, password) => { // signinForm.querySelector('.message-error').innerHTML = ''; }) .catch((error) => { - const errorMessage = error.message; - - // personalizando los mensajes de los 2 errores mas comunes - // if (errorCode === 'auth/user-not-found') { - // signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado'; - // } else if (errorCode === 'auth/wrong-password') { - // signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario'; - // } else { - // signinForm.querySelector('.message-error').innerHTML = errorMessage; //mensajes por defecto de los otros posibles errores - // } - console.log(errorMessage); - }); + + }); } \ No newline at end of file diff --git a/src/lib/index.js b/src/lib/index.js deleted file mode 100644 index 60bfe20b..00000000 --- a/src/lib/index.js +++ /dev/null @@ -1,12 +0,0 @@ -// aqui exportaras las funciones que necesites - -export const myFunction = () => { - // aqui tu codigo - // console.log('Hola mundo!'); -}; - -//punta las funciones de router para cargarlo en el main -//nombrres utils, lib, vendors,assets -// cuando se crea un respositiorio hacer git init y gitingnore -// archivos sensibles ponerlo antes en el gitinore antes de hacer commit - diff --git a/src/main.js b/src/main.js index 5a3bd5bd..50eee86b 100644 --- a/src/main.js +++ b/src/main.js @@ -2,9 +2,9 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; -import { init } from "./js/firebase/config.js"; -import { login, register } from "./js/firebase/methods.js"; - +import { init } from "./lib/firebase/config.js"; +import { login, register,loginWithGoogle,verificarSendingMail } from "./lib/firebase/methods.js"; +/*logout importar*/ init(); const auth = getAuth(); @@ -83,6 +83,7 @@ signupForm.addEventListener('submit', async (e) => { // función de Firebase para registrar un usuario try { const resultado = await register(auth, valorCorreo, signupPassword); + verificarSendingMail(auth) console.log(resultado); signupForm.querySelector('.message-error').innerHTML = ''; @@ -112,12 +113,13 @@ signinForm.addEventListener('submit', async (e) => { const passwordInput = document.getElementById('idContraseñaSI').value; try { const { emailVerified, email } = await login(auth, emailInput, passwordInput) - + //console.log(emailVerified,email); /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ if (emailVerified) { console.log('Bienvenid@', email); } else { + auth.signOut(); console.log('Por favor realiza la verificación de tu cuenta'); } @@ -144,14 +146,20 @@ signinForm.addEventListener('submit', async (e) => { }); // LOGOUT -const logout = document.getElementById('salir'); -logout.addEventListener('click', (e) => { - e.preventDefault(); - -}); +/*const logout = document.getElementById('salir'); +logout.addEventListener('click', () => { + logOut(auth) + +});*/ // GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') -googleButton.addEventListener('click', () => { - // console.log(email,password) +googleButton.addEventListener('click', (e) => { + e. preventDefault(); + loginWithGoogle(auth); + closeModalSI(); + signinForm.reset(); }); + + + diff --git a/src/style.css b/src/style.css index c5506a28..fd08e85a 100644 --- a/src/style.css +++ b/src/style.css @@ -5,11 +5,6 @@ padding: 0; } -h1 { - position: fixed; - top: 10px; - left: 10px; -} @@ -137,34 +132,43 @@ input:hover, } body { - font-family: sans-serif; + background-image: url(img/inicioApp.png); } -/* BARRA NAVEGACIÓN */ +h1 { +font-family: 'Fredoka One'; +position: absolute; +width: 300px; +height: 47px; +left: 28px; +top: 115px; +font-style: normal; +font-weight: 400; +font-size: 35px; +line-height: 42px; +color: rgba(255, 242, 242, 0.25); +text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); +} +h5{ +position: absolute; +width: 187px; +height: 18px; +left: 30px; +top: 75px; +font-family: 'ABeeZee'; +font-size: 18px; +line-height: 24px; +color: #f5efef; +} +.navLink { +display: inline-block; +font-family: century Gothic; +color: #FFFFFF; +padding-left: 20px; +margin: 5px; +text-align: right; + -.navBar { - background-color: rgb(154, 116, 190); - height: 50px; - width: 100%; - font-size: 30px; - top: 80px; - left: 0; - justify-content: center; - position: absolute; -} -li a { - text-decoration: none; /*para quitar el subrayado*/ - color: white; - text-decoration: none; - list-style: none; - margin: 0 15px 0 15px; - padding-top: 10px; -} -.nav { - justify-content: space-between; - color: white; - display: inline; - padding-top: 10px; } \ No newline at end of file From a562f55aaf4cca06aa14e22060e2a1c4db807ce1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Fri, 13 Jan 2023 13:16:53 -0300 Subject: [PATCH 23/73] nada para actualizar --- src/index.html | 2 ++ src/main.js | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/index.html b/src/index.html index c7eb9a66..c06283f1 100644 --- a/src/index.html +++ b/src/index.html @@ -20,6 +20,8 @@

Red Social NVJ

+
+ --> -<<<<<<< HEAD - - - -======= - + ->>>>>>> 85776c9e979d3f9c7bcefe18401be6f2d6b705bb - diff --git a/src/js/routes.js b/src/js/routes.js index c6e86fb1..f9aa63bd 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,13 +1,23 @@ import {home} from '../components/Home.js'; -// import {register} from '../components/register.js'; +import {register} from '../components/register.js'; // import {login} from '../components/login.js'; const rootDiv = document.getElementById('root'); const routes = { '/':home, -// '/register': register, + '/register': register, // '/login': login, }; + export const onNavigate = (pathname) => { + window.history.pushState ( + {}, + pathname, + window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// + ); + + rootDiv.appendChild = (routes[pathname]()); + }; + const componentes = routes[window.location.pathname]; rootDiv.appendChild(componentes()); \ No newline at end of file diff --git a/src/login.js b/src/login.js index 8a829f83..1e051a61 100644 --- a/src/login.js +++ b/src/login.js @@ -1,8 +1,2 @@ import { template } from "@babel/core"; -const paths = { - signin: { - path: "/", - template: `

` - }, -}; \ No newline at end of file diff --git a/src/style.css b/src/style.css index db725fbc..161b1dcc 100644 --- a/src/style.css +++ b/src/style.css @@ -6,27 +6,16 @@ box-sizing: border-box; } -body { - font-family: sans-serif; -} /* BARRA NAVEGACIÓN */ -.navBar{ -background-color: rgb(154, 116, 190); -height: 80px; -width: 100%; -top: 80px; -left: 0; -display: flex; -} - -.nav{ +.navBar { + background-color: rgb(154, 116, 190); + height: 80px; + width: 100%; + top: 80px; + left: 0; display: flex; - justify-content: space-between; - color: white; - text-decoration: none; - list-style: none; } @@ -65,19 +54,23 @@ display: flex; } input { - background: rgba(255, 255, 255, 0.2); backdrop-filter: blur(15px); - border-radius: 5px; - width: 200px; - height: 35px; + width: 240px; + height: 45px; border: transparent; - margin: 0 0 30px 0; + margin: 25px 30px 0px 30px; cursor: pointer; + justify-content: center; + background: rgba(255, 255, 255, 0.32); + border-radius: 8px; } -input:hover, + .btnSubmit:hover { + background: rgba(56, 52, 52, 0.5); +} +input:hover{ background: rgba(245, 236, 236, 0.5); } @@ -85,27 +78,27 @@ input:hover, background: rgb(41, 41, 248); } - - -.correo, -.contraseña, -.user-name { - letter-spacing: 1px; - color: rgb(27, 27, 27); - - -} - - .btnSubmit { - background: rgba(255, 255, 255, 0.2); + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + margin: 25px 30px 0 30px; + width: 240px; + height: 45px; + background: rgba(82, 82, 92, 0.8); border-radius: 6px; - color: rgb(83, 83, 81); + /* Inside auto layout */ + flex: none; + order: 0; + align-self: stretch; + flex-grow: 0; + color: rgba(255, 255, 255, 0.32); + font-size: 16px; + line-height: 25px; letter-spacing: 2px; - backdrop-filter: blur(3px); - border: none; - width: 45%; - height: 25px; + + } @@ -129,7 +122,7 @@ input:hover, margin-top: 30px; color: whitesmoke; text-align: justify; - background-color: orangered; + background-color: rgb(214, 42, 42); border-radius: 5px; width: 100%; padding: 0px 5px; @@ -155,44 +148,111 @@ input:hover, border-style: solid; } -/* body { - background-image: url(img/inicioApp.png); -} */ - +/* Estilos para formulario dinámico*/ h1 { -font-family: 'Fredoka One'; -position: absolute; -width: 300px; -height: 47px; -left: 28px; -top: 115px; -font-style: normal; -font-weight: 400; -font-size: 35px; -line-height: 42px; -color: rgba(255, 242, 242, 0.25); -text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); -} -h5{ -position: absolute; -width: 187px; -height: 18px; -left: 30px; -top: 75px; -font-family: 'ABeeZee'; -font-size: 18px; -line-height: 24px; -color: #f5efef; + font-family: 'Fredoka One'; + position: absolute; + width: 300px; + height: 47px; + left: 28px; + top: 115px; + font-style: normal; + font-weight: 400; + font-size: 35px; + line-height: 42px; + color: rgba(255, 242, 242, 0.25); + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); +} + +h5 { + position: absolute; + width: 187px; + height: 18px; + left: 30px; + top: 75px; + font-family: 'ABeeZee'; + font-size: 18px; + line-height: 24px; + color: #f5efef; } + .navLink { -display: inline-block; -font-family: century Gothic; -color: #FFFFFF; -padding-left: 20px; -margin: 5px; -text-align: right; + display: inline-block; + font-family: century Gothic; + color: #575454; + padding-left: 20px; + margin: 5px; + text-align: right; +} + +.sectionSignup { + width: 360px; + height: 800px; + justify-content: center; + background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); +} + +.password, +.email, +.username { + line-height: 24px; + color: #000000; + align-items: center; + text-align: center; + +} +.contenedorForm { + background: rgba(255, 255, 255, 0.32); + box-shadow: 0px 3px 10px rgba(46, 46, 66, 0.1); + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 24px; + gap: 24px; + position: absolute; + width: 340px; + height: 460px; + left: 10px; + top: 190px; + border-radius: 30px; +} + +.form { + display: contents; + justify-content: center; + align-items: center; +} +.tituloh2register { + font-family: 'Fredoka One'; + width: 300px; + height: 47px; + text-align: center; + font-style: normal; + font-weight: 400; + font-size: 35px; + line-height: 42px; + color: rgba(255, 242, 242, 0.25); + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + margin: 0; + position: absolute; + top: 100px; + left: 35px; +} +.usuario { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 55px; +} +.imgInicio { + width: 360px; + height: 800px; } \ No newline at end of file From 9d7d48d4ac709f900e923dc094a2c2076613bd86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Mon, 16 Jan 2023 15:21:48 -0300 Subject: [PATCH 29/73] register sin funcionar, pruebas --- src/components/Home.js | 4 ++++ src/components/register.js | 11 +++++++++++ src/js/routes.js | 12 ++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index cd66d33f..17c62217 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -1,3 +1,4 @@ +import { onNavigate } from '../js/routes.js' export const home = () => { const homeDiv = document.createElement('div'); @@ -18,6 +19,9 @@ export const home = () => { buttonLogin.textContent = 'Sign up'; buttonLogin.id = 'botonLoguear'; + buttonRegister.addEventListener('click', () => onNavigate('/register')); + + listaBotones.appendChild(buttonRegister); listaBotones.appendChild(buttonLogin); diff --git a/src/components/register.js b/src/components/register.js index e69de29b..a1346598 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -0,0 +1,11 @@ +export const register = () => { + + const HomeDiv = document.createElement('div'); + HomeDiv.textContent = 'Bienvenida al registro'; + const buttonHome = document.createElement('button'); + + buttonHome.textContent = 'Regresar al Home'; + + HomeDiv.appendChild('buttonHome'); + return HomeDiv; + }; \ No newline at end of file diff --git a/src/js/routes.js b/src/js/routes.js index c6e86fb1..ad896167 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,13 +1,21 @@ import {home} from '../components/Home.js'; -// import {register} from '../components/register.js'; +import {register} from '../components/register.js'; // import {login} from '../components/login.js'; const rootDiv = document.getElementById('root'); const routes = { '/':home, -// '/register': register, +'/register': register, // '/login': login, }; +export const onNavigate = (pathname) => { + window.history.pushState( + {}, + pathname, + window.location.origin + pathname, + ); +}; + const componentes = routes[window.location.pathname]; rootDiv.appendChild(componentes()); \ No newline at end of file From eaa9cb2d685539b9f5ae40172f463f421a25aada Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Mon, 16 Jan 2023 15:47:57 -0500 Subject: [PATCH 30/73] 3 primeras rutas --- src/components/Home.js | 9 +++++++-- src/components/login.js | 14 ++++++++++++++ src/components/register.js | 25 ++++++++++++++++++------- src/js/routes.js | 31 +++++++++++++++++++++++++------ src/style.css | 6 ++---- 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index 83060ab3..881e7202 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -1,3 +1,6 @@ +import { onNavigate } from "../js/routes.js"; + + export const home = () => { const homeDiv = document.createElement('div'); @@ -10,17 +13,19 @@ export const home = () => { const buttonRegister = document.createElement('li'); buttonRegister.className = 'navLink'; - buttonRegister.textContent = 'Sign in'; + buttonRegister.textContent = 'Sign up'; buttonRegister.id = 'botonRegistrar'; const buttonLogin = document.createElement('li'); buttonLogin.className = 'navLink'; - buttonLogin.textContent = 'Sign up'; + buttonLogin.textContent = 'Sign in'; buttonLogin.id = 'botonLoguear'; listaBotones.appendChild(buttonRegister); listaBotones.appendChild(buttonLogin); + buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonLogin.addEventListener('click', () => onNavigate('/login')); diff --git a/src/components/login.js b/src/components/login.js index e69de29b..9b47ccd2 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -0,0 +1,14 @@ +export const login = () =>{ + + const loginDiv = document.createElement('div'); + const nameApp = document.createElement('h1'); + nameApp.textContent = "Dad's Power Login"; + + loginDiv.appendChild(nameApp); + + + + + + return loginDiv; + } \ No newline at end of file diff --git a/src/components/register.js b/src/components/register.js index 3c241917..2a7592ca 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -1,11 +1,22 @@ -export const Register = () =>{ +import { onNavigate } from "../js/routes.js"; -const HomeDiv = document.createElement('div'); -HomeDiv.textContent = 'Bienvenida al registro'; -const buttonHome = document.createElement('button'); +export const register = () => { -buttonHome.textContent = 'Regresar al Home'; + const registerDiv = document.createElement('div'); + const nameApp = document.createElement('h1'); + nameApp.textContent = "Dad's Power Sign Up"; -HomeDiv.appendChild('buttonHome'); -return HomeDiv; + registerDiv.appendChild(nameApp); + + const buttonLogin = document.createElement('li'); + buttonLogin.textContent = 'Sign in'; + buttonLogin.id = 'botonLoguear'; + + registerDiv.appendChild(buttonLogin); + buttonLogin.addEventListener('click', () => onNavigate('/login')); + + + + + return registerDiv; } \ No newline at end of file diff --git a/src/js/routes.js b/src/js/routes.js index 2e078d69..4fae550c 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,13 +1,32 @@ -import {home} from '../components/Home.js'; -// import {register} from '../components/register.js'; -// import {login} from '../components/login.js'; +import { home } from '../components/Home.js'; +import { register } from '../components/register.js'; + import {login} from '../components/login.js'; const rootDiv = document.getElementById('root'); const routes = { -'/':home, -// '/register': register, -// '/login': login, + '/': home, + '/register': register, + '/login': login, +}; + +export const onNavigate = (pathname) => { + window.history.pushState( + {}, + pathname, + window.location.origin + pathname, + ); + + while(rootDiv.firstChild){ + rootDiv.removeChild(rootDiv.firstChild) + } + rootDiv.appendChild(routes[pathname]()); }; const componentes = routes[window.location.pathname]; + +window.onpopstate = () =>{ rootDiv.appendChild(componentes()); +} + +rootDiv.appendChild(componentes()); + diff --git a/src/style.css b/src/style.css index db725fbc..bc3c8a6e 100644 --- a/src/style.css +++ b/src/style.css @@ -187,12 +187,10 @@ color: #f5efef; .navLink { display: inline-block; font-family: century Gothic; -color: #FFFFFF; +color: #0f12bf; padding-left: 20px; margin: 5px; text-align: right; - - - +cursor:pointer } \ No newline at end of file From 2ce5b14b246a5289416006e20b229e2d2c15e1c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Mon, 16 Jan 2023 18:26:55 -0300 Subject: [PATCH 31/73] se agregan

de error diferenciados en register, estilos de errores, labels y mensaje para enviar al sign in --- src/components/register.js | 47 ++++++++++---- src/js/routes.js | 3 + src/style.css | 127 +++++++++++++++++++++++++++++++------ 3 files changed, 146 insertions(+), 31 deletions(-) diff --git a/src/components/register.js b/src/components/register.js index db4e40ae..091cbd29 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -1,3 +1,5 @@ +import { onNavigate } from '../js/routes.js' + export const register = () => { const signupSection = document.createElement('section'); @@ -18,44 +20,67 @@ export const register = () => { const inputUser = document.createElement('input'); const labelUser = document.createElement('label'); - labelUser.textContent = 'username'; - labelUser.className ='usuario' - inputUser.setAttribute('name','username'); + labelUser.textContent = 'Username'; + labelUser.className ='usuario'; formSU.appendChild(labelUser); - inputUser.setAttribute('type', 'user'); + inputUser.type ='user'; inputUser.className = 'username'; inputUser.id = 'idUsername'; - inputUser.placeholder = 'Amy Schumer'; + inputUser.placeholder = 'Rob Scott'; formSU.appendChild(inputUser); const inputEmail = document.createElement('input'); - inputEmail.setAttribute('type', 'e-mail'); + const labelEmail = document.createElement('label'); + labelEmail.textContent = 'E-mail'; + labelEmail.className = 'labelEmail'; + formSU.appendChild(labelEmail); + inputEmail.type = 'e-mail'; inputEmail.className = 'email'; inputEmail.id = 'idCorreoSU'; inputEmail.placeholder = 'example@gmail.com' formSU.appendChild(inputEmail); + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSignupEmail = document.createElement('p'); + errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass + errorSignupEmail.textContent = 'Aquí va error para email'; + formSU.appendChild(errorSignupEmail); + const inputPasword = document.createElement('input'); + const labelPassword = document.createElement('label'); + labelPassword.textContent = 'Password'; + labelPassword.className = 'labelPassword'; + formSU.appendChild(labelPassword); inputPasword.type = 'password'; inputPasword.textContent = 'password'; inputPasword.className = 'password'; inputPasword.id = 'idContraseñaSU'; - inputPasword.placeholder = '*******' + inputPasword.placeholder = '******' formSU.appendChild(inputPasword); + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSignupPassword = document.createElement('p'); + errorSignupPassword.className ='message-error-password'; //aquí debe estar la diferencia en la className, distinto para email y pass + errorSignupPassword.textContent = 'Aquí va error para password'; + formSU.appendChild(errorSignupPassword); + const buttonSU = document.createElement('button'); buttonSU.type = 'submit'; buttonSU.textContent = 'submit' buttonSU.className = 'btnSubmit'; buttonSU.id = 'btnEnviarSU'; - formSU.appendChild(buttonSU) + formSU.appendChild(buttonSU); + + const tienesCuenta = document.createElement('p'); + tienesCuenta.className = 'p-tienes-cuenta'; + tienesCuenta.textContent = 'Already have an account ?'; + formSU.appendChild(tienesCuenta); + + - const errorSignup = document.createElement('p'); - errorSignup.className ='message-error'; - formSU.appendChild(errorSignup); return signupSection; } diff --git a/src/js/routes.js b/src/js/routes.js index f9aa63bd..a270b577 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -15,6 +15,9 @@ const routes = { pathname, window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// ); + while(rootDiv.firstChild){ + rootDiv.removeChild(rootDiv.firstChild); + } rootDiv.appendChild = (routes[pathname]()); }; diff --git a/src/style.css b/src/style.css index 161b1dcc..b88f71a4 100644 --- a/src/style.css +++ b/src/style.css @@ -148,7 +148,7 @@ input:hover{ border-style: solid; } -/* Estilos para formulario dinámico*/ +/* Estilos para vista HOME*/ h1 { font-family: 'Fredoka One'; position: absolute; @@ -185,6 +185,7 @@ h5 { text-align: right; } +/* Estilos para Vista REGISTER */ .sectionSignup { width: 360px; height: 800px; @@ -192,14 +193,21 @@ h5 { background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.password, -.email, -.username { - line-height: 24px; - color: #000000; - align-items: center; +.tituloh2register { + font-family: 'Fredoka One'; + width: 300px; + height: 47px; text-align: center; - + font-style: normal; + font-weight: 400; + font-size: 35px; + line-height: 42px; + color: rgba(255, 242, 242, 0.25); + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + margin: 0; + position: absolute; + top: 100px; + left: 35px; } .contenedorForm { @@ -224,24 +232,35 @@ h5 { align-items: center; } -.tituloh2register { - font-family: 'Fredoka One'; - width: 300px; - height: 47px; +.password, +.email, +.username { + line-height: 24px; + color: #000000; + align-items: center; text-align: center; + +} + +/* Dar color más tenue al placeholder de los input */ +input::placeholder{ + color:#8F9CA3; +} + +/* Estilos para los títulos de los labels de cada input */ +.usuario { + font-family: 'Century Gothic'; font-style: normal; font-weight: 400; - font-size: 35px; - line-height: 42px; - color: rgba(255, 242, 242, 0.25); - text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); - margin: 0; + font-size: 15px; + line-height: 150%; + color: #52525C; position: absolute; - top: 100px; - left: 35px; + left: 55px; + /* left: 140px; */ } -.usuario { +.labelEmail { font-family: 'Century Gothic'; font-style: normal; font-weight: 400; @@ -249,7 +268,75 @@ h5 { line-height: 150%; color: #52525C; position: absolute; + /* left: 152px; */ left: 55px; + top: 120px; +} + +.labelPassword { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 55px; + /* left: 141px; */ + top: 215px; + +} + +/* Estilos para mensaje de error */ + +.message-error-email { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #d16b49; + position: absolute; + left: 111px; + top: 190px; +} + +.message-error-password { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #d16b49; + position: absolute; + left: 102px; + top: 285px; +} + +/* Parrafo con enlace a sigin */ + +.p-tienes-cuenta{ + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 100px; + bottom: 60px; +} + +.enlace-signin { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 60px; + bottom: 60px; } .imgInicio { From 4f55c6984b53c6593ea9cd0219126191c9807ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Mon, 16 Jan 2023 16:28:12 -0500 Subject: [PATCH 32/73] 3 primeras rutas --- src/components/Home.js | 2 -- src/components/register.js | 11 +++++++++++ src/js/routes.js | 16 +++------------- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index d66bde79..6aacde75 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -28,8 +28,6 @@ export const home = () => { buttonRegister.addEventListener('click', () => onNavigate('/register')); buttonLogin.addEventListener('click', () => onNavigate('/login')); - - const sectionDiv = document.createElement('section'); sectionDiv.className = 'bienvenida'; const bienvenidaH5 = document.createElement('h5'); diff --git a/src/components/register.js b/src/components/register.js index db4e40ae..3f411fc5 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -1,3 +1,5 @@ +import { onNavigate } from "../js/routes.js"; + export const register = () => { const signupSection = document.createElement('section'); @@ -57,5 +59,14 @@ export const register = () => { errorSignup.className ='message-error'; formSU.appendChild(errorSignup); + + + const buttonLogin = document.createElement('li'); + buttonLogin.textContent = 'Sign in'; + buttonLogin.id = 'botonLoguear'; + + signupSection.appendChild(buttonLogin); + buttonLogin.addEventListener('click', () => onNavigate('/login')); + return signupSection; } diff --git a/src/js/routes.js b/src/js/routes.js index a3f2e9e8..e949627a 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -13,7 +13,7 @@ export const onNavigate = (pathname) => { window.history.pushState( {}, pathname, - window.location.origin + pathname, + window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// ); while(rootDiv.firstChild){ @@ -21,22 +21,12 @@ export const onNavigate = (pathname) => { } rootDiv.appendChild(routes[pathname]()); }; - - export const onNavigate = (pathname) => { - window.history.pushState ( - {}, - pathname, - window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// - ); - - rootDiv.appendChild = (routes[pathname]()); - }; - + const componentes = routes[window.location.pathname]; window.onpopstate = () =>{ rootDiv.appendChild(componentes()); -} +}; rootDiv.appendChild(componentes()); From 2c50866812eeb40fdbdeb23653d7a5a9bea42d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 17 Jan 2023 12:01:39 -0500 Subject: [PATCH 33/73] 2 primeras vistas con touter --- src/components/Home.js | 1 + src/components/login.js | 92 +++++++++++-- src/components/register.js | 18 ++- src/js/routes.js | 5 - src/style.css | 269 +++++++++++++++++++++++++++++++------ 5 files changed, 316 insertions(+), 69 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index 38ea590c..28924697 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -8,6 +8,7 @@ export const home = () => { homeDiv.appendChild(barraNavegacion); const listaBotones = document.createElement('ul'); + listaBotones.className = 'ul-home'; barraNavegacion.appendChild(listaBotones); const buttonRegister = document.createElement('li'); diff --git a/src/components/login.js b/src/components/login.js index 9b47ccd2..5caf7c52 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -1,14 +1,78 @@ -export const login = () =>{ - - const loginDiv = document.createElement('div'); - const nameApp = document.createElement('h1'); - nameApp.textContent = "Dad's Power Login"; - - loginDiv.appendChild(nameApp); - - - - - - return loginDiv; - } \ No newline at end of file +export const login = () => { + + const signinSection = document.createElement('section'); + signinSection.className = 'sectionSignup-in' + const titulo = document.createElement('h2'); + titulo.textContent = "Dad's Power"; + titulo.className = 'tituloh2register-login'; + signinSection.appendChild(titulo); + + const formSI = document.createElement('form'); + formSI.className = 'form'; + formSI.id = 'formularioSI'; + + const divUser = document.createElement('div'); + divUser.className = 'contenedorForm' + signinSection.appendChild(divUser); + divUser.appendChild(formSI); + + + const inputEmail = document.createElement('input'); + const labelEmail = document.createElement('label'); + labelEmail.textContent = 'E-mail'; + labelEmail.className = 'labelEmailLogin'; + + formSI.appendChild(labelEmail); + inputEmail.type = 'e-mail'; + inputEmail.className = 'email'; + inputEmail.id = 'idCorreoSU'; + inputEmail.placeholder = 'example@gmail.com' + formSI.appendChild(inputEmail); + + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSigninEmail = document.createElement('p'); + errorSigninEmail.className = 'message-error-email-login'; //aquí debe estar la diferencia en la className, distinto para email y pass + errorSigninEmail.textContent = 'Aquí va error para email'; + formSI.appendChild(errorSigninEmail); + + const inputPasword = document.createElement('input'); + const labelPassword = document.createElement('label'); + labelPassword.textContent = 'Password'; + labelPassword.className = 'labelPasswordLogin'; + formSI.appendChild(labelPassword); + inputPasword.type = 'password'; + inputPasword.textContent = 'password'; + inputPasword.className = 'password'; + inputPasword.id = 'idContraseñaSI'; + inputPasword.placeholder = '******' + formSI.appendChild(inputPasword); + + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSigninPassword = document.createElement('p'); + errorSigninPassword.className = 'message-error-password-login'; //aquí debe estar la diferencia en la className, distinto para email y pass + errorSigninPassword.textContent = 'Aquí va error para password'; + formSI.appendChild(errorSigninPassword); + + const buttonSI = document.createElement('button'); + buttonSI.type = 'submit'; + buttonSI.textContent = 'submit' + buttonSI.className = 'btnSubmit'; + buttonSI.id = 'btnEnviarSI'; + formSI.appendChild(buttonSI); + + const buttonGoogle = document.createElement('button'); + buttonGoogle.textContent = 'Sign in with Google' + buttonGoogle.type = 'button'; + buttonGoogle.className = 'btnGoogle'; + buttonGoogle.id = 'entrarGoogle'; + + const imagenGoogle = document.createElement('img'); + imagenGoogle.src = '/img/google.png'; + imagenGoogle.className = 'imgGoogle'; + + buttonGoogle.appendChild(imagenGoogle); + formSI.appendChild(buttonGoogle); + + + return signinSection; +} \ No newline at end of file diff --git a/src/components/register.js b/src/components/register.js index e47c6123..a4075431 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -3,10 +3,10 @@ import { onNavigate } from '../js/routes.js' export const register = () => { const signupSection = document.createElement('section'); - signupSection.className = 'sectionSignup' + signupSection.className = 'sectionSignup-in' const titulo = document.createElement('h2'); titulo.textContent = "Dad's Power"; - titulo.className = 'tituloh2register'; + titulo.className = 'tituloh2register-login'; signupSection.appendChild(titulo); const formSU = document.createElement('form'); @@ -75,20 +75,18 @@ export const register = () => { formSU.appendChild(buttonSU); const tienesCuenta = document.createElement('p'); - tienesCuenta.className = 'p-tienes-cuenta'; + tienesCuenta.className = 'p-tienes-cuenta-register'; tienesCuenta.textContent = 'Already have an account ?'; formSU.appendChild(tienesCuenta); - - - - - - const buttonLogin = document.createElement('li'); + const buttonLogin = document.createElement('a'); + buttonLogin.className = 'signin-a'; buttonLogin.textContent = 'Sign in'; buttonLogin.id = 'botonLoguear'; - signupSection.appendChild(buttonLogin); + + + tienesCuenta.appendChild(buttonLogin); buttonLogin.addEventListener('click', () => onNavigate('/login')); return signupSection; diff --git a/src/js/routes.js b/src/js/routes.js index 5b153923..bade75bf 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -22,11 +22,6 @@ export const onNavigate = (pathname) => { rootDiv.appendChild = (routes[pathname]()); }; - while(rootDiv.firstChild){ - rootDiv.removeChild(rootDiv.firstChild) - } - rootDiv.appendChild(routes[pathname]()); -}; const componentes = routes[window.location.pathname]; diff --git a/src/style.css b/src/style.css index b88f71a4..bc2249ce 100644 --- a/src/style.css +++ b/src/style.css @@ -7,17 +7,6 @@ } -/* BARRA NAVEGACIÓN */ - -.navBar { - background-color: rgb(154, 116, 190); - height: 80px; - width: 100%; - top: 80px; - left: 0; - display: flex; -} - @@ -70,7 +59,8 @@ input { .btnSubmit:hover { background: rgba(56, 52, 52, 0.5); } -input:hover{ + +input:hover { background: rgba(245, 236, 236, 0.5); } @@ -97,7 +87,8 @@ input:hover{ font-size: 16px; line-height: 25px; letter-spacing: 2px; - + border: none; + cursor: pointer; } @@ -128,27 +119,9 @@ input:hover{ padding: 0px 5px; } -.logoGoogle { - width: 17px; - height: 17px; - /*padding: 1%;*/ - margin: 0 0.5rem 0 0.5rem; -} - -.btnGoogle { - /* background: transparent;*/ - background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); - width: 108%; - height: 35px; - border-radius: 5px; - border: none; - color: beige; - text-align: center; - border: 2px blue; - border-style: solid; -} /* Estilos para vista HOME*/ + h1 { font-family: 'Fredoka One'; position: absolute; @@ -176,24 +149,47 @@ h5 { color: #f5efef; } +/* BARRA NAVEGACIÓN */ + +.navBarHome { + height: 40px; + width: 360px; + top: 5px; + left: 170px; + position: absolute; + z-index: 1; + +} + +.ul-home { + height: 40px; + width: 360px; + right: 0px; + justify-content: right; + +} + .navLink { display: inline-block; font-family: century Gothic; color: #575454; - padding-left: 20px; margin: 5px; text-align: right; + cursor: pointer; + color: #f5efef; + padding: 0 7px; + font-size: 14px; } /* Estilos para Vista REGISTER */ -.sectionSignup { +.sectionSignup-in { width: 360px; height: 800px; justify-content: center; background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.tituloh2register { +.tituloh2register-login { font-family: 'Fredoka One'; width: 300px; height: 47px; @@ -243,8 +239,201 @@ h5 { } /* Dar color más tenue al placeholder de los input */ -input::placeholder{ - color:#8F9CA3; +input::placeholder { + color: #8F9CA3; +} + +/* Estilos para los títulos de los labels de cada input */ +.usuario { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 55px; + /* left: 140px; */ +} + + + +.labelEmailLogin { + top: 25px; + left: 55px; + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 150%; + color: #52525C; + position: absolute; + +} + +.labelPasswordLogin { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 55px; + /* left: 141px; */ + top: 120px; + +} + +/* Estilos para mensaje de error */ + +.message-error-email-login { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #d16b49; + position: absolute; + left: 55px; + top: 97px; +} + +.message-error-password-login { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #d16b49; + position: absolute; + left: 55px; + top: 190px; +} +.p-tienes-cuenta-register { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 72px; + bottom: 60px; +} +/* Parrafo con enlace a sigin */ + +.p-tienes-cuenta { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 75px; + bottom: 60px; +} + +.enlace-signin { + font-family: 'Century Gothic'; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 150%; + color: #52525C; + position: absolute; + left: 60px; + bottom: 60px; +} + +.imgInicio { + width: 360px; + height: 800px; + z-index: 0; +} + +.signin-a { + text-decoration: underline; + color: #294074; + text-align: center; + cursor: pointer; + +} + +.imgGoogle { + width: 45px; + height: 45px; + /*padding: 1%;*/ + margin: -1.775rem .17rem 0rem 0rem; + padding: 0px; + display: flex; + align-items: baseline; + /* position: absolute; */ + left: 55px; + border: solid 1px #f5efef; + background-color: #f5efef; + border-radius: 5px; +} + +.btnGoogle { + /* background: transparent;*/ + /*background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); */ + width: 230px; + height: 45px; + border-radius: 5px; + border: none; + color: rgb(225, 220, 245); + text-align: center; + background-color: rgb(0, 81, 255); + cursor: pointer; + justify-content: center; + margin: 25px 30px 0px 30px; + /* padding-left: 30px; */ + font-size: 16px; + text-align: right; + padding-right: 30px; + padding-top: 10px; + box-shadow: 2px rgb(225, 220, 245); + +} + +/*estilos del SignUp*/ +.contenedorForm { + background: rgba(255, 255, 255, 0.32); + box-shadow: 0px 3px 10px rgba(46, 46, 66, 0.1); + display: flex; + flex-direction: column; + align-items: flex-start; + padding: 24px; + gap: 24px; + position: absolute; + width: 340px; + height: 460px; + left: 10px; + top: 190px; + border-radius: 30px; +} + +.form { + display: contents; + justify-content: center; + align-items: center; +} + +.password, +.email, +.username { + line-height: 24px; + color: #000000; + align-items: center; + text-align: center; + +} + +/* Dar color más tenue al placeholder de los input */ +input::placeholder { + color: #8F9CA3; } /* Estilos para los títulos de los labels de cada input */ @@ -297,7 +486,7 @@ input::placeholder{ line-height: 150%; color: #d16b49; position: absolute; - left: 111px; + left: 55px; top: 190px; } @@ -309,13 +498,13 @@ input::placeholder{ line-height: 150%; color: #d16b49; position: absolute; - left: 102px; + left: 55px; top: 285px; } /* Parrafo con enlace a sigin */ -.p-tienes-cuenta{ +.p-tienes-cuenta { font-family: 'Century Gothic'; font-style: normal; font-weight: 400; From 235c40edaf2d31da3da7ba914df439f993f77f0e Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 17 Jan 2023 12:05:13 -0500 Subject: [PATCH 34/73] Se muestra tercera vista-router del login.js con estilos definidos --- src/components/register.js | 3 +-- src/js/routes.js | 4 ++++ src/style.css | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/components/register.js b/src/components/register.js index 091cbd29..f64553a7 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -76,11 +76,10 @@ export const register = () => { const tienesCuenta = document.createElement('p'); tienesCuenta.className = 'p-tienes-cuenta'; - tienesCuenta.textContent = 'Already have an account ?'; + tienesCuenta.textContent = 'Already have an account?'; formSU.appendChild(tienesCuenta); - return signupSection; } diff --git a/src/js/routes.js b/src/js/routes.js index a270b577..21eaa160 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -23,4 +23,8 @@ const routes = { }; const componentes = routes[window.location.pathname]; +window.onpopstate = () =>{ + rootDiv.appendChild(componentes()); + }; + rootDiv.appendChild(componentes()); \ No newline at end of file diff --git a/src/style.css b/src/style.css index b88f71a4..7177a6f2 100644 --- a/src/style.css +++ b/src/style.css @@ -97,6 +97,8 @@ input:hover{ font-size: 16px; line-height: 25px; letter-spacing: 2px; + border: none; + } @@ -183,6 +185,7 @@ h5 { padding-left: 20px; margin: 5px; text-align: right; + line-height: 17px; } /* Estilos para Vista REGISTER */ From ca4c9d78a6c07462a2e3315b2006d9ae1dc5baa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 17 Jan 2023 17:21:21 -0300 Subject: [PATCH 35/73] signUp SignIn loginWithGoogle funcionando, con errores, solucionado error de los addeventlistener --- src/components/feed.js | 19 +++ src/components/login.js | 7 +- src/components/register.js | 4 +- src/js/routes.js | 5 +- src/main.js | 253 +++++++++++++++++-------------------- 5 files changed, 141 insertions(+), 147 deletions(-) create mode 100644 src/components/feed.js diff --git a/src/components/feed.js b/src/components/feed.js new file mode 100644 index 00000000..d6870bd4 --- /dev/null +++ b/src/components/feed.js @@ -0,0 +1,19 @@ +import { onNavigate } from '../js/routes.js' + +export const feed = () => { + + const feedSection = document.createElement('section'); + feedSection.className = 'section-feed'; + + const titulo = document.createElement('h2'); + titulo.textContent = "Dad's Power"; + titulo.className = 'tituloh2-feed'; + feedSection.appendChild(titulo); + + const Post = asdasd; + + + + return feedSection; + +} \ No newline at end of file diff --git a/src/components/login.js b/src/components/login.js index 5caf7c52..2b0dfe6a 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -25,14 +25,14 @@ export const login = () => { formSI.appendChild(labelEmail); inputEmail.type = 'e-mail'; inputEmail.className = 'email'; - inputEmail.id = 'idCorreoSU'; + inputEmail.id = 'idCorreoSI'; inputEmail.placeholder = 'example@gmail.com' formSI.appendChild(inputEmail); //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSigninEmail = document.createElement('p'); errorSigninEmail.className = 'message-error-email-login'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSigninEmail.textContent = 'Aquí va error para email'; + // errorSigninEmail.textContent = 'Aquí va error para email'; formSI.appendChild(errorSigninEmail); const inputPasword = document.createElement('input'); @@ -50,7 +50,7 @@ export const login = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSigninPassword = document.createElement('p'); errorSigninPassword.className = 'message-error-password-login'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSigninPassword.textContent = 'Aquí va error para password'; + // errorSigninPassword.textContent = 'Aquí va error para password'; formSI.appendChild(errorSigninPassword); const buttonSI = document.createElement('button'); @@ -73,6 +73,5 @@ export const login = () => { buttonGoogle.appendChild(imagenGoogle); formSI.appendChild(buttonGoogle); - return signinSection; } \ No newline at end of file diff --git a/src/components/register.js b/src/components/register.js index a4075431..e1e61149 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -44,7 +44,7 @@ export const register = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSignupEmail = document.createElement('p'); errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSignupEmail.textContent = 'Aquí va error para email'; + // errorSignupEmail.textContent = 'Aquí va error para email'; formSU.appendChild(errorSignupEmail); @@ -63,7 +63,7 @@ export const register = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSignupPassword = document.createElement('p'); errorSignupPassword.className ='message-error-password'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSignupPassword.textContent = 'Aquí va error para password'; + // errorSignupPassword.textContent = 'Aquí va error para password'; formSU.appendChild(errorSignupPassword); diff --git a/src/js/routes.js b/src/js/routes.js index bade75bf..ca4137eb 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,12 +1,15 @@ import { home } from '../components/Home.js'; import { register } from '../components/register.js'; import {login} from '../components/login.js'; + import {feed} from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { '/': home, '/register': register, - '/login': login, + '/login': login, + '/feed': feed, + }; export const onNavigate = (pathname) => { diff --git a/src/main.js b/src/main.js index 1861da08..2b29c9ed 100644 --- a/src/main.js +++ b/src/main.js @@ -1,152 +1,124 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; -import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +//import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; -import { login, register,loginWithGoogle,verificarSendingMail } from "./lib/firebase/methods.js"; +import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methods.js"; /*logout importar*/ + init(); const auth = getAuth(); -// TODO: Add SDKs for Firebase products that you want to use -// https://firebase.google.com/docs/web/setup#available-libraries - -// Your web app's Firebase configuration - - -// const modalSI = document.querySelector('#modalSI'); -// const modalSU = document.querySelector('#modalSU'); - -// /* abrieno modal sign up */ -// const openModalSU = () => { -// modalSU.style.display = 'flex'; -// }; - -// const closeModalSU = () => { -// modalSU.style.display = 'none'; -// }; - -// const btnOpenModalSU = document.getElementById('botonRegistrar'); -// btnOpenModalSU.addEventListener('click', openModalSU); - -// const btnCloseModalSU = document.getElementById('botonCerrarModalSU'); -// btnCloseModalSU.addEventListener('click', closeModalSU); - -// // open-close modal Sing in -// const openModalSI = () => { -// modalSI.style.display = 'flex'; -// }; - -// const closeModalSI = () => { -// modalSI.style.display = 'none'; -// }; -// const btnOpenModalSI = document.getElementById('botonLoguear'); -// btnOpenModalSI.addEventListener('click', openModalSI); - -// const btnCloseModalSI = document.getElementById('botonCerrarModalSI'); -// btnCloseModalSI.addEventListener('click', closeModalSI); +// Initialize Cloud Firestore and get a reference to the service + +// const fs = getFirestore(app); + + + +function validarCorreo(correo) { + const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + const valido = expReg.test(correo); + console.log(valido); + if (valido === true) { + console.log('valido'); + return true; + } if (valido === false) { + console.log('invalido'); + return false; + } +} + +// SIGN UP +const signupForm = document.getElementById('formularioSU'); +if(signupForm){ +signupForm.addEventListener("submit", async (e) => { + e.preventDefault(); // para cancelar el evento de reinicio del formulario + console.log(signupForm.value); + let signupEmail = ''; + + const valorCorreo = document.getElementById('idCorreoSU').value; + const posibleCorreo = validarCorreo(valorCorreo); + if (posibleCorreo === true) { + signupEmail = valorCorreo; + } else { + signupEmail = ''; + } + const signupPassword = document.getElementById('idContraseñaSU').value; + + // función de Firebase para registrar un usuario + try { + const resultado = await register(auth, valorCorreo, signupPassword); + verificarSendingMail(auth) + console.log(resultado); + signupForm.reset(); + signupForm.querySelector('.message-error-email').innerHTML = ''; + signupForm.querySelector('.message-error-password').innerHTML = ''; + +} + catch ({ code, message }) { + console.log(message); + // personalizando los mensajes de los 2 errores mas comunes + if (code === 'auth/email-already-in-use') { + signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' + } else if (code === 'auth/weak-password') { + signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } else { + signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores + } + } + console.log('signUp'); + +}); +}; + + + +// SIGN IN + +const signinForm = document.getElementById('formularioSI'); +if(signinForm){ +signinForm.addEventListener('submit', async (e) => { + e.preventDefault(); + const emailInput = document.getElementById('idCorreoSI').value; + const passwordInput = document.getElementById('idContraseñaSI').value; + try { + const { emailVerified, email } = await login(auth, emailInput, passwordInput) + + //console.log(emailVerified,email); + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (emailVerified) { + console.log('Bienvenid@', email); + } else { + + auth.signOut(); + console.log('Por favor realiza la verificación de tu cuenta'); + } + // console.log(emailVerified) /* verificando el observador */ -// // Initialize Cloud Firestore and get a reference to the service -// //const fs = getFirestore(app); + signinForm.reset(); + signinForm.querySelector('.message-error-email-login').innerHTML = ''; + signinForm.querySelector('.message-error-password-login').innerHTML = ''; -// function validarCorreo(correo) { -// const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; -// const valido = expReg.test(correo); -// console.log(valido); -// if (valido === true) { -// console.log('valido'); -// return true; -// } if (valido === false) { -// console.log('invalido'); -// return false; -// } -// } + } catch ({ code, message }) { + // console.log('error', error.message, error.code, error.response) -// // SIGN UP -// const signupForm = document.getElementById('formularioSU'); -// signupForm.addEventListener('submit', async (e) => { -// let signupEmail = ''; -// e.preventDefault(); // para cancelar el evento de reinicio del formulario -// const valorCorreo = document.getElementById('idCorreoSU').value; -// const posibleCorreo = validarCorreo(valorCorreo); -// if (posibleCorreo === true) { -// signupEmail = valorCorreo; -// } else { -// signupEmail = ''; -// } -// const signupPassword = document.getElementById('idContraseñaSU').value; + if (code === 'auth/user-not-found') { + signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; + } else if (code === 'auth/wrong-password') { + signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; + } else { + signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores + } + } -// // función de Firebase para registrar un usuario -// try { -// const resultado = await register(auth, valorCorreo, signupPassword); -// verificarSendingMail(auth) -// console.log(resultado); + console.log('signIn'); +}); +}; -// signupForm.querySelector('.message-error').innerHTML = ''; -// } -// catch ({ code, message }) { -// console.log(message); -// // personalizando los mensajes de los 2 errores mas comunes -// if (code === 'auth/email-already-in-use') { -// signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' -// } else if (code === 'auth/weak-password') { -// signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' -// } else { -// signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores -// } -// } -// console.log('signUp'); -// }); - - - -// // SIGN IN - -// const signinForm = document.getElementById('formularioSI'); -// signinForm.addEventListener('submit', async (e) => { -// e.preventDefault(); -// const emailInput = document.getElementById('idCorreoSI').value; -// const passwordInput = document.getElementById('idContraseñaSI').value; -// try { -// const { emailVerified, email } = await login(auth, emailInput, passwordInput) - -// //console.log(emailVerified,email); -// /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ -// if (emailVerified) { -// console.log('Bienvenid@', email); -// } else { - -// auth.signOut(); -// console.log('Por favor realiza la verificación de tu cuenta'); -// } -// // console.log(emailVerified) /* verificando el observador */ - -// closeModalSI(); - -// signinForm.reset(); -// signinForm.querySelector('.message-error').innerHTML = ''; - -// } catch ({ code, message }) { -// // console.log('error', error.message, error.code, error.response) - -// if (code === 'auth/user-not-found') { -// signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado'; -// } else if (code === 'auth/wrong-password') { -// signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario'; -// } else { -// signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores -// } -// } - -// console.log('signIn'); -// }); - -// export let mensajeErrorSI = signinForm.querySelector('.message-error').innerHTML = ""; - // // LOGOUT // /*const logout = document.getElementById('salir'); // logout.addEventListener('click', () => { @@ -154,11 +126,12 @@ const auth = getAuth(); // });*/ -// // GOOGLE LOGIN -// const googleButton = document.getElementById('entrarGoogle') -// googleButton.addEventListener('click', (e) => { -// e. preventDefault(); -// loginWithGoogle(auth); -// closeModalSI(); -// signinForm.reset(); -// }); +// GOOGLE LOGIN +const googleButton = document.getElementById('entrarGoogle') +if(googleButton){ +googleButton.addEventListener('click', (e) => { + e. preventDefault(); + loginWithGoogle(auth); + signinForm.reset(); +}); +}; From 4a51ee2410063afd7f7a216b502209db7c06e5eb Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 17 Jan 2023 15:31:54 -0500 Subject: [PATCH 36/73] Se soluciono error en register.js y en login.js-funcionalidad del boton login con google --- src/js/routes.js | 4 ++-- src/style.css | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/js/routes.js b/src/js/routes.js index 6fcb21cd..d0a3376b 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -26,8 +26,8 @@ export const onNavigate = (pathname) => { const componentes = routes[window.location.pathname]; window.onpopstate = () =>{ -rootDiv.appendChild(componentes()); -}; +}; +rootDiv.appendChild(componentes()); diff --git a/src/style.css b/src/style.css index ce676601..c501e98b 100644 --- a/src/style.css +++ b/src/style.css @@ -357,8 +357,8 @@ input::placeholder { } .imgGoogle { - width: 45px; - height: 45px; + width: 35px; + height: 35px; /*padding: 1%;*/ margin: -1.775rem .17rem 0rem 0rem; padding: 0px; @@ -368,28 +368,28 @@ input::placeholder { left: 55px; border: solid 1px #f5efef; background-color: #f5efef; - border-radius: 5px; + border-radius: 2px; } .btnGoogle { /* background: transparent;*/ /*background: linear-gradient(294deg, rgba(238, 174, 202, 1) 0%, rgba(148, 187, 233, 1) 100%); */ - width: 230px; - height: 45px; - border-radius: 5px; + width: 219px; + height: 35px; + border-radius: 3px; border: none; color: rgb(225, 220, 245); text-align: center; background-color: rgb(0, 81, 255); cursor: pointer; justify-content: center; - margin: 25px 30px 0px 30px; + margin: 25px 30px 0px 38px; /* padding-left: 30px; */ font-size: 16px; text-align: right; - padding-right: 30px; + padding-right: 28px; padding-top: 10px; - box-shadow: 2px rgb(225, 220, 245); + text-shadow: 1px 0 1px #ffffff ; } From 6e513df2e9ea1de742598a25df6abbf24b65171f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 17 Jan 2023 15:44:03 -0500 Subject: [PATCH 37/73] 2 primeras vistas con touter --- src/components/login.js | 6 +- src/components/register.js | 4 +- src/main.js | 198 +++++++++++++++++++------------------ 3 files changed, 105 insertions(+), 103 deletions(-) diff --git a/src/components/login.js b/src/components/login.js index 5caf7c52..bdba0c55 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -25,14 +25,14 @@ export const login = () => { formSI.appendChild(labelEmail); inputEmail.type = 'e-mail'; inputEmail.className = 'email'; - inputEmail.id = 'idCorreoSU'; + inputEmail.id = 'idCorreoSI'; inputEmail.placeholder = 'example@gmail.com' formSI.appendChild(inputEmail); //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSigninEmail = document.createElement('p'); errorSigninEmail.className = 'message-error-email-login'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSigninEmail.textContent = 'Aquí va error para email'; + // errorSigninEmail.textContent = 'Aquí va error para email'; formSI.appendChild(errorSigninEmail); const inputPasword = document.createElement('input'); @@ -50,7 +50,7 @@ export const login = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSigninPassword = document.createElement('p'); errorSigninPassword.className = 'message-error-password-login'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSigninPassword.textContent = 'Aquí va error para password'; + // errorSigninPassword.textContent = 'Aquí va error para password'; formSI.appendChild(errorSigninPassword); const buttonSI = document.createElement('button'); diff --git a/src/components/register.js b/src/components/register.js index a4075431..68f27f4f 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -44,7 +44,7 @@ export const register = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSignupEmail = document.createElement('p'); errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSignupEmail.textContent = 'Aquí va error para email'; + //errorSignupEmail.textContent = 'Aquí va error para email'; formSU.appendChild(errorSignupEmail); @@ -63,7 +63,7 @@ export const register = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSignupPassword = document.createElement('p'); errorSignupPassword.className ='message-error-password'; //aquí debe estar la diferencia en la className, distinto para email y pass - errorSignupPassword.textContent = 'Aquí va error para password'; + // errorSignupPassword.textContent = 'Aquí va error para password'; formSU.appendChild(errorSignupPassword); diff --git a/src/main.js b/src/main.js index 1861da08..0440f90e 100644 --- a/src/main.js +++ b/src/main.js @@ -1,10 +1,10 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; -import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +// import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; -import { login, register,loginWithGoogle,verificarSendingMail } from "./lib/firebase/methods.js"; -/*logout importar*/ +import { login, loginWithGoogle, register, verificarSendingMail } from "./lib/firebase/methods.js"; +/*logout, importar*/ init(); const auth = getAuth(); @@ -53,112 +53,114 @@ const auth = getAuth(); -// function validarCorreo(correo) { -// const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; -// const valido = expReg.test(correo); -// console.log(valido); -// if (valido === true) { -// console.log('valido'); -// return true; -// } if (valido === false) { -// console.log('invalido'); -// return false; -// } -// } +function validarCorreo(correo) { + const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + const valido = expReg.test(correo); + console.log(valido); + if (valido === true) { + console.log('valido'); + return true; + } if (valido === false) { + console.log('invalido'); + return false; + } +} // // SIGN UP -// const signupForm = document.getElementById('formularioSU'); -// signupForm.addEventListener('submit', async (e) => { -// let signupEmail = ''; -// e.preventDefault(); // para cancelar el evento de reinicio del formulario -// const valorCorreo = document.getElementById('idCorreoSU').value; -// const posibleCorreo = validarCorreo(valorCorreo); -// if (posibleCorreo === true) { -// signupEmail = valorCorreo; -// } else { -// signupEmail = ''; -// } -// const signupPassword = document.getElementById('idContraseñaSU').value; - -// // función de Firebase para registrar un usuario -// try { -// const resultado = await register(auth, valorCorreo, signupPassword); -// verificarSendingMail(auth) -// console.log(resultado); - -// signupForm.querySelector('.message-error').innerHTML = ''; -// } -// catch ({ code, message }) { -// console.log(message); -// // personalizando los mensajes de los 2 errores mas comunes -// if (code === 'auth/email-already-in-use') { -// signupForm.querySelector('.message-error').innerHTML = 'El Email ya se encuentra registrado' -// } else if (code === 'auth/weak-password') { -// signupForm.querySelector('.message-error').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' -// } else { -// signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores -// } -// } -// console.log('signUp'); -// }); +const signupForm = document.getElementById('formularioSU'); +signupForm.addEventListener('submit', async (e) => { + e.preventDefault(); // para cancelar el evento de reinicio del formulario + var signupEmail = ''; + const valorCorreo = document.getElementById('idCorreoSU').value; + const posibleCorreo = validarCorreo(valorCorreo); + if (posibleCorreo === true) { + signupEmail = valorCorreo; + } else { + signupEmail = ''; + } + const signupPassword = document.getElementById('idContraseñaSU').value; + + // función de Firebase para registrar un usuario + try { + const resultado = await register(auth, valorCorreo, signupPassword); + verificarSendingMail(auth) + console.log(resultado); + + signupForm.querySelector('.message-error-email').innerHTML = ''; + signupForm.querySelector('.message-error-password').innerHTML = ''; + + } + catch ({ code, message }) { + console.log(message); + // personalizando los mensajes de los 2 errores mas comunes + if (code === 'auth/email-already-in-use') { + signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' + } else if (code === 'auth/weak-password') { + signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } else { + signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores + } + } + console.log('signUp'); +}); // // SIGN IN -// const signinForm = document.getElementById('formularioSI'); -// signinForm.addEventListener('submit', async (e) => { -// e.preventDefault(); -// const emailInput = document.getElementById('idCorreoSI').value; -// const passwordInput = document.getElementById('idContraseñaSI').value; -// try { -// const { emailVerified, email } = await login(auth, emailInput, passwordInput) - -// //console.log(emailVerified,email); -// /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ -// if (emailVerified) { -// console.log('Bienvenid@', email); -// } else { - -// auth.signOut(); -// console.log('Por favor realiza la verificación de tu cuenta'); -// } -// // console.log(emailVerified) /* verificando el observador */ - -// closeModalSI(); - -// signinForm.reset(); -// signinForm.querySelector('.message-error').innerHTML = ''; - -// } catch ({ code, message }) { -// // console.log('error', error.message, error.code, error.response) - -// if (code === 'auth/user-not-found') { -// signinForm.querySelector('.message-error').innerHTML = 'El Usuario no se encuentra registrado'; -// } else if (code === 'auth/wrong-password') { -// signinForm.querySelector('.message-error').innerHTML = 'La Contraseña no corresponde al usuario'; -// } else { -// signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores -// } -// } - -// console.log('signIn'); -// }); - -// export let mensajeErrorSI = signinForm.querySelector('.message-error').innerHTML = ""; +const signinForm = document.getElementById('formularioSI'); +signinForm.addEventListener('submit', async (e) => { + e.preventDefault(); + const emailInput = document.getElementById('idCorreoSI').value; + const passwordInput = document.getElementById('idContraseñaSI').value; + try { + const { emailVerified, email } = await login(auth, emailInput, passwordInput) + + //console.log(emailVerified,email); + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (emailVerified) { + console.log('Bienvenid@', email); + } else { + + auth.signOut(); + console.log('Por favor realiza la verificación de tu cuenta'); + } + // console.log(emailVerified) /* verificando el observador */ + + closeModalSI(); + + signinForm.reset(); + signinForm.querySelector('.message-error-email-login').innerHTML = ''; + signinForm.querySelector('.message-error-password-login').innerHTML = ''; + + } catch ({ code, message }) { + // console.log('error', error.message, error.code, error.response) + + if (code === 'auth/user-not-found') { + signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; + } else if (code === 'auth/wrong-password') { + signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; + } else { + signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores + } + } + + console.log('signIn'); +}); + // // LOGOUT // /*const logout = document.getElementById('salir'); // logout.addEventListener('click', () => { // logOut(auth) - + // });*/ -// // GOOGLE LOGIN -// const googleButton = document.getElementById('entrarGoogle') -// googleButton.addEventListener('click', (e) => { -// e. preventDefault(); -// loginWithGoogle(auth); -// closeModalSI(); -// signinForm.reset(); -// }); +// GOOGLE LOGIN +const googleButton = document.getElementById('entrarGoogle') +googleButton.addEventListener('click', (e) => { + e.preventDefault(); + loginWithGoogle(auth); + closeModalSI(); + signinForm.reset(); +}); From 8ee0e535b6bcb6c0714fa05068494e7d41572f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 17 Jan 2023 21:29:14 -0500 Subject: [PATCH 38/73] 3 primeras vistas con router y estilos --- src/components/Home.js | 5 +- src/components/feed.js | 2 +- src/components/register.js | 4 - src/js/routes.js | 23 +++-- src/main.js | 189 +++++++++++++++++++------------------ 5 files changed, 109 insertions(+), 114 deletions(-) diff --git a/src/components/Home.js b/src/components/Home.js index 28924697..04f95b2b 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -23,15 +23,12 @@ export const home = () => { buttonLogin.textContent = 'Sign in / login'; buttonLogin.id = 'botonLoguear'; - buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonLogin.addEventListener('click', () => onNavigate('/login')); listaBotones.appendChild(buttonRegister); listaBotones.appendChild(buttonLogin); - buttonRegister.addEventListener('click', () => onNavigate('/register')); - buttonLogin.addEventListener('click', () => onNavigate('/login')); - const sectionDiv = document.createElement('section'); sectionDiv.className = 'bienvenida'; const bienvenidaH5 = document.createElement('h5'); diff --git a/src/components/feed.js b/src/components/feed.js index d6870bd4..5b943cae 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -10,7 +10,7 @@ export const feed = () => { titulo.className = 'tituloh2-feed'; feedSection.appendChild(titulo); - const Post = asdasd; + //const Post = asdasd; diff --git a/src/components/register.js b/src/components/register.js index c060e669..e1e61149 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -44,11 +44,7 @@ export const register = () => { //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass const errorSignupEmail = document.createElement('p'); errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass -<<<<<<< HEAD - //errorSignupEmail.textContent = 'Aquí va error para email'; -======= // errorSignupEmail.textContent = 'Aquí va error para email'; ->>>>>>> ca4c9d78a6c07462a2e3315b2006d9ae1dc5baa8 formSU.appendChild(errorSignupEmail); diff --git a/src/js/routes.js b/src/js/routes.js index ca4137eb..41a3325f 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,7 +1,7 @@ -import { home } from '../components/Home.js'; +import { home } from '../components/home.js'; import { register } from '../components/register.js'; - import {login} from '../components/login.js'; - import {feed} from '../components/feed.js'; +import { login } from '../components/login.js'; +import { feed } from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { @@ -9,27 +9,26 @@ const routes = { '/register': register, '/login': login, '/feed': feed, - }; -export const onNavigate = (pathname) => { +export const onNavigate = (pathname) => { //se cambia la ruta window.history.pushState( {}, pathname, window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// ); - while(rootDiv.firstChild){ + while (rootDiv.firstChild) { rootDiv.removeChild(rootDiv.firstChild); } - - rootDiv.appendChild = (routes[pathname]()); - }; - + rootDiv.appendChild(routes[pathname]()); +}; + + const componentes = routes[window.location.pathname]; -window.onpopstate = () =>{ -rootDiv.appendChild(componentes()); +window.onpopstate = () => { + rootDiv.appendChild(componentes()); }; rootDiv.appendChild(componentes()); diff --git a/src/main.js b/src/main.js index 029fb5b8..a42517b4 100644 --- a/src/main.js +++ b/src/main.js @@ -4,73 +4,72 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth //import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methods.js"; -/*logout importar*/ - +/*logout importar*/ +// import { onNavigate } from "./js/routes.js"; init(); const auth = getAuth(); - // Initialize Cloud Firestore and get a reference to the service // const fs = getFirestore(app); - function validarCorreo(correo) { - const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; - const valido = expReg.test(correo); - console.log(valido); - if (valido === true) { - console.log('valido'); - return true; - } if (valido === false) { - console.log('invalido'); - return false; - } + const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + const valido = expReg.test(correo); + console.log(valido); + if (valido === true) { + console.log('valido'); + return true; + } if (valido === false) { + console.log('invalido'); + return false; + } } // SIGN UP const signupForm = document.getElementById('formularioSU'); -if(signupForm){ -signupForm.addEventListener("submit", async (e) => { - e.preventDefault(); // para cancelar el evento de reinicio del formulario - console.log(signupForm.value); - let signupEmail = ''; - - const valorCorreo = document.getElementById('idCorreoSU').value; - const posibleCorreo = validarCorreo(valorCorreo); - if (posibleCorreo === true) { - signupEmail = valorCorreo; - } else { - signupEmail = ''; - } - const signupPassword = document.getElementById('idContraseñaSU').value; - - // función de Firebase para registrar un usuario - try { - const resultado = await register(auth, valorCorreo, signupPassword); - verificarSendingMail(auth) - console.log(resultado); - signupForm.reset(); - signupForm.querySelector('.message-error-email').innerHTML = ''; - signupForm.querySelector('.message-error-password').innerHTML = ''; - -} - catch ({ code, message }) { - console.log(message); - // personalizando los mensajes de los 2 errores mas comunes - if (code === 'auth/email-already-in-use') { - signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' - } else if (code === 'auth/weak-password') { - signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' - } else { - signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores - } - } - console.log('signUp'); - -}); +if (signupForm) { + signupForm.addEventListener("submit", async (e) => { + e.preventDefault(); // para cancelar el evento de reinicio del formulario + console.log(signupForm.value); + let signupEmail = ''; + + const valorCorreo = document.getElementById('idCorreoSU').value; + const posibleCorreo = validarCorreo(valorCorreo); + if (posibleCorreo === true) { + signupEmail = valorCorreo; + } else { + signupEmail = ''; + } + const signupPassword = document.getElementById('idContraseñaSU').value; +console.log('idContraseñaSU'); + // función de Firebase para registrar un usuario + try { + const resultado = await register(auth, valorCorreo, signupPassword); + verificarSendingMail(auth) + console.log(resultado); + signupForm.reset(); + signupForm.querySelector('.message-error-email').innerHTML = ''; + signupForm.querySelector('.message-error-password').innerHTML = ''; + + } + catch ({ code, message }) { + console.log(message); + // personalizando los mensajes de los 2 errores mas comunes + if (code === 'auth/email-already-in-use') { + signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' + } else if (code === 'auth/weak-password') { + signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } + // else { + // signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores + // } + } + console.log('signUp'); + + }); }; @@ -78,47 +77,51 @@ signupForm.addEventListener("submit", async (e) => { // SIGN IN const signinForm = document.getElementById('formularioSI'); -if(signinForm){ -signinForm.addEventListener('submit', async (e) => { - e.preventDefault(); - const emailInput = document.getElementById('idCorreoSI').value; - const passwordInput = document.getElementById('idContraseñaSI').value; - try { - const { emailVerified, email } = await login(auth, emailInput, passwordInput) - - //console.log(emailVerified,email); - /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ - if (emailVerified) { - console.log('Bienvenid@', email); - } else { - - auth.signOut(); - console.log('Por favor realiza la verificación de tu cuenta'); - } - // console.log(emailVerified) /* verificando el observador */ +if (signinForm) { + signinForm.addEventListener('submit', async (e) => { + e.preventDefault(); + const emailInput = document.getElementById('idCorreoSI').value; + const passwordInput = document.getElementById('idContraseñaSI').value; + try { + const { emailVerified, email } = await login(auth, emailInput, passwordInput) + //console.log(emailVerified,email); + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (emailVerified) { + // onNavigate('/feed'); - signinForm.reset(); - signinForm.querySelector('.message-error-email-login').innerHTML = ''; - signinForm.querySelector('.message-error-password-login').innerHTML = ''; + console.log('Bienvenid@', email); + } else { - } catch ({ code, message }) { - // console.log('error', error.message, error.code, error.response) + auth.signOut(); + console.log('Por favor realiza la verificación de tu cuenta'); + } + // console.log(emailVerified) /* verificando el observador */ + + + signinForm.reset(); + signinForm.querySelector('.message-error-email-login').innerHTML = ''; + signinForm.querySelector('.message-error-password-login').innerHTML = ''; - if (code === 'auth/user-not-found') { - signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; - } else if (code === 'auth/wrong-password') { - signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; - } else { - signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores - } - } - console.log('signIn'); -}); + } catch ({ code, message }) { + // console.log('error', error.message, error.code, error.response) + + if (code === 'auth/user-not-found') { + signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; + } else if (code === 'auth/wrong-password') { + signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; + } + // else { + // signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores + // } + } + + console.log('signIn'); + }); }; - + // // LOGOUT // /*const logout = document.getElementById('salir'); // logout.addEventListener('click', () => { @@ -128,10 +131,10 @@ signinForm.addEventListener('submit', async (e) => { // GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') -if(googleButton){ -googleButton.addEventListener('click', (e) => { - e. preventDefault(); - loginWithGoogle(auth); - signinForm.reset(); -}); +if (googleButton) { + googleButton.addEventListener('click', (e) => { + e.preventDefault(); + loginWithGoogle(auth); + signinForm.reset(); + }); }; From a0f41d0606390abe413357568c8500d822c9c14f Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 17 Jan 2023 21:30:10 -0500 Subject: [PATCH 39/73] Se muestra cuarta vista-feed.js con estilos/por completar los posts --- src/components/Home.js | 5 +- src/components/feed.js | 15 ++- src/components/imagen/avatar.png | Bin 0 -> 22299 bytes src/js/routes.js | 2 +- src/main.js | 188 ++++++++++++++++--------------- src/style.css | 43 ++++++- 6 files changed, 149 insertions(+), 104 deletions(-) create mode 100644 src/components/imagen/avatar.png diff --git a/src/components/Home.js b/src/components/Home.js index 28924697..04f95b2b 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -23,15 +23,12 @@ export const home = () => { buttonLogin.textContent = 'Sign in / login'; buttonLogin.id = 'botonLoguear'; - buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonLogin.addEventListener('click', () => onNavigate('/login')); listaBotones.appendChild(buttonRegister); listaBotones.appendChild(buttonLogin); - buttonRegister.addEventListener('click', () => onNavigate('/register')); - buttonLogin.addEventListener('click', () => onNavigate('/login')); - const sectionDiv = document.createElement('section'); sectionDiv.className = 'bienvenida'; const bienvenidaH5 = document.createElement('h5'); diff --git a/src/components/feed.js b/src/components/feed.js index d6870bd4..f88fcfa4 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -9,9 +9,20 @@ export const feed = () => { titulo.textContent = "Dad's Power"; titulo.className = 'tituloh2-feed'; feedSection.appendChild(titulo); - - const Post = asdasd; + + const perfil = document.createElement('div') + perfil.className = 'avatarUser'; + // const username = document.getElementById('idUsername'); + // username.id = 'idUsername'; + // perfil.appendChild(username); + // perfil.type = 'file' + const avatarImg = document.createElement('img'); + avatarImg.className = 'avatarImg'; + avatarImg.src = '/components/imagen/avatar.png'; + perfil.appendChild(avatarImg); + feedSection.appendChild(perfil); + const fondo = document.createElement('section') return feedSection; diff --git a/src/components/imagen/avatar.png b/src/components/imagen/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..17cc8be85f409e5c5d758a8a92274df97214b990 GIT binary patch literal 22299 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 KqFbx&825i5hA9mI literal 0 HcmV?d00001 diff --git a/src/js/routes.js b/src/js/routes.js index 76c46fd4..0c9fd146 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -22,7 +22,7 @@ export const onNavigate = (pathname) => { rootDiv.removeChild(rootDiv.firstChild); } - rootDiv.appendChild = (routes[pathname]()); + rootDiv.appendChild(routes[pathname]()); }; diff --git a/src/main.js b/src/main.js index 2b29c9ed..df8ed604 100644 --- a/src/main.js +++ b/src/main.js @@ -1,10 +1,12 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; +import { onNavigate } from "./js/routes.js"; //import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methods.js"; -/*logout importar*/ + +/*logout importar*/ init(); const auth = getAuth(); @@ -32,45 +34,45 @@ function validarCorreo(correo) { // SIGN UP const signupForm = document.getElementById('formularioSU'); -if(signupForm){ -signupForm.addEventListener("submit", async (e) => { - e.preventDefault(); // para cancelar el evento de reinicio del formulario - console.log(signupForm.value); - let signupEmail = ''; - - const valorCorreo = document.getElementById('idCorreoSU').value; - const posibleCorreo = validarCorreo(valorCorreo); - if (posibleCorreo === true) { - signupEmail = valorCorreo; - } else { - signupEmail = ''; - } - const signupPassword = document.getElementById('idContraseñaSU').value; +if (signupForm) { + signupForm.addEventListener("submit", async (e) => { + e.preventDefault(); // para cancelar el evento de reinicio del formulario + console.log(signupForm.value); + let signupEmail = ''; + + const valorCorreo = document.getElementById('idCorreoSU').value; + const posibleCorreo = validarCorreo(valorCorreo); + if (posibleCorreo === true) { + signupEmail = valorCorreo; + } else { + signupEmail = ''; + } + const signupPassword = document.getElementById('idContraseñaSU').value; - // función de Firebase para registrar un usuario - try { - const resultado = await register(auth, valorCorreo, signupPassword); - verificarSendingMail(auth) - console.log(resultado); - signupForm.reset(); - signupForm.querySelector('.message-error-email').innerHTML = ''; - signupForm.querySelector('.message-error-password').innerHTML = ''; + // función de Firebase para registrar un usuario + try { + const resultado = await register(auth, valorCorreo, signupPassword); + verificarSendingMail(auth) + console.log(resultado); + signupForm.reset(); + signupForm.querySelector('.message-error-email').innerHTML = ''; + signupForm.querySelector('.message-error-password').innerHTML = ''; -} - catch ({ code, message }) { - console.log(message); - // personalizando los mensajes de los 2 errores mas comunes - if (code === 'auth/email-already-in-use') { - signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' - } else if (code === 'auth/weak-password') { - signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' - } else { - signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores } - } - console.log('signUp'); + catch ({ code, message }) { + console.log(message); + // personalizando los mensajes de los 2 errores mas comunes + if (code === 'auth/email-already-in-use') { + signupForm.querySelector('.message-error-email').innerHTML = 'El Email ya se encuentra registrado' + } else if (code === 'auth/weak-password') { + signupForm.querySelector('.message-error-password').innerHTML = 'La Contraseña debe tener al menos 6 carácteres' + } else { + signupForm.querySelector('.message-error').innerHTML = message; // mensajes por defecto de los otros posibles errores + } + } + console.log('signUp'); -}); + }); }; @@ -78,60 +80,62 @@ signupForm.addEventListener("submit", async (e) => { // SIGN IN const signinForm = document.getElementById('formularioSI'); -if(signinForm){ -signinForm.addEventListener('submit', async (e) => { - e.preventDefault(); - const emailInput = document.getElementById('idCorreoSI').value; - const passwordInput = document.getElementById('idContraseñaSI').value; - try { - const { emailVerified, email } = await login(auth, emailInput, passwordInput) - - //console.log(emailVerified,email); - /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ - if (emailVerified) { - console.log('Bienvenid@', email); - } else { - - auth.signOut(); - console.log('Por favor realiza la verificación de tu cuenta'); - } - // console.log(emailVerified) /* verificando el observador */ - - - signinForm.reset(); - signinForm.querySelector('.message-error-email-login').innerHTML = ''; - signinForm.querySelector('.message-error-password-login').innerHTML = ''; - - - } catch ({ code, message }) { - // console.log('error', error.message, error.code, error.response) - - if (code === 'auth/user-not-found') { - signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; - } else if (code === 'auth/wrong-password') { - signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; - } else { - signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores - } - } - - console.log('signIn'); -}); -}; - -// // LOGOUT -// /*const logout = document.getElementById('salir'); -// logout.addEventListener('click', () => { -// logOut(auth) - -// });*/ - -// GOOGLE LOGIN -const googleButton = document.getElementById('entrarGoogle') -if(googleButton){ -googleButton.addEventListener('click', (e) => { - e. preventDefault(); - loginWithGoogle(auth); - signinForm.reset(); -}); +if (signinForm) { + signinForm.addEventListener('submit', async (e) => { + e.preventDefault(); + const emailInput = document.getElementById('idCorreoSI').value; + const passwordInput = document.getElementById('idContraseñaSI').value; + try { + const { emailVerified, email } = await login(auth, emailInput, passwordInput) + + //console.log(emailVerified,email); + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + if (emailVerified) { + onNavigate('/feed'); + console.log('Bienvenid@', email); + } else { + + /* auth.signOut();*/ + console.log('Por favor realiza la verificación de tu cuenta'); + } + // console.log(emailVerified) /* verificando el observador */ + + + signinForm.reset(); + signinForm.querySelector('.message-error-email-login').innerHTML = ''; + signinForm.querySelector('.message-error-password-login').innerHTML = ''; + + + } catch ({ code, message }) { + // console.log('error', error.message, error.code, error.response) + + if (code === 'auth/user-not-found') { + signinForm.querySelector('.message-error-email-login').innerHTML = 'El Usuario no se encuentra registrado'; + } else if (code === 'auth/wrong-password') { + signinForm.querySelector('.message-error-password-login').innerHTML = 'La Contraseña no corresponde al usuario'; + // } else { + // signinForm.querySelector('.message-error').innerHTML = message; //mensajes por defecto de los otros posibles errores + // } + } + + console.log('signIn'); + }; + }); }; + + // // LOGOUT + // /*const logout = document.getElementById('salir'); + // logout.addEventListener('click', () => { + // logOut(auth) + + // });*/ + + // GOOGLE LOGIN + const googleButton = document.getElementById('entrarGoogle') + if (googleButton) { + googleButton.addEventListener('click', (e) => { + e.preventDefault(); + loginWithGoogle(auth); + signinForm.reset(); + }); + }; diff --git a/src/style.css b/src/style.css index c501e98b..43fcd8c3 100644 --- a/src/style.css +++ b/src/style.css @@ -184,7 +184,7 @@ h5 { background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.tituloh2register-login { +.tituloh2register-login{ font-family: 'Fredoka One'; width: 300px; height: 47px; @@ -357,8 +357,8 @@ input::placeholder { } .imgGoogle { - width: 35px; - height: 35px; + width: 34px; + height: 33.4px; /*padding: 1%;*/ margin: -1.775rem .17rem 0rem 0rem; padding: 0px; @@ -366,9 +366,10 @@ input::placeholder { align-items: baseline; /* position: absolute; */ left: 55px; - border: solid 1px #f5efef; background-color: #f5efef; - border-radius: 2px; + border: 6px solid #f5efef ; + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; } .btnGoogle { @@ -380,6 +381,7 @@ input::placeholder { border: none; color: rgb(225, 220, 245); text-align: center; + border: 1px solid rgb(0, 81, 255); background-color: rgb(0, 81, 255); cursor: pointer; justify-content: center; @@ -526,4 +528,35 @@ input::placeholder { .imgInicio { width: 360px; height: 800px; +} + +.tituloh2-feed { + font-family: 'Fredoka One'; + width: 300px; + height: 47px; + text-align: center; + font-style: normal; + font-weight: 400; + font-size: 35px; + line-height: 42px; + color: rgba(255, 242, 242, 0.25); + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + margin: 0; + position: absolute; + top: 25px; + left: 19px +} + +.avatarImg{ + width: 65px; + height: 65px; + position: absolute; + right: 12px; + top:12px +} +.section-feed { + width: 360px; + height: 800px; + justify-content: center; + background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } \ No newline at end of file From b5e9506413cd7c90309ad54422873a1f32f4a06f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Wed, 18 Jan 2023 11:15:45 -0500 Subject: [PATCH 40/73] 3 primeras vistas con router y estilos --- src/components/login.js | 7 ++++--- src/components/register.js | 1 + src/main.js | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/components/login.js b/src/components/login.js index 2b0dfe6a..cb6da987 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -9,6 +9,7 @@ export const login = () => { const formSI = document.createElement('form'); formSI.className = 'form'; + formSI.method = 'post'; formSI.id = 'formularioSI'; const divUser = document.createElement('div'); @@ -20,8 +21,8 @@ export const login = () => { const inputEmail = document.createElement('input'); const labelEmail = document.createElement('label'); labelEmail.textContent = 'E-mail'; - labelEmail.className = 'labelEmailLogin'; - + labelEmail.className = 'labelEmailLogin'; + formSI.appendChild(labelEmail); inputEmail.type = 'e-mail'; inputEmail.className = 'email'; @@ -70,7 +71,7 @@ export const login = () => { imagenGoogle.src = '/img/google.png'; imagenGoogle.className = 'imgGoogle'; - buttonGoogle.appendChild(imagenGoogle); + buttonGoogle.appendChild(imagenGoogle); formSI.appendChild(buttonGoogle); return signinSection; diff --git a/src/components/register.js b/src/components/register.js index e1e61149..04342441 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -11,6 +11,7 @@ export const register = () => { const formSU = document.createElement('form'); formSU.className = 'form'; + formSU.method = 'post'; formSU.id = 'formularioSU'; const divUser = document.createElement('div'); diff --git a/src/main.js b/src/main.js index 174b96de..dfc734c5 100644 --- a/src/main.js +++ b/src/main.js @@ -87,7 +87,7 @@ if (signinForm) { const { emailVerified, email } = await login(auth, emailInput, passwordInput) //console.log(emailVerified,email); - /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del cooreo electrónico enviado */ + /* permitir acceder a la página a solo los usuarios que hayan verificado su cuenta a través del correo electrónico enviado */ if (emailVerified) { onNavigate('/feed'); console.log('Bienvenid@', email); From bbeec2719bf48791a422970441cea8c5dc3b5a61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Wed, 18 Jan 2023 13:27:34 -0300 Subject: [PATCH 41/73] =?UTF-8?q?actualizaci=C3=B3n=20desde=20push=20de=20?= =?UTF-8?q?jhoa,=20se=20agreg=C3=B3=20contenido=20a=20vista=20feed,=20se?= =?UTF-8?q?=20agreg=C3=B3=20metodo=20post=20a=20formularios=20de=20registe?= =?UTF-8?q?r=20y=20login?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3ddc501d..7f7b404f 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ node_modules/ .yarn.lock package-lock.json config.js +Register.js From 0474e6ffd867d9f1c59dc9e4fd4b58810decb440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Wed, 18 Jan 2023 17:18:34 -0300 Subject: [PATCH 42/73] se agrega input al feed para post, se comienza a trabjar con grid en css --- src/components/feed.js | 20 ++++++- src/style.css | 117 +++++++++++++++++++++++++---------------- 2 files changed, 90 insertions(+), 47 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index f88fcfa4..7b693362 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -22,7 +22,25 @@ export const feed = () => { perfil.appendChild(avatarImg); feedSection.appendChild(perfil); - const fondo = document.createElement('section') + const postDiv = document.createElement('div'); + postDiv.className = 'post-div'; + feedSection.appendChild(postDiv); + + const post = document.createElement('input'); + post.type = 'text'; + post.className ='post-input'; + post.placeholder = 'what do you need?'; + post.id = 'idPost'; + postDiv.appendChild(post); + + const postButton = document.createElement('button'); + postButton.className = 'post-btn'; + postButton.id = 'idPostButton'; + postButton.textContent = 'Help!'; + postDiv.appendChild(postButton); + + + return feedSection; diff --git a/src/style.css b/src/style.css index 43fcd8c3..bc5c98c6 100644 --- a/src/style.css +++ b/src/style.css @@ -37,18 +37,7 @@ } -input { - backdrop-filter: blur(15px); - width: 240px; - height: 45px; - border: transparent; - margin: 25px 30px 0px 30px; - cursor: pointer; - justify-content: center; - background: rgba(255, 255, 255, 0.32); - border-radius: 8px; -} .btnSubmit:hover { @@ -63,30 +52,6 @@ input:hover { background: rgb(41, 41, 248); } -.btnSubmit { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - margin: 25px 30px 0 30px; - width: 240px; - height: 45px; - background: rgba(82, 82, 92, 0.8); - border-radius: 6px; - /* Inside auto layout */ - flex: none; - order: 0; - align-self: stretch; - flex-grow: 0; - color: rgba(255, 255, 255, 0.32); - font-size: 16px; - line-height: 25px; - letter-spacing: 2px; - border: none; - cursor: pointer; - -} - .close-modal { margin-bottom: 30px; @@ -114,6 +79,44 @@ input:hover { padding: 0px 5px; } +/* ESTILOS GENERALES */ + +input { + backdrop-filter: blur(15px); + width: 240px; + height: 45px; + border: transparent; + margin: 25px 30px 0px 30px; + cursor: pointer; + justify-content: center; + background: rgba(255, 255, 255, 0.32); + border-radius: 8px; + +} + +.btnSubmit { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + margin: 25px 30px 0 30px; + width: 240px; + height: 45px; + background: rgba(82, 82, 92, 0.8); + border-radius: 6px; + /* Inside auto layout */ + flex: none; + order: 0; + align-self: stretch; + flex-grow: 0; + color: rgba(255, 255, 255, 0.32); + font-size: 16px; + line-height: 25px; + letter-spacing: 2px; + border: none; + cursor: pointer; + +} /* Estilos para vista HOME*/ @@ -530,6 +533,26 @@ input::placeholder { height: 800px; } +/* estilos SECTION FEED */ + +.section-feed { + width: 360px; + height: 800px; + display: grid; + grid-template-columns: 80px 200px 80px; + grid-template-rows: repeat(3, 200px); + gap: 5px; + justify-content: center; + background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); +} + +.section-feed > * { + border: 2px solid black; + text-align: center; + justify-content: center; + align-items: center; + display: flex; +} .tituloh2-feed { font-family: 'Fredoka One'; width: 300px; @@ -542,21 +565,23 @@ input::placeholder { color: rgba(255, 242, 242, 0.25); text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); margin: 0; - position: absolute; + /* position: absolute; top: 25px; - left: 19px + left: 19px */ } .avatarImg{ - width: 65px; - height: 65px; - position: absolute; - right: 12px; - top:12px + width: 65px; + height: 65px; + + /* position: absolute; + right: 12px; + top:12px */ } -.section-feed { - width: 360px; - height: 800px; + +.post-div{ justify-content: center; - background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); + align-items: center; + + } \ No newline at end of file From 477095af64080daa9016e2f54bc284d2da452d83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Thu, 19 Jan 2023 08:42:23 -0500 Subject: [PATCH 43/73] inicio de las funciones de firestore(collection) --- src/components/feed.js | 108 +++++++++++++++--- src/{img => components/imagen}/google.png | Bin src/components/login.js | 2 +- src/index.html | 6 +- src/js/index.js | 2 - src/lib/firebase/config.js | 2 +- .../firebase/{methods.js => methodsAuth.js} | 0 .../firebase/methodsFirestore.js} | 0 src/{ => lib/firebase}/post.js | 0 src/login.js | 2 - src/main.js | 72 +++++++----- src/style.css | 54 +++++++-- 12 files changed, 189 insertions(+), 59 deletions(-) rename src/{img => components/imagen}/google.png (100%) delete mode 100644 src/js/index.js rename src/lib/firebase/{methods.js => methodsAuth.js} (100%) rename src/{js/router.js => lib/firebase/methodsFirestore.js} (100%) rename src/{ => lib/firebase}/post.js (100%) delete mode 100644 src/login.js diff --git a/src/components/feed.js b/src/components/feed.js index 7b693362..fbc74aa2 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,16 +1,23 @@ -import { onNavigate } from '../js/routes.js' +//import { onNavigate } from '../js/routes.js' export const feed = () => { const feedSection = document.createElement('section'); feedSection.className = 'section-feed'; + const containerHeader = document.createElement('div'); + containerHeader.className = 'feed-container-header'; + + feedSection.appendChild(containerHeader); + + const titulo = document.createElement('h2'); titulo.textContent = "Dad's Power"; titulo.className = 'tituloh2-feed'; - feedSection.appendChild(titulo); - - const perfil = document.createElement('div') + + containerHeader.appendChild(titulo); + + const perfil = document.createElement('div') perfil.className = 'avatarUser'; // const username = document.getElementById('idUsername'); // username.id = 'idUsername'; @@ -20,24 +27,83 @@ export const feed = () => { avatarImg.className = 'avatarImg'; avatarImg.src = '/components/imagen/avatar.png'; perfil.appendChild(avatarImg); - feedSection.appendChild(perfil); - - const postDiv = document.createElement('div'); - postDiv.className = 'post-div'; - feedSection.appendChild(postDiv); - + + containerHeader.appendChild(perfil); + + + /* const post = document.createElement('input'); post.type = 'text'; post.className ='post-input'; post.placeholder = 'what do you need?'; post.id = 'idPost'; - postDiv.appendChild(post); + postDiv.appendChild(post); */ + + const createContainerButtons = document.createElement('div'); + createContainerButtons.className = 'container-buttons'; + feedSection.appendChild(createContainerButtons); + + const createPostButton = document.createElement('button'); + createPostButton.id = 'idCreatePostButton' + createPostButton.innerHTML = ''; + + createPostButton.addEventListener('click', () => openModalAddPost(feedSection)); + + const perfilButton = document.createElement('button'); + perfilButton.id = 'idPerfilButton' + perfilButton.innerHTML = ''; + + const comentarioButton = document.createElement('button'); + comentarioButton.id = 'idcomentarioButton' + comentarioButton.innerHTML = ''; - const postButton = document.createElement('button'); - postButton.className = 'post-btn'; - postButton.id = 'idPostButton'; - postButton.textContent = 'Help!'; - postDiv.appendChild(postButton); + + createContainerButtons.appendChild(perfilButton); + createContainerButtons.appendChild(createPostButton); + createContainerButtons.appendChild(comentarioButton); + + + + // const modalPost = ` + //

+ // ` + + + + // const publicarPostButton = document.createElement('button'); + // publicarPostButton.className = 'post-btn'; + // publicarPostButton.id = 'idPostButton'; + // publicarPostButton.textContent = 'Help!'; + // modalPost.appendChild(publicarPostButton); + + + + // const postDiv = document.createElement('div'); + // postDiv.className = 'post-div'; + // postDiv.id = 'idPostDiv'; + + // const postCreado = ` + //
+ //
+ // + //
+ //
+ // ` + + // postDiv.innerHTML = postCreado; + // feedSection.appendChild(postDiv); @@ -45,4 +111,14 @@ export const feed = () => { return feedSection; +} + +const openModalAddPost = (feedSection) => { + console.log('post'); + const containerAddPost = document.createElement('div'); + containerAddPost.className = 'container-add-post'; + feedSection.appendChild(containerAddPost); + const openModalAddPost = document.createElement('div'); + openModalAddPost.className = 'modal-add-post'; + containerAddPost.appendChild(openModalAddPost); } \ No newline at end of file diff --git a/src/img/google.png b/src/components/imagen/google.png similarity index 100% rename from src/img/google.png rename to src/components/imagen/google.png diff --git a/src/components/login.js b/src/components/login.js index cb6da987..a5587f1a 100644 --- a/src/components/login.js +++ b/src/components/login.js @@ -68,7 +68,7 @@ export const login = () => { buttonGoogle.id = 'entrarGoogle'; const imagenGoogle = document.createElement('img'); - imagenGoogle.src = '/img/google.png'; + imagenGoogle.src = '/components/imagen/google.png'; imagenGoogle.className = 'imgGoogle'; buttonGoogle.appendChild(imagenGoogle); diff --git a/src/index.html b/src/index.html index ed90fd8d..388732f9 100644 --- a/src/index.html +++ b/src/index.html @@ -12,6 +12,10 @@ + + + + @@ -103,7 +107,7 @@

Sign in

- + diff --git a/src/js/index.js b/src/js/index.js deleted file mode 100644 index 139597f9..00000000 --- a/src/js/index.js +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/lib/firebase/config.js b/src/lib/firebase/config.js index 118bd52e..58440d0e 100644 --- a/src/lib/firebase/config.js +++ b/src/lib/firebase/config.js @@ -15,5 +15,5 @@ const firebaseConfig = { // console.log('app', app) export const init = () =>{ const app = initializeApp(firebaseConfig); - + return app; } diff --git a/src/lib/firebase/methods.js b/src/lib/firebase/methodsAuth.js similarity index 100% rename from src/lib/firebase/methods.js rename to src/lib/firebase/methodsAuth.js diff --git a/src/js/router.js b/src/lib/firebase/methodsFirestore.js similarity index 100% rename from src/js/router.js rename to src/lib/firebase/methodsFirestore.js diff --git a/src/post.js b/src/lib/firebase/post.js similarity index 100% rename from src/post.js rename to src/lib/firebase/post.js diff --git a/src/login.js b/src/login.js deleted file mode 100644 index 1e051a61..00000000 --- a/src/login.js +++ /dev/null @@ -1,2 +0,0 @@ -import { template } from "@babel/core"; - diff --git a/src/main.js b/src/main.js index dfc734c5..4493bd83 100644 --- a/src/main.js +++ b/src/main.js @@ -2,32 +2,40 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -//import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; -import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methods.js"; +import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; /*logout importar*/ +const app = init(); -init(); const auth = getAuth(); // Initialize Cloud Firestore and get a reference to the service -// const fs = getFirestore(app); - +const db = getFirestore(app); +const postsRef = await getDocs(collection(db, 'posts')); +//console.log('posts', postsRef); +let posts = []; +// const posts = postsRef.map((item) => ({ id: item.id, data: item.data() })) +postsRef.forEach((item) => { /*para traer los posts de mi colección */ + // console.log(`${doc.id} => ${doc.data()}`); + posts.push({ id: item.id, data: item.data() }); +}); +console.log('posts', posts); function validarCorreo(correo) { - const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; - const valido = expReg.test(correo); - console.log(valido); - if (valido === true) { - console.log('valido'); - return true; - } if (valido === false) { - console.log('invalido'); - return false; - } + const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; + const valido = expReg.test(correo); + console.log(valido); + if (valido === true) { + console.log('valido'); + return true; + } if (valido === false) { + console.log('invalido'); + return false; + } } // SIGN UP @@ -121,19 +129,25 @@ if (signinForm) { }); }; - // // LOGOUT - // /*const logout = document.getElementById('salir'); - // logout.addEventListener('click', () => { - // logOut(auth) +// // LOGOUT +// /*const logout = document.getElementById('salir'); +// logout.addEventListener('click', () => { +// logOut(auth) + +// });*/ + +// GOOGLE LOGIN +const googleButton = document.getElementById('entrarGoogle') +if (googleButton) { + googleButton.addEventListener('click', (e) => { + e.preventDefault(); + loginWithGoogle(auth); + signinForm.reset(); + }); +}; + + + + //FEED CONTROLLER - // });*/ - // GOOGLE LOGIN - const googleButton = document.getElementById('entrarGoogle') - if (googleButton) { - googleButton.addEventListener('click', (e) => { - e.preventDefault(); - loginWithGoogle(auth); - signinForm.reset(); - }); - }; diff --git a/src/style.css b/src/style.css index bc5c98c6..fa23cff1 100644 --- a/src/style.css +++ b/src/style.css @@ -537,22 +537,22 @@ input::placeholder { .section-feed { width: 360px; - height: 800px; - display: grid; + height: 100vh; /*es el 100% para cualquier dispositivo*/ + /* display: grid; grid-template-columns: 80px 200px 80px; grid-template-rows: repeat(3, 200px); - gap: 5px; - justify-content: center; + gap: 5px; */ + position: relative; /*para que el hijo posicionarse respecto al section-feed*/ + /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.section-feed > * { - border: 2px solid black; +/* .section-feed > * { text-align: center; justify-content: center; align-items: center; display: flex; -} +} */ .tituloh2-feed { font-family: 'Fredoka One'; width: 300px; @@ -583,5 +583,45 @@ input::placeholder { justify-content: center; align-items: center; +} +.container-buttons{ + position: absolute; + bottom: 0; + left: 0; + width: 360px; + background-color: #F7DAE5; + display: grid; + grid-template-columns: repeat(3, 1fr);/*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ +} + +.container-buttons button { + padding: 1rem; + border: none; + background: transparent; +} + +.feed-container-header{ + display: flex; + align-items: center; + justify-content: space-between; + width: 100% !important; + padding: 1rem; +} +.container-add-post{ + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.4); +} +.modal-add-post{ + width: 80%; + height: 50vh; +background: #334E6F; +border-radius: 12px; } \ No newline at end of file From 41e88a54d8b1f9b7a1b52ecf0b94908975c43091 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Thu, 19 Jan 2023 09:13:19 -0500 Subject: [PATCH 44/73] se agrego modal de post con estilos en feed.js --- src/components/feed.js | 22 +++++++++++++++------- src/js/routes.js | 18 +++++++++--------- src/style.css | 26 ++++++++++++++++++++++---- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index f88fcfa4..581ffa15 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -9,20 +9,28 @@ export const feed = () => { titulo.textContent = "Dad's Power"; titulo.className = 'tituloh2-feed'; feedSection.appendChild(titulo); - - const perfil = document.createElement('div') + + const perfil = document.createElement('div') perfil.className = 'avatarUser'; - // const username = document.getElementById('idUsername'); - // username.id = 'idUsername'; - // perfil.appendChild(username); - // perfil.type = 'file' + const buttonUnpload = document.createElement('input') + buttonUnpload.className= 'buttonUnpload'; + buttonUnpload.type = 'file'; + buttonUnpload.id = 'perfilAvatar' + perfil.appendChild(buttonUnpload) + + const avatarImg = document.createElement('img'); avatarImg.className = 'avatarImg'; avatarImg.src = '/components/imagen/avatar.png'; perfil.appendChild(avatarImg); feedSection.appendChild(perfil); + + + + - const fondo = document.createElement('section') + + return feedSection; diff --git a/src/js/routes.js b/src/js/routes.js index 0c9fd146..fc714c01 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,7 +1,7 @@ import { home } from '../components/Home.js'; import { register } from '../components/register.js'; - import {login} from '../components/login.js'; - import {feed} from '../components/feed.js'; +import { login } from '../components/login.js'; +import { feed } from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { @@ -18,18 +18,18 @@ export const onNavigate = (pathname) => { pathname, window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// ); - while(rootDiv.firstChild){ + while (rootDiv.firstChild) { rootDiv.removeChild(rootDiv.firstChild); } - - rootDiv.appendChild(routes[pathname]()); - }; - -const componentes = routes[window.location.pathname]; + rootDiv.appendChild(routes[pathname]()); +}; -window.onpopstate = () =>{ +const componentes = routes[window.location.pathname]; + +window.onpopstate = () => { + rootDiv.appendChild(componentes()); }; rootDiv.appendChild(componentes()); diff --git a/src/style.css b/src/style.css index 43fcd8c3..1541440d 100644 --- a/src/style.css +++ b/src/style.css @@ -543,20 +543,38 @@ input::placeholder { text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); margin: 0; position: absolute; - top: 25px; - left: 19px + top: 35px; + left: 17px } .avatarImg{ width: 65px; height: 65px; position: absolute; - right: 12px; - top:12px + left:280px; + top:20px } .section-feed { width: 360px; height: 800px; justify-content: center; background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); +} + .buttonUnpload{ + width: 128px; + height: 20px; + border: none; + position: absolute; + top: 70px; + left: 190px; +} + +.inputProfile{ + text-align: center; + width: 100px; + height: 50px; + color: #575454; + position: absolute; + top: 25px; + text-indent: 25px; } \ No newline at end of file From bef10e6e616799f0073302154298fa4d3711bf14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Fri, 20 Jan 2023 16:03:17 -0500 Subject: [PATCH 45/73] insertando post exitentes en el muro --- src/components/feed.js | 50 +++++++++++++--------- src/index.html | 4 +- src/lib/firebase/config.js | 32 +++++++------- src/lib/firebase/methodsFirestore.js | 27 ++++++++++++ src/main.js | 31 ++++++-------- src/style.css | 64 ++++++++++++++++++++-------- 6 files changed, 136 insertions(+), 72 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index fbc74aa2..8799f113 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,5 +1,6 @@ //import { onNavigate } from '../js/routes.js' - +//import { postsRef } from "./lib/firebase/methodsFirestore.js"; +import { posts } from "../main.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -75,7 +76,6 @@ export const feed = () => { // ` - // const publicarPostButton = document.createElement('button'); // publicarPostButton.className = 'post-btn'; // publicarPostButton.id = 'idPostButton'; @@ -83,30 +83,38 @@ export const feed = () => { // modalPost.appendChild(publicarPostButton); + const contenedorPosts = document.createElement('div'); + contenedorPosts.className = 'contenedor-posts'; + feedSection.appendChild(contenedorPosts); - // const postDiv = document.createElement('div'); - // postDiv.className = 'post-div'; - // postDiv.id = 'idPostDiv'; + - // const postCreado = ` - //
- //
- // - //
- //
- // ` + //console.log('posts', posts); + const postsitos=posts.forEach((post) => { + console.log(post.data["autor"]); + + const postCreado = document.createElement('div'); + postCreado.className = 'post-div'; - // postDiv.innerHTML = postCreado; - // feedSection.appendChild(postDiv); + postCreado.innerHTML = ` +
+
+ + +
+ +

${post.data["titulo"]}

+

${post.data["descripcion"]}

+

${post.fecha}

+
+ `; + //postCreado.innerHTML=postDiv; + return postCreado; + }); + contenedorPosts.append(...postsitos); return feedSection; @@ -114,7 +122,7 @@ export const feed = () => { } const openModalAddPost = (feedSection) => { - console.log('post'); + //console.log('post'); const containerAddPost = document.createElement('div'); containerAddPost.className = 'container-add-post'; feedSection.appendChild(containerAddPost); diff --git a/src/index.html b/src/index.html index 388732f9..e80ed6fb 100644 --- a/src/index.html +++ b/src/index.html @@ -107,7 +107,9 @@

Sign in

- + + diff --git a/src/lib/firebase/config.js b/src/lib/firebase/config.js index 58440d0e..70246f07 100644 --- a/src/lib/firebase/config.js +++ b/src/lib/firebase/config.js @@ -1,19 +1,19 @@ -// Import the functions you need from the SDKs you need -import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; +// // Import the functions you need from the SDKs you need +// import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; -const firebaseConfig = { - apiKey: 'AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo', - authDomain: 'redsocialnvj-47db7.firebaseapp.com', - projectId: 'redsocialnvj-47db7', - storageBucket: 'redsocialnvj-47db7.appspot.com', - messagingSenderId: '161909447570', - appId: '1:161909447570:web:b126b68b577520ab947f4b', - }; +// const firebaseConfig = { +// apiKey: 'AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo', +// authDomain: 'redsocialnvj-47db7.firebaseapp.com', +// projectId: 'redsocialnvj-47db7', +// storageBucket: 'redsocialnvj-47db7.appspot.com', +// messagingSenderId: '161909447570', +// appId: '1:161909447570:web:b126b68b577520ab947f4b', +// }; - // Initialize Firebase -// console.log('app', app) -export const init = () =>{ - const app = initializeApp(firebaseConfig); - return app; -} +// // Initialize Firebase +// // console.log('app', app) +// // export const init = () =>{ +// // return app; +// // } +// export const app = initializeApp(firebaseConfig); diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index e69de29b..32e2867d 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -0,0 +1,27 @@ +// Import the functions you need from the SDKs you need +import { initializeApp } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-app.js"; + + +const firebaseConfig = { + apiKey: 'AIzaSyAQKOcN9jLUCxn2zXz-mkJKV-BaeFjcKvo', + authDomain: 'redsocialnvj-47db7.firebaseapp.com', + projectId: 'redsocialnvj-47db7', + storageBucket: 'redsocialnvj-47db7.appspot.com', + messagingSenderId: '161909447570', + appId: '1:161909447570:web:b126b68b577520ab947f4b', + }; + + // Initialize Firebase +// console.log('app', app) +// export const init = () =>{ +// return app; +// } +export const app = initializeApp(firebaseConfig); + + +import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; + +// Initialize Cloud Firestore and get a reference to the service +const db = getFirestore(app); +export const postsRef = await getDocs(collection(db, 'posts')); +//console.log('postsRef',postsRef); \ No newline at end of file diff --git a/src/main.js b/src/main.js index 4493bd83..60353836 100644 --- a/src/main.js +++ b/src/main.js @@ -2,28 +2,19 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; -import { init } from "./lib/firebase/config.js"; +//import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +//import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { postsRef } from "./lib/firebase/methodsFirestore.js"; /*logout importar*/ -const app = init(); +//const app = init(); const auth = getAuth(); -// Initialize Cloud Firestore and get a reference to the service + /*..................................AUTH CONTROLLER.................................*/ -const db = getFirestore(app); -const postsRef = await getDocs(collection(db, 'posts')); -//console.log('posts', postsRef); -let posts = []; -// const posts = postsRef.map((item) => ({ id: item.id, data: item.data() })) -postsRef.forEach((item) => { /*para traer los posts de mi colección */ - // console.log(`${doc.id} => ${doc.data()}`); - posts.push({ id: item.id, data: item.data() }); -}); -console.log('posts', posts); function validarCorreo(correo) { const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; @@ -82,7 +73,6 @@ if (signupForm) { }; - // SIGN IN const signinForm = document.getElementById('formularioSI'); @@ -148,6 +138,13 @@ if (googleButton) { - //FEED CONTROLLER - + /*..................................FIRESTORE CONTROLLER.................................*/ +//MOSTRAR POSTS EXISTENTES + //console.log('postsRef',postsRef); + export let posts = []; + postsRef.forEach((item) => { /*para traer los posts de mi colección */ + // // console.log(`${doc.id} => ${doc.data()}`); + posts.push({ id: item.id, data: item.data() }); + }); + //console.log('posts', posts); \ No newline at end of file diff --git a/src/style.css b/src/style.css index fa23cff1..6e7ff7e4 100644 --- a/src/style.css +++ b/src/style.css @@ -5,6 +5,7 @@ padding: 0; box-sizing: border-box; } + .modal { display: none; background: url(img/fondo10.png); @@ -187,7 +188,7 @@ h5 { background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.tituloh2register-login{ +.tituloh2register-login { font-family: 'Fredoka One'; width: 300px; height: 47px; @@ -308,6 +309,7 @@ input::placeholder { left: 55px; top: 190px; } + .p-tienes-cuenta-register { font-family: 'Century Gothic'; font-style: normal; @@ -319,6 +321,7 @@ input::placeholder { left: 72px; bottom: 60px; } + /* Parrafo con enlace a sigin */ .p-tienes-cuenta { @@ -370,7 +373,7 @@ input::placeholder { /* position: absolute; */ left: 55px; background-color: #f5efef; - border: 6px solid #f5efef ; + border: 6px solid #f5efef; border-top-left-radius: 3px; border-bottom-left-radius: 3px; } @@ -384,7 +387,7 @@ input::placeholder { border: none; color: rgb(225, 220, 245); text-align: center; - border: 1px solid rgb(0, 81, 255); + border: 1px solid rgb(0, 81, 255); background-color: rgb(0, 81, 255); cursor: pointer; justify-content: center; @@ -394,7 +397,7 @@ input::placeholder { text-align: right; padding-right: 28px; padding-top: 10px; - text-shadow: 1px 0 1px #ffffff ; + text-shadow: 1px 0 1px #ffffff; } @@ -533,16 +536,18 @@ input::placeholder { height: 800px; } -/* estilos SECTION FEED */ +/* .....................estilos SECTION FEED............... */ .section-feed { width: 360px; - height: 100vh; /*es el 100% para cualquier dispositivo*/ + height: 100vh; + /*es el 100% para cualquier dispositivo*/ /* display: grid; grid-template-columns: 80px 200px 80px; grid-template-rows: repeat(3, 200px); gap: 5px; */ - position: relative; /*para que el hijo posicionarse respecto al section-feed*/ + position: relative; + /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } @@ -570,7 +575,7 @@ input::placeholder { left: 19px */ } -.avatarImg{ +.avatarImg { width: 65px; height: 65px; @@ -579,19 +584,21 @@ input::placeholder { top:12px */ } -.post-div{ +.post-div { justify-content: center; align-items: center; - + } -.container-buttons{ + +.container-buttons { position: absolute; bottom: 0; left: 0; width: 360px; background-color: #F7DAE5; display: grid; - grid-template-columns: repeat(3, 1fr);/*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ + grid-template-columns: repeat(3, 1fr); + /*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ } .container-buttons button { @@ -600,14 +607,15 @@ input::placeholder { background: transparent; } -.feed-container-header{ +.feed-container-header { display: flex; align-items: center; justify-content: space-between; width: 100% !important; padding: 1rem; } -.container-add-post{ + +.container-add-post { position: absolute; top: 0; left: 0; @@ -619,9 +627,31 @@ input::placeholder { background: rgba(0, 0, 0, 0.4); } -.modal-add-post{ +.modal-add-post { width: 80%; height: 50vh; -background: #334E6F; -border-radius: 12px; + background: #334E6F; + border-radius: 12px; +} + +.contenedor-posts { + width: 100%; + height: 82vh; + background-color: transparent; + border: 2px solid rgb(244, 130, 197); + + display: flex; + /* or inline-flex */ + flex-direction: column; + flex-direction: row; + + justify-content: center; + +} + +.post-div { + width: 95%; + height: 25vh; + border: 1px solid rgb(67, 33, 53); + border-radius: 10px; } \ No newline at end of file From 9e86f6cf04604736cd37358361caf4403695ce48 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Fri, 20 Jan 2023 16:50:08 -0500 Subject: [PATCH 46/73] se agrega post existente de base de datos --- src/components/feed.js | 29 ++++++++---------- src/lib/firebase/config.js | 1 - src/lib/firebase/methodsFirestore.js | 39 ++++++++++++++++++++++++ src/main.js | 28 +++++++++++------- src/style.css | 44 +++++++++++++++++----------- 5 files changed, 95 insertions(+), 46 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index c5f733f7..984faef5 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -19,12 +19,7 @@ export const feed = () => { const perfil = document.createElement('div') perfil.className = 'avatarUser'; - const buttonUnpload = document.createElement('input') - buttonUnpload.className= 'buttonUnpload'; - buttonUnpload.type = 'file'; - buttonUnpload.id = 'perfilAvatar' - perfil.appendChild(buttonUnpload) - + const avatarImg = document.createElement('img'); avatarImg.className = 'avatarImg'; @@ -34,14 +29,6 @@ export const feed = () => { containerHeader.appendChild(perfil); - /* - const post = document.createElement('input'); - post.type = 'text'; - post.className ='post-input'; - post.placeholder = 'what do you need?'; - post.id = 'idPost'; - postDiv.appendChild(post); */ - const createContainerButtons = document.createElement('div'); createContainerButtons.className = 'container-buttons'; feedSection.appendChild(createContainerButtons); @@ -52,6 +39,7 @@ export const feed = () => { createPostButton.addEventListener('click', () => openModalAddPost(feedSection)); + const perfilButton = document.createElement('button'); perfilButton.id = 'idPerfilButton' perfilButton.innerHTML = ''; @@ -117,11 +105,18 @@ export const feed = () => { } const openModalAddPost = (feedSection) => { - console.log('post'); const containerAddPost = document.createElement('div'); containerAddPost.className = 'container-add-post'; feedSection.appendChild(containerAddPost); - const openModalAddPost = document.createElement('div'); + const openModalAddPost = document.createElement('textarea'); openModalAddPost.className = 'modal-add-post'; + openModalAddPost.id = 'modal-add-post'; + openModalAddPost.placeholder = 'What do you need?' containerAddPost.appendChild(openModalAddPost); -} \ No newline at end of file + const buttonModal = document.createElement('button'); + buttonModal.type= 'submit'; + buttonModal.textContent = 'submit'; + containerAddPost.appendChild(buttonModal) + +} + diff --git a/src/lib/firebase/config.js b/src/lib/firebase/config.js index 58440d0e..073fa8fc 100644 --- a/src/lib/firebase/config.js +++ b/src/lib/firebase/config.js @@ -12,7 +12,6 @@ const firebaseConfig = { }; // Initialize Firebase -// console.log('app', app) export const init = () =>{ const app = initializeApp(firebaseConfig); return app; diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index e69de29b..4acaf804 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -0,0 +1,39 @@ +import { collection, addDoc} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; + + +export const saveDocs = (titulo , descripcion) => +addDoc(collection (db, 'posts'),{titulo,descripcion}); + + + +export const getDocs = () => { +console.log('task-list') +} + + + const postsRef = await getDocs(collection(db, 'posts')); +// if (postsRef.exists()) { +// console.log(item.data) +// } +let html = ""; +postsRef.forEach((item) => { /*para traer los posts de mi colección */ +// console.log(`${doc.id} => ${doc.data()}`); + //post.push({ id: item.id, data: item.data() }); + const post = item.data() + + html+= ` +
+

${post.titulo}

+

${post.descripcion}

+ ` +}); +modalPost.innerText = html; + + + + + + //}; +// console.log('posts', posts); + + diff --git a/src/main.js b/src/main.js index 4493bd83..69157344 100644 --- a/src/main.js +++ b/src/main.js @@ -2,28 +2,34 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { saveDocs } from "./lib/firebase/methodsFirestore.js"; /*logout importar*/ + + + const app = init(); const auth = getAuth(); - +/* FEED */ // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); -const postsRef = await getDocs(collection(db, 'posts')); -//console.log('posts', postsRef); -let posts = []; -// const posts = postsRef.map((item) => ({ id: item.id, data: item.data() })) -postsRef.forEach((item) => { /*para traer los posts de mi colección */ - // console.log(`${doc.id} => ${doc.data()}`); - posts.push({ id: item.id, data: item.data() }); -}); -console.log('posts', posts); + +const modalPost = document.getElementById('modal-add-post'); +modalPost.addEventListener('submit', (e) => { + e.preventDefault(); + console.log('enviado') + const descripcion = modalPost ['modal-add-post'] + saveDocs(descripcion.value) + +}) + + function validarCorreo(correo) { const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; diff --git a/src/style.css b/src/style.css index fa23cff1..067d88ec 100644 --- a/src/style.css +++ b/src/style.css @@ -5,6 +5,7 @@ padding: 0; box-sizing: border-box; } + .modal { display: none; background: url(img/fondo10.png); @@ -187,7 +188,7 @@ h5 { background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -.tituloh2register-login{ +.tituloh2register-login { font-family: 'Fredoka One'; width: 300px; height: 47px; @@ -308,6 +309,7 @@ input::placeholder { left: 55px; top: 190px; } + .p-tienes-cuenta-register { font-family: 'Century Gothic'; font-style: normal; @@ -319,6 +321,7 @@ input::placeholder { left: 72px; bottom: 60px; } + /* Parrafo con enlace a sigin */ .p-tienes-cuenta { @@ -370,7 +373,7 @@ input::placeholder { /* position: absolute; */ left: 55px; background-color: #f5efef; - border: 6px solid #f5efef ; + border: 6px solid #f5efef; border-top-left-radius: 3px; border-bottom-left-radius: 3px; } @@ -384,7 +387,7 @@ input::placeholder { border: none; color: rgb(225, 220, 245); text-align: center; - border: 1px solid rgb(0, 81, 255); + border: 1px solid rgb(0, 81, 255); background-color: rgb(0, 81, 255); cursor: pointer; justify-content: center; @@ -394,7 +397,7 @@ input::placeholder { text-align: right; padding-right: 28px; padding-top: 10px; - text-shadow: 1px 0 1px #ffffff ; + text-shadow: 1px 0 1px #ffffff; } @@ -537,12 +540,14 @@ input::placeholder { .section-feed { width: 360px; - height: 100vh; /*es el 100% para cualquier dispositivo*/ + height: 100vh; + /*es el 100% para cualquier dispositivo*/ /* display: grid; grid-template-columns: 80px 200px 80px; grid-template-rows: repeat(3, 200px); gap: 5px; */ - position: relative; /*para que el hijo posicionarse respecto al section-feed*/ + position: relative; + /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } @@ -570,7 +575,7 @@ input::placeholder { left: 19px */ } -.avatarImg{ +.avatarImg { width: 65px; height: 65px; @@ -579,19 +584,21 @@ input::placeholder { top:12px */ } -.post-div{ +.post-div { justify-content: center; align-items: center; - + } -.container-buttons{ + +.container-buttons { position: absolute; bottom: 0; left: 0; width: 360px; background-color: #F7DAE5; display: grid; - grid-template-columns: repeat(3, 1fr);/*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ + grid-template-columns: repeat(3, 1fr); + /*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ } .container-buttons button { @@ -600,14 +607,15 @@ input::placeholder { background: transparent; } -.feed-container-header{ +.feed-container-header { display: flex; align-items: center; justify-content: space-between; width: 100% !important; padding: 1rem; } -.container-add-post{ + +.container-add-post { position: absolute; top: 0; left: 0; @@ -619,9 +627,11 @@ input::placeholder { background: rgba(0, 0, 0, 0.4); } -.modal-add-post{ +.modal-add-post { width: 80%; - height: 50vh; -background: #334E6F; -border-radius: 12px; + height: 15vh; + background: #ffffff; + border-radius: 10px; + text-indent: 10px; + } \ No newline at end of file From eac4c91a917b511570bf1c902fdc654223e7cbab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Mon, 23 Jan 2023 09:59:25 -0300 Subject: [PATCH 47/73] =?UTF-8?q?actualizaci=C3=B3n=20chicas=20fin=20de=20?= =?UTF-8?q?semana?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/firebase/methodsFirestore.js | 26 ++++++++++++++++++++++++ src/main.js | 30 +++++++++++++++------------- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index e69de29b..e980395f 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -0,0 +1,26 @@ +// import { init } from "./config.js"; +import { + getFirestore, + collection, + getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; + + // const app = init(); + const db = getFirestore(); + const userRef = collection(db, "users"); + + export const postsRef = (db) => { + getDocs(userRef).then((snap) => { + snap.forEach((doc) => { + console.log(doc.id); + console.log(doc.data()); + }); + }); +}; + + + + +// const db = getFirestore(app); + +// export const postsRef = (db) => { +// getDocs(collection(db, 'posts'))}; diff --git a/src/main.js b/src/main.js index 4493bd83..dc41e55c 100644 --- a/src/main.js +++ b/src/main.js @@ -2,29 +2,18 @@ import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { postsRef } from "./lib/firebase/methodsFirestore.js"; + /*logout importar*/ const app = init(); const auth = getAuth(); -// Initialize Cloud Firestore and get a reference to the service - -const db = getFirestore(app); -const postsRef = await getDocs(collection(db, 'posts')); -//console.log('posts', postsRef); -let posts = []; -// const posts = postsRef.map((item) => ({ id: item.id, data: item.data() })) -postsRef.forEach((item) => { /*para traer los posts de mi colección */ - // console.log(`${doc.id} => ${doc.data()}`); - posts.push({ id: item.id, data: item.data() }); -}); -console.log('posts', posts); - function validarCorreo(correo) { const expReg = /^[a-z0-9!#$%&'+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'+/=?^_`{|}~-]+)@(?:[a-z0-9](?:[a-z0-9-][a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/; const valido = expReg.test(correo); @@ -150,4 +139,17 @@ if (googleButton) { //FEED CONTROLLER +//FIRESTORE +// Initialize Cloud Firestore and get a reference to the service + + export const db = getFirestore(app); + +postsRef (db); +// let posts = []; +// // const posts = postsRef.map((item) => ({ id: item.id, data: item.data() })) +// postsRef.forEach((item) => { /*para traer los posts de mi colección */ +// // console.log(`${doc.id} => ${doc.data()}`); +// posts.push({ id: item.id, data: item.data() }); +// }); +// console.log('posts', posts); From fa22fbafd0ed0108a94f1c012cf7e01af848e0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Mon, 23 Jan 2023 10:51:50 -0500 Subject: [PATCH 48/73] mostrar los post existentes, funcion en methodsFirestore y utilizandola desde feed.js --- src/comentarios.text | 74 ++++++++++++++++ src/components/feed.js | 98 +++++++-------------- src/lib/firebase/methodsFirestore.js | 31 ++++++- src/lib/firebase/post.js | 1 + src/main.js | 30 +++++-- src/style.css | 122 +++++++++++---------------- 6 files changed, 208 insertions(+), 148 deletions(-) create mode 100644 src/comentarios.text diff --git a/src/comentarios.text b/src/comentarios.text new file mode 100644 index 00000000..d3de8d53 --- /dev/null +++ b/src/comentarios.text @@ -0,0 +1,74 @@ + +-------------------------------FEED--------------------------------------------- +const openModalAddPost = (feedSection) => { + //console.log('post'); + const containerAddPost = document.createElement('div'); + containerAddPost.className = 'container-add-post'; + feedSection.appendChild(containerAddPost); + const openModalAddPost = document.createElement('div'); + openModalAddPost.className = 'modal-add-post'; + containerAddPost.appendChild(openModalAddPost); +} + +------------------------------STYLE----------------------------------------- +.modal { + display: none; + background: url(img/fondo10.png); + background-size: cover; + background-position: center; + width: 100%; + height: 100%; + top: 0; + left: 0; + position: fixed; + padding: 15px; + justify-content: center; + align-items: center; +} + +.modal-container { + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(8px); + width: 320px; + height: 500px; + font-family: sans-serif; + padding: 25px; + border-radius: 15px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.close-modal { + margin-bottom: 30px; + margin-left: 320px; + width: 20px; + height: 25px; + border: transparent; + color: rgb(48, 46, 46); + background-color: transparent; + position: absolute; + top: 10px; + padding-left: 18px; + cursor: pointer; +} + +.container-add-post { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.4); +} + +.modal-add-post { + width: 80%; + height: 50vh; + background: #334E6F; + border-radius: 12px; +} diff --git a/src/components/feed.js b/src/components/feed.js index 8799f113..b66dc975 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,6 +1,7 @@ //import { onNavigate } from '../js/routes.js' //import { postsRef } from "./lib/firebase/methodsFirestore.js"; -import { posts } from "../main.js"; +//import { posts } from "../main.js"; +import { postsRef } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -32,14 +33,6 @@ export const feed = () => { containerHeader.appendChild(perfil); - /* - const post = document.createElement('input'); - post.type = 'text'; - post.className ='post-input'; - post.placeholder = 'what do you need?'; - post.id = 'idPost'; - postDiv.appendChild(post); */ - const createContainerButtons = document.createElement('div'); createContainerButtons.className = 'container-buttons'; feedSection.appendChild(createContainerButtons); @@ -64,69 +57,42 @@ export const feed = () => { createContainerButtons.appendChild(comentarioButton); - - // const modalPost = ` - // - // ` - - - // const publicarPostButton = document.createElement('button'); - // publicarPostButton.className = 'post-btn'; - // publicarPostButton.id = 'idPostButton'; - // publicarPostButton.textContent = 'Help!'; - // modalPost.appendChild(publicarPostButton); - - const contenedorPosts = document.createElement('div'); contenedorPosts.className = 'contenedor-posts'; feedSection.appendChild(contenedorPosts); - - - //console.log('posts', posts); - const postsitos=posts.forEach((post) => { - console.log(post.data["autor"]); - - const postCreado = document.createElement('div'); - postCreado.className = 'post-div'; - - - postCreado.innerHTML = ` -
-
- - -
- -

${post.data["titulo"]}

-

${post.data["descripcion"]}

-

${post.fecha}

-
- `; - - //postCreado.innerHTML=postDiv; - return postCreado; - - }); - contenedorPosts.append(...postsitos); - + //console.log('postsRef', postsRef); + + postsRef() + .then(postsCollection => { + postsCollection.forEach((item) => { /*para traer los posts de mi colección */ + + const posts = item.data(); + console.log(posts); + + const postCreado = document.createElement('div'); + postCreado.className = 'post-div'; + + + postCreado.innerHTML = ` +
+
+ + +
+ +

${posts["titulo"]}

+

${posts["descripcion"]}

+

${posts["fecha"]}

+
+ `; + contenedorPosts.append(postCreado); + + }); + }) + .catch(error => console.log("fallo la promesa de firestore", error)) return feedSection; } -const openModalAddPost = (feedSection) => { - //console.log('post'); - const containerAddPost = document.createElement('div'); - containerAddPost.className = 'container-add-post'; - feedSection.appendChild(containerAddPost); - const openModalAddPost = document.createElement('div'); - openModalAddPost.className = 'modal-add-post'; - containerAddPost.appendChild(openModalAddPost); -} \ No newline at end of file diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index 32e2867d..fe3520d9 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -19,9 +19,34 @@ const firebaseConfig = { export const app = initializeApp(firebaseConfig); -import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs, doc, setDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); -export const postsRef = await getDocs(collection(db, 'posts')); -//console.log('postsRef',postsRef); \ No newline at end of file +export const postsRef = async () => await getDocs(collection(db, 'posts')) + +console.log('postsRef',postsRef()); + +//Add a new document in collection "posts" +// export const crearPost = await setDoc(doc(db, "posts", "LA"), { +// autor: "Jhoa", +// descripcion: "Insertando 1º post", +// fecha: "22/01/2023", +// titulo: "3º post" +// }); + + +export const crearPost = (uid, titulo, descripcion) => { + return this.db.collection('posts').add({ // adición de un post. También podemos utilizar nuestro propio Id usando: .doc("key").set({ + uid: uid, + autor: autor, + titulo: titulo, + descripcion: descripcion, + fecha: firebase.firestore.FieldValue.serverTimestamp() + }) + .then(refDoc => { // si la inserción(creación del post) fue exitosa debería dar en la consola el id del post que debería venir del firestore + console.log(`Id del post =>${refDoc.id}`) + }).catch(error => { + console.log(`Error de creación del post =>${error}`); + }) +}; \ No newline at end of file diff --git a/src/lib/firebase/post.js b/src/lib/firebase/post.js index 29e71450..1b93e0e9 100644 --- a/src/lib/firebase/post.js +++ b/src/lib/firebase/post.js @@ -23,3 +23,4 @@ class Post { consultarPostxUsuario(emailUser) { } } + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 60353836..7160696b 100644 --- a/src/main.js +++ b/src/main.js @@ -5,7 +5,7 @@ import { onNavigate } from "./js/routes.js"; //import { getFirestore, collection, getDocs } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; //import { init } from "./lib/firebase/config.js"; import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; -import { postsRef } from "./lib/firebase/methodsFirestore.js"; +//import { crearPost} from "./lib/firebase/methodsFirestore.js"; /*logout importar*/ //const app = init(); @@ -142,9 +142,25 @@ if (googleButton) { //MOSTRAR POSTS EXISTENTES //console.log('postsRef',postsRef); - export let posts = []; - postsRef.forEach((item) => { /*para traer los posts de mi colección */ - // // console.log(`${doc.id} => ${doc.data()}`); - posts.push({ id: item.id, data: item.data() }); - }); - //console.log('posts', posts); \ No newline at end of file + +//export const llamarColeccion = () => { + + // export const posts = []; + // postsRef() + // .then(postsCollection => { + // console.log(postsCollection); + // postsCollection.forEach((item) => { /*para traer los posts de mi colección */ + // // // console.log(`${doc.id} => ${doc.data()}`); + // posts.push({ id: item.id, data: item.data() }); + // }); + // }) + // .catch(error => console.log("fallo la promesa de firestore", error)) + // console.log(posts); + + + // } + // console.log('posts', posts); + + // CREAR UN NUEVO POST + + //crearPost("", "inserción 2do post", "holi de juevo"); \ No newline at end of file diff --git a/src/style.css b/src/style.css index 6e7ff7e4..99567f10 100644 --- a/src/style.css +++ b/src/style.css @@ -6,39 +6,6 @@ box-sizing: border-box; } -.modal { - display: none; - background: url(img/fondo10.png); - background-size: cover; - background-position: center; - width: 100%; - height: 100%; - top: 0; - left: 0; - position: fixed; - padding: 15px; - justify-content: center; - align-items: center; - - -} - -.modal-container { - background: rgba(255, 255, 255, 0.2); - backdrop-filter: blur(8px); - width: 320px; - height: 500px; - font-family: sans-serif; - padding: 25px; - border-radius: 15px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - -} - - .btnSubmit:hover { @@ -54,19 +21,7 @@ input:hover { } -.close-modal { - margin-bottom: 30px; - margin-left: 320px; - width: 20px; - height: 25px; - border: transparent; - color: rgb(48, 46, 46); - background-color: transparent; - position: absolute; - top: 10px; - padding-left: 18px; - cursor: pointer; -} + .message-error { font-size: 12px; @@ -615,43 +570,66 @@ input::placeholder { padding: 1rem; } -.container-add-post { - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100vh; - display: flex; - align-items: center; - justify-content: center; - background: rgba(0, 0, 0, 0.4); -} - -.modal-add-post { - width: 80%; - height: 50vh; - background: #334E6F; - border-radius: 12px; -} .contenedor-posts { width: 100%; - height: 82vh; + height: 800px; background-color: transparent; - border: 2px solid rgb(244, 130, 197); - + border: none; display: flex; /* or inline-flex */ flex-direction: column; - flex-direction: row; - - justify-content: center; + /* justify-content: center; */ + gap: 10px; } .post-div { - width: 95%; + width: 100%; height: 25vh; - border: 1px solid rgb(67, 33, 53); + border: 1px solid #52525C; border-radius: 10px; + background-color: #ffffff; +} + +.parte-superior-post{ + background-color: #C3E2E6; + height: 6vh; + border-top-left-radius: 10px; + border-top-right-radius: 10px; + border: 1px solid #52525C; + border-bottom: none; + display: flex; + align-items: center; +} + +.boton-editar{ + border: none; + background-color: transparent; + position: absolute; + right: 8vh; + +} + +.boton-eliminar{ + border: none; + background-color: transparent; + position: absolute; + right: 4vh; + + +} + +.boton-like{ + border: none; + color: #FA79AA; + background-color: transparent; + position: absolute; + + right: 8vh; + +} + +.titulo-post{ + font-family:century; } \ No newline at end of file From 16866d7bf864780538fc34a0b797f785b12ef307 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Mon, 23 Jan 2023 12:55:16 -0300 Subject: [PATCH 49/73] actualizar para mostrar post --- src/components/feed.js | 2 +- src/main.js | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 8799f113..0b0d61c5 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -114,7 +114,7 @@ export const feed = () => { return postCreado; }); - contenedorPosts.append(...postsitos); + contenedorPosts.append(postsitos); return feedSection; diff --git a/src/main.js b/src/main.js index 2bf6d1ee..844d78fe 100644 --- a/src/main.js +++ b/src/main.js @@ -8,7 +8,6 @@ import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/fi import { postsRef } from "./lib/firebase/methodsFirestore.js"; import { getFirestore } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; -import { postsRef } from "./lib/firebase/methodsFirestore.js"; /*logout importar*/ //const app = init(); From 27d9a41542c9b84a658b737140314e7aee79265e Mon Sep 17 00:00:00 2001 From: Valmontx Date: Mon, 23 Jan 2023 10:55:37 -0500 Subject: [PATCH 50/73] Mostramos los post existentes desde la coleccion firestore --- src/components/feed.js | 66 ++++++-------- src/components/imagen/avatar2.png | Bin 0 -> 285012 bytes src/index.html | 3 +- src/lib/firebase/methodsFirestore.js | 11 ++- src/main.js | 19 ++-- src/style.css | 126 ++++++++++++++++++++++----- 6 files changed, 152 insertions(+), 73 deletions(-) create mode 100644 src/components/imagen/avatar2.png diff --git a/src/components/feed.js b/src/components/feed.js index 8bce3766..33ff7735 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,5 +1,6 @@ //import { onNavigate } from '../js/routes.js' -//import { postsRef } from "./lib/firebase/methodsFirestore.js"; +//import { postsRef } from ". + import { posts } from "../main.js"; export const feed = () => { @@ -65,66 +66,57 @@ export const feed = () => { //
// // ` + + + + const publicarPostButton = document.createElement('button'); + publicarPostButton.className = 'post-btn'; + publicarPostButton.id = 'idPostButton'; + publicarPostButton.textContent = 'Create post'; + feedSection.appendChild(publicarPostButton); + - // const publicarPostButton = document.createElement('button'); - // publicarPostButton.className = 'post-btn'; - // publicarPostButton.id = 'idPostButton'; - // publicarPostButton.textContent = 'Help!'; - // modalPost.appendChild(publicarPostButton); + const textoUser = document.createElement('textarea') + textoUser.className = 'textoUser'; + textoUser.name = 'addpost' + textoUser.id = 'idUserPost'; + textoUser.placeholder = 'what do you need?' + feedSection.appendChild(textoUser); + const contenedorPosts = document.createElement('div'); contenedorPosts.className = 'contenedor-posts'; feedSection.appendChild(contenedorPosts); - - - //console.log('posts', posts); - const postsitos=posts.forEach((post) => { + posts.forEach((post) => { console.log(post.data["autor"]); - const postCreado = document.createElement('div'); - postCreado.className = 'post-div'; - - - postCreado.innerHTML = ` + const postDiv = document.createElement('div'); + postDiv.className = 'post-div'; + postDiv.innerHTML = `
- - + +
- +

${post.data["titulo"]}

${post.data["descripcion"]}

-

${post.fecha}

+

${post.data["fecha"]}

`; - //postCreado.innerHTML=postDiv; - return postCreado; + contenedorPosts.append(postDiv); }); - contenedorPosts.append(...postsitos); return feedSection; } -const openModalAddPost = (feedSection) => { - const containerAddPost = document.createElement('div'); - containerAddPost.className = 'container-add-post'; - feedSection.appendChild(containerAddPost); - const openModalAddPost = document.createElement('textarea'); - openModalAddPost.className = 'modal-add-post'; - openModalAddPost.id = 'modal-add-post'; - openModalAddPost.placeholder = 'What do you need?' - containerAddPost.appendChild(openModalAddPost); - const buttonModal = document.createElement('button'); - buttonModal.type= 'submit'; - buttonModal.textContent = 'submit'; - containerAddPost.appendChild(buttonModal) - -} + + diff --git a/src/components/imagen/avatar2.png b/src/components/imagen/avatar2.png new file mode 100644 index 0000000000000000000000000000000000000000..91936577f5f074721742584d1adc154bcb24c97b GIT binary patch literal 285012 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 z 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 d|5XAl18|s4(r$F#H)4jqt + - +

- - + diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index dbbaba7e..f83d6345 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -15,6 +15,7 @@ export const app = initializeApp(firebaseConfig); import { getFirestore, collection, getDocs, doc, setDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +// import { async } from "regenerator-runtime"; // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); @@ -23,6 +24,9 @@ export const postsRef = async () => await getDocs(collection(db, 'posts')) console.log('postsRef',postsRef()); +export const crearPost = async() => await addDoc(collection(db, 'posts')) + + //Add a new document in collection "posts" // export const crearPost = await setDoc(doc(db, "posts", "LA"), { // autor: "Jhoa", @@ -32,6 +36,7 @@ console.log('postsRef',postsRef()); // }); + // export const crearPost = (uid, titulo, descripcion) => { // return this.db.collection('posts').add({ // adición de un post. También podemos utilizar nuestro propio Id usando: .doc("key").set({ // uid: uid, diff --git a/src/main.js b/src/main.js index bfad2f7a..1aba9b87 100644 --- a/src/main.js +++ b/src/main.js @@ -116,11 +116,11 @@ if (signinForm) { }; // // LOGOUT -// /*const logout = document.getElementById('salir'); +// const logout = document.getElementById('salir'); // logout.addEventListener('click', () => { -// logOut(auth) +// logOut(auth) -// });*/ +// }); // GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') diff --git a/src/style.css b/src/style.css index 4d435ec4..132c6614 100644 --- a/src/style.css +++ b/src/style.css @@ -496,6 +496,7 @@ input::placeholder { .section-feed { width: 360px; height: 100vh; + overflow:scroll; /*es el 100% para cualquier dispositivo*/ /* display: grid; grid-template-columns: 80px 200px 80px; @@ -505,6 +506,8 @@ input::placeholder { /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); + + } /* .section-feed > * { @@ -542,9 +545,12 @@ input::placeholder { .container-buttons { position: absolute; + position: sticky; bottom: 0; left: 0; + top: 745px; width: 360px; + height: 59px; background-color: #F7DAE5; display: grid; grid-template-columns: repeat(3, 1fr); @@ -572,27 +578,30 @@ input::placeholder { background-color: transparent; border: none; display: flex; - /* or inline-flex */ flex-direction: column; - /* justify-content: center; */ - gap: 10px; + margin : 0 0 0 20px; + gap:20px; } .post-div { - width: 100%; + width: 90%; height: 25vh; border: 1px solid #52525C; border-radius: 10px; background-color: #ffffff; + font-family: 'Roboto', sans-serif; + font-size: 10px; + + + } .parte-superior-post{ background-color: #C3E2E6; height: 6vh; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border: 1px solid #52525C; + border-top-left-radius: 10px ; + border-top-right-radius: 10px ; border-bottom: none; display: flex; align-items: center; @@ -603,6 +612,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 8vh; + color: #222222; } @@ -611,6 +621,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 4vh; + color:#222222 } @@ -620,11 +631,60 @@ input::placeholder { color: #FA79AA; background-color: transparent; position: absolute; - - right: 8vh; + margin-top: 100px; + right: 4vh; + font-size: 12px; + font-family: 'roboto, sans-serif'; } .titulo-post{ - font-family:century; -} \ No newline at end of file + font-family: 'Roboto', sans-serif; + font-size: 15px; + color:#52525C; +} + +.textoUser{ + border:none; + resize: none; + width: 90%; + height: 50px; + margin: 0 5px 0 20px; + border: 5px double #d6d6db; + border-radius: 3px; + text-indent: 5px; + margin-bottom: 10px; + margin-top: -40px; + +} +h2.titulo-post{ + position: relative; + top: -35px; + margin: 0 0 0 20px; +} +h3.descripcion-post{ + margin: 0 0 0 20px; + color:#222222; +} +h4.fecha-post { + position: relative; + top: 60px; + margin: 0 0 0 15px; + + color: #888686; + font-size: 10px; +} +.post-btn { + position: relative; + background :#3b5998; + border-radius: 2px; + width: 50px; + height: 20px; + color:#d6d6db; + text-shadow: 1px 0 1px #ffffff; + border: none; + left: 275px; + top: 5px; + +} + \ No newline at end of file From ff8060ed888da060dd42f5e268b8a5de93591a10 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 24 Jan 2023 10:54:32 -0500 Subject: [PATCH 57/73] Se agrego funcionalidad al formulario del feed.js con validacion y estilos css --- src/components/register.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/register.js b/src/components/register.js index 04342441..defbba6e 100644 --- a/src/components/register.js +++ b/src/components/register.js @@ -83,7 +83,7 @@ export const register = () => { const buttonLogin = document.createElement('a'); buttonLogin.className = 'signin-a'; buttonLogin.textContent = 'Sign in'; - buttonLogin.id = 'botonLoguear'; + buttonLogin.id = 'botonLoguear'; From 3a838efecff690da4c43ba407828d03c92efed2b Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 24 Jan 2023 11:11:23 -0500 Subject: [PATCH 58/73] Se agrego funcionalidad del formulario del feed.js con validacion y estilos css --- .gitignore | 2 +- src/components/Home.js | 2 +- src/js/routes.js | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 7f7b404f..3dba51dc 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ node_modules/ .yarn.lock package-lock.json config.js -Register.js + diff --git a/src/components/Home.js b/src/components/Home.js index 04f95b2b..6df1f9bf 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -16,7 +16,7 @@ export const home = () => { buttonRegister.textContent = 'Sign up'; buttonRegister.id = 'botonRegistrar'; - buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonRegister.addEventListener('click', () => onNavigate('/Register')); const buttonLogin = document.createElement('li'); buttonLogin.className = 'navLink'; diff --git a/src/js/routes.js b/src/js/routes.js index ed50e342..f9862ad5 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,12 +1,12 @@ import { home } from '../components/home.js'; -import { register } from '../components/register.js'; +import { register } from '../components/Register.js'; import { login } from '../components/login.js'; import { feed } from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { '/': home, - '/register': register, + '/Register': register, '/login': login, '/feed': feed, }; From 5a09624c13fd519da6209fe0fe61fa012af21051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 24 Jan 2023 13:16:38 -0300 Subject: [PATCH 59/73] boton de enviar post funcionando en feed.js --- src/components/feed.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 9b1b5cc1..e1c40c7b 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -73,8 +73,8 @@ export const feed = () => { e.preventDefault(); console.log('click'); let textPost = document.getElementById('idUserPost').value; - if (textPost === null || textPost === ''){ - console.log('escriba un mensaje'); + if (textPost === null || textPost === '' || textPost.length == 0){ + alert('escriba un mensaje'); } console.log(textPost); }); From de2fc9be8e0e6ea8a30d7885b338bfd0c3397353 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Tue, 24 Jan 2023 11:19:09 -0500 Subject: [PATCH 60/73] Se agrego funcionalidad del formulario del feed.js con validacion y estilos css --- .gitignore | 1 + src/components/Home.js | 2 +- src/js/routes.js | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 3dba51dc..e0f3bf8e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ node_modules/ package-lock.json config.js +Register.js \ No newline at end of file diff --git a/src/components/Home.js b/src/components/Home.js index 6df1f9bf..04f95b2b 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -16,7 +16,7 @@ export const home = () => { buttonRegister.textContent = 'Sign up'; buttonRegister.id = 'botonRegistrar'; - buttonRegister.addEventListener('click', () => onNavigate('/Register')); + buttonRegister.addEventListener('click', () => onNavigate('/register')); const buttonLogin = document.createElement('li'); buttonLogin.className = 'navLink'; diff --git a/src/js/routes.js b/src/js/routes.js index f9862ad5..ed50e342 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,12 +1,12 @@ import { home } from '../components/home.js'; -import { register } from '../components/Register.js'; +import { register } from '../components/register.js'; import { login } from '../components/login.js'; import { feed } from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { '/': home, - '/Register': register, + '/register': register, '/login': login, '/feed': feed, }; From dd987eb328ccc2f7d9b67401a770ca7cfe87c9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 11:36:00 -0500 Subject: [PATCH 61/73] =?UTF-8?q?actualizaci=C3=B3n=20de=20los=20avances?= =?UTF-8?q?=20de=20Vale=20y=20Nico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/feed.js | 76 +++++++++++++------------- src/lib/firebase/methodsFirestore.js | 19 +------ src/main.js | 7 --- src/style.css | 79 ++++++++++++++++++++++++---- 4 files changed, 108 insertions(+), 73 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index a3b5a654..5fd03737 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,9 +1,4 @@ -<<<<<<< HEAD //import { onNavigate } from '../js/routes.js' -//import { postsRef } from "./lib/firebase/methodsFirestore.js"; -======= - ->>>>>>> 353e7b8df48abf0b48272cd8d2ea9fdd7e9d5160 import { postsRef } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { @@ -38,11 +33,11 @@ export const feed = () => { createContainerButtons.className = 'container-buttons'; feedSection.appendChild(createContainerButtons); - const createPostButton = document.createElement('button'); - createPostButton.id = 'idCreatePostButton' - createPostButton.innerHTML = ''; + // const createPostButton = document.createElement('button'); + // createPostButton.id = 'idCreatePostButton' + // createPostButton.innerHTML = ''; - createPostButton.addEventListener('click', () => openModalAddPost(feedSection)); + // createPostButton.addEventListener('click', () => openModalAddPost(feedSection)); const perfilButton = document.createElement('button'); @@ -53,44 +48,48 @@ export const feed = () => { comentarioButton.id = 'idcomentarioButton' comentarioButton.innerHTML = ''; + const logoutButton = document.createElement('button'); + logoutButton.id = 'idlogoutButton' + logoutButton.innerHTML = ''; createContainerButtons.appendChild(perfilButton); - createContainerButtons.appendChild(createPostButton); createContainerButtons.appendChild(comentarioButton) + createContainerButtons.appendChild(logoutButton); + + +//--------------CREANDO UN NUEVO POST----------------------------- const formulario = document.createElement('form'); formulario.id = 'idForm'; + feedSection.appendChild(formulario); + + const textoUser = document.createElement('textarea'); + textoUser.className = 'textoUser'; + // textoUser.name = 'addpost'; + textoUser.id = 'idUserPost'; + textoUser.placeholder = 'what do you need?' + formulario.appendChild(textoUser); const publicarPostButton = document.createElement('button'); publicarPostButton.className = 'post-btn'; publicarPostButton.type = 'submit'; publicarPostButton.id = 'idPostButton'; - publicarPostButton.textContent = 'Create post'; + publicarPostButton.textContent = 'Post'; formulario.appendChild(publicarPostButton); - feedSection.appendChild(formulario); - - - - const formularioPost = document.getElementById('idForm') - if (formularioPost) { - formularioPost.addEventListener('submit', () => { - console.log('click') - let textPost = document.getElementById('idUserPost').value; - console.log(textPost); - }); - } - - const textoUser = document.createElement('textarea') - textoUser.className = 'textoUser'; - textoUser.name = 'addpost' - textoUser.id = 'idUserPost'; - textoUser.placeholder = 'what do you need?' - formulario.appendChild(textoUser); - - - + //const formularioPost = document.getElementById('idForm'); + + formulario.addEventListener('submit', (e) => { + e.preventDefault(); + console.log('click'); + let textPost = document.getElementById('idUserPost').value; + if (textPost === null || textPost === '' || textPost.length == 0){ + alert('escriba un mensaje'); + } + console.log(textPost); + }); +//----------------------MOSTRANDO POSTS EXISTENTES----------------------------- const contenedorPosts = document.createElement('div'); contenedorPosts.className = 'contenedor-posts'; @@ -101,8 +100,8 @@ export const feed = () => { postsCollection.forEach((item) => { /*para traer los posts de mi colección */ const posts = item.data(); - console.log(posts); - + //console.log(posts); + //console.log(posts["fecha"]); const postCreado = document.createElement('div'); postCreado.className = 'post-div'; @@ -114,9 +113,10 @@ export const feed = () => { -

${posts["titulo"]}

-

${posts["descripcion"]}

-

${posts["fecha"]}

+

+ +

${posts["descripcion"]}

+

${posts["fecha"]}

`; contenedorPosts.append(postCreado); diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index 674ea63e..9f6a1892 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -10,16 +10,7 @@ const firebaseConfig = { appId: '1:161909447570:web:b126b68b577520ab947f4b', }; -<<<<<<< HEAD - // Initialize Firebase -// console.log('app', app) -// export const init = () =>{ -// return app; -// } -======= -export const app = initializeApp(firebaseConfig); ->>>>>>> 353e7b8df48abf0b48272cd8d2ea9fdd7e9d5160 export const app = initializeApp(firebaseConfig); @@ -27,14 +18,10 @@ import { getFirestore, collection, getDocs, doc, setDoc } from "https://www.gsta // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); -<<<<<<< HEAD -export const postsRef = async () => await getDocs(collection(db, 'posts')) /*obtener la coleccion de firestore*/ -======= // Obtener la data desde el firestore export const postsRef = async () => await getDocs(collection(db, 'posts')) ->>>>>>> 353e7b8df48abf0b48272cd8d2ea9fdd7e9d5160 -console.log('postsRef',postsRef()); +//console.log('postsRef',postsRef()); //Add a new document in collection "posts" // export const crearPost = await setDoc(doc(db, "posts", "LA"), { @@ -58,8 +45,4 @@ console.log('postsRef',postsRef()); // }).catch(error => { // console.log(`Error de creación del post =>${error}`); // }) -<<<<<<< HEAD -// }; -======= // }; ->>>>>>> 353e7b8df48abf0b48272cd8d2ea9fdd7e9d5160 diff --git a/src/main.js b/src/main.js index a260ff65..bfad2f7a 100644 --- a/src/main.js +++ b/src/main.js @@ -133,10 +133,3 @@ if (googleButton) { }; -<<<<<<< HEAD - - - - -======= ->>>>>>> 353e7b8df48abf0b48272cd8d2ea9fdd7e9d5160 diff --git a/src/style.css b/src/style.css index 65e3f373..0f3d73ea 100644 --- a/src/style.css +++ b/src/style.css @@ -487,6 +487,7 @@ input::placeholder { .section-feed { width: 360px; height: 100vh; + overflow:scroll; /*es el 100% para cualquier dispositivo*/ /* display: grid; grid-template-columns: 80px 200px 80px; @@ -496,6 +497,8 @@ input::placeholder { /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); + + } /* .section-feed > * { @@ -533,9 +536,12 @@ input::placeholder { .container-buttons { position: absolute; + position: sticky; bottom: 0; left: 0; + top: 745px; width: 360px; + height: 59px; background-color: #F7DAE5; display: grid; grid-template-columns: repeat(3, 1fr); @@ -563,27 +569,30 @@ input::placeholder { background-color: transparent; border: none; display: flex; - /* or inline-flex */ flex-direction: column; - /* justify-content: center; */ - gap: 10px; + margin : 0 0 0 20px; + gap:20px; } .post-div { - width: 100%; + width: 90%; height: 25vh; border: 1px solid #52525C; border-radius: 10px; background-color: #ffffff; + font-family: 'Roboto', sans-serif; + font-size: 10px; + + + } .parte-superior-post{ background-color: #C3E2E6; height: 6vh; - border-top-left-radius: 10px; - border-top-right-radius: 10px; - border: 1px solid #52525C; + border-top-left-radius: 10px ; + border-top-right-radius: 10px ; border-bottom: none; display: flex; align-items: center; @@ -594,6 +603,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 8vh; + color: #222222; } @@ -602,6 +612,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 4vh; + color:#222222 } @@ -611,11 +622,59 @@ input::placeholder { color: #FA79AA; background-color: transparent; position: absolute; - - right: 8vh; + margin-top: 100px; + right: 4vh; + font-size: 12px; + font-family: 'roboto, sans-serif'; } .titulo-post{ - font-family:century; + font-family: 'Roboto', sans-serif; + font-size: 15px; + color:#52525C; +} + +.textoUser{ + border:none; + resize: none; + width: 90%; + height: 50px; + margin: 0 5px 0 20px; + border: 5px double #d6d6db; + border-radius: 3px; + text-indent: 5px; + margin-bottom: 10px; + margin-top: -40px; + +} +h2.titulo-post{ + position: relative; + top: -35px; + margin: 0 0 0 20px; +} +h3.descripcion-post{ + margin: 0 0 0 20px; + color:#222222; +} +h4.fecha-post { + position: relative; + top: 60px; + margin: 0 0 0 15px; + + color: #888686; + font-size: 10px; +} +.post-btn { + position: relative; + background :#3b5998; + border-radius: 2px; + width: 50px; + height: 20px; + color:#d6d6db; + text-shadow: 1px 0 1px #ffffff; + border: none; + left: 275px; + top: 5px; + } \ No newline at end of file From d0c21f065e4f33eb4e03cf35febf1d5d529166a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 24 Jan 2023 15:51:53 -0300 Subject: [PATCH 62/73] se agrega funcion logout, loginwithGoogle no funciona, se agrega addDoc pero agrega nuevos post vacios --- src/comentarios.text | 199 +++++++++++++++++++++++++++ src/components/feed.js | 24 ++-- src/index.html | 5 - src/lib/firebase/methodsAuth.js | 4 +- src/lib/firebase/methodsFirestore.js | 10 +- src/main.js | 23 ++-- src/style.css | 80 ++++++++--- 7 files changed, 304 insertions(+), 41 deletions(-) diff --git a/src/comentarios.text b/src/comentarios.text index d3de8d53..e86b3d4d 100644 --- a/src/comentarios.text +++ b/src/comentarios.text @@ -72,3 +72,202 @@ const openModalAddPost = (feedSection) => { background: #334E6F; border-radius: 12px; } + +------------------------------- estilos Vale------------ +.section-feed { + width: 360px; + height: 100vh; + overflow:scroll; + /*es el 100% para cualquier dispositivo*/ + /* display: grid; + grid-template-columns: 80px 200px 80px; + grid-template-rows: repeat(3, 200px); + gap: 5px; */ + position: relative; + /*para que el hijo posicionarse respecto al section-feed*/ + /* justify-content: center; */ + background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); + + +} + +/* .section-feed > * { + text-align: center; + justify-content: center; + align-items: center; + display: flex; +} */ +.tituloh2-feed { + font-family: 'Fredoka One'; + width: 300px; + height: 47px; + text-align: center; + font-style: normal; + font-weight: 400; + font-size: 35px; + line-height: 42px; + color: rgba(255, 242, 242, 0.25); + text-shadow: 0px 4px 4px rgba(0, 0, 0, 0.25); + margin: 0; + /* position: absolute; + top: 25px; + left: 19px */ +} + +.avatarImg { + width: 65px; + height: 65px; + + /* position: absolute; + right: 12px; + top:12px */ +} + + + .container-buttons { + position: absolute; + position: sticky; + bottom: 0; + left: 0; + top: 745px; + width: 360px; + height: 59px; + background-color: #F7DAE5; + display: grid; + grid-template-columns: repeat(3, 1fr); + /*las tres columnas tendrán la misma dimensión en cualquier dispositivo*/ +} + +.container-buttons button { + padding: 1rem; + border: none; + background: transparent; +} + +.feed-container-header { + display: flex; + align-items: center; + justify-content: space-between; + width: 100% !important; + padding: 1rem; +} + + +.contenedor-posts { + width: 100%; + height: 800px; + background-color: transparent; + border: none; + display: flex; + flex-direction: column; + margin : 0 0 0 20px; + gap:20px; + +} + +.post-div { + width: 90%; + height: 25vh; + border: 1px solid #52525C; + border-radius: 10px; + background-color: #ffffff; + font-family: 'Roboto', sans-serif; + font-size: 10px; + + + +} + +.parte-superior-post{ + background-color: #C3E2E6; + height: 6vh; + border-top-left-radius: 10px ; + border-top-right-radius: 10px ; + border-bottom: none; + display: flex; + align-items: center; +} + +.boton-editar{ + border: none; + background-color: transparent; + position: absolute; + right: 8vh; + color: #222222; + +} + +.boton-eliminar{ + border: none; + background-color: transparent; + position: absolute; + right: 4vh; + color:#222222 + + +} + +.boton-like{ + border: none; + color: #FA79AA; + background-color: transparent; + position: absolute; + + +} + +.titulo-post{ + font-family: 'Roboto', sans-serif; + font-size: 15px; + color:#52525C; +} + +.textoUser{ + border:none; + resize: none; + width: 90%; + height: 50px; + margin: 0 5px 0 20px; + border: 5px double #d6d6db; + border-radius: 3px; + text-indent: 5px; + margin-bottom: 10px; + margin-top: -40px; + +} +h2.titulo-post{ + position: relative; + top: -35px; + margin: 0 0 0 20px; +} +h3.descripcion-post{ + margin: 0 0 0 20px; + color:#222222; +} +h4.fecha-post { + position: relative; + top: 60px; + margin: 0 0 0 15px; + + color: #888686; + font-size: 10px; +} +.post-btn { + position: relative; + background :#3b5998; + border-radius: 2px; + width: 50px; + height: 20px; + color:#d6d6db; + text-shadow: 1px 0 1px #ffffff; + border: none; + left: 275px; + top: 5px; + +} + + +------BOTON EN EL FEEED DE VALE----------- +const logoutButton = document.createElement('button'); + logoutButton.id = 'idlogoutButton' + logoutButton.innerHTML = ''; \ No newline at end of file diff --git a/src/components/feed.js b/src/components/feed.js index e1c40c7b..13f695e9 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,5 +1,5 @@ -import { postsRef } from "../lib/firebase/methodsFirestore.js"; +import { postsRef, savePosts } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -33,9 +33,9 @@ export const feed = () => { createContainerButtons.className = 'container-buttons'; feedSection.appendChild(createContainerButtons); - const createPostButton = document.createElement('button'); - createPostButton.id = 'idCreatePostButton' - createPostButton.innerHTML = ''; + const logoutButton = document.createElement('button'); + logoutButton.id = 'idlogoutButton' + logoutButton.innerHTML = ''; const perfilButton = document.createElement('button'); perfilButton.id = 'idPerfilButton' @@ -47,8 +47,8 @@ export const feed = () => { createContainerButtons.appendChild(perfilButton); - createContainerButtons.appendChild(createPostButton); - createContainerButtons.appendChild(comentarioButton) + createContainerButtons.appendChild(comentarioButton); + createContainerButtons.appendChild(logoutButton); //FORMULARIO PARA POSTEAR @@ -65,7 +65,7 @@ export const feed = () => { publicarPostButton.className = 'post-btn'; publicarPostButton.type = 'submit'; publicarPostButton.id = 'idPostButton'; - publicarPostButton.textContent = 'Create post'; + publicarPostButton.textContent = 'Post'; formulario.appendChild(publicarPostButton); @@ -76,7 +76,8 @@ export const feed = () => { if (textPost === null || textPost === '' || textPost.length == 0){ alert('escriba un mensaje'); } - console.log(textPost); + formulario.reset(); + alert('tu post ha sido publicado'); }); @@ -95,6 +96,9 @@ export const feed = () => { contenedorPosts.className = 'contenedor-posts'; feedSection.appendChild(contenedorPosts); + + savePosts(textoUser.value).then().catch(error => console.log("fallo la promesa para postear", error)); + postsRef() .then(postsCollection => { postsCollection.forEach((item) => { /*para traer los posts de mi colección */ @@ -124,6 +128,10 @@ export const feed = () => { }) .catch(error => console.log("fallo la promesa de firestore", error)) + // let valorPostCreado = getElementById('idUserPost').value; + + + return feedSection; } diff --git a/src/index.html b/src/index.html index 2da5f708..be0fedcf 100644 --- a/src/index.html +++ b/src/index.html @@ -104,12 +104,7 @@

Sign in

- - - - diff --git a/src/lib/firebase/methodsAuth.js b/src/lib/firebase/methodsAuth.js index 254d47c2..014e536c 100644 --- a/src/lib/firebase/methodsAuth.js +++ b/src/lib/firebase/methodsAuth.js @@ -56,11 +56,11 @@ export const login = (auth, email, password) => { } - /* export const logOut = (auth) => { + export const logOut = (auth) => { auth.signOut().then(() => { console.log('sign out'); }); - }*/ + } export const loginWithGoogle = (auth) => { diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index a5d0c8e7..b85416d9 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -13,7 +13,7 @@ const firebaseConfig = { export const app = initializeApp(firebaseConfig); -import { getFirestore, collection, getDocs, doc, setDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs, addDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); @@ -24,6 +24,14 @@ console.log('postsRef',postsRef()); //---------------Generando nuevos post de forma dinámica---------------- +//utilizando método addDoc de firestore + +export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) + + + + + //------------------------------Editando post----------------------------- diff --git a/src/main.js b/src/main.js index 3ab8ab3a..51e31128 100644 --- a/src/main.js +++ b/src/main.js @@ -1,7 +1,7 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { login, register, loginWithGoogle, verificarSendingMail, logOut } from "./lib/firebase/methodsAuth.js"; /*logout importar*/ @@ -115,19 +115,24 @@ if (signinForm) { }); }; -// // LOGOUT -// /*const logout = document.getElementById('salir'); -// logout.addEventListener('click', () => { -// logOut(auth) - -// });*/ - -// GOOGLE LOGIN + //---------------- LOGOUT------------ + const logout = document.getElementById('idlogoutButton'); + if(logout){ + logout.addEventListener('click', () => { + alert('¿deseas abandonar tu sesión?'); + logOut(auth); + onNavigate('/'); + }); +}; +// --------------- GOOGLE LOGIN----------------- const googleButton = document.getElementById('entrarGoogle') if (googleButton) { googleButton.addEventListener('click', (e) => { e.preventDefault(); loginWithGoogle(auth); signinForm.reset(); + //poner una condicion para enviar al feed luego de cerrarse el pop up de google + onNavigate('/feed'); + console.log('Bienvenid@'); }); }; \ No newline at end of file diff --git a/src/style.css b/src/style.css index 4d435ec4..b862d557 100644 --- a/src/style.css +++ b/src/style.css @@ -495,24 +495,16 @@ input::placeholder { .section-feed { width: 360px; - height: 100vh; + height: 100vh; /*es el 100% para cualquier dispositivo*/ - /* display: grid; - grid-template-columns: 80px 200px 80px; - grid-template-rows: repeat(3, 200px); - gap: 5px; */ + overflow:scroll; position: relative; /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); } -/* .section-feed > * { - text-align: center; - justify-content: center; - align-items: center; - display: flex; -} */ + .tituloh2-feed { font-family: 'Fredoka One'; width: 300px; @@ -542,9 +534,13 @@ input::placeholder { .container-buttons { position: absolute; + position: sticky; + z-index: 1; bottom: 0; left: 0; + top: 745px; width: 360px; + height: 59px; background-color: #F7DAE5; display: grid; grid-template-columns: repeat(3, 1fr); @@ -575,7 +571,8 @@ input::placeholder { /* or inline-flex */ flex-direction: column; /* justify-content: center; */ - gap: 10px; + margin : 0 0 0 20px; + gap: 20px; } @@ -585,6 +582,8 @@ input::placeholder { border: 1px solid #52525C; border-radius: 10px; background-color: #ffffff; + font-family: 'Roboto', sans-serif; + font-size: 10px; } .parte-superior-post{ @@ -603,6 +602,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 8vh; + color: #222222; } @@ -611,7 +611,7 @@ input::placeholder { background-color: transparent; position: absolute; right: 4vh; - + color:#222222; } @@ -620,11 +620,59 @@ input::placeholder { color: #FA79AA; background-color: transparent; position: absolute; - - right: 8vh; + margin-top: 100px; + right: 4vh; + font-size: 12px; + font-family: 'roboto, sans-serif'; } .titulo-post{ - font-family:century; + font-family: 'Roboto', sans-serif; + font-size: 15px; + color:#52525C; +} + +.textoUser{ + border:none; + resize: none; + width: 90%; + height: 50px; + margin: 0 5px 0 20px; + border: 5px double #d6d6db; + border-radius: 3px; + text-indent: 5px; + margin-bottom: 10px; + margin-top: -40px; + +} +h2.titulo-post{ + position: relative; + top: -35px; + margin: 0 0 0 20px; +} +h3.descripcion-post{ + margin: 0 0 0 20px; + color:#222222; +} +h4.fecha-post { + position: relative; + top: 60px; + margin: 0 0 0 15px; + + color: #888686; + font-size: 10px; +} +.post-btn { + position: relative; + background :#3b5998; + border-radius: 2px; + width: 50px; + height: 20px; + color:#d6d6db; + text-shadow: 1px 0 1px #ffffff; + border: none; + left: 275px; + top: 5px; + } \ No newline at end of file From 186cf37ba219168064061ac2a063ad07dc624665 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicole=20Henr=C3=ADquez?= Date: Tue, 24 Jan 2023 17:33:28 -0300 Subject: [PATCH 63/73] funcion savePost en feed.js muestra los post generados desde el tesarea del feed --- src/components/feed.js | 12 +++++++++--- src/lib/firebase/methodsAuth.js | 2 ++ src/lib/firebase/methodsFirestore.js | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 13f695e9..90399bcc 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -76,8 +76,13 @@ export const feed = () => { if (textPost === null || textPost === '' || textPost.length == 0){ alert('escriba un mensaje'); } + else{ + savePosts(textPost).then().catch(error => console.log("fallo la promesa para postear", error)); + alert('tu post ha sido publicado'); + + } + formulario.reset(); - alert('tu post ha sido publicado'); }); @@ -96,9 +101,10 @@ export const feed = () => { contenedorPosts.className = 'contenedor-posts'; feedSection.appendChild(contenedorPosts); - - savePosts(textoUser.value).then().catch(error => console.log("fallo la promesa para postear", error)); + // savePosts(textoUser.value).then().catch(error => console.log("fallo la promesa para postear", error)); + + postsRef() .then(postsCollection => { postsCollection.forEach((item) => { /*para traer los posts de mi colección */ diff --git a/src/lib/firebase/methodsAuth.js b/src/lib/firebase/methodsAuth.js index 014e536c..52633a10 100644 --- a/src/lib/firebase/methodsAuth.js +++ b/src/lib/firebase/methodsAuth.js @@ -56,6 +56,8 @@ export const login = (auth, email, password) => { } + + export const logOut = (auth) => { auth.signOut().then(() => { console.log('sign out'); diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index b85416d9..4b4e069f 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -33,6 +33,7 @@ export const savePosts = async (descripcion) => await addDoc(collection(db, 'pos + //------------------------------Editando post----------------------------- From 267c6bb61377cdc6f943aaae3d1a559e5d412979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 16:54:28 -0500 Subject: [PATCH 64/73] =?UTF-8?q?actualizaci=C3=B3n=20de=20los=20avances?= =?UTF-8?q?=20de=20Vale=20y=20Nico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/firebase/methodsAuth.js | 38 +++++++++++++++++++--------- src/lib/firebase/methodsFirestore.js | 2 +- src/main.js | 38 +++++++++++++++++++--------- 3 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/lib/firebase/methodsAuth.js b/src/lib/firebase/methodsAuth.js index 254d47c2..26f24f30 100644 --- a/src/lib/firebase/methodsAuth.js +++ b/src/lib/firebase/methodsAuth.js @@ -56,24 +56,38 @@ export const login = (auth, email, password) => { } - /* export const logOut = (auth) => { + export const logOut = (auth) => { auth.signOut().then(() => { console.log('sign out'); }); - }*/ + } export const loginWithGoogle = (auth) => { + return new Promise((resolve, reject) => { //resolve para retornar el valor deseado cuando una función se ejecute y reject para cuando una función retorna un valor no deseado./ + const provider = new GoogleAuthProvider(); - signInWithPopup(auth, provider) - .then(result => { - const user = result.user; - // closeModalSI(); - console.log('sign in Google'); - // signinForm.querySelector('.message-error').innerHTML = ''; - }) - .catch((error) => { + return signInWithPopup(auth, provider) + .then(({ user }) => resolve(user)) + .catch(error => reject(error)) + + }) + } + + + + // export const loginWithGoogle = (auth) => { + // const provider = new GoogleAuthProvider(); + + // signInWithPopup(auth, provider) + // .then(result => { + // const user = result.user; + // // closeModalSI(); + // console.log('sign in Google'); + // // signinForm.querySelector('.message-error').innerHTML = ''; + // }) + // .catch((error) => { - }); - } \ No newline at end of file + // }); + // } \ No newline at end of file diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index 9f6a1892..afd79ce5 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -14,7 +14,7 @@ const firebaseConfig = { export const app = initializeApp(firebaseConfig); -import { getFirestore, collection, getDocs, doc, setDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs, addDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); diff --git a/src/main.js b/src/main.js index bfad2f7a..a50af9d1 100644 --- a/src/main.js +++ b/src/main.js @@ -1,10 +1,9 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { login, register, loginWithGoogle, verificarSendingMail, logOut } from "./lib/firebase/methodsAuth.js"; -/*logout importar*/ //const app = init(); const auth = getAuth(); @@ -115,21 +114,36 @@ if (signinForm) { }); }; -// // LOGOUT -// /*const logout = document.getElementById('salir'); -// logout.addEventListener('click', () => { -// logOut(auth) +// LOGOUT +const logout = document.getElementById('idlogoutButton'); +if (logout) { + logout.addEventListener('click', () => { + logOut(auth) -// });*/ + }); +} // GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') if (googleButton) { - googleButton.addEventListener('click', (e) => { + googleButton.addEventListener('click', async (e) => { e.preventDefault(); - loginWithGoogle(auth); - signinForm.reset(); - }); -}; + try { + const {emailVerified, email}= await loginWithGoogle(auth); + signinForm.reset(); + if (emailVerified) { + onNavigate('/feed'); + console.log('Bienvenid@', email); + } else { + + /* auth.signOut();*/ + console.log('Por favor realiza la verificación de tu cuenta'); + } + } + catch (error) { + + }; + }); + }; From 3bbacf87ddc22c71a099c5ba45d61076344fc6a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 19:52:22 -0500 Subject: [PATCH 65/73] =?UTF-8?q?actualizaci=C3=B3n=20de=20los=20avances?= =?UTF-8?q?=20de=20Vale=20y=20Nico?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/feed.js | 45 ++++++++++++++++++---------- src/lib/firebase/methodsFirestore.js | 8 +++++ src/main.js | 9 +++--- src/style.css | 22 ++++++++++++-- 4 files changed, 62 insertions(+), 22 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 5fd03737..21f5ba22 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,5 +1,5 @@ //import { onNavigate } from '../js/routes.js' -import { postsRef } from "../lib/firebase/methodsFirestore.js"; +import { postsRef, savePosts } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -41,15 +41,21 @@ export const feed = () => { const perfilButton = document.createElement('button'); - perfilButton.id = 'idPerfilButton' + perfilButton.type = 'button'; + perfilButton.id = 'idPerfilButton'; + perfilButton.className = 'perfil-button'; perfilButton.innerHTML = ''; const comentarioButton = document.createElement('button'); - comentarioButton.id = 'idcomentarioButton' + comentarioButton.type = 'button'; + comentarioButton.id = 'idcomentarioButton'; + comentarioButton.className = 'comentario-button'; comentarioButton.innerHTML = ''; const logoutButton = document.createElement('button'); - logoutButton.id = 'idlogoutButton' + logoutButton.type = 'button'; + logoutButton.id = 'idlogoutButton'; + logoutButton.className = 'logout-button'; logoutButton.innerHTML = ''; createContainerButtons.appendChild(perfilButton); @@ -60,16 +66,11 @@ export const feed = () => { //--------------CREANDO UN NUEVO POST----------------------------- const formulario = document.createElement('form'); + formulario.method = 'post'; formulario.id = 'idForm'; + formulario.className = 'formulario-post'; feedSection.appendChild(formulario); - const textoUser = document.createElement('textarea'); - textoUser.className = 'textoUser'; - // textoUser.name = 'addpost'; - textoUser.id = 'idUserPost'; - textoUser.placeholder = 'what do you need?' - formulario.appendChild(textoUser); - const publicarPostButton = document.createElement('button'); publicarPostButton.className = 'post-btn'; publicarPostButton.type = 'submit'; @@ -77,18 +78,32 @@ export const feed = () => { publicarPostButton.textContent = 'Post'; formulario.appendChild(publicarPostButton); - //const formularioPost = document.getElementById('idForm'); - + formulario.addEventListener('submit', (e) => { e.preventDefault(); console.log('click'); let textPost = document.getElementById('idUserPost').value; - if (textPost === null || textPost === '' || textPost.length == 0){ + if (textPost === ''){ alert('escriba un mensaje'); } - console.log(textPost); + else{ + savePosts(textPost).then().catch(error => console.log("fallo la promesa para postear", error)); + alert('tu post ha sido publicado'); + + } + + formulario.reset(); }); + const textoUser = document.createElement('textarea'); + textoUser.className = 'textoUser'; + // textoUser.name = 'addpost'; + textoUser.id = 'idUserPost'; + textoUser.placeholder = 'what do you need?' + formulario.appendChild(textoUser); + + + //----------------------MOSTRANDO POSTS EXISTENTES----------------------------- const contenedorPosts = document.createElement('div'); diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index afd79ce5..b98e39be 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -22,6 +22,14 @@ const db = getFirestore(app); export const postsRef = async () => await getDocs(collection(db, 'posts')) //console.log('postsRef',postsRef()); +//---------------Generando nuevos post de forma dinámica---------------- + +//utilizando método addDoc de firestore + +export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) + + + //Add a new document in collection "posts" // export const crearPost = await setDoc(doc(db, "posts", "LA"), { diff --git a/src/main.js b/src/main.js index a50af9d1..f4fdd039 100644 --- a/src/main.js +++ b/src/main.js @@ -115,10 +115,11 @@ if (signinForm) { }; // LOGOUT -const logout = document.getElementById('idlogoutButton'); -if (logout) { - logout.addEventListener('click', () => { - logOut(auth) +const logoutButton = document.getElementById('idlogoutButton'); +if (logoutButton) { + logoutButton.addEventListener('click', () => { + logOut(auth); + onNavigate('/'); }); } diff --git a/src/style.css b/src/style.css index 0f3d73ea..7dcd1330 100644 --- a/src/style.css +++ b/src/style.css @@ -554,6 +554,18 @@ input::placeholder { background: transparent; } +.perfil-button{ + cursor: pointer !important; +} + +.comentario-button{ + cursor: pointer; +} + +.logout-button{ + cursor: pointer; +} + .feed-container-header { display: flex; align-items: center; @@ -604,7 +616,8 @@ input::placeholder { position: absolute; right: 8vh; color: #222222; - + cursor: pointer; + } .boton-eliminar{ @@ -612,7 +625,8 @@ input::placeholder { background-color: transparent; position: absolute; right: 4vh; - color:#222222 + color:#222222; + cursor: pointer; } @@ -626,6 +640,7 @@ input::placeholder { right: 4vh; font-size: 12px; font-family: 'roboto, sans-serif'; + cursor: pointer; } @@ -653,7 +668,7 @@ h2.titulo-post{ top: -35px; margin: 0 0 0 20px; } -h3.descripcion-post{ +h4.descripcion-post{ margin: 0 0 0 20px; color:#222222; } @@ -676,5 +691,6 @@ h4.fecha-post { border: none; left: 275px; top: 5px; + cursor: pointer; } \ No newline at end of file From 63dfcdf2edb38237d84e5f1c62946765a9517d1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 20:05:35 -0500 Subject: [PATCH 66/73] fix rename file --- src/components/Register.js | 11 ----------- src/components/{register.js => Register2.js} | 0 2 files changed, 11 deletions(-) delete mode 100644 src/components/Register.js rename src/components/{register.js => Register2.js} (100%) diff --git a/src/components/Register.js b/src/components/Register.js deleted file mode 100644 index 3c241917..00000000 --- a/src/components/Register.js +++ /dev/null @@ -1,11 +0,0 @@ -export const Register = () =>{ - -const HomeDiv = document.createElement('div'); -HomeDiv.textContent = 'Bienvenida al registro'; -const buttonHome = document.createElement('button'); - -buttonHome.textContent = 'Regresar al Home'; - -HomeDiv.appendChild('buttonHome'); -return HomeDiv; -} \ No newline at end of file diff --git a/src/components/register.js b/src/components/Register2.js similarity index 100% rename from src/components/register.js rename to src/components/Register2.js From 844eb7ee9b75d9c6fe8bec47d2d58235ae794fd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 20:24:49 -0500 Subject: [PATCH 67/73] fix rename file --- src/components/Register2.js | 94 ---------------------------- src/lib/firebase/methodsFirestore.js | 6 -- 2 files changed, 100 deletions(-) delete mode 100644 src/components/Register2.js diff --git a/src/components/Register2.js b/src/components/Register2.js deleted file mode 100644 index 04342441..00000000 --- a/src/components/Register2.js +++ /dev/null @@ -1,94 +0,0 @@ -import { onNavigate } from '../js/routes.js' - -export const register = () => { - - const signupSection = document.createElement('section'); - signupSection.className = 'sectionSignup-in' - const titulo = document.createElement('h2'); - titulo.textContent = "Dad's Power"; - titulo.className = 'tituloh2register-login'; - signupSection.appendChild(titulo); - - const formSU = document.createElement('form'); - formSU.className = 'form'; - formSU.method = 'post'; - formSU.id = 'formularioSU'; - - const divUser = document.createElement('div'); - divUser.className = 'contenedorForm' - signupSection.appendChild(divUser); - divUser.appendChild(formSU); - - const inputUser = document.createElement('input'); - const labelUser = document.createElement('label'); - labelUser.textContent = 'Username'; - labelUser.className ='usuario'; - formSU.appendChild(labelUser); - inputUser.type ='user'; - inputUser.className = 'username'; - inputUser.id = 'idUsername'; - inputUser.placeholder = 'Rob Scott'; - formSU.appendChild(inputUser); - - - const inputEmail = document.createElement('input'); - const labelEmail = document.createElement('label'); - labelEmail.textContent = 'E-mail'; - labelEmail.className = 'labelEmail'; - formSU.appendChild(labelEmail); - inputEmail.type = 'e-mail'; - inputEmail.className = 'email'; - inputEmail.id = 'idCorreoSU'; - inputEmail.placeholder = 'example@gmail.com' - formSU.appendChild(inputEmail); - - //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass - const errorSignupEmail = document.createElement('p'); - errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass - // errorSignupEmail.textContent = 'Aquí va error para email'; - formSU.appendChild(errorSignupEmail); - - - const inputPasword = document.createElement('input'); - const labelPassword = document.createElement('label'); - labelPassword.textContent = 'Password'; - labelPassword.className = 'labelPassword'; - formSU.appendChild(labelPassword); - inputPasword.type = 'password'; - inputPasword.textContent = 'password'; - inputPasword.className = 'password'; - inputPasword.id = 'idContraseñaSU'; - inputPasword.placeholder = '******' - formSU.appendChild(inputPasword); - - //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass - const errorSignupPassword = document.createElement('p'); - errorSignupPassword.className ='message-error-password'; //aquí debe estar la diferencia en la className, distinto para email y pass - // errorSignupPassword.textContent = 'Aquí va error para password'; - formSU.appendChild(errorSignupPassword); - - - const buttonSU = document.createElement('button'); - buttonSU.type = 'submit'; - buttonSU.textContent = 'submit' - buttonSU.className = 'btnSubmit'; - buttonSU.id = 'btnEnviarSU'; - formSU.appendChild(buttonSU); - - const tienesCuenta = document.createElement('p'); - tienesCuenta.className = 'p-tienes-cuenta-register'; - tienesCuenta.textContent = 'Already have an account ?'; - formSU.appendChild(tienesCuenta); - - const buttonLogin = document.createElement('a'); - buttonLogin.className = 'signin-a'; - buttonLogin.textContent = 'Sign in'; - buttonLogin.id = 'botonLoguear'; - - - - tienesCuenta.appendChild(buttonLogin); - buttonLogin.addEventListener('click', () => onNavigate('/login')); - - return signupSection; -} diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index a97d6468..d8fa393a 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -23,12 +23,6 @@ export const postsRef = async () => await getDocs(collection(db, 'posts')) //console.log('postsRef',postsRef()); //---------------Generando nuevos post de forma dinámica---------------- -//utilizando método addDoc de firestore - -export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) - - - //---------------Generando nuevos post de forma dinámica---------------- From 44ba18dd0c22d47646f7241e5d1f2b61d5cde9d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Tue, 24 Jan 2023 20:32:15 -0500 Subject: [PATCH 68/73] fix rename file --- src/components/Home.js | 2 +- src/components/registro.js | 94 ++++++++++++++++++++++++++++++++++++++ src/js/routes.js | 5 +- 3 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 src/components/registro.js diff --git a/src/components/Home.js b/src/components/Home.js index 04f95b2b..e89f0854 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -16,7 +16,7 @@ export const home = () => { buttonRegister.textContent = 'Sign up'; buttonRegister.id = 'botonRegistrar'; - buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonRegister.addEventListener('click', () => onNavigate('/registro')); const buttonLogin = document.createElement('li'); buttonLogin.className = 'navLink'; diff --git a/src/components/registro.js b/src/components/registro.js new file mode 100644 index 00000000..04342441 --- /dev/null +++ b/src/components/registro.js @@ -0,0 +1,94 @@ +import { onNavigate } from '../js/routes.js' + +export const register = () => { + + const signupSection = document.createElement('section'); + signupSection.className = 'sectionSignup-in' + const titulo = document.createElement('h2'); + titulo.textContent = "Dad's Power"; + titulo.className = 'tituloh2register-login'; + signupSection.appendChild(titulo); + + const formSU = document.createElement('form'); + formSU.className = 'form'; + formSU.method = 'post'; + formSU.id = 'formularioSU'; + + const divUser = document.createElement('div'); + divUser.className = 'contenedorForm' + signupSection.appendChild(divUser); + divUser.appendChild(formSU); + + const inputUser = document.createElement('input'); + const labelUser = document.createElement('label'); + labelUser.textContent = 'Username'; + labelUser.className ='usuario'; + formSU.appendChild(labelUser); + inputUser.type ='user'; + inputUser.className = 'username'; + inputUser.id = 'idUsername'; + inputUser.placeholder = 'Rob Scott'; + formSU.appendChild(inputUser); + + + const inputEmail = document.createElement('input'); + const labelEmail = document.createElement('label'); + labelEmail.textContent = 'E-mail'; + labelEmail.className = 'labelEmail'; + formSU.appendChild(labelEmail); + inputEmail.type = 'e-mail'; + inputEmail.className = 'email'; + inputEmail.id = 'idCorreoSU'; + inputEmail.placeholder = 'example@gmail.com' + formSU.appendChild(inputEmail); + + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSignupEmail = document.createElement('p'); + errorSignupEmail.className ='message-error-email'; //aquí debe estar la diferencia en la className, distinto para email y pass + // errorSignupEmail.textContent = 'Aquí va error para email'; + formSU.appendChild(errorSignupEmail); + + + const inputPasword = document.createElement('input'); + const labelPassword = document.createElement('label'); + labelPassword.textContent = 'Password'; + labelPassword.className = 'labelPassword'; + formSU.appendChild(labelPassword); + inputPasword.type = 'password'; + inputPasword.textContent = 'password'; + inputPasword.className = 'password'; + inputPasword.id = 'idContraseñaSU'; + inputPasword.placeholder = '******' + formSU.appendChild(inputPasword); + + //considerar agregar una diferencia en el parrafo que se imprima el mensaje de error segun sea para mail o pass + const errorSignupPassword = document.createElement('p'); + errorSignupPassword.className ='message-error-password'; //aquí debe estar la diferencia en la className, distinto para email y pass + // errorSignupPassword.textContent = 'Aquí va error para password'; + formSU.appendChild(errorSignupPassword); + + + const buttonSU = document.createElement('button'); + buttonSU.type = 'submit'; + buttonSU.textContent = 'submit' + buttonSU.className = 'btnSubmit'; + buttonSU.id = 'btnEnviarSU'; + formSU.appendChild(buttonSU); + + const tienesCuenta = document.createElement('p'); + tienesCuenta.className = 'p-tienes-cuenta-register'; + tienesCuenta.textContent = 'Already have an account ?'; + formSU.appendChild(tienesCuenta); + + const buttonLogin = document.createElement('a'); + buttonLogin.className = 'signin-a'; + buttonLogin.textContent = 'Sign in'; + buttonLogin.id = 'botonLoguear'; + + + + tienesCuenta.appendChild(buttonLogin); + buttonLogin.addEventListener('click', () => onNavigate('/login')); + + return signupSection; +} diff --git a/src/js/routes.js b/src/js/routes.js index ed50e342..74198118 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,12 +1,13 @@ import { home } from '../components/home.js'; -import { register } from '../components/register.js'; +import { register } from '../components/registro.js'; import { login } from '../components/login.js'; import { feed } from '../components/feed.js'; + const rootDiv = document.getElementById('root'); const routes = { '/': home, - '/register': register, + '/registro': register, '/login': login, '/feed': feed, }; From 09b0008c7166719eb63ea68009212ad1ad413934 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Wed, 25 Jan 2023 08:13:13 -0500 Subject: [PATCH 69/73] =?UTF-8?q?=20Se=20a=C3=B1adio=20un=20post=20en=20ti?= =?UTF-8?q?empo=20real=20en=20el=20feed.js=20con=20estilos=20css-=20funcio?= =?UTF-8?q?nalidad=20al=20boton=20logout=20y=20boton=20google?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/feed.js | 2 +- src/components/imagen/avatar3.png | Bin 0 -> 8013 bytes src/lib/firebase/methodsAuth.js | 4 ++-- src/lib/firebase/methodsFirestore.js | 2 +- src/main.js | 10 +++++----- src/style.css | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) create mode 100644 src/components/imagen/avatar3.png diff --git a/src/components/feed.js b/src/components/feed.js index 50d1e7f0..6178cad3 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -23,7 +23,7 @@ export const feed = () => { const avatarImg = document.createElement('img'); avatarImg.className = 'avatarImg'; - avatarImg.src = '/components/imagen/avatar.png'; + avatarImg.src = '/components/imagen/avatar3.png'; perfil.appendChild(avatarImg); containerHeader.appendChild(perfil); diff --git a/src/components/imagen/avatar3.png b/src/components/imagen/avatar3.png new file mode 100644 index 0000000000000000000000000000000000000000..52623337efcd16d7a2126bd4b1509846b9088485 GIT binary patch literal 8013 zcmV-TAF|+yP)q%+B7Ix8+cxC{j05j-1%2WG-E}N?cT85C

G?rR4NYMh;e@!nysJ19j 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 { } - /* export const logOut = (auth) => { + export const logOut = (auth) => { auth.signOut().then(() => { console.log('sign out'); }); - }*/ + } export const loginWithGoogle = (auth) => { diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index f83d6345..ccd2712e 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -24,7 +24,7 @@ export const postsRef = async () => await getDocs(collection(db, 'posts')) console.log('postsRef',postsRef()); -export const crearPost = async() => await addDoc(collection(db, 'posts')) +export const savePost = async() => await addDoc(collection(db, 'posts', {descricion})) //Add a new document in collection "posts" diff --git a/src/main.js b/src/main.js index 1aba9b87..0e722ab2 100644 --- a/src/main.js +++ b/src/main.js @@ -1,7 +1,7 @@ // Import the functions of Firestore for posting import { getAuth } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-auth.js"; import { onNavigate } from "./js/routes.js"; -import { login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; +import { logOut, login, register, loginWithGoogle, verificarSendingMail } from "./lib/firebase/methodsAuth.js"; /*logout importar*/ @@ -116,11 +116,11 @@ if (signinForm) { }; // // LOGOUT -// const logout = document.getElementById('salir'); -// logout.addEventListener('click', () => { -// logOut(auth) +const logout = document.getElementById('idlogoutButton'); +logout.addEventListener('click', () => +{ logOut(auth) -// }); +}); // GOOGLE LOGIN const googleButton = document.getElementById('entrarGoogle') diff --git a/src/style.css b/src/style.css index 132c6614..7c2ed1a2 100644 --- a/src/style.css +++ b/src/style.css @@ -654,7 +654,7 @@ input::placeholder { border-radius: 3px; text-indent: 5px; margin-bottom: 10px; - margin-top: -40px; + margin-top: -65px; } h2.titulo-post{ @@ -684,7 +684,7 @@ h4.fecha-post { text-shadow: 1px 0 1px #ffffff; border: none; left: 275px; - top: 5px; + top: 0px; } \ No newline at end of file From 80de48ea16599b83ed80cf4d5876e10a53d29121 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Wed, 25 Jan 2023 12:59:04 -0500 Subject: [PATCH 70/73] fix rename file --- src/components/Home.js | 2 +- src/components/Register.js | 11 ----------- src/components/{register.js => registro.js} | 0 src/js/routes.js | 4 ++-- 4 files changed, 3 insertions(+), 14 deletions(-) delete mode 100644 src/components/Register.js rename src/components/{register.js => registro.js} (100%) diff --git a/src/components/Home.js b/src/components/Home.js index 04f95b2b..e89f0854 100644 --- a/src/components/Home.js +++ b/src/components/Home.js @@ -16,7 +16,7 @@ export const home = () => { buttonRegister.textContent = 'Sign up'; buttonRegister.id = 'botonRegistrar'; - buttonRegister.addEventListener('click', () => onNavigate('/register')); + buttonRegister.addEventListener('click', () => onNavigate('/registro')); const buttonLogin = document.createElement('li'); buttonLogin.className = 'navLink'; diff --git a/src/components/Register.js b/src/components/Register.js deleted file mode 100644 index 3c241917..00000000 --- a/src/components/Register.js +++ /dev/null @@ -1,11 +0,0 @@ -export const Register = () =>{ - -const HomeDiv = document.createElement('div'); -HomeDiv.textContent = 'Bienvenida al registro'; -const buttonHome = document.createElement('button'); - -buttonHome.textContent = 'Regresar al Home'; - -HomeDiv.appendChild('buttonHome'); -return HomeDiv; -} \ No newline at end of file diff --git a/src/components/register.js b/src/components/registro.js similarity index 100% rename from src/components/register.js rename to src/components/registro.js diff --git a/src/js/routes.js b/src/js/routes.js index ed50e342..7a31f66c 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,12 +1,12 @@ import { home } from '../components/home.js'; -import { register } from '../components/register.js'; +import { register } from '../components/registro.js'; import { login } from '../components/login.js'; import { feed } from '../components/feed.js'; const rootDiv = document.getElementById('root'); const routes = { '/': home, - '/register': register, + '/registro': register, '/login': login, '/feed': feed, }; From fc1a9565b1f1314ad91889aa99bf2fd542eb566d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jhoanna=20Rosa=20Mera=20D=C3=A1vila?= Date: Sat, 28 Jan 2023 20:05:29 -0500 Subject: [PATCH 71/73] modal de logout --- src/components/feed.js | 105 +++++++++++++++++++++++++++++++---------- 1 file changed, 81 insertions(+), 24 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 76df7e17..d6752387 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,4 +1,6 @@ -import { postsRef, savePosts } from "../lib/firebase/methodsFirestore.js"; +import { postsRef, savePosts, unsub } from "../lib/firebase/methodsFirestore.js"; +//postRefRT, +//import { doc }from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -32,10 +34,6 @@ export const feed = () => { createContainerButtons.className = 'container-buttons'; feedSection.appendChild(createContainerButtons); - const logoutButton = document.createElement('button'); - logoutButton.id = 'idlogoutButton' - logoutButton.innerHTML = ''; - const perfilButton = document.createElement('button'); perfilButton.type = 'button'; perfilButton.id = 'idPerfilButton'; @@ -59,13 +57,15 @@ export const feed = () => { createContainerButtons.appendChild(logoutButton); - //FORMULARIO PARA POSTEAR + + + //----------------------------------FORMULARIO PARA POSTEAR-------------------------------------------------------------------------- const formulario = document.createElement('form'); formulario.method = 'post'; formulario.id = 'idForm'; formulario.className = 'formulario-post'; - console.log(formulario); + //console.log(formulario); feedSection.appendChild(formulario); @@ -87,7 +87,7 @@ export const feed = () => { else{ savePosts(textPost).then().catch(error => console.log("fallo la promesa para postear", error)); alert('tu post ha sido publicado'); - + unsub(textPost).then(result => console.log(result)).catch(error => console.log("fallo la promesa mostrar en tiempo real los posts existentes", error)); } formulario.reset(); @@ -104,7 +104,7 @@ export const feed = () => { -//----------------------MOSTRANDO POSTS EXISTENTES----------------------------- +//----------------------------MOSTRANDO POSTS EXISTENTES--------------------------------------------------------------------------------- const contenedorPosts = document.createElement('div'); contenedorPosts.className = 'contenedor-posts'; @@ -113,42 +113,99 @@ export const feed = () => { // savePosts(textoUser.value).then().catch(error => console.log("fallo la promesa para postear", error)); - postsRef() - .then(postsCollection => { - postsCollection.forEach((item) => { /*para traer los posts de mi colección */ + // .postRefRT(postsCollection => { + + //const posts = doc.data(); + + Query.forEach((doc) => { /*para traer los posts de mi colección */ - const posts = item.data(); + const posts = doc.data(); //console.log(posts); //console.log(posts["fecha"]); const postCreado = document.createElement('div'); postCreado.className = 'post-div'; + postCreado.innerHTML =''; - - postCreado.innerHTML = ` + if(user.uid === posts.uid){ + postCreado.innerHTML += `

- -

- -

${posts["descripcion"]}

-

${posts["fecha"]}

+ +
+ +

${posts["descripcion"]}

+ +

${posts["fecha"]}

+
+
- `; + ` + }else{ + postCreado.innerHTML += ` +
+
+
+ +
+ +

${posts["descripcion"]}

+ +

${posts["fecha"]}

+
+ +
+ ` + } + + ; + contenedorPosts.append(postCreado); }); - }) - .catch(error => console.log("fallo la promesa de firestore", error)) + + + - // let valorPostCreado = getElementById('idUserPost').value; + //MODAL LOG OUT + const modalLogOut= document.createElement('div'); + modalLogOut.className = 'modal'; + modalLogOut.id = 'idModalLogout'; + modalLogOut.innerHTML =` + + `; + feedSection.appendChild(modalLogOut); + + const closeModal = () => { + console.log('cerrando'); + modalLogOut.style.display = 'none'; + } + + const openModal = () => { + console.log('hello'); + modalLogOut.style.display = 'flex'; + } + + logoutButton.addEventListener('click', () =>{ + openModal(); + }); + + const closeModalLogout = modalLogOut.querySelector('#botonCancelar'); //no se puede usar getElementById porque aun no existe + if( closeModalLogout) + { closeModalLogout.addEventListener('click', () =>{closeModal()});} return feedSection; } + From ed0d11104cce6f70b1a101226f4ecb8cbc2d5ed5 Mon Sep 17 00:00:00 2001 From: Valmontx Date: Sun, 29 Jan 2023 20:44:21 -0500 Subject: [PATCH 72/73] se muestra los post en tiempo real y creacion del modal eliminar --- src/components/feed.js | 126 +++++++++++++++++++++------ src/index.html | 9 -- src/js/routes.js | 12 +-- src/lib/firebase/methodsFirestore.js | 48 ++++------ src/main.js | 2 +- src/style.css | 37 +++++++- 6 files changed, 158 insertions(+), 76 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 17c41a90..f4904ee3 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,4 +1,4 @@ -import { postsRef, savePosts } from "../lib/firebase/methodsFirestore.js"; +import { postsRef, savePosts, getPost } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -74,17 +74,18 @@ export const feed = () => { formulario.addEventListener('submit', (e) => { e.preventDefault(); + console.log('click'); let textPost = document.getElementById('idUserPost').value; - if (textPost === null || textPost === '' || textPost.length == 0){ - alert('escriba un mensaje'); + if (textPost === null || textPost === '' || textPost.length == 0) { + alert('escriba un mensaje'); } - else{ + else { savePosts(textPost).then().catch(error => console.log("fallo la promesa para postear", error)); alert('tu post ha sido publicado'); } - + formulario.reset(); }); @@ -99,7 +100,7 @@ export const feed = () => { -//----------------------MOSTRANDO POSTS EXISTENTES----------------------------- + //----------------------MOSTRANDO POSTS EXISTENTES----------------------------- const contenedorPosts = document.createElement('div'); contenedorPosts.className = 'contenedor-posts'; @@ -108,41 +109,116 @@ export const feed = () => { // savePosts(textoUser.value).then().catch(error => console.log("fallo la promesa para postear", error)); - - postsRef() - .then(postsCollection => { - postsCollection.forEach((item) => { /*para traer los posts de mi colección */ - const posts = item.data(); - //console.log(posts); - //console.log(posts["fecha"]); - const postCreado = document.createElement('div'); - postCreado.className = 'post-div'; + // postsRef() + getPost(postsCollection => { + postsCollection.forEach((item) => { /*para traer los posts de mi colección */ + const posts = item.data(); + //console.log(posts); + //console.log(posts["fecha"]); + const postCreado = document.createElement('div'); + postCreado.className = 'post-div'; + postCreado.innerHTML = ''; - postCreado.innerHTML = ` + postCreado.innerHTML = `
-
+

${posts["autor"]}

${posts["descripcion"]}

-

${posts["fecha"]}

+

${posts.date}

`; - contenedorPosts.append(postCreado); - - }); - }) - .catch(error => console.log("fallo la promesa de firestore", error)) - - // let valorPostCreado = getElementById('idUserPost').value; + contenedorPosts.append(postCreado); + + }); + }) + // .catch(error => console.log("fallo la promesa de firestore", error)) + + //MODAL LOG OUT + const modalLogOut = document.createElement('div'); + modalLogOut.className = 'modal'; + modalLogOut.id = 'idModalLogout'; + + modalLogOut.innerHTML = ` + + `; + feedSection.appendChild(modalLogOut); + + const closeModal = () => { + console.log('cerrando'); + modalLogOut.style.display = 'none'; + } + + const openModal = () => { + console.log('hello'); + modalLogOut.style.display = 'flex'; + } + + logoutButton.addEventListener('click', () => { + openModal(); + }); + const closeModalLogout = modalLogOut.querySelector('#botonCancelar'); //no se puede usar getElementById porque aun no existe + if (closeModalLogout) { closeModalLogout.addEventListener('click', () => { closeModal() }); } + + // MODAL ELIMINAR + + const modalDelete = document.createElement('div'); + modalDelete.className = 'modal'; + modalDelete.id = 'idModalDelete'; + + modalDelete.innerHTML = ` + + `; + feedSection.appendChild(modalDelete); + + const closeModalDelete = () => { + console.log('cerrando'); + modalDelete.style.display = 'none'; + } + + const openModalDelete = () => { + console.log('hello'); + modalDelete.style.display = 'flex'; + } + + const openDelete = contenedorPosts.querySelector('#botonEliminar') + if(openDelete) { + openDelete.addEventListener('click', () => {openModalDelete()}); + console.log('clickii') + } + + + const aceptarElimiar = modalDelete.querySelector('#botonAceptar'); + if (aceptarElimiar){ + aceptarElimiar.addEventListener('click', () => { + /*FUNCION ELIMINAR*/ + }); + } + const closeDelete = modalDelete.querySelector('#botonCancelar'); //no se puede usar getElementById porque aun no existe + if (closeDelete) + { closeDelete.addEventListener('click', () => { closeModalDelete() }); + } return feedSection; } + + diff --git a/src/index.html b/src/index.html index 65b19a3c..158219ef 100644 --- a/src/index.html +++ b/src/index.html @@ -8,10 +8,7 @@ Dad's Power -<<<<<<< HEAD -======= ->>>>>>> 44ba18dd0c22d47646f7241e5d1f2b61d5cde9d9 @@ -109,12 +106,6 @@

Sign in

-<<<<<<< HEAD - - - -======= ->>>>>>> 44ba18dd0c22d47646f7241e5d1f2b61d5cde9d9 diff --git a/src/js/routes.js b/src/js/routes.js index 74198118..4e04a665 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -14,7 +14,7 @@ const routes = { export const onNavigate = (pathname) => { //se cambia la ruta window.history.pushState( - {}, + {state:pathname}, pathname, window.location.origin + pathname, // requiere 3 parámetros - 1 estado vacio - asignar título - asignar la ruta// ); @@ -26,11 +26,11 @@ export const onNavigate = (pathname) => { //se cambia la ruta }; -const componentes = routes[window.location.pathname]; + const componentes = routes[window.location.pathname]; -window.onpopstate = () => { - rootDiv.appendChild(componentes()); -}; -rootDiv.appendChild(componentes()); + window.onpopstate = () => { + rootDiv.appendChild(componentes()); + }; + rootDiv.appendChild(componentes()); diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index 1765c2b6..7c66d671 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -13,30 +13,41 @@ const firebaseConfig = { export const app = initializeApp(firebaseConfig); -import { getFirestore, collection, getDocs, addDoc } from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs, addDoc , query ,orderBy, onSnapshot, deleteDoc} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +// import { async } from "regenerator-runtime"; // Initialize Cloud Firestore and get a reference to the service const db = getFirestore(app); + + // Obtener la data desde el firestore -export const postsRef = async () => await getDocs(collection(db, 'posts')) +export const postsRef = async (id) => await getDocs(collection(db, 'posts', id)) //console.log('postsRef',postsRef()); -//---------------Generando nuevos post de forma dinámica---------------- //---------------Generando nuevos post de forma dinámica---------------- -//utilizando método addDoc de firestore - -export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) +//utilizando método addDoc de firestore con onSnapshot(actualización en tiempo real) +export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) + + export const getPost = (callback) => { + const qs = query(collection(db, 'posts'), orderBy( 'descripcion', 'asc')); + onSnapshot (qs,(callback)) +} + // mostrar tiempo del post +// const date = new Date().toLocaleDateString('es-es', {month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}) +//-----------------------------Eliminando post--------------------------- + export const detelePost = async (id) => await deleteDoc(doc (db , 'post', id)) //------------------------------Editando post----------------------------- +// export const udpDatePost = async (id) => await updateDoc(doc(db, 'post', id)) //------------------Agregando interacciones, me gusta <3 -------------------- @@ -46,30 +57,5 @@ export const savePosts = async (descripcion) => await addDoc(collection(db, 'pos -export const savePost = async() => await addDoc(collection(db, 'posts', {descricion})) - - -//Add a new document in collection "posts" -// export const crearPost = await setDoc(doc(db, "posts", "LA"), { -// autor: "Jhoa", -// descripcion: "Insertando 1º post", -// fecha: "22/01/2023", -// titulo: "3º post" -// }); - -// export const crearPost = (uid, titulo, descripcion) => { -// return this.db.collection('posts').add({ // adición de un post. También podemos utilizar nuestro propio Id usando: .doc("key").set({ -// uid: uid, -// autor: autor, -// titulo: titulo, -// descripcion: descripcion, -// fecha: firebase.firestore.FieldValue.serverTimestamp() -// }) -// .then(refDoc => { // si la inserción(creación del post) fue exitosa debería dar en la consola el id del post que debería venir del firestore -// console.log(`Id del post =>${refDoc.id}`) -// }).catch(error => { -// console.log(`Error de creación del post =>${error}`); -// }) -// }; diff --git a/src/main.js b/src/main.js index ec8e4d78..4879d56f 100644 --- a/src/main.js +++ b/src/main.js @@ -113,7 +113,7 @@ if (signinForm) { }; // LOGOUT -const logoutButton = document.getElementById('idlogoutButton'); +const logoutButton = document.getElementById('botonAceptar'); if (logoutButton) { logoutButton.addEventListener('click', () => { logOut(auth); diff --git a/src/style.css b/src/style.css index 676fe95f..72b777f6 100644 --- a/src/style.css +++ b/src/style.css @@ -7,7 +7,7 @@ } .btnSubmit:hover { - background: rgba(56, 52, 52, 0.5); + background: rgba(14, 13, 13, 0.5); } input:hover { @@ -53,7 +53,7 @@ input { margin: 25px 30px 0 30px; width: 240px; height: 45px; - background: rgba(82, 82, 92, 0.8); + background: rgba(41, 41, 43, 0.8); border-radius: 6px; /* Inside auto layout */ flex: none; @@ -625,9 +625,9 @@ input::placeholder { color: #FA79AA; background-color: transparent; position: absolute; - margin-top: 100px; + margin-top: 110px; right: 4vh; - font-size: 12px; + font-size: 10px; font-family: 'roboto, sans-serif'; cursor: pointer; @@ -683,3 +683,32 @@ h4.fecha-post { cursor: pointer; } + +/*modal logout*/ +.modal { + display: none; + background: rgba(0, 0, 0, 0.4); + background-size: cover; + background-position: center; + width: 100%; + height: 100%; + top: 0; + left: 0; + position: fixed; + padding: 15px; + justify-content: center; + align-items: center; +} +.modal-container { + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(8px); + width: 320px; + height: 500px; + font-family: sans-serif; + padding: 25px; + border-radius: 15px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} \ No newline at end of file From c707a5d31523cc6d5323423bcbab44767bf4c1af Mon Sep 17 00:00:00 2001 From: Valmontx Date: Mon, 30 Jan 2023 11:20:49 -0500 Subject: [PATCH 73/73] Se muestra modal de eliminar post con estilos --- src/components/feed.js | 43 +++++----- src/js/routes.js | 2 +- src/lib/firebase/methodsFirestore.js | 6 +- src/style.css | 115 +++++++++++++++++++-------- 4 files changed, 109 insertions(+), 57 deletions(-) diff --git a/src/components/feed.js b/src/components/feed.js index 944f7332..f4409772 100644 --- a/src/components/feed.js +++ b/src/components/feed.js @@ -1,4 +1,4 @@ -import { savePosts, getPost } from "../lib/firebase/methodsFirestore.js"; +import { savePosts, getPost, deletePost } from "../lib/firebase/methodsFirestore.js"; export const feed = () => { const feedSection = document.createElement('section'); @@ -122,7 +122,6 @@ export const feed = () => { const postCreado = document.createElement('div'); postCreado.className = 'post-div'; postCreado.innerHTML = ''; - postCreado.innerHTML = `
@@ -133,8 +132,10 @@ export const feed = () => {

${posts["autor"]}

${posts["descripcion"]}

${posts.date}

-
+
+ `; + contenedorPosts.append(postCreado); }); @@ -148,21 +149,21 @@ export const feed = () => { modalLogOut.innerHTML = ` `; feedSection.appendChild(modalLogOut); const closeModal = () => { - console.log('cerrando'); + // console.log('cerrando'); modalLogOut.style.display = 'none'; } const openModal = () => { - console.log('hello'); + // console.log('hello'); modalLogOut.style.display = 'flex'; } @@ -181,9 +182,9 @@ export const feed = () => { modalDelete.innerHTML = ` `; @@ -198,21 +199,23 @@ export const feed = () => { console.log('hello'); modalDelete.style.display = 'flex'; } - - const openDelete = contenedorPosts.querySelector('#botonEliminar') + contenedorPosts.addEventListener('click', () => { + console.log('click') + openModalDelete(); + }); + const openDelete = modalDelete.querySelector('#botonEliminar') if(openDelete) { openDelete.addEventListener('click', () => {openModalDelete()}); - console.log('clickii') + } - const aceptarElimiar = modalDelete.querySelector('#botonAceptar'); - if (aceptarElimiar){ - aceptarElimiar.addEventListener('click', () => { - /*FUNCION ELIMINAR*/ - }); + const aceptarEliminar = modalDelete.querySelector('#Eliminar'); + if (aceptarEliminar){ + aceptarEliminar.addEventListener('click', () => { deletePost(); + closeModalDelete()}); } - const closeDelete = modalDelete.querySelector('#botonCancelar'); //no se puede usar getElementById porque aun no existe + const closeDelete = modalDelete.querySelector('#botonCancelarEliminar'); //no se puede usar getElementById porque aun no existe if (closeDelete) { closeDelete.addEventListener('click', () => { closeModalDelete() }); } diff --git a/src/js/routes.js b/src/js/routes.js index 4e04a665..2e415ee4 100644 --- a/src/js/routes.js +++ b/src/js/routes.js @@ -1,4 +1,4 @@ -import { home } from '../components/home.js'; +import { home } from '../components/Home.js'; import { register } from '../components/registro.js'; import { login } from '../components/login.js'; import { feed } from '../components/feed.js'; diff --git a/src/lib/firebase/methodsFirestore.js b/src/lib/firebase/methodsFirestore.js index 7c66d671..2353ce81 100644 --- a/src/lib/firebase/methodsFirestore.js +++ b/src/lib/firebase/methodsFirestore.js @@ -13,7 +13,7 @@ const firebaseConfig = { export const app = initializeApp(firebaseConfig); -import { getFirestore, collection, getDocs, addDoc , query ,orderBy, onSnapshot, deleteDoc} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; +import { getFirestore, collection, getDocs, addDoc , query ,orderBy, onSnapshot, deleteDoc ,doc} from "https://www.gstatic.com/firebasejs/9.15.0/firebase-firestore.js"; // import { async } from "regenerator-runtime"; // Initialize Cloud Firestore and get a reference to the service @@ -30,7 +30,7 @@ export const postsRef = async (id) => await getDocs(collection(db, 'posts', id)) //utilizando método addDoc de firestore con onSnapshot(actualización en tiempo real) -export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'), {descripcion}) +export const savePosts = async (descripcion) => await addDoc(collection(db, 'posts'),{descripcion}) export const getPost = (callback) => { @@ -42,7 +42,7 @@ export const savePosts = async (descripcion) => await addDoc(collection(db, 'pos // const date = new Date().toLocaleDateString('es-es', {month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric'}) //-----------------------------Eliminando post--------------------------- - export const detelePost = async (id) => await deleteDoc(doc (db , 'post', id)) + export const deletePost = async (id) => await deleteDoc(doc (db , 'post', id)) diff --git a/src/style.css b/src/style.css index 72b777f6..9aebb35d 100644 --- a/src/style.css +++ b/src/style.css @@ -487,14 +487,14 @@ input::placeholder { .section-feed { width: 360px; height: 100vh; - overflow:scroll; + overflow: scroll; /*es el 100% para cualquier dispositivo*/ - overflow:scroll; + overflow: scroll; position: relative; /*para que el hijo posicionarse respecto al section-feed*/ /* justify-content: center; */ background: linear-gradient(180deg, #334E6F 0%, #8F9CA3 100%); - + } @@ -526,7 +526,7 @@ input::placeholder { } - .container-buttons { +.container-buttons { position: absolute; position: sticky; z-index: 1; @@ -547,15 +547,15 @@ input::placeholder { background: transparent; } -.perfil-button{ +.perfil-button { cursor: pointer !important; } -.comentario-button{ +.comentario-button { cursor: pointer; } -.logout-button{ +.logout-button { cursor: pointer; } @@ -575,8 +575,8 @@ input::placeholder { border: none; display: flex; flex-direction: column; - margin : 0 0 0 20px; - gap:20px; + margin: 0 0 0 20px; + gap: 20px; } @@ -588,20 +588,20 @@ input::placeholder { background-color: #ffffff; font-family: 'Roboto', sans-serif; font-size: 10px; - + } -.parte-superior-post{ +.parte-superior-post { background-color: #C3E2E6; height: 6vh; - border-top-left-radius: 10px ; - border-top-right-radius: 10px ; + border-top-left-radius: 10px; + border-top-right-radius: 10px; border-bottom: none; display: flex; align-items: center; } -.boton-editar{ +.boton-editar { border: none; background-color: transparent; position: absolute; @@ -610,17 +610,17 @@ input::placeholder { cursor: pointer; } -.boton-eliminar{ +.boton-eliminar { border: none; background-color: transparent; position: absolute; right: 4vh; - color:#222222; + color: #222222; cursor: pointer; } -.boton-like{ +.boton-like { border: none; color: #FA79AA; background-color: transparent; @@ -633,34 +633,37 @@ input::placeholder { } -.titulo-post{ +.titulo-post { font-family: 'Roboto', sans-serif; font-size: 15px; - color:#52525C; + color: #52525C; } -.textoUser{ - border:none; +.textoUser { + border: none; resize: none; width: 90%; height: 50px; margin: 0 5px 0 20px; - border: 5px double #d6d6db; + border: 5px double #d6d6db; border-radius: 3px; text-indent: 5px; margin-bottom: 10px; margin-top: -40px; - + } -h2.titulo-post{ + +h2.titulo-post { position: relative; top: -35px; margin: 0 0 0 20px; } -h3.descripcion-post{ + +h3.descripcion-post { margin: 0 0 0 20px; - color:#222222; + color: #222222; } + h4.fecha-post { position: relative; top: 60px; @@ -669,13 +672,14 @@ h4.fecha-post { color: #888686; font-size: 10px; } + .post-btn { position: relative; - background :#3b5998; + background: #3b5998; border-radius: 2px; width: 50px; height: 20px; - color:#d6d6db; + color: #d6d6db; text-shadow: 1px 0 1px #ffffff; border: none; left: 275px; @@ -685,11 +689,10 @@ h4.fecha-post { } /*modal logout*/ + .modal { display: none; background: rgba(0, 0, 0, 0.4); - background-size: cover; - background-position: center; width: 100%; height: 100%; top: 0; @@ -699,16 +702,62 @@ h4.fecha-post { justify-content: center; align-items: center; } + .modal-container { background: rgba(255, 255, 255, 0.2); backdrop-filter: blur(8px); - width: 320px; - height: 500px; + width: 261.13px; + height: 136px; + left: 49px; + top: 306px; font-family: sans-serif; + + color: rgb(65, 65, 68); padding: 25px; border-radius: 15px; display: flex; flex-direction: column; align-items: center; justify-content: center; -} \ No newline at end of file + border: 2px solid rgba(82, 82, 92, 0.5); + + +} +.boton-aceptar{ + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(8px); + border-bottom-left-radius: 15px; + width: 130px; + height: 30px; + border:transparent; + position: relative; + top: 40px; + left:-65px; + color:rgba(201, 23, 23, 1); + border: solid 1px rgba(82, 82, 92, 0.5); + cursor: pointer; +} +.boton-cancelar{ + background: rgba(255, 255, 255, 0.2); + backdrop-filter: blur(8px); + border-bottom-right-radius: 15px; + width: 130px; + height: 30px; + border: solid 1px rgba(82, 82, 92, 0.5); + position: relative; + top: 23px; + left: 65px; + color:rgba(82, 82, 92, 1); + cursor: pointer; + +} +.texto-delete{ + font-style: normal; + font-weight: 400; + font-size: 18px; + line-height: 21px; + text-align: center; + margin-top: 35px; + + +}