@@ -4,7 +4,9 @@ import useDownloadFile from "@/hooks/useDownloadFile";
44import { Knowledge , RagSourceRecord } from "@/api" ;
55import { HoverCard , HoverCardTrigger } from "@/components/ui/hover-card" ;
66import { KnowledgeSourceDetail } from "./KnowledgeSourceDetail" ;
7- import { useState } from "react" ;
7+ import React , { useState } from "react" ;
8+ import { useIsTouch } from "@/hooks/useIsTouch.ts" ;
9+ import { useHandleClickOutside } from "@/hooks/useHandleClickOutside.ts" ;
810
911interface KnowledgeSourceProps {
1012 knowledgeId : string | null ;
@@ -25,12 +27,17 @@ export function KnowledgeSource({
2527 openPdf,
2628} : Readonly < KnowledgeSourceProps > ) {
2729 const { t } = useTranslation ( ) ;
28- const { downloadFile } = useDownloadFile ( ) ;
30+ const isTouch = useIsTouch ( ) ;
31+ const [ open , setOpen ] = useState ( false ) ;
32+ const ref = useHandleClickOutside < HTMLDivElement > ( ( ) => {
33+ setOpen ( false ) ;
34+ } ) ;
2935 const [ hoverProps , setHoverProps ] = useState < HoverProps > ( {
3036 source : null ,
3137 knowledge : null ,
3238 } ) ;
3339
40+ const { downloadFile } = useDownloadFile ( ) ;
3441 const { knowledge, error } = useGetKnowledgeApi ( { uuid : knowledgeId } ) ;
3542
3643 const getDocType = ( ) => {
@@ -57,7 +64,21 @@ export function KnowledgeSource({
5764 ( source ) => source . embeddingId === embeddingId ,
5865 ) ;
5966
60- const handleHover = ( ) => {
67+ const handleClick = ( ) => {
68+ if ( isTouch ) {
69+ return ;
70+ }
71+ void handleFileSource ( ) ;
72+ } ;
73+
74+ const handleTouch = ( event : React . TouchEvent ) => {
75+ event . preventDefault ( ) ;
76+ handleHover ( ) ;
77+ setOpen ( true ) ;
78+ } ;
79+
80+ const handleHover = ( event ?: React . MouseEvent ) => {
81+ event ?. preventDefault ( ) ;
6182 setHoverProps ( {
6283 knowledge : knowledge ?? null ,
6384 source : sourceContent ?? null ,
@@ -73,23 +94,29 @@ export function KnowledgeSource({
7394 }
7495
7596 return (
76- < HoverCard >
77- { knowledge ?. label ? (
78- < HoverCardTrigger onMouseEnter = { handleHover } >
79- < span
80- onClick = { ( ) => void handleFileSource ( ) }
81- className = "inline-flex items-center px-2 py-0.5 rounded border text-sm font-medium text-secondary-foreground hover:bg-foreground/20 bg-foreground/5"
82- >
83- { getDocType ( ) } | { knowledge . label }
97+ < div ref = { ref } >
98+ < HoverCard open = { isTouch ? open : undefined } >
99+ { knowledge ?. label ? (
100+ < HoverCardTrigger onMouseEnter = { handleHover } >
101+ < span
102+ onClick = { handleClick }
103+ onTouchStart = { handleTouch }
104+ className = "inline-flex items-center px-2 py-0.5 rounded border text-sm font-medium text-secondary-foreground hover:bg-foreground/20 bg-foreground/5"
105+ >
106+ { getDocType ( ) } | { knowledge . label }
107+ </ span >
108+ </ HoverCardTrigger >
109+ ) : (
110+ < span className = "inline-flex items-center px-2 py-0.5 rounded border text-sm font-medium text-secondary-foreground hover:bg-foreground/20 bg-foreground/5" >
111+ { getDocType ( ) } | { t ( "chatbot.chat.source.loading" ) }
84112 </ span >
85- </ HoverCardTrigger >
86- ) : (
87- < span className = "inline-flex items-center px-2 py-0.5 rounded border text-sm font-medium text-secondary-foreground hover:bg-foreground/20 bg-foreground/5" >
88- { getDocType ( ) } | { t ( "chatbot.chat.source.loading" ) }
89- </ span >
90- ) }
113+ ) }
91114
92- < KnowledgeSourceDetail hoverProps = { hoverProps } />
93- </ HoverCard >
115+ < KnowledgeSourceDetail
116+ onOpenFile = { ( ) => void handleFileSource ( ) }
117+ hoverProps = { hoverProps }
118+ />
119+ </ HoverCard >
120+ </ div >
94121 ) ;
95122}
0 commit comments