react-eth-challenge icon indicating copy to clipboard operation
react-eth-challenge copied to clipboard

Solución al reto.

Open Alberto-SC opened this issue 2 years ago • 0 comments

DESCRIPTION

Solución al reto:

Nombre: Silva Cazares Luis Alberto

Usuario Platzi: albertosilva

Deploy con netlify :https://alberto-sc.netlify.app/

Reto:

  • [x] Primer problema

  • [x] Segundo problema

  • [x] Tercer problema

  • [x] Cuarto Problema

  • [x] Quinto Problema

  • [x] Sexto Problema

  • [x] Septimo Problema


Retos:

  • Primer problema : Create the project components

Se crearon los componentes como lo sugiere la estructura de App.js cada uno se creo en la carpeta components,

en un principio cada componente tenía otra carpeta para guardar sus estilos juntos, pero para no mover demasiado

los test decidí cambiarlo y pasar los estilos a su propia carpeta.

Cada componente recibe como prop la información que necesita del archivo json.

  • Segundo problema : Add styles

Para añadir estilos se decidio usar styled components, una librería que permite unir todo el potencial de css con javascript

de hecho aunque en principio la desición de usar esta librería fue una mera preferencia , la elaboración de un componente interno,

(las cards de las skills) se facilito gracias a ello, el único inconveniente es que se tuvieron que agregar clases a los

componentes que no hacen nada ya que styled components crea clases con hashes para que nunca colisionen estilos entre distintos

componentes sin embargo los test necesitaban buscar cierta clase en especifico.

  • Tercer problema : Create getData.js function

getData tenía que ser una función que hiciera fetch a una API también definida por nosotros,se decidio usar la API de fetch

para ello haciendo una funcion asincrona que devuelve la misma promesa para que en otro componente se ocupen de la resolución

o posible error.

  • Cuarto problema : Integrate API

Para el desarrollo podiamos o llenar los campos de placeholders o consumir la API con un servidor local con json-server pero

para producción hacía falta un endpoint disponible públicamente y con https, una opción era usar mongoDB sin embargo ya tenía ocpupado el cluster gratuito por lo que se opto por una opcíon mucho mas sencilla , utilizar el mismo endpoint que ofrece github

cuando se vizualizan los archivos de un repositorio en 'raw' este endpont nos viene perfecto ya que el funcionamiento de la API

se reduce únicamente a devolver un json lo cual es justo lo que tenemos, el endpoint es el siguiente https://raw.githubusercontent.com/Alberto-SC/react-eth-challenge/main/data.json.

  • Quinto problema: Custom API

Este problema es básicamente cambiar la información por defecto y usar nuestra propia información , Cabe mencionar que se trato de incluir

todos los campos incluido el campo 'certificate' que en principio según el diseño propuesto no tenía un lugar, se opto por ponerlo en el mismo

container que 'experience' ya que era uno muy grande.

  • Sexto problema: Document

Documentar la solución a travez de este mismo pull request

  • Septimo problema: Deploy

Se decidio utilizar netlify ya que desde mi punto de vista es el mas sencillo, no necesita de configuración y lo único que necesita

ya esta definido en el package.json , el único problema es que debido a problemas de dependencias el primer intento falló ya que

'npm install' devolvió un error, esto lo solucionamos usando 'npm install --legacy-peer-deps' pero la única manera de indicarle

a netlify que use dicha opción es que exista un archivo .npmrc donde se especifique dicha opción por lo que solo hacía falta

subir dicho archivo con el siguiente contenido:


legacy-peer-deps=true

  • Otros problemas:

Test

Los test estaban preparados para usar la función mount de enzyme dicha función crea un problema en todos los test

que indica 'It looks like you called mount() without a global document being loaded.' , esto es por que los test no se prueban

en un entorno de navegador por lo que no existe un DOM y hay que proveer uno , una opción es usar JSDOM y modificar

los test para que funcionen , pero otra opción es cambiar 'mount()' por shallow() opción por la que se optó. Sin embargo shallow también nos trae

un problema del que solo te das cuenta si checas la documentación y es que shallow renderiza un componente aislado

es decir no se renderiza a partir de otro componente que lo llame dentro de nuestro proyecto , esto significa un problema para

los test ya que al hacer fetch de los datos en el componente principal App.js estos datos se pasan como props a los componentes correspondientes , sin embargo con shallow() el componente se renderiza sin nadie que lo llame por lo tanto sin que le pasen props

por lo que los n elementos que requiere encontrar el test nunca serán encontrados ya que no tiene datos,

una solición es pasarle data en el componente del test o poner data por default dentro de cada componente que fue la opción que se tomó

Eslint

Se decidio cambiar el parser de babel para eslint ya que daba problemas con los imports y no descubrí una manera de quitar el error,

sin embargo considero una buena desición ya que la misma página indica que dicho parser babel-eslint

estaba deprecado y su sucesor cambio de nombre por @babel/eslint-parser por lo que se actualizo a dicho paquete.

Consideraciones y cambios

  • [ ] Añadir propTypes

  • [ ] Corregir diseño mobile , en web al hacer resize funciona el cambio pero un movil de verdad no funciona.

  • [ ] Crear el componente background: el componente bakcground usa hojas de estilo .css y no sigue la estructura con el uso de styled components.

Alberto-SC avatar Jul 13 '22 01:07 Alberto-SC