CoolFace
Apppublic

admin08077/Githubgemini

sourceHugging Faceotherupdated 10mo agoView on Hugging Face
0likes
WorkspaceConnectorHub-sp07MOSr.js.map1 linesDownload Raw Back to assets
1{"version":3,"file":"WorkspaceConnectorHub-sp07MOSr.js","sources":["../../components/features/WorkspaceConnectorHub.tsx"],"sourcesContent":["import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { useGlobalState } from '../../contexts/GlobalStateContext.tsx';\nimport * as vaultService from '../../services/vaultService.ts';\nimport { useNotification } from '../../contexts/NotificationContext.tsx';\nimport { validateToken } from '../../services/authService.ts';\nimport { ACTION_REGISTRY, executeWorkspaceAction } from '../../services/workspaceConnectorService.ts';\nimport { RectangleGroupIcon, GithubIcon, SparklesIcon } from '../icons.tsx';\nimport { LoadingSpinner } from '../shared/index.tsx';\nimport { signInWithGoogle } from '../../services/googleAuthService.ts';\nimport { useVaultModal } from '../../contexts/VaultModalContext.tsx';\n\nconst ServiceConnectionCard: React.FC<{\n    serviceName: string;\n    icon: React.ReactNode;\n    fields: { id: string; label: string; placeholder: string }[];\n    onConnect: (credentials: Record<string, string>) => Promise<void>;\n    onDisconnect: () => Promise<void>;\n    status: string;\n    isLoading: boolean;\n}> = ({ serviceName, icon, fields, onConnect, onDisconnect, status, isLoading }) => {\n    const [creds, setCreds] = useState<Record<string, string>>({});\n\n    const handleConnect = () => {\n        onConnect(creds);\n    };\n\n    const isConnected = status.startsWith('Connected');\n\n    return (\n        <div className=\"bg-surface border border-border rounded-lg p-6\">\n            <div className=\"flex items-center justify-between\">\n                <div className=\"flex items-center gap-4\">\n                    <div className=\"w-10 h-10\">{icon}</div>\n                    <div>\n                        <h3 className=\"text-lg font-bold text-text-primary\">{serviceName}</h3>\n                        <p className={`text-sm ${isConnected ? 'text-green-600' : 'text-text-secondary'}`}>{status}</p>\n                    </div>\n                </div>\n                {isConnected && (\n                    <button onClick={onDisconnect} className=\"px-4 py-2 bg-red-500/10 text-red-600 font-semibold rounded-lg hover:bg-red-500/20\">\n                        Disconnect\n                    </button>\n                )}\n            </div>\n            {!isConnected && (\n                <div className=\"mt-4 pt-4 border-t border-border space-y-2\">\n                    {fields.map(field => (\n                        <div key={field.id}>\n                            <label className=\"text-xs text-text-secondary\">{field.label}</label>\n                            <input\n                                type={field.id.includes('token') || field.id.includes('pat') ? 'password' : 'text'}\n                                value={creds[field.id] || ''}\n                                onChange={e => setCreds(prev => ({ ...prev, [field.id]: e.target.value }))}\n                                placeholder={field.placeholder}\n                                className=\"w-full mt-1 p-2 bg-background border border-border rounded-md text-sm\"\n                            />\n                        </div>\n                    ))}\n                    <button onClick={handleConnect} disabled={isLoading} className=\"btn-primary w-full mt-2 py-2 flex items-center justify-center\">\n                        {isLoading ? <LoadingSpinner /> : 'Connect'}\n                    </button>\n                </div>\n            )}\n        </div>\n    );\n};\n\n\nexport const WorkspaceConnectorHub: React.FC = () => {\n    const { state, dispatch } = useGlobalState();\n    const { user, githubUser, vaultState } = state;\n    const { addNotification } = useNotification();\n    const { requestUnlock, requestCreation } = useVaultModal();\n    const [loadingStates, setLoadingStates] = useState<Record<string, boolean>>({});\n    const [connectionStatuses, setConnectionStatuses] = useState<Record<string, string>>({});\n    \n    // Manual action state\n    const [selectedActionId, setSelectedActionId] = useState<string>([...ACTION_REGISTRY.keys()][0]);\n    const [actionParams, setActionParams] = useState<Record<string, any>>({});\n    const [isExecuting, setIsExecuting] = useState(false);\n    const [actionResult, setActionResult] = useState<string>('');\n\n    const services = useMemo(() => {\n        const serviceMap = new Map();\n        ACTION_REGISTRY.forEach(action => {\n            if (!serviceMap.has(action.service)) {\n                serviceMap.set(action.service, {\n                    name: action.service,\n                    actions: [],\n                });\n            }\n            serviceMap.get(action.service).actions.push(action);\n        });\n        return Array.from(serviceMap.values());\n    }, []);\n\n    const checkConnections = useCallback(async () => {\n        if (!user || !vaultState.isUnlocked) return;\n        \n        const checkCred = async (credId: string, serviceName: string, successMessage: string) => {\n             const token = await vaultService.getDecryptedCredential(credId);\n             setConnectionStatuses(s => ({ ...s, [serviceName]: token ? successMessage : 'Not Connected' }));\n        };\n\n        await checkCred('github_pat', 'GitHub', githubUser ? `Connected as ${githubUser.login}`: 'Connected');\n        await checkCred('jira_pat', 'Jira', 'Connected');\n        await checkCred('slack_bot_token', 'Slack', 'Connected');\n\n    }, [user, vaultState.isUnlocked, githubUser]);\n\n    useEffect(() => {\n        checkConnections();\n    }, [checkConnections]);\n    \n    const withVault = useCallback(async (callback: () => Promise<void>) => {\n        if (!vaultState.isInitialized) {\n            const created = await requestCreation();\n            if (!created) { addNotification('Vault setup is required.', 'error'); return; }\n        }\n        if (!vaultState.isUnlocked) {\n            const unlocked = await requestUnlock();\n            if (!unlocked) { addNotification('Vault must be unlocked to manage connections.', 'error'); return; }\n        }\n        await callback();\n    }, [vaultState, requestCreation, requestUnlock, addNotification]);\n\n\n    const handleConnect = async (serviceName: string, credentials: Record<string, string>) => {\n        await withVault(async () => {\n            setLoadingStates(s => ({ ...s, [serviceName]: true }));\n            try {\n                for (const [key, value] of Object.entries(credentials)) {\n                    if (value) await vaultService.saveCredential(key, value);\n                }\n                if (serviceName === 'GitHub' && credentials.github_pat) {\n                     const githubProfile = await validateToken(credentials.github_pat);\n                     dispatch({ type: 'SET_GITHUB_USER', payload: githubProfile });\n                     await vaultService.saveCredential('github_user', JSON.stringify(githubProfile));\n                }\n                addNotification(`${serviceName} connected successfully!`, 'success');\n                checkConnections();\n            } catch (e) {\n                addNotification(`Failed to connect ${serviceName}: ${e instanceof Error ? e.message : 'Unknown error'}`, 'error');\n            } finally {\n                setLoadingStates(s => ({ ...s, [serviceName]: false }));\n            }\n        });\n    };\n    \n    const handleDisconnect = async (serviceName: string, credIds: string[]) => {\n       await withVault(async () => {\n            setLoadingStates(s => ({ ...s, [serviceName]: true }));\n            try {\n                for (const id of credIds) {\n                     await vaultService.saveCredential(id, ''); // Overwrite with empty string\n                }\n                 if (serviceName === 'GitHub') {\n                     dispatch({ type: 'SET_GITHUB_USER', payload: null });\n                     await vaultService.saveCredential('github_user', '');\n                }\n                addNotification(`${serviceName} disconnected.`, 'info');\n                checkConnections();\n            } catch(e) {\n                addNotification(`Failed to disconnect ${serviceName}.`, 'error');\n            } finally {\n                 setLoadingStates(s => ({ ...s, [serviceName]: false }));\n            }\n       });\n    };\n    \n    const handleExecuteAction = async () => {\n        await withVault(async () => {\n            setIsExecuting(true);\n            setActionResult('');\n            try {\n                const result = await executeWorkspaceAction(selectedActionId, actionParams);\n                setActionResult(JSON.stringify(result, null, 2));\n                addNotification('Action executed successfully!', 'success');\n            } catch(e) {\n                setActionResult(`Error: ${e instanceof Error ? e.message : 'Unknown Error'}`);\n                addNotification('Action failed.', 'error');\n            } finally {\n                setIsExecuting(false);\n            }\n        });\n    };\n\n    const handleSignIn = () => {\n        signInWithGoogle();\n        // The result is handled by the global callback set in App.tsx\n    };\n\n    const selectedAction = ACTION_REGISTRY.get(selectedActionId);\n    const actionParameters = selectedAction ? selectedAction.getParameters() : {};\n\n    if (!user) {\n        return (\n            <div className=\"h-full flex items-center justify-center\">\n                <div className=\"text-center bg-surface p-8 rounded-lg border border-border max-w-md\">\n                    <h2 className=\"text-xl font-bold\">Sign In Required</h2>\n                    <p className=\"text-text-secondary my-4\">Please sign in with your Google account to manage workspace connections.</p>\n                    <button onClick={handleSignIn} className=\"btn-primary px-6 py-3 flex items-center justify-center gap-2 mx-auto\">\n                        Sign in with Google\n                    </button>\n                </div>\n            </div>\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-8\">\n                <h1 className=\"text-4xl font-extrabold tracking-tight flex items-center\"><RectangleGroupIcon /><span className=\"ml-3\">Workspace Connector Hub</span></h1>\n                <p className=\"mt-2 text-lg text-text-secondary\">Connect to your development services to unlock cross-platform AI actions.</p>\n            </header>\n            <div className=\"flex-grow grid grid-cols-1 lg:grid-cols-2 gap-8 min-h-0\">\n                <div className=\"flex flex-col gap-6 overflow-y-auto pr-4\">\n                    <h2 className=\"text-2xl font-bold\">Service Connections</h2>\n                    <ServiceConnectionCard \n                        serviceName=\"GitHub\"\n                        icon={<GithubIcon />}\n                        fields={[{ id: 'github_pat', label: 'Personal Access Token', placeholder: 'ghp_...' }]}\n                        onConnect={(creds) => handleConnect('GitHub', creds)}\n                        onDisconnect={() => handleDisconnect('GitHub', ['github_pat'])}\n                        status={connectionStatuses.GitHub || 'Checking...'}\n                        isLoading={loadingStates.GitHub}\n                    />\n                     {/* Placeholder cards for Jira and Slack */}\n                    <ServiceConnectionCard \n                        serviceName=\"Jira\"\n                        icon={<div className=\"w-10 h-10 bg-[#0052CC] rounded flex items-center justify-center text-white font-bold text-xl\">J</div>}\n                        fields={[\n                            { id: 'jira_domain', label: 'Jira Domain', placeholder: 'your-company.atlassian.net' },\n                            { id: 'jira_email', label: 'Your Jira Email', placeholder: 'you@example.com' },\n                            { id: 'jira_pat', label: 'API Token', placeholder: 'Your API Token' },\n                        ]}\n                        onConnect={(creds) => handleConnect('Jira', creds)}\n                        onDisconnect={() => handleDisconnect('Jira', ['jira_domain', 'jira_email', 'jira_pat'])}\n                        status={connectionStatuses.Jira || 'Checking...'}\n                        isLoading={loadingStates.Jira}\n                    />\n                    <ServiceConnectionCard \n                        serviceName=\"Slack\"\n                        icon={<div className=\"w-10 h-10 bg-[#4A154B] rounded flex items-center justify-center text-white font-bold text-2xl\">#</div>}\n                        fields={[{ id: 'slack_bot_token', label: 'Bot User OAuth Token', placeholder: 'xoxb-...' }]}\n                        onConnect={(creds) => handleConnect('Slack', creds)}\n                        onDisconnect={() => handleDisconnect('Slack', ['slack_bot_token'])}\n                        status={connectionStatuses.Slack || 'Checking...'}\n                        isLoading={loadingStates.Slack}\n                    />\n                </div>\n                <div className=\"flex flex-col gap-6 bg-surface p-6 border border-border rounded-lg\">\n                    <h2 className=\"text-2xl font-bold\">Manual Action Runner</h2>\n                    <div className=\"space-y-4\">\n                         <div>\n                            <label className=\"text-sm font-medium\">Action</label>\n                            <select value={selectedActionId} onChange={e => setSelectedActionId(e.target.value)} className=\"w-full mt-1 p-2 bg-background border rounded\">\n                                {services.map(service => (\n                                    <optgroup label={service.name} key={service.name}>\n                                        {service.actions.map((action: any) => (\n                                            <option key={action.id} value={action.id}>{action.description}</option>\n                                        ))}\n                                    </optgroup>\n                                ))}\n                            </select>\n                        </div>\n                        {Object.entries(actionParameters).map(([key, param]: [string, any]) => (\n                            <div key={key}>\n                                <label className=\"text-sm font-medium\">{key} {param.required && '*'}</label>\n                                <input \n                                    type={param.type}\n                                    value={actionParams[key] || ''}\n                                    onChange={e => setActionParams(p => ({...p, [key]: e.target.value}))}\n                                    placeholder={param.default || ''}\n                                    className=\"w-full mt-1 p-2 bg-background border rounded\"\n                                />\n                            </div>\n                        ))}\n                        <button onClick={handleExecuteAction} disabled={isExecuting} className=\"btn-primary w-full py-2 flex items-center justify-center gap-2\">\n                           {isExecuting ? <LoadingSpinner/> : <><SparklesIcon /> Execute Action</>}\n                        </button>\n                    </div>\n                    <div>\n                        <label className=\"text-sm font-medium\">Result</label>\n                        <pre className=\"w-full h-48 mt-1 p-2 bg-background border rounded overflow-auto text-xs\">{actionResult || 'Action results will appear here.'}</pre>\n                    </div>\n                </div>\n            </div>\n        </div>\n    );\n};"],"names":["ServiceConnectionCard","serviceName","icon","fields","onConnect","onDisconnect","status","isLoading","creds","setCreds","useState","handleConnect","isConnected","jsxs","jsx","field","e","prev","LoadingSpinner","WorkspaceConnectorHub","state","dispatch","useGlobalState","user","githubUser","vaultState","addNotification","useNotification","requestUnlock","requestCreation","useVaultModal","loadingStates","setLoadingStates","connectionStatuses","setConnectionStatuses","selectedActionId","setSelectedActionId","ACTION_REGISTRY","actionParams","setActionParams","isExecuting","setIsExecuting","actionResult","setActionResult","services","useMemo","serviceMap","action","checkConnections","useCallback","checkCred","credId","successMessage","token","vaultService.getDecryptedCredential","s","useEffect","withVault","callback","credentials","key","value","vaultService.saveCredential","githubProfile","validateToken","handleDisconnect","credIds","id","handleExecuteAction","result","executeWorkspaceAction","handleSignIn","signInWithGoogle","selectedAction","actionParameters","RectangleGroupIcon","GithubIcon","service","param","p","Fragment","SparklesIcon"],"mappings":"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"}