admin08077/Githubgemini
0
1{"version":3,"file":"AiUnitTestGenerator-Bawbasui.js","sources":["../../components/features/AiUnitTestGenerator.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { generateUnitTestsStream, downloadFile } from '../../services/index.ts';\nimport { BeakerIcon, ArrowDownTrayIcon } from '../icons.tsx';\nimport { LoadingSpinner } from '../shared/index.tsx';\nimport { MarkdownRenderer } from '../shared/index.tsx';\n\nconst exampleCode = `import React from 'react';\n\nexport const Greeting = ({ name }) => {\n if (!name) {\n return <div>Hello, Guest!</div>;\n }\n return <div>Hello, {name}!</div>;\n};`;\n\nexport const AiUnitTestGenerator: React.FC = () => {\n const [code, setCode] = useState<string>(exampleCode);\n const [tests, setTests] = useState<string>('');\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n const handleGenerate = useCallback(async () => {\n if (!code.trim()) {\n setError('Please enter some code to generate tests for.');\n return;\n }\n setIsLoading(true);\n setError('');\n setTests('');\n try {\n const stream = generateUnitTestsStream(code);\n let fullResponse = '';\n for await (const chunk of stream) {\n fullResponse += chunk;\n setTests(fullResponse);\n }\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate tests: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [code]);\n \n const cleanCodeForDownload = (markdown: string) => {\n return markdown.replace(/^```(?:\\w+\\n)?/, '').replace(/```$/, '');\n }\n\n return (\n <div className=\"h-full flex flex-col p-4 sm:p-6 lg:p-8 text-text-primary\">\n <header className=\"mb-6\">\n <h1 className=\"text-3xl font-bold flex items-center\">\n <BeakerIcon />\n <span className=\"ml-3\">AI Unit Test Generator</span>\n </h1>\n <p className=\"text-text-secondary mt-1\">Provide a function or component and let AI write the tests.</p>\n </header>\n <div className=\"flex-grow flex flex-col gap-4 min-h-0\">\n <div className=\"flex flex-col flex-1 min-h-0\">\n <label htmlFor=\"code-input\" className=\"text-sm font-medium text-text-secondary mb-2\">Source Code</label>\n <textarea\n id=\"code-input\"\n value={code}\n onChange={(e) => setCode(e.target.value)}\n placeholder=\"Paste your source code here...\"\n className=\"flex-grow p-4 bg-surface border border-border rounded-md resize-none font-mono text-sm focus:ring-2 focus:ring-primary focus:outline-none\"\n />\n </div>\n <div className=\"flex-shrink-0\">\n <button\n onClick={handleGenerate}\n disabled={isLoading}\n className=\"btn-primary w-full max-w-xs mx-auto flex items-center justify-center px-6 py-3\"\n >\n {isLoading ? <LoadingSpinner /> : 'Generate Unit Tests'}\n </button>\n </div>\n <div className=\"flex flex-col flex-1 min-h-0\">\n <div className=\"flex justify-between items-center mb-2\">\n <label className=\"text-sm font-medium text-text-secondary\">Generated Tests</label>\n {tests && !isLoading && (\n <div className=\"flex items-center gap-2\">\n <button onClick={() => navigator.clipboard.writeText(cleanCodeForDownload(tests))} className=\"px-3 py-1 bg-gray-100 text-xs rounded-md hover:bg-gray-200\">Copy Code</button>\n <button onClick={() => downloadFile(cleanCodeForDownload(tests), 'tests.tsx', 'text/typescript')} className=\"flex items-center gap-1 px-3 py-1 bg-gray-100 text-xs rounded-md hover:bg-gray-200\">\n <ArrowDownTrayIcon className=\"w-4 h-4\" /> Download\n </button>\n </div>\n )}\n </div>\n <div className=\"flex-grow p-1 bg-background border border-border rounded-md overflow-y-auto\">\n {isLoading && !tests && (\n <div className=\"flex items-center justify-center h-full\">\n <LoadingSpinner />\n </div>\n )}\n {error && <p className=\"p-4 text-red-500\">{error}</p>}\n {tests && <MarkdownRenderer content={tests} />}\n {!isLoading && !tests && !error && (\n <div className=\"text-text-secondary h-full flex items-center justify-center\">\n The generated tests will appear here.\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["exampleCode","AiUnitTestGenerator","code","setCode","useState","tests","setTests","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","stream","generateUnitTestsStream","fullResponse","chunk","err","errorMessage","cleanCodeForDownload","markdown","jsxs","jsx","BeakerIcon","e","LoadingSpinner","downloadFile","ArrowDownTrayIcon","MarkdownRenderer"],"mappings":"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"}