CoolFace
Apppublic

admin08077/Githubgemini

sourceHugging Faceotherupdated 10mo agoView on Hugging Face
0likes
AiCodeExplainer-CE0_1KFz.js.map1 linesDownload Raw Back to assets
1{"version":3,"file":"AiCodeExplainer-CE0_1KFz.js","sources":["../../components/features/AiCodeExplainer.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { explainCodeStructured } from '../../services/index.ts';\nimport type { StructuredExplanation } from '../../types.ts';\nimport { CpuChipIcon } from '../icons.tsx';\nimport { MarkdownRenderer, LoadingSpinner } from '../shared/index.tsx';\n\nconst exampleCode = `const bubbleSort = (arr) => {\n  for (let i = 0; i < arr.length; i++) {\n    for (let j = 0; j < arr.length - i - 1; j++) {\n      if (arr[j] > arr[j + 1]) {\n        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];\n      }\n    }\n  }\n  return arr;\n};`;\n\ntype ExplanationTab = 'summary' | 'lineByLine' | 'complexity' | 'suggestions';\n\nconst simpleSyntaxHighlight = (code: string) => {\n    const escapedCode = code\n        .replace(/&/g, '&amp;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n\n    return escapedCode\n        .replace(/\\b(const|let|var|function|return|if|for|=>|import|from|export|default)\\b/g, '<span class=\"text-indigo-600 font-semibold\">$1</span>')\n        .replace(/(\\`|'|\")(.*?)(\\`|'|\")/g, '<span class=\"text-emerald-700\">$1$2$3</span>')\n        .replace(/(\\/\\/.*)/g, '<span class=\"text-gray-500 italic\">$1</span>')\n        .replace(/(\\{|\\}|\\(|\\)|\\[|\\])/g, '<span class=\"text-gray-600\">$1</span>');\n};\n\nexport const AiCodeExplainer: React.FC<{ initialCode?: string }> = ({ initialCode }) => {\n    const [code, setCode] = useState<string>(initialCode || exampleCode);\n    const [explanation, setExplanation] = useState<StructuredExplanation | null>(null);\n    const [isLoading, setIsLoading] = useState<boolean>(false);\n    const [error, setError] = useState<string>('');\n    const [activeTab, setActiveTab] = useState<ExplanationTab>('summary');\n    const textareaRef = useRef<HTMLTextAreaElement>(null);\n    const preRef = useRef<HTMLPreElement>(null);\n\n    const handleExplain = useCallback(async (codeToExplain: string) => {\n        if (!codeToExplain.trim()) {\n            setError('Please enter some code to explain.');\n            return;\n        }\n        setIsLoading(true);\n        setError('');\n        setExplanation(null);\n        setActiveTab('summary');\n        try {\n            const result = await explainCodeStructured(codeToExplain);\n            setExplanation(result);\n        } catch (err) {\n            const errorMessage = err instanceof Error ? err.message : 'An unknown error occurred.';\n            setError(`Failed to get explanation: ${errorMessage}`);\n        } finally {\n            setIsLoading(false);\n        }\n    }, []);\n    \n    useEffect(() => {\n        if (initialCode) {\n            setCode(initialCode);\n            handleExplain(initialCode);\n        }\n    }, [initialCode, handleExplain]);\n\n    const handleScroll = () => {\n        if (preRef.current && textareaRef.current) {\n            preRef.current.scrollTop = textareaRef.current.scrollTop;\n            preRef.current.scrollLeft = textareaRef.current.scrollLeft;\n        }\n    };\n\n    const highlightedCode = useMemo(() => simpleSyntaxHighlight(code), [code]);\n\n    const renderTabContent = () => {\n        if (!explanation) return null;\n        switch(activeTab) {\n            case 'summary':\n                return <MarkdownRenderer content={explanation.summary} />;\n            case 'lineByLine':\n                return (\n                    <div className=\"space-y-3\">\n                        {explanation.lineByLine.map((item, index) => (\n                            <div key={index} className=\"p-3 bg-background rounded-md border border-border\">\n                                <p className=\"font-mono text-xs text-primary mb-1\">Lines: {item.lines}</p>\n                                <p className=\"text-sm\">{item.explanation}</p>\n                            </div>\n                        ))}\n                    </div>\n                );\n            case 'complexity':\n                return (\n                    <div>\n                        <p><strong>Time Complexity:</strong> <span className=\"font-mono text-amber-600\">{explanation.complexity.time}</span></p>\n                        <p><strong>Space Complexity:</strong> <span className=\"font-mono text-amber-600\">{explanation.complexity.space}</span></p>\n                    </div>\n                );\n            case 'suggestions':\n                return (\n                     <ul className=\"list-disc list-inside space-y-2\">\n                        {explanation.suggestions.map((item, index) => <li key={index}>{item}</li>)}\n                    </ul>\n                );\n        }\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 flex-shrink-0\">\n                <h1 className=\"text-3xl font-bold flex items-center\">\n                    <CpuChipIcon />\n                    <span className=\"ml-3\">AI Code Explainer</span>\n                </h1>\n                <p className=\"text-text-secondary mt-1\">Get a detailed, structured analysis of any code snippet.</p>\n            </header>\n            <div className=\"flex-grow flex flex-col lg:flex-row gap-6 min-h-0\">\n                \n                {/* Left Column: Code Input */}\n                <div className=\"flex flex-col min-h-0 lg:w-1/2\">\n                    <label htmlFor=\"code-input\" className=\"text-sm font-medium text-text-secondary mb-2\">Your Code</label>\n                    <div className=\"relative flex-grow bg-surface border border-border rounded-md focus-within:ring-2 focus-within:ring-primary overflow-hidden\">\n                        <textarea\n                            ref={textareaRef}\n                            id=\"code-input\"\n                            value={code}\n                            onChange={(e) => setCode(e.target.value)}\n                            onScroll={handleScroll}\n                            placeholder=\"Paste your code here...\"\n                            spellCheck=\"false\"\n                            className=\"absolute inset-0 w-full h-full p-4 bg-transparent resize-none font-mono text-sm text-transparent caret-primary outline-none z-10\"\n                        />\n                        <pre \n                            ref={preRef}\n                            aria-hidden=\"true\"\n                            className=\"absolute inset-0 w-full h-full p-4 font-mono text-sm text-text-primary pointer-events-none z-0 whitespace-pre-wrap overflow-auto no-scrollbar\"\n                            dangerouslySetInnerHTML={{ __html: highlightedCode + '\\n' }}\n                        />\n                    </div>\n                    <div className=\"mt-4 flex-shrink-0\">\n                        <button\n                            onClick={() => handleExplain(code)}\n                            disabled={isLoading}\n                            className=\"btn-primary w-full flex items-center justify-center px-6 py-3\"\n                        >\n                            {isLoading ? <LoadingSpinner/> : 'Analyze Code'}\n                        </button>\n                    </div>\n                </div>\n\n                {/* Right Column: AI Analysis */}\n                <div className=\"flex flex-col min-h-0 lg:w-1/2\">\n                    <label className=\"text-sm font-medium text-text-secondary mb-2\">AI Analysis</label>\n                    <div className=\"relative flex-grow flex flex-col bg-surface border border-border rounded-md overflow-hidden\">\n                        <div className=\"flex-shrink-0 flex border-b border-border\">\n                           {(['summary', 'lineByLine', 'complexity', 'suggestions'] as ExplanationTab[]).map(tab => (\n                               <button key={tab} onClick={() => setActiveTab(tab)} disabled={!explanation}\n                                className={`px-4 py-2 text-sm font-medium capitalize transition-colors ${activeTab === tab ? 'bg-background text-primary font-semibold' : 'text-text-secondary hover:bg-gray-100 disabled:text-gray-400'}`}>\n                                   {tab.replace(/([A-Z])/g, ' $1')}\n                               </button>\n                           ))}\n                        </div>\n                        <div className=\"p-4 flex-grow overflow-y-auto\">\n                            {isLoading && <div className=\"flex items-center justify-center h-full\"><LoadingSpinner /></div>}\n                            {error && <p className=\"text-red-500\">{error}</p>}\n                            {explanation && !isLoading && renderTabContent()}\n                            {!isLoading && !explanation && !error && <div className=\"text-text-secondary h-full flex items-center justify-center\">The analysis will appear here.</div>}\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n};"],"names":["exampleCode","simpleSyntaxHighlight","code","AiCodeExplainer","initialCode","setCode","useState","explanation","setExplanation","isLoading","setIsLoading","error","setError","activeTab","setActiveTab","textareaRef","useRef","preRef","handleExplain","useCallback","codeToExplain","result","explainCodeStructured","err","errorMessage","useEffect","handleScroll","highlightedCode","useMemo","renderTabContent","jsx","MarkdownRenderer","item","index","jsxs","CpuChipIcon","e","LoadingSpinner","tab"],"mappings":"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"}