import React, { useState } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, } from "@/components/ui/card"; import { githubApi } from "@/lib/api"; import type { GitHubConfig, MirrorOptions, AdvancedOptions } from "@/types/config"; import { Input } from "../ui/input"; import { toast } from "sonner"; import { Info } from "lucide-react"; import { GitHubMirrorSettings } from "./GitHubMirrorSettings"; import { Separator } from "../ui/separator"; import { HoverCard, HoverCardContent, HoverCardTrigger, } from "@/components/ui/hover-card"; interface GitHubConfigFormProps { config: GitHubConfig; setConfig: React.Dispatch>; mirrorOptions: MirrorOptions; setMirrorOptions: React.Dispatch>; advancedOptions: AdvancedOptions; setAdvancedOptions: React.Dispatch>; onAutoSave?: (githubConfig: GitHubConfig) => Promise; onMirrorOptionsAutoSave?: (mirrorOptions: MirrorOptions) => Promise; onAdvancedOptionsAutoSave?: (advancedOptions: AdvancedOptions) => Promise; isAutoSaving?: boolean; } export function GitHubConfigForm({ config, setConfig, mirrorOptions, setMirrorOptions, advancedOptions, setAdvancedOptions, onAutoSave, onMirrorOptionsAutoSave, onAdvancedOptionsAutoSave, isAutoSaving }: GitHubConfigFormProps) { const [isLoading, setIsLoading] = useState(false); const handleChange = (e: React.ChangeEvent) => { const { name, value, type, checked } = e.target; const newConfig = { ...config, [name]: type === "checkbox" ? checked : value, }; setConfig(newConfig); // Auto-save for all field changes if (onAutoSave) { onAutoSave(newConfig); } }; const testConnection = async () => { if (!config.token) { toast.error("GitHub token is required to test the connection"); return; } setIsLoading(true); try { const result = await githubApi.testConnection(config.token); if (result.success) { toast.success("Successfully connected to GitHub!"); } else { toast.error("Failed to connect to GitHub. Please check your token."); } } catch (error) { toast.error( error instanceof Error ? error.message : "An unknown error occurred" ); } finally { setIsLoading(false); } }; return ( GitHub Configuration

GitHub Token Requirements

You need to create a Classic GitHub PAT Token with the following scopes:

  • repo
  • admin:org

The organization access is required for mirroring organization repositories.

Generate tokens at{" "} github.com/settings/tokens

Required for private repositories, organizations, and starred repositories.

{ setConfig(newConfig); if (onAutoSave) onAutoSave(newConfig); }} onMirrorOptionsChange={(newOptions) => { setMirrorOptions(newOptions); if (onMirrorOptionsAutoSave) onMirrorOptionsAutoSave(newOptions); }} onAdvancedOptionsChange={(newOptions) => { setAdvancedOptions(newOptions); if (onAdvancedOptionsAutoSave) onAdvancedOptionsAutoSave(newOptions); }} />
); }