From 2d1f21efe7ce5c68ce6ed3ed39ed374fa562c442 Mon Sep 17 00:00:00 2001 From: MBO-Tech-IT Date: Thu, 2 Apr 2026 01:17:06 +0200 Subject: [PATCH] feat: add useTypewriter hook --- hooks/useTypewriter.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 hooks/useTypewriter.ts diff --git a/hooks/useTypewriter.ts b/hooks/useTypewriter.ts new file mode 100644 index 0000000..6e01db0 --- /dev/null +++ b/hooks/useTypewriter.ts @@ -0,0 +1,32 @@ +"use client"; + +import { useEffect, useState } from "react"; + +export function useTypewriter(words: string[], typingSpeed = 80, deletingSpeed = 40, pauseMs = 2000) { + const [displayed, setDisplayed] = useState(""); + const [wordIndex, setWordIndex] = useState(0); + const [isDeleting, setIsDeleting] = useState(false); + + useEffect(() => { + const current = words[wordIndex % words.length]; + + const timeout = setTimeout(() => { + if (!isDeleting) { + setDisplayed(current.slice(0, displayed.length + 1)); + if (displayed.length + 1 === current.length) { + setTimeout(() => setIsDeleting(true), pauseMs); + } + } else { + setDisplayed(current.slice(0, displayed.length - 1)); + if (displayed.length - 1 === 0) { + setIsDeleting(false); + setWordIndex((i) => i + 1); + } + } + }, isDeleting ? deletingSpeed : typingSpeed); + + return () => clearTimeout(timeout); + }, [displayed, isDeleting, wordIndex, words, typingSpeed, deletingSpeed, pauseMs]); + + return displayed; +}