import React, { useState } from 'react'; import * as Dialog from '@radix-ui/react-dialog'; import { motion } from 'framer-motion'; import { toast } from 'react-toastify'; import Cookies from 'js-cookie'; import type { GitHubUserResponse } from '~/types/GitHub'; interface GitHubAuthDialogProps { isOpen: boolean; onClose: () => void; } export function GitHubAuthDialog({ isOpen, onClose }: GitHubAuthDialogProps) { const [token, setToken] = useState(''); const [isSubmitting, setIsSubmitting] = useState(false); const [tokenType, setTokenType] = useState<'classic' | 'fine-grained'>('classic'); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!token.trim()) { return; } setIsSubmitting(true); try { const response = await fetch('https://api.github.com/user', { headers: { Accept: 'application/vnd.github.v3+json', Authorization: `Bearer ${token}`, }, }); if (response.ok) { const userData = (await response.json()) as GitHubUserResponse; // Save connection data const connectionData = { token, tokenType, user: { login: userData.login, avatar_url: userData.avatar_url, name: userData.name || userData.login, }, connected_at: new Date().toISOString(), }; localStorage.setItem('github_connection', JSON.stringify(connectionData)); // Set cookies for API requests Cookies.set('githubToken', token); Cookies.set('githubUsername', userData.login); Cookies.set('git:github.com', JSON.stringify({ username: token, password: 'x-oauth-basic' })); toast.success(`Successfully connected as ${userData.login}`); setToken(''); onClose(); } else { if (response.status === 401) { toast.error('Invalid GitHub token. Please check and try again.'); } else { toast.error(`GitHub API error: ${response.status} ${response.statusText}`); } } } catch (error) { console.error('Error connecting to GitHub:', error); toast.error('Failed to connect to GitHub. Please try again.'); } finally { setIsSubmitting(false); } }; return ( !open && onClose()}>

Access Private Repositories

To access private repositories, you need to connect your GitHub account by providing a personal access token.

Connect with GitHub Token

setToken(e.target.value)} placeholder="ghp_xxxxxxxxxxxxxxxxxxxx" className="w-full px-3 py-1.5 rounded-lg border border-[#E5E5E5] dark:border-[#333333] bg-white dark:bg-[#1A1A1A] text-[#111111] dark:text-white placeholder-[#999999] text-sm" />
Get your token at{' '} github.com/settings/tokens

Accessing Private Repositories

Important things to know about accessing private repositories:

  • You must be granted access to the repository by its owner
  • Your GitHub token must have the 'repo' scope
  • For organization repositories, you may need additional permissions
  • No token can give you access to repositories you don't have permission for
); }