| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 | import { useEffect, useRef, useState } from 'react'import type { ModerationService } from '@/models/common'function splitStringByLength(inputString: string, chunkLength: number) {  const resultArray = []  for (let i = 0; i < inputString.length; i += chunkLength)    resultArray.push(inputString.substring(i, i + chunkLength))  return resultArray}export const useModerate = (  content: string,  stop: boolean,  moderationService: (text: string) => ReturnType<ModerationService>,  seperateLength = 50,) => {  const moderatedContentMap = useRef<Map<number, string>>(new Map())  const moderatingIndex = useRef<number[]>([])  const [contentArr, setContentArr] = useState<string[]>([])  const handleModerate = () => {    const stringArr = splitStringByLength(content, seperateLength)    const lastIndex = stringArr.length - 1    stringArr.forEach((item, index) => {      if (!(index in moderatingIndex.current) && !moderatedContentMap.current.get(index)) {        if (index === lastIndex && !stop)          return        moderatingIndex.current.push(index)        moderationService(item).then((res) => {          if (res.flagged) {            moderatedContentMap.current.set(index, res.text)            setContentArr([...stringArr.slice(0, index), res.text, ...stringArr.slice(index + 1)])          }        })      }    })    setContentArr(stringArr)  }  useEffect(() => {    if (content)      handleModerate()  }, [content, stop])  return contentArr.map((item, index) => moderatedContentMap.current.get(index) || item).join('')}
 |