@@ -6,12 +6,13 @@ import { useUserPreferences } from '@/contexts/UserPreferencesContext';
66import { useMasking } from '@/hooks/useMasking' ;
77import { useCurrencyConversion } from '@/hooks/useCurrencyConversion' ;
88import { ChatMessage } from '@/types' ;
9- import { AlertTriangle , Bot , Clock , Coins , Copy , Check , Link , RotateCcw , User , Loader2 , RefreshCcw , XCircle } from 'lucide-react' ;
10- import React , { useState , useCallback } from 'react' ;
9+ import { AlertTriangle , Bot , Clock , Coins , Link , RotateCcw , User , Loader2 , RefreshCcw , XCircle } from 'lucide-react' ;
10+ import React from 'react' ;
1111import ReactMarkdown from 'react-markdown' ;
1212import { sanitizeUrl } from '@/lib/markdownSanitizer' ;
1313import { useTranslation } from '@/contexts/TranslationContext' ;
1414import { motion , useReducedMotion } from 'framer-motion' ;
15+ import CopyButton from '@/components/ui/CopyButton' ;
1516
1617interface MessageProps {
1718 message : ChatMessage ;
@@ -40,7 +41,7 @@ export default function Message({ message, onActionClick, onRetry, shouldAnimate
4041 const { t } = useTranslation ( ) ;
4142 const isPending = message . metadata ?. status === 'pending' ;
4243 const isFailed = message . metadata ?. status === 'failed' ;
43- const [ receiptCopied , setReceiptCopied ] = useState ( false ) ;
44+
4445
4546 // Currency conversion hook for transaction amounts
4647 const amountForConversion = message . metadata ?. transactionData ?. amountIn
@@ -52,14 +53,7 @@ export default function Message({ message, onActionClick, onRetry, shouldAnimate
5253 tokenForConversion ,
5354 ) ;
5455
55- const handleCopyReceiptId = useCallback ( ( receiptId : string ) => {
56- navigator . clipboard ?. writeText ( receiptId ) . then ( ( ) => {
57- setReceiptCopied ( true ) ;
58- setTimeout ( ( ) => setReceiptCopied ( false ) , 2000 ) ;
59- } ) . catch ( ( ) => {
60- /* clipboard unavailable */
61- } ) ;
62- } , [ ] ) ;
56+
6357
6458 const variants = {
6559 initial : {
@@ -386,6 +380,40 @@ export default function Message({ message, onActionClick, onRetry, shouldAnimate
386380 </ span >
387381 </ div >
388382 ) }
383+ { message . metadata . transactionData . transactionId && (
384+ < div className = "flex justify-between items-center gap-2" >
385+ < span > Request ID:</ span >
386+ < div className = "flex items-center gap-1" >
387+ < span className = "theme-text-primary font-mono text-xs" >
388+ { message . metadata . transactionData . transactionId . slice ( 0 , 6 ) }
389+ ...
390+ { message . metadata . transactionData . transactionId . slice ( - 4 ) }
391+ </ span >
392+ < CopyButton
393+ value = { message . metadata . transactionData . transactionId }
394+ className = "flex-shrink-0 p-0.5"
395+ iconClassName = "w-3 h-3"
396+ />
397+ </ div >
398+ </ div >
399+ ) }
400+ { message . metadata . transactionData . txHash && (
401+ < div className = "flex justify-between items-center gap-2" >
402+ < span > Tx Hash:</ span >
403+ < div className = "flex items-center gap-1" >
404+ < span className = "theme-text-primary font-mono text-xs" >
405+ { message . metadata . transactionData . txHash . slice ( 0 , 6 ) }
406+ ...
407+ { message . metadata . transactionData . txHash . slice ( - 4 ) }
408+ </ span >
409+ < CopyButton
410+ value = { message . metadata . transactionData . txHash }
411+ className = "flex-shrink-0 p-0.5"
412+ iconClassName = "w-3 h-3"
413+ />
414+ </ div >
415+ </ div >
416+ ) }
389417 { message . metadata . transactionData . receiptId && (
390418 < div className = "flex justify-between items-center gap-2" >
391419 < span > Receipt ID:</ span >
@@ -395,22 +423,11 @@ export default function Message({ message, onActionClick, onRetry, shouldAnimate
395423 ...
396424 { message . metadata . transactionData . receiptId . slice ( - 4 ) }
397425 </ span >
398- < button
399- type = "button"
400- onClick = { ( ) =>
401- handleCopyReceiptId (
402- message . metadata ! . transactionData ! . receiptId ! ,
403- )
404- }
405- className = "flex-shrink-0 p-0.5 rounded text-gray-400 hover:text-blue-400 transition-colors"
406- title = "Copy receipt ID"
407- >
408- { receiptCopied ? (
409- < Check className = "w-3 h-3 text-green-400" />
410- ) : (
411- < Copy className = "w-3 h-3" />
412- ) }
413- </ button >
426+ < CopyButton
427+ value = { message . metadata . transactionData . receiptId }
428+ className = "flex-shrink-0 p-0.5"
429+ iconClassName = "w-3 h-3"
430+ />
414431 </ div >
415432 </ div >
416433 ) }
0 commit comments