import React, { useState, useEffect } from 'react'; import { logStore } from '~/lib/stores/logs'; import { classNames } from '~/utils/classNames'; import { motion } from 'framer-motion'; import { toast } from 'react-toastify'; interface GitHubUserResponse { login: string; avatar_url: string; html_url: string; } interface GitHubConnection { user: GitHubUserResponse | null; token: string; } export default function ConnectionsTab() { const [connection, setConnection] = useState({ user: null, token: '', }); const [isLoading, setIsLoading] = useState(true); const [isConnecting, setIsConnecting] = useState(false); // Load saved connection on mount useEffect(() => { const savedConnection = localStorage.getItem('github_connection'); if (savedConnection) { setConnection(JSON.parse(savedConnection)); } setIsLoading(false); }, []); const fetchGithubUser = async (token: string) => { try { setIsConnecting(true); const response = await fetch('https://api.github.com/user', { headers: { Authorization: `Bearer ${token}`, }, }); if (!response.ok) { throw new Error('Invalid token or unauthorized'); } const data = (await response.json()) as GitHubUserResponse; const newConnection = { user: data, token }; // Save connection localStorage.setItem('github_connection', JSON.stringify(newConnection)); setConnection(newConnection); toast.success('Successfully connected to GitHub'); } catch (error) { logStore.logError('Failed to authenticate with GitHub', { error }); toast.error('Failed to connect to GitHub'); setConnection({ user: null, token: '' }); } finally { setIsConnecting(false); } }; const handleConnect = async (event: React.FormEvent) => { event.preventDefault(); await fetchGithubUser(connection.token); }; const handleDisconnect = () => { localStorage.removeItem('github_connection'); setConnection({ user: null, token: '' }); toast.success('Disconnected from GitHub'); }; if (isLoading) { return (
Loading...
); } return (
{/* Header */}

Connection Settings

Manage your external service connections and integrations

{/* GitHub Connection */}

GitHub Connection

setConnection((prev) => ({ ...prev, token: e.target.value }))} disabled={isConnecting || !!connection.user} placeholder="Enter your GitHub token" className={classNames( 'w-full px-3 py-2 rounded-lg text-sm', 'bg-[#F8F8F8] dark:bg-[#1A1A1A]', 'border border-[#E5E5E5] dark:border-[#333333]', 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary', 'focus:outline-none focus:ring-1 focus:ring-purple-500', 'disabled:opacity-50', )} />
{!connection.user ? ( ) : ( )} {connection.user && (
Connected to GitHub )}
); }