admin08077/Githubgemini
0
1{"version":3,"file":"AiPullRequestAssistant-auR4G7bZ.js","sources":["../../components/features/AiPullRequestAssistant.tsx"],"sourcesContent":["import React, { useState, useMemo, useCallback } from 'react';\nimport * as Diff from 'diff';\nimport { generatePrSummaryStructured } from '../../services/index.ts';\nimport type { StructuredPrSummary } from '../../types.ts';\nimport { AiPullRequestAssistantIcon } from '../icons.tsx';\nimport { LoadingSpinner } from '../shared/index.tsx';\n\nconst exampleBefore = `function Greeter(props) {\n return <h1>Hello, {props.name}!</h1>;\n}`;\nconst exampleAfter = `function Greeter({ name, enthusiasmLevel = 1 }) {\n const punctuation = '!'.repeat(enthusiasmLevel);\n return <h1>Hello, {name}{punctuation}</h1>;\n}`;\n\nexport const AiPullRequestAssistant: React.FC = () => {\n const [beforeCode, setBeforeCode] = useState<string>(exampleBefore);\n const [afterCode, setAfterCode] = useState<string>(exampleAfter);\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string>('');\n\n // Form state\n const [title, setTitle] = useState('');\n const [description, setDescription] = useState('');\n const [fromBranch, setFromBranch] = useState('feature/new-logic');\n const [toBranch, setToBranch] = useState('main');\n const [changeType, setChangeType] = useState('feat');\n const [relatedIssue, setRelatedIssue] = useState('');\n const [testingSteps, setTestingSteps] = useState('1. \\n2. \\n3.');\n\n const handleGenerateSummary = useCallback(async () => {\n if (!beforeCode.trim() && !afterCode.trim()) {\n setError('Please provide code to generate a summary.');\n return;\n }\n setIsLoading(true);\n setError('');\n \n try {\n const diff = Diff.createPatch('component.tsx', beforeCode, afterCode);\n const result: StructuredPrSummary = await generatePrSummaryStructured(diff);\n setTitle(result.title);\n setDescription(`${result.summary}\\n\\n**Key Changes:**\\n${result.changes.map(c => `- ${c}`).join('\\n')}`);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n setError(`Failed to generate summary: ${errorMessage}`);\n } finally {\n setIsLoading(false);\n }\n }, [beforeCode, afterCode]);\n\n const markdownPreview = useMemo(() => {\n return `\n# ${changeType}: ${title}\n${relatedIssue ? `\\n**Closes:** ${relatedIssue}\\n` : ''}\n**Branch:** \\`${fromBranch}\\` -> \\`${toBranch}\\`\n\n## Description\n${description}\n\n## Testing Steps\n${testingSteps}\n `.trim();\n }, [title, description, fromBranch, toBranch, changeType, relatedIssue, testingSteps]);\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 <AiPullRequestAssistantIcon />\n <span className=\"ml-3\">AI Pull Request Assistant</span>\n </h1>\n <p className=\"text-text-secondary mt-1\">Generate a PR summary from code changes and populate a full template.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0\">\n {/* Left side: Inputs and Generator */}\n <div className=\"flex flex-col gap-4 min-h-0\">\n <div className=\"flex flex-col flex-1 min-h-0\">\n <label htmlFor=\"before-code\" className=\"text-sm font-medium text-text-secondary mb-2\">Before</label>\n <textarea id=\"before-code\" value={beforeCode} onChange={e => setBeforeCode(e.target.value)} className=\"flex-grow p-4 bg-surface border border-border rounded-md resize-none font-mono text-sm\" />\n </div>\n <div className=\"flex flex-col flex-1 min-h-0\">\n <label htmlFor=\"after-code\" className=\"text-sm font-medium text-text-secondary mb-2\">After</label>\n <textarea id=\"after-code\" value={afterCode} onChange={e => setAfterCode(e.target.value)} className=\"flex-grow p-4 bg-surface border border-border rounded-md resize-none font-mono text-sm\" />\n </div>\n <button onClick={handleGenerateSummary} disabled={isLoading} className=\"btn-primary w-full flex items-center justify-center px-6 py-3\">\n {isLoading ? <LoadingSpinner /> : 'Generate Title & Description'}\n </button>\n {error && <p className=\"text-red-500 text-xs text-center\">{error}</p>}\n </div>\n\n {/* Right side: Form and Preview */}\n <div className=\"flex flex-col gap-4 min-h-0\">\n <form className=\"flex flex-col gap-2 overflow-y-auto pr-2 bg-surface border border-border p-4 rounded-lg h-1/2\">\n <div className=\"flex gap-2\">\n <div className=\"w-1/4\"><label className=\"block text-xs\">Type</label><select value={changeType} onChange={e => setChangeType(e.target.value)} className=\"w-full mt-1 p-1 rounded bg-background border border-border text-sm\"><option>feat</option><option>fix</option><option>chore</option><option>docs</option><option>refactor</option></select></div>\n <div className=\"w-3/4\"><label className=\"block text-xs\">Title</label><input type=\"text\" value={title} onChange={e => setTitle(e.target.value)} className=\"w-full mt-1 p-1 rounded bg-background border border-border text-sm\"/></div>\n </div>\n <div><label className=\"block text-xs\">Description</label><textarea value={description} onChange={e => setDescription(e.target.value)} className=\"w-full mt-1 p-1 rounded bg-background border border-border resize-y h-24 text-sm\"/></div>\n <div><label className=\"block text-xs\">Testing Steps</label><textarea value={testingSteps} onChange={e => setTestingSteps(e.target.value)} className=\"w-full mt-1 p-1 rounded bg-background border border-border resize-y h-16 text-sm\"/></div>\n </form>\n <div className=\"flex flex-col h-1/2\">\n <div className=\"flex justify-between items-center mb-2\">\n <label className=\"text-sm font-medium text-text-secondary\">Markdown Preview</label>\n <button onClick={() => navigator.clipboard.writeText(markdownPreview)} className=\"px-3 py-1 bg-gray-100 text-xs rounded-md hover:bg-gray-200\">Copy Markdown</button>\n </div>\n <div className=\"relative flex-grow\"><pre className=\"w-full h-full bg-background border border-border p-4 rounded-md text-sm overflow-auto whitespace-pre-wrap\">{markdownPreview}</pre></div>\n </div>\n </div>\n </div>\n </div>\n );\n};"],"names":["exampleBefore","exampleAfter","AiPullRequestAssistant","beforeCode","setBeforeCode","useState","afterCode","setAfterCode","isLoading","setIsLoading","error","setError","title","setTitle","description","setDescription","fromBranch","setFromBranch","toBranch","setToBranch","changeType","setChangeType","relatedIssue","setRelatedIssue","testingSteps","setTestingSteps","handleGenerateSummary","useCallback","diff","Diff.createPatch","result","generatePrSummaryStructured","c","err","errorMessage","markdownPreview","useMemo","jsxs","jsx","AiPullRequestAssistantIcon","e","LoadingSpinner"],"mappings":"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"}