Spaces:
Build error
Build error
| import { useEffect, useRef, useState } from 'react'; | |
| import { encryptText } from '@/components/app/(home)/sections/hero/Title/Title'; | |
| export default function useSwitchingCode(code: string, ms = 20, progress = 1, fill = true) { | |
| const [value, setValue] = useState(code); | |
| const prevCode = useRef(value); | |
| useEffect(() => { | |
| if (code === prevCode.current) return; | |
| let i = 0; | |
| setValue(prevCode.current); | |
| let timeout: number; | |
| const tick = () => { | |
| i += progress; | |
| const prevLines = prevCode.current.split('\n'); | |
| const currentLines = code.split('\n'); | |
| const maxLines = fill ? 10 : Math.max(prevLines.length, currentLines.length); | |
| while (prevLines.length < maxLines) prevLines.push(''); | |
| while (currentLines.length < maxLines) currentLines.push(''); | |
| const remainingLines = prevLines.map((line, index) => { | |
| if (line === currentLines[index]) return line; | |
| const charLength = Math.floor(line.length * (i / 30)); | |
| return (currentLines[index]?.slice(0, Math.floor(currentLines[index].length * (i / 30))) ?? '') | |
| + encryptText(line.slice(charLength), 0, { randomizeChance: 0.5 }); | |
| }); | |
| setValue((fill ? remainingLines : remainingLines.filter((line, index, arr) => { | |
| if (line === '' && arr[index - 1] === '') return false; | |
| return true; | |
| })).join('\n')); | |
| if (i < 30) { | |
| timeout = window.setTimeout(tick, ms); | |
| } else { | |
| prevCode.current = code; | |
| } | |
| }; | |
| tick(); | |
| return () => { | |
| window.clearTimeout(timeout); | |
| prevCode.current = code; | |
| }; | |
| }, [code, ms, progress, fill]); | |
| return value; | |
| } |