CursosEmpresasBlogLiveConfPrecios

Uso de gravatar en nuestro proyecto

Clase 19 de 29 • Curso de React Router 5 y Redux

Clase anteriorSiguiente clase

Contenido del curso

Bienvenida al curso

  • 1
    Todo lo que aprenderás sobre React Router y Redux

    Todo lo que aprenderás sobre React Router y Redux

    01:30 min

¿Qué es React Router? y Aplicarlo en tus proyectos

  • 2
    ¿Qué es React Router y cómo instalarlo?

    ¿Qué es React Router y cómo instalarlo?

    02:54 min
  • 3
    Crear nuestro archivo de Rutas

    Crear nuestro archivo de Rutas

    07:33 min
  • 4
    Container: Login

    Container: Login

    10:29 min
  • 5
    Container: Register

    Container: Register

    06:28 min
  • 6
    Container: 404 Not Found

    Container: 404 Not Found

    06:43 min
  • 7
    Componente: Layout

    Componente: Layout

    05:10 min
  • 8
    Manejando enlaces y configuraciones

    Manejando enlaces y configuraciones

    06:33 min

¿Qué es Redux?

  • 9
    Qué es Redux

    Qué es Redux

    02:17 min
  • 10

    ¿Qué es Redux? Profundizando en la herramienta

    01:32 min
  • 11
    Instalación de Redux

    Instalación de Redux

    04:40 min
  • 12
    Creando el Store de Redux

    Creando el Store de Redux

    12:53 min

Aplicando Redux a nuestra aplicación

  • 13
    Creando los reducers

    Creando los reducers

    10:40 min
  • 14
    Finalizando reducers y eliminar favoritos

    Finalizando reducers y eliminar favoritos

    08:26 min
  • 15
    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    Debuggeando nuestro proyecto (agregando validaciones a nuestro componente card)

    04:19 min
  • 16
    Crear Formulario de Login

    Crear Formulario de Login

    10:08 min
  • 17
    Formulario de Login con Redux

    Formulario de Login con Redux

    06:28 min
  • 18
    Creando un Servicio para Gravatar

    Creando un Servicio para Gravatar

    05:28 min
  • 19
    Uso de gravatar en nuestro proyecto

    Uso de gravatar en nuestro proyecto

    Viendo ahora
  • 20
    Validación para LogIn LogOut

    Validación para LogIn LogOut

    09:15 min
  • 21
    Register

    Register

    07:00 min
  • 22
    Register con Redux

    Register con Redux

    04:17 min
  • 23
    Vista general del player

    Vista general del player

    05:26 min
  • 24
    Arreglando la funcionalidad del player

    Arreglando la funcionalidad del player

    06:55 min
  • 25
    Terminando de detallar nuestro player

    Terminando de detallar nuestro player

    13:50 min
  • 26
    Validaciones

    Validaciones

    10:35 min
  • 27
    Validaciones de UI

    Validaciones de UI

    07:04 min
  • 28
    Debug con Redux Devtools

    Debug con Redux Devtools

    05:57 min

Cierre del curso

  • 29
    Cierre del Proyecto

    Cierre del Proyecto

    00:39 min
Tomar examen

