admin08077/Githubgemini
0
1{"version":3,"file":"IamPolicyGenerator-FVEFQANt.js","sources":["../../components/features/IamPolicyGenerator.tsx"],"sourcesContent":["import React, { useState, useCallback } from 'react';\nimport { generateIamPolicyStream } from '../../services/aiService.ts';\nimport { ShieldCheckIcon } from '../icons.tsx';\nimport { LoadingSpinner, MarkdownRenderer } from '../shared/index.tsx';\n\nexport const IamPolicyGenerator: React.FC = () => {\n const [description, setDescription] = useState('A user role that can read from S3 buckets but not write or delete.');\n const [platform, setPlatform] = useState<'aws' | 'gcp'>('aws');\n const [policy, setPolicy] = useState('');\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState('');\n\n const handleGenerate = useCallback(async () => {\n if (!description.trim()) {\n setError('Please provide a description.');\n return;\n }\n setIsLoading(true);\n setError('');\n setPolicy('');\n try {\n const stream = generateIamPolicyStream(description, platform);\n let fullResponse = '';\n for await (const chunk of stream) {\n fullResponse += chunk;\n setPolicy(fullResponse);\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : 'An unknown error occurred.');\n } finally {\n setIsLoading(false);\n }\n }, [description, platform]);\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 <ShieldCheckIcon />\n <span className=\"ml-3\">IAM Policy Generator</span>\n </h1>\n <p className=\"text-text-secondary mt-1\">Generate AWS or GCP IAM policies from a natural language description.</p>\n </header>\n <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-6 min-h-0\">\n <div className=\"flex flex-col gap-4\">\n <div>\n <label htmlFor=\"platform\" className=\"text-sm font-medium mb-2 block\">Cloud Platform</label>\n <div className=\"flex gap-2 p-1 bg-surface rounded-lg border\">\n <button onClick={() => setPlatform('aws')} className={`flex-1 py-2 rounded-md text-sm ${platform === 'aws' ? 'bg-primary text-text-on-primary' : ''}`}>AWS</button>\n <button onClick={() => setPlatform('gcp')} className={`flex-1 py-2 rounded-md text-sm ${platform === 'gcp' ? 'bg-primary text-text-on-primary' : ''}`}>GCP</button>\n </div>\n </div>\n <div className=\"flex flex-col flex-1 min-h-0\">\n <label htmlFor=\"description\" className=\"text-sm font-medium mb-2\">Describe the desired permissions</label>\n <textarea id=\"description\" value={description} onChange={e => setDescription(e.target.value)} className=\"flex-grow p-2 bg-surface border rounded text-sm\"/>\n </div>\n <button onClick={handleGenerate} disabled={isLoading} className=\"btn-primary w-full py-3\">{isLoading ? <LoadingSpinner/> : 'Generate Policy'}</button>\n </div>\n <div className=\"flex flex-col\">\n <label className=\"text-sm font-medium mb-2\">Generated Policy (JSON)</label>\n <div className=\"flex-grow p-1 bg-background border rounded overflow-auto\">\n {isLoading && !policy && <div className=\"flex justify-center items-center h-full\"><LoadingSpinner /></div>}\n {error && <p className=\"text-red-500 p-4\">{error}</p>}\n {policy && <MarkdownRenderer content={policy} />}\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":["IamPolicyGenerator","description","setDescription","useState","platform","setPlatform","policy","setPolicy","isLoading","setIsLoading","error","setError","handleGenerate","useCallback","stream","generateIamPolicyStream","fullResponse","chunk","err","jsxs","jsx","ShieldCheckIcon","LoadingSpinner","MarkdownRenderer"],"mappings":"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"}