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