From 433e08f2f798b4c04d57cd2d61b16a58aa5196be Mon Sep 17 00:00:00 2001 From: littleblack111 Date: Sun, 13 Oct 2024 00:38:37 +0800 Subject: core: added home page --- components/hacktype.tsx | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 components/hacktype.tsx (limited to 'components/hacktype.tsx') diff --git a/components/hacktype.tsx b/components/hacktype.tsx new file mode 100644 index 0000000..59c91b3 --- /dev/null +++ b/components/hacktype.tsx @@ -0,0 +1,55 @@ +"use client" + +import { useEffect, useRef } from "react"; + +const letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +function hackType(element: HTMLElement) { + let iteration = 0; + const interval = setInterval(() => { + element.innerText = element.innerText + .split("") + .map((letter, index) => { + if (index < iteration) { + return element.getAttribute('data-value')![index]; + } + return letters[Math.floor(Math.random() * 26)]; + }) + .join(""); + + if (iteration >= element.getAttribute('data-value')!.length) { + clearInterval(interval); + } + + iteration += 1 / 5; + }, 20); +} + +export default function HackType({ text }: { text: string }) { + const elementRef = useRef(null); + + useEffect(() => { + if (elementRef.current) { + elementRef.current.setAttribute('data-value', text); + hackType(elementRef.current); + + const interval = setInterval(() => { + hackType(elementRef.current!); + }, 10000); + + document.addEventListener("visibilitychange", () => { + if (!document.hidden && elementRef.current) { + hackType(elementRef.current); + } + }); + + return () => clearInterval(interval); + } + }, [text]); + + return ( +
+ {text} +
+ ); +} \ No newline at end of file -- cgit v1.2.3