@@ -4,9 +4,13 @@ import Snackbar from '@mui/material/Snackbar';
4
4
import Alert from '@mui/material/Alert' ;
5
5
import { FileInfo } from "../types/types.ts" ;
6
6
import { keyframes } from '@mui/system' ;
7
+ import { calculateTokenCount , formatTokenCount , generatePrompt } from "../utils/promptBuilder" ;
7
8
8
9
interface CopyButtonProps {
9
- content : string ;
10
+ roleContent : string ;
11
+ ruleContent : string ;
12
+ taskContent : string ;
13
+ outputContent : string ;
10
14
files : FileInfo [ ] ;
11
15
}
12
16
@@ -25,41 +29,33 @@ const breathAnimation = keyframes`
25
29
}
26
30
` ;
27
31
28
- const formatTokenCount = ( count : number ) : string => {
29
- if ( count >= 10000 ) {
30
- return `${ ( count / 10000 ) . toFixed ( 1 ) . replace ( / \. 0 $ / , '' ) } 万` ;
31
- }
32
- if ( count >= 1000 ) {
33
- return `${ ( count / 1000 ) . toFixed ( 1 ) . replace ( / \. 0 $ / , '' ) } k` ;
34
- }
35
- return count . toString ( ) ;
36
- } ;
37
-
38
- const CopyButton : React . FC < CopyButtonProps > = ( { content, files} ) => {
32
+ const CopyButton : React . FC < CopyButtonProps > = ( {
33
+ roleContent,
34
+ ruleContent,
35
+ taskContent,
36
+ outputContent,
37
+ files
38
+ } ) => {
39
39
const [ open , setOpen ] = useState ( false ) ;
40
40
const [ message , setMessage ] = useState < { text : string ; severity : 'success' | 'error' } > ( {
41
41
text : '' ,
42
42
severity : 'success' ,
43
43
} ) ;
44
44
45
- const tokenCount = useMemo ( ( ) => {
46
- const filesContent = files . map ( file =>
47
- `\`\`\`${ file . path } \n${ file . content } \n\`\`\``
48
- ) . join ( '\n\n' ) ;
49
- const totalContent = `${ content } \n\n${ filesContent } ` ;
50
- return Math . ceil ( totalContent . length / 4 ) ;
51
- } , [ content , files ] ) ;
45
+ const tokenCount = useMemo ( ( ) =>
46
+ calculateTokenCount ( roleContent , ruleContent , taskContent , outputContent , files ) ,
47
+ [ roleContent , ruleContent , taskContent , outputContent , files ]
48
+ ) ;
52
49
53
- const formattedToken = useMemo ( ( ) => formatTokenCount ( tokenCount ) , [ tokenCount ] ) ;
50
+ const formattedToken = useMemo ( ( ) =>
51
+ formatTokenCount ( tokenCount ) ,
52
+ [ tokenCount ] ) ;
54
53
55
54
const handleCopy = async ( ) => {
56
- const filesContent = files . map ( file =>
57
- `\`\`\`${ file . path } \n${ file . content } \n\`\`\``
58
- ) . join ( '\n\n' ) ;
59
-
60
55
try {
61
- await navigator . clipboard . writeText ( `${ content } \n\n${ filesContent } ` ) ;
62
- setMessage ( { text : '内容已复制!' , severity : 'success' } ) ;
56
+ await navigator . clipboard . writeText (
57
+ generatePrompt ( roleContent , ruleContent , taskContent , outputContent , files )
58
+ ) ;
63
59
} catch {
64
60
setMessage ( { text : '复制失败' , severity : 'error' } ) ;
65
61
}
0 commit comments