Escuelas

  • Desarrollo Web
    • Fundamentos del Desarrollo Web Profesional
    • Diseño y Desarrollo Frontend
    • Desarrollo Frontend con JavaScript
    • Desarrollo Frontend con Vue.js
    • Desarrollo Frontend con Angular
    • Desarrollo Frontend con React.js
    • Desarrollo Backend con Node.js
    • Desarrollo Backend con Python
    • Desarrollo Backend con Java
    • Desarrollo Backend con PHP
    • Desarrollo Backend con Ruby
    • Bases de Datos para Web
    • Seguridad Web & API
    • Testing Automatizado y QA para Web
    • Arquitecturas Web Modernas y Escalabilidad
    • DevOps y Cloud para Desarrolladores Web
  • English Academy
    • Inglés Básico A1
    • Inglés Básico A2
    • Inglés Intermedio B1
    • Inglés Intermedio Alto B2
    • Inglés Avanzado C1
    • Inglés para Propósitos Específicos
    • Inglés de Negocios
  • Marketing Digital
    • Fundamentos de Marketing Digital
    • Marketing de Contenidos y Redacción Persuasiva
    • SEO y Posicionamiento Web
    • Social Media Marketing y Community Management
    • Publicidad Digital y Paid Media
    • Analítica Digital y Optimización (CRO)
    • Estrategia de Marketing y Growth
    • Marketing de Marca y Comunicación Estratégica
    • Marketing para E-commerce
    • Marketing B2B
    • Inteligencia Artificial Aplicada al Marketing
    • Automatización del Marketing
    • Marca Personal y Marketing Freelance
    • Ventas y Experiencia del Cliente
    • Creación de Contenido para Redes Sociales
  • Inteligencia Artificial y Data Science
    • Fundamentos de Data Science y AI
    • Análisis y Visualización de Datos
    • Machine Learning y Deep Learning
    • Data Engineer
    • Inteligencia Artificial para la Productividad
    • Desarrollo de Aplicaciones con IA
    • AI Software Engineer
  • Ciberseguridad
    • Fundamentos de Ciberseguridad
    • Hacking Ético y Pentesting (Red Team)
    • Análisis de Malware e Ingeniería Forense
    • Seguridad Defensiva y Cumplimiento (Blue Team)
    • Ciberseguridad Estratégica
  • Liderazgo y Habilidades Blandas
    • Fundamentos de Habilidades Profesionales
    • Liderazgo y Gestión de Equipos
    • Comunicación Avanzada y Oratoria
    • Negociación y Resolución de Conflictos
    • Inteligencia Emocional y Autogestión
    • Productividad y Herramientas Digitales
    • Gestión de Proyectos y Metodologías Ágiles
    • Desarrollo de Carrera y Marca Personal
    • Diversidad, Inclusión y Entorno Laboral Saludable
    • Filosofía y Estrategia para Líderes
  • Diseño de Producto y UX
    • Fundamentos de Diseño UX/UI
    • Investigación de Usuarios (UX Research)
    • Arquitectura de Información y Usabilidad
    • Diseño de Interfaces y Prototipado (UI Design)
    • Sistemas de Diseño y DesignOps
    • Redacción UX (UX Writing)
    • Creatividad e Innovación en Diseño
    • Diseño Accesible e Inclusivo
    • Diseño Asistido por Inteligencia Artificial
    • Gestión de Producto y Liderazgo en Diseño
    • Diseño de Interacciones Emergentes (VUI/VR)
    • Desarrollo Web para Diseñadores
    • Diseño y Prototipado No-Code
  • Contenido Audiovisual
    • Fundamentos de Producción Audiovisual
    • Producción de Video para Plataformas Digitales
    • Producción de Audio y Podcast
    • Fotografía y Diseño Gráfico para Contenido Digital
    • Motion Graphics y Animación
    • Contenido Interactivo y Realidad Aumentada
    • Estrategia, Marketing y Monetización de Contenidos
  • Desarrollo Móvil
    • Fundamentos de Desarrollo Móvil
    • Desarrollo Nativo Android con Kotlin
    • Desarrollo Nativo iOS con Swift
    • Desarrollo Multiplataforma con React Native
    • Desarrollo Multiplataforma con Flutter
    • Arquitectura y Patrones de Diseño Móvil
    • Integración de APIs y Persistencia Móvil
    • Testing y Despliegue en Móvil
    • Diseño UX/UI para Móviles
  • Diseño Gráfico y Arte Digital
    • Fundamentos del Diseño Gráfico y Digital
    • Diseño de Identidad Visual y Branding
    • Ilustración Digital y Arte Conceptual
    • Diseño Editorial y de Empaques
    • Motion Graphics y Animación 3D
    • Diseño Gráfico Asistido por Inteligencia Artificial
    • Creatividad e Innovación en Diseño
  • Programación
    • Fundamentos de Programación e Ingeniería de Software
    • Herramientas de IA para el trabajo
    • Matemáticas para Programación
    • Programación con Python
    • Programación con JavaScript
    • Programación con TypeScript
    • Programación Orientada a Objetos con Java
    • Desarrollo con C# y .NET
    • Programación con PHP
    • Programación con Go y Rust
    • Programación Móvil con Swift y Kotlin
    • Programación con C y C++
    • Administración Básica de Servidores Linux
  • Negocios
    • Fundamentos de Negocios y Emprendimiento
    • Estrategia y Crecimiento Empresarial
    • Finanzas Personales y Corporativas
    • Inversión en Mercados Financieros
    • Ventas, CRM y Experiencia del Cliente
    • Operaciones, Logística y E-commerce
    • Gestión de Proyectos y Metodologías Ágiles
    • Aspectos Legales y Cumplimiento
    • Habilidades Directivas y Crecimiento Profesional
    • Diversidad e Inclusión en el Entorno Laboral
    • Herramientas Digitales y Automatización para Negocios
  • Blockchain y Web3
    • Fundamentos de Blockchain y Web3
    • Desarrollo de Smart Contracts y dApps
    • Finanzas Descentralizadas (DeFi)
    • NFTs y Economía de Creadores
    • Seguridad Blockchain
    • Ecosistemas Blockchain Alternativos (No-EVM)
    • Producto, Marketing y Legal en Web3
  • Recursos Humanos
    • Fundamentos y Cultura Organizacional en RRHH
    • Atracción y Selección de Talento
    • Cultura y Employee Experience
    • Gestión y Desarrollo de Talento
    • Desarrollo y Evaluación de Liderazgo
    • Diversidad, Equidad e Inclusión
    • AI y Automatización en Recursos Humanos
    • Tecnología y Automatización en RRHH
  • Finanzas e Inversiones
    • Fundamentos de Finanzas Personales y Corporativas
    • Análisis y Valoración Financiera
    • Inversión y Mercados de Capitales
    • Finanzas Descentralizadas (DeFi) y Criptoactivos
    • Finanzas y Estrategia para Startups
    • Inteligencia Artificial Aplicada a Finanzas
    • Domina Excel
    • Financial Analyst
    • Conseguir trabajo en Finanzas e Inversiones
  • Startups
    • Fundamentos y Validación de Ideas
    • Estrategia de Negocio y Product-Market Fit
    • Desarrollo de Producto y Operaciones Lean
    • Finanzas, Legal y Fundraising
    • Marketing, Ventas y Growth para Startups
    • Cultura, Talento y Liderazgo
    • Finanzas y Operaciones en Ecommerce
    • Startups Web3 y Blockchain
    • Startups con Impacto Social
    • Expansión y Ecosistema Startup
  • Cloud Computing y DevOps
    • Fundamentos de Cloud y DevOps
    • Administración de Servidores Linux
    • Contenerización y Orquestación
    • Infraestructura como Código (IaC) y CI/CD
    • Amazon Web Services
    • Microsoft Azure
    • Serverless y Observabilidad
    • Certificaciones Cloud (Preparación)
    • Plataforma Cloud GCP

