Spaces:
Build error
Build error
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>, | |
separateLength = 50, | |
) => { | |
const moderatedContentMap = useRef<Map<number, string>>(new Map()) | |
const moderatingIndex = useRef<number[]>([]) | |
const [contentArr, setContentArr] = useState<string[]>([]) | |
const handleModerate = () => { | |
const stringArr = splitStringByLength(content, separateLength) | |
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('') | |
} | |