Juan Sifontez

DailyCode #9

Lentes en una computadora con código detras

Hola. 👋🏼 Espero que te encuentres bien. Bienvenido a otra entrada de DailyCode. Hoy fue un día de refactorizar componentes y agregar un spinner.

Refactorización del componente Quiz

Tome la decisión de comenzar a refactorizar el componente Quiz porque era diferente de leer el componente y también porque quise agregar las preguntas de la bandera X a cuál país pertenece.

Por ello refactorizar para mostrar diferentes Quiz dependiendo del estado gameMode se haría más sencillo.

El componente Quiz tenía la forma de:

// Quiz.js
...
function Quiz ({ gameMode, isLoading, quiz}) {

  let quizText

  if (gameOver && gameMode === 'Results') {
    quizText = <h3 style={{textAlign:'center'}}>
      {gameMode}
    </h3>
  } else {
    quizText = <h3>
      {gameMode === ""
      ? `Select game mode`
      : (isLoading
          ? `Loading ${gameMode} of... quiz...`
          : `${quiz.capital} is the capital of`
        )
      }
    </h3>

return quizText
...

via GIPHY

Se ve horrible, lo sé. Lo que se me ocurrió para mejorarlo fue dividirlo en 3 componentes que dependerán de las propiedades isLoading y gameMode.

Cree el componente IsLoading, CapitalQuiz y FlagQuiz. Y se cargarían sin tantas condiciones anidadas.

// IsLoading.js
...
const IsLoading = (props) => {
  return (
    <h3>
      Loading {props.mode} of... quiz...
    </h3>
  )
}
...
// FlagQuiz.js
...
const FlagQuiz = (props) => {

  return(
    <h3>
      <img className="flag-img" src={props.flag} alt={`${props.country} flag`}/>
      Which country does this flag belong to?
    </h3>
  )
}
...
// CaptialQuiz.js
...
function CapitalQuiz (props) {

  return (
    <h3> {props.capital} is the capital of</h3>
  )
}
...

Como puedes observas, todos los componentes retornan un elemento <h3>. Ya sólo falta llamarlos en Quiz.js.

// Quiz.js
...
if (isLoading) {
  return <IsLoading mode={gameMode} isLoading={isLoading}/>
}
if (gameMode === "capital") {
  return <CapitalQuiz capital={quiz.capital}/>
}
if (gameMode === "flag") {
  return (
    <FlagQuiz country={quiz.name} flag={quiz.flagUrl} />
  )
}
return <h3>Select the game mode</h3>    
...

via GIPHY

El componente IsLoading se mostrará solo si la propiedad isLoading es verdadero. Mientras que FlagQuiz y CapitalQuiz lo harán dependiendo del modo de juego elegido.

No obstante se puede dar el caso que ningún modo de juego este seleccionado. Para ello es el último return <h3>...</h3>, en caso que ninguna condición se cumpla, que muestre ese h3.

Creando el componente spinner

El componente Spinner.js es el más sencillo. Será solo un div que tenga la clase spinner para realizar la animación con @keyframes.

// Spinner.js
...
return(
  <div className="spinner__container">
    <div className="spinner"></div>
  </div>
)
...
// Spinner.css
spinner__container {
  display: flex;
  justify-content: center;
}

.spinner {
  width: 5em;
  height: 5em;
  border-radius: 50%;
  border: 15px solid hsla(236.8, 54.4%, 59.6%, .6);
  border-top-color: hsl(236.8, 54.4%, 59.6%);
  animation: spinner 1s linear infinite;
}

@keyframes spinner {
  from { transform: rotate(0deg) }
  to { transform: rotate(360deg) }
}

Como puedes leer, el spinner tiene el mismo alto y ancho para que sea un cuadrado y border-radius: 50% para que sea un círculo.

Con la propiedad animation le digo cual es la animación (keyframs) a utilizar. La animación dura 1 segundo, el progreso ( timing function) es lineal y las iteraciones son infinitas.

Para darle el toque un elemento girando sobre otro solamente se debe dar diferentes colores a los bordes.

Por último, en keyframes se debe establecer que rote de 0 grados a 360 grados.

El elemento .spinner__container sólo lo utilizo para centrar el spinner a lo ancho.

Nos Leemos

Ya queda poco para terminar la aplicación. Falta afinar algunos detalles, agregar unas animaciones. Por último, creo que agregaré un timer para que se sienta la presión de tiempo.

Todo eso lo haré en los días subsiguientes. Por ahora. Nos leemos. 👋🏼

Bob Esponja despiédiendose

Referencias