JokeNetwork/faq

View on GitHub
components/textRotator.tsx

Summary

Maintainability
A
1 hr
Test Coverage
import { useState, useEffect } from "react";
import styles from "./textrotator.module.scss";

type Letter = {
  char: string;
  key: number;
};

const words = [
  "searchable",
  "shareable",
  "optimized",
  "user-friendly",
  "accessible",
  "better",
];

const TextRotator = () => {
  const [currentWordIndex, setCurrentWordIndex] = useState(0);
  const [letters, setLetters] = useState<Letter[]>(
    words[0].split("").map((char) => ({ char, key: Math.random() }))
  );

  useEffect(() => {
    const changeWord = () => {
      const nextWordIndex = (currentWordIndex + 1) % words.length;
      const nextWord = words[nextWordIndex].split("");

      setLetters((prevLetters) => {
        const maxLength = Math.max(prevLetters.length, nextWord.length);
        const newLetters: Letter[] = [];

        for (let i = 0; i < maxLength; i++) {
          newLetters.push({
            char: nextWord[i] || " ",
            key: Math.random(),
          });
        }

        return newLetters;
      });

      setCurrentWordIndex(nextWordIndex);
    };

    const intervalId = setInterval(changeWord, 4000);

    return () => {
      clearInterval(intervalId);
    };
  }, [currentWordIndex]);

  return (
    <div className="nx-mt-2 nx-text-2xl nx-font-light nx-tracking-tight nx-text-slate-900 dark:nx-text-slate-100">
      <p>
        MetaTags make your website{" "}
        <span className={styles.word}>
          {letters.map(({ char, key }) => (
            <span key={key} className={styles.letter}>
              {char}
            </span>
          ))}
        </span>
         .<br />
      </p>
    </div>
  );
};

export default TextRotator;