Platzi y comunidad

  • Platzi Business
  • Live Classes
  • Lanzamientos
  • Executive Program
  • Trabaja con nosotros
  • Podcast

Recursos

  • Manual de Marca

Soporte

  • Preguntas Frecuentes
  • Contáctanos

Legal

  • Términos y Condiciones
  • Privacidad
  • Tyc promociones
Reconocimientos
Reconocimientos
Logo reconocimientoTop 40 Mejores EdTech del mundo · 2024
Logo reconocimientoPrimera Startup Latina admitida en YC · 2014
Logo reconocimientoPrimera Startup EdTech · 2018
Logo reconocimientoCEO Ganador Medalla por la Educación T4 & HP · 2024
Logo reconocimientoCEO Mejor Emprendedor del año · 2024
De LATAM conpara el mundo
YoutubeInstagramLinkedInTikTokFacebookX (Twitter)Threads
        Seba Cardoso

        Seba Cardoso

        student•
        hace 6 años

        A mi se me ocurre que también podría tener una sola img y manejar la lógica dentro del src.

        <img src={Object.keys(user).length > 0 ? gravatar(user.email) : userIcon} alt={user.email} />
          Oscar Barajas Tavares

          Oscar Barajas Tavares

          Team Platzi•
          hace 6 años

          Una solución que ayuda a mejorar el código que es parte de la imagen, gracias por compartir.

          Markoz Peña Mendez

          Markoz Peña Mendez

          student•
          hace 6 años

          No esta mal pero para mi gusto es mejor tener todo ese resultado que final regresa un Boolean en una constante. Meter mucho js en la JSX no es entendible al final.

        Pablo Domínguez Durán

        Pablo Domínguez Durán

        student•
        hace 6 años

        No me gusta que dé por hecho que sabemos qué hace gravatar.js

        Una explicación sencilla bastaría. Al saltarselo hace que muchos solo copien y peguen código

          Jaime David Burbano Montoya

          Jaime David Burbano Montoya

          student•
          hace 6 años

          Es que no hace mucho. Lo que hizo en ese archivo fue construir una url .

          import md5 from 'md5'; const gravatar = (email) => { const base = 'https://gravatar.com/avatar/'; const formattEmail = (email).trim().toLowerCase(); const hash = md5(formattEmail, {encoding:'binaty'}); return `${base}${hash}`; } export default gravatar;
          1. Importa la libreria de md5
          2. Crea un función llamada gravatar que recibe un email como parametro
          3. Crea una "base" que es la url de gravatar para obtener una imagen
          4. Crea la parte dinámica de la url, donde coge el email que recibe, le quita los espacios que pueda tener dentro y lo pasa a minúsculas
          5. Convierte la parte dinámica de la url a un hash o una serie binaria
          6. La función retonar una URL que representa una imagen
          7. Le pone esta url de la imagen en la etiqueta <img>

          Eso es todo

          Victor Baruch Pazaran Jaimes

          Victor Baruch Pazaran Jaimes

          student•
          hace 5 años

          claro, estoy de acuerdo en esto, pero tambien es tarea de cada quien ponerse a investigar un poco por nuestra cuenta en los temas que te interesen o que se quieran entender mas a profundidad, tan solo imagina como seria el curso si se pusiera a explicar cada una de las funciones que llebamos usando hasta el momento

          yo nunca habia escuchado de gravatar, pero mira, con una sencialla busqueda en google pude saber que era

          gravatar.JPG
        Joaquín Ignacio Ossandón Gómez

        Joaquín Ignacio Ossandón Gómez

        student•
        hace 6 años

        Para quienes tengan un error con Object.keys(user)

        En mi index.js (más bien en mi estado inicial) no existía el objeto user, sino User, corrigiendo esto, solucioné el error de que no funcionase con el Object.keys, claramente no era un objeto, sino algo que no estaba definido y me lo estaba sacando de la manga.

        Antes:

        const initialState = { "User" : {}, "playing": {}, "myList": [], ...

        Después:

        const initialState = { "user" : {}, "playing": {}, "myList": [], ...

        Hace bien despejarse, intenté hacer un poco de música, me distraje un poco, fui a hacer almuerzo y cuando entré a la cocina, se me alumbró la ampolleta. 😁

        Obvio, también tenemos que revisar todo y entender qué estamos haciendo y por qué. En mi caso, no terminaba de enlazar todo hasta ahora. 😅

        Esto soluciona también el problema de la próxima clase.

          Manuel Entrena Jimenez

          Manuel Entrena Jimenez

          student•
          hace 5 años

          Me salvastes!

        Axel Alexis Lopez Resendiz

        Axel Alexis Lopez Resendiz

        student•
        hace 6 años

        En el return de gravatar

        return `${base}${hash}?d=identicon`

        de esta forma les retornara la imagen que tenga asignada al hash del correo o una aleatoria en caso de que no lo tenga.

          Miguel Angel Reyes Moreno

          Miguel Angel Reyes Moreno

          student•
          hace 5 años

          No me funciona :(

        Andrés Felipe Cano Sierra

        Andrés Felipe Cano Sierra

        student•
        hace 6 años

        Oh, oh, oh It's magic, you know

        Max Alberto Cuao Manjarrez

        Max Alberto Cuao Manjarrez

        student•
        hace 6 años

        Otra manera de validar si existe el usuario para poner el icono:

        <img src={user ? gravatar(user.email) : userIcon} alt={user ? user.email : 'Icono de usuario'} />
        Gustavo Gonzalez Montero

        Gustavo Gonzalez Montero

        student•
        hace 4 años

        Alguien me puede explicar con peras y manzanas porque en esta ocasión usamos una arrow function en mapStateToProps para sacar el usuario, y en otras ocaciones usamos un objeto que usamos como parámetro en el connect?

        const mapStateToProps = state => { return { user: state.user } } export default connect(mapStateToProps, null)(Header)

        Lo que entiendo es que del contenedor Login nos conectamos al otro contenedor Home que tiene al componente Header donde "supongo" que va a "traer" consigo ya cargado el usuario (en las props del state).

        ¿Es así o cómo se podría explicar de una manera simple?

          Nilson Diaz

          Nilson Diaz

          student•
          hace 4 años

          Hola ! como bien ya sabes La forma de consumir el estado de redux es atravez de la funcion connect , esta recibira dos parametros

          El primero sera una funcion a la que redux internamente le pasara todo nuestro store (o state) y nosotros dentro de la funcion retornaremos un objeto con los valores del store que queremos consumir en nuestro componente, tambien solo podemos retornar el store(o state) si queremos tener acceso a todo. Comunmente y por convencion se le llama mapStateToProps

          El segundo parametro es un objeto en donde ponemos nuestros actions, Comunmente y por convencion se le llama mapDispatchToProps.

          la razon por la que mapStateToProps es una funcion es porque nosotros no tenemos acceso al store de redux de una forma directa , asi que de esta forma redux nos dara por parametros el estado y ya luego nosotros decidiremos que retornar a las props de nuestro componente, mapDispatchToProps siempre sera un objeto ya que redux no tiene conocimiento de que actions nosotros tenemos , asi que importamos nuestro actions y lo ponemos en un objeto y se lo pasamos de segundo parametro en la funcion connect.

          si no necesitamos actions o estado simplemente le ponemos un null en su respectivo espacio, y haremos esto cada vez que queramos conectarnos al store de redux (o state) en cualquier componente

          siempre puedes leer mas a detalle como funciona en su documentacion

          Espero te haya quedado un poco mas claro !

          Gustavo Gonzalez Montero

          Gustavo Gonzalez Montero

          student•
          hace 4 años

          Gracias!

        Manuel Alejandro Blanco Lamas

        Manuel Alejandro Blanco Lamas

        student•
        hace 5 años

        Tambien pueden verificar si email esta incluido dentro de user con:

        Object.keys(user).includes('email')

        Andrés Campuzano Garzón

        Andrés Campuzano Garzón

        student•
        hace 6 años

        🦄 Acá el código de lo trabajado al momento: https://github.com/AndresCampuzano/React-Router-and-Redux/commit/c2d05f887bda20f194436f08d042064cb96c7525

          GRECO ALEJANDRO SERNA DIAZ

          GRECO ALEJANDRO SERNA DIAZ

          student•
          hace 5 años

          muchas gracias compañero, gracias a ti pude darme cuenta de lo que fallé en mi proyecto, saludos :D

        platzerito02112019 platzerito02112019

        platzerito02112019 platzerito02112019

        student•
        hace 6 años

        Tengo este TypeError cuando uso la funcion keys

        const Header = props => { const { user } = props; const hasUser = Object.keys(user).length > 0;
        Uncaught TypeError: Cannot convert undefined or null to object at Function.keys (<anonymous>) at Header (Header.jsx:23) at renderWithHooks (react-dom.development.js:15108) at mountIndeterminateComponent (react-dom.development.js:17342) at beginWork$1 (react-dom.development.js:18486) at HTMLUnknownElement.callCallback (react-dom.development.js:347) at Object.invokeGuardedCallbackDev (react-dom.development.js:397) at invokeGuardedCallback (react-dom.development.js:454) at beginWork$$1 (react-dom.development.js:23217) at performUnitOfWork (react-dom.development.js:22208)

        ![](

        type.png

          Juan Sebastian Reina

          Juan Sebastian Reina

          student•
          hace 6 años

          Lo que debe estar ocurriendo es que cuando se hace el destructuring de props el valor de user no existe, luego, el Object.keys intenta obtener los key values de un objeto que no existe o es null. Prueba lo siguiente:

          const isNullOrUndefined = (value) => value === null || typeof value === 'undefined' ; const { user } = props; const hasUser = isNullOrUndefined() && Object.keys(user).length > 0;

          en caso de ser null o undefined Object.keys no se ejecuta y hasUsertoma el valor defalse`, de esta manera debería quedar resulto

          Juan Sebastian Reina

          Juan Sebastian Reina

          student•
          hace 6 años

          me falta algo en el comentario anterior, corrijo:

          const hasUser = !isNullOrUndefined(user) && Object.keys(user).length > 0;

          ps: no se si se pueden editar comentarios haha

        Manuel Entrena Jimenez

        Manuel Entrena Jimenez

        student•
        hace 5 años

        Tuve que poner un "/" entre el base y el hash para que la url de gravatar funcionase y al final "?

        code.png

          Emmanuel Vega

          Emmanuel Vega

          student•
          hace 5 años

          Gracias! A mi tampoco me retornaba ni mi usuario ni el default Aunque me queda duda de por qué se puede acceder a mi usario aún sin ponerle una contraseña

        Daniel Hernández

        Daniel Hernández

        student•
        hace 6 años

        porque en la logica de un anterior video para pasar un parametro a una function desde el html toco hacer : {() => function(param)} y aqui si se puede hacer {function(param)} ??

          Marco Mesén Campos

          Marco Mesén Campos

          student•
          hace 6 años

          las funciones que pases así {function(param)} se ejecutará inmediatamente, diferente a las funciones que pases dentro de otra, estas esperarán a que las ejecutes, el ejemplo anterior que mencionas era un event, creo que era onchange o onclick por ende tenía que pasarse sin que se ejecutara, hasta que el evento lo hiciera

        Pablo Domínguez Durán

        Pablo Domínguez Durán

        student•
        hace 6 años

        Lo que hace la url de gravatar es proveer una url pública que tiene una foto asociada a un correo.

        Este correo lo mandamos con un hash en formato binario que obtenemos de md5, un algoritmo de criptografía, para crear un hash de 128 bits

        Karen Paola Diaz Duarte

        Karen Paola Diaz Duarte

        student•
        hace 5 años

        Práctica: anteriormente me salía un error en la consola de la web y lo corregí poniendo binary en comillas simples, 'binary'

        24.PNG

        Bruno Kamiche

        Bruno Kamiche

        student•
        hace 5 años

        no entendí nara

        Julio Gragirena

        Julio Gragirena

        student•
        hace 6 años

        holaa , el icono del usuario no me cambia , no se cual es la solucion

        import React from 'react'; import { connect } from 'react-redux'; import '../asset/styles/Components/Header.scss'; import { Link } from 'react-router-dom'; import gravatar from '../utils/gravatar'; import logo from '../asset/static/logo-platzi-video-BW2.png'; import userIcon from '../asset/static/user-icon.png'; const Header = (props) => { const { user } = props; const hasUser = Object.keys(user).length > 0; console.log(hasUser); return ( <header className='header'> <Link to='/'> <img className='header__img' src={logo} alt='Platzi Video' /> </Link> <div className='header__menu'> <div className='header__menu--profile'> { hasUser ? (<img src={gravatar(user.email)} alt={user.email} />) : (<img src={userIcon} alt='User' />) } <p>Perfil</p> </div> <ul> <li><a href='/'>Cuenta</a></li> <li> <Link to='/login'> Iniciar sesion </Link> </li> </ul> </div> </header> ); }; const mapStateToProps = (state) => { return { user: state.user, }; }; //export default Header; export default connect(mapStateToProps, null)(Header);
        import md5 from 'md5'; const gravatar = (email) => { const base = 'https://gravatar.com/avatar/'; const formattedEmail = email[0].trim().toLowerCase(); const hash = md5(formattedEmail, { enconding: 'binary' }); return `${base}${hash}`; }; export default gravatar;
          Luis Lira

          Luis Lira

          student•
          hace 6 años

          ¡Hola! :D

          Para que funcione el cambio de icono debes usar una cuenta de correr la cual esté registrada en Gravatar y que le hayas asignado tu propia imagen, en mi caso, me salía la imagen que agregué en mi cuenta de Wordpress, al parecer de ahí las toma.

          ¡Nunca pares de aprender! 💚

          Julio Gragirena

          Julio Gragirena

          student•
          hace 6 años

          osea no me pone el icono por defecto ni tampoco un icono valido , ando viendo pero no encuentro el error la verdad

        Daniel Ruiz

        Daniel Ruiz

        student•
        hace 5 años

        No me cambia el avatar pero tampoco me arroja ningun error en consola ¿donde podria estar fallando?

          Luis Lira

          Luis Lira

          student•
          hace 5 años

          Podrías poner tu código para poder revisarlo? También puedes ir haciendo logs para ver qué resultado estás teniendo.

          Martin Paez

          Martin Paez

          student•
          hace 5 años

          Hi. Tienes que revisar tu funcion gravatar o el componente Header. Si nos podrias compartir tu codigo de ambos seria mejor para poderte apoyar. :)

        Juan Sebastián Gómez Tabares

        Juan Sebastián Gómez Tabares

        student•
        hace 5 años

        estoy revisando que es props y aun no me queda claro que es, asi que lo imprimi en consola y me encuentro con muchas cosas que no se que son, alguien me podria explicar?

          Abril Rios

          Abril Rios

          student•
          hace 5 años

          Props vendria a ser las propiedades React lo abrevia como props.

          Un ejemplo de una propiedad con JavaScript seria .toString

          Y con uno de React podria ser React.component

        Migrant Cyborg

        Migrant Cyborg

        student•
        hace 5 años

        Por si les llega a dar un typeError diciendo que el Object.keys no puede ejecurtarse sobre un elemento vacio:

        1. Revisen las solcuiones que ya ofrecieron otrxs compañerxs: 1.1. Revisar initialState que "user" estè escrito en minuscula 1.2 Revisa que Object.keys inicie en mayuscula y no object.keys Y si nada de eso les funciona, lo que pasa es que el typo està en el reducer, vayan al case de loginRequest, y asegurense que en el return de user esté asì: action.payload
        case actions.loginRequest: return{ ...state, user: action.payload, };

        Me pasó que tenia actions.payload y no tenia como guardar el dato. Intenten no resolver haciendo una validación para que cuando user venga vació no haga el Object.keys, porque de este modo no resuelven el problema real y van a ir acarreando esta deuda tènica. Exitos compas!!

          Cesar Eduardo Valle Pino

          Cesar Eduardo Valle Pino

          student•
          hace 4 años

          Me paso que tenía object en lugar de Object. Gracias.

        Paul Cortes

        Paul Cortes

        student•
        hace 5 años

        Que opìnan de esta forma de validar

        <img src={user.email ? gravatar(user.email) : userIcon} alt='' />
          Carlos Alfonso Garcia Rivera

          Carlos Alfonso Garcia Rivera

          student•
          hace 5 años

          estilo compacto (y)