| 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('')
 
- }
 
 
  |