mirror of
				https://github.com/langgenius/dify.git
				synced 2025-11-03 20:33:00 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
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('')
 | 
						|
}
 |