Download packages/client/src/components/github/RepoImporter.tsx from E5K7/asipilot: direct link, hf CLI and curl.
- Browser
- Download file 2.48 kB
-
https://huggingface.co/spaces/E5K7/asipilot/resolve/main/packages/client/src/components/github/RepoImporter.tsx
- Command line
-
hf download hf://spaces/E5K7/asipilot/packages/client/src/components/github/RepoImporter.tsx
-
curl -L -o RepoImporter.tsx https://huggingface.co/spaces/E5K7/asipilot/resolve/main/packages/client/src/components/github/RepoImporter.tsx
2.48 kB
| import { useState } from 'react'; | |
| import { useGitHub } from '@/hooks/useGitHub'; | |
| import { useGitHubStore } from '@/stores/githubStore'; | |
| import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'; | |
| import { Input } from '@/components/ui/input'; | |
| import { Button } from '@/components/ui/button'; | |
| import { Github, Loader2 } from 'lucide-react'; | |
| interface RepoImporterProps { | |
| open: boolean; | |
| onClose: () => void; | |
| } | |
| export default function RepoImporter({ open, onClose }: RepoImporterProps) { | |
| const [url, setUrl] = useState(''); | |
| const { importRepo, isImporting } = useGitHub(); | |
| const importProgress = useGitHubStore((s) => s.importProgress); | |
| const [error, setError] = useState(''); | |
| const handleImport = async () => { | |
| if (!url.trim()) return; | |
| setError(''); | |
| try { | |
| await importRepo(url.trim()); | |
| onClose(); | |
| } catch (err) { | |
| setError((err as Error).message || 'Failed to import repository'); | |
| } | |
| }; | |
| return ( | |
| <Dialog open={open} onOpenChange={(o) => !o && onClose()}> | |
| <DialogContent> | |
| <DialogHeader> | |
| <DialogTitle className="flex items-center gap-2"> | |
| <Github className="w-5 h-5" /> | |
| Import from GitHub | |
| </DialogTitle> | |
| <DialogDescription> | |
| Paste a GitHub repository URL to import and analyze. | |
| </DialogDescription> | |
| </DialogHeader> | |
| <div className="space-y-4 mt-2"> | |
| <Input | |
| value={url} | |
| onChange={(e) => setUrl(e.target.value)} | |
| placeholder="https://github.com/owner/repo or owner/repo" | |
| disabled={isImporting} | |
| onKeyDown={(e) => e.key === 'Enter' && handleImport()} | |
| /> | |
| {error && <p className="text-sm text-red-400">{error}</p>} | |
| {isImporting && ( | |
| <div className="flex items-center gap-2 text-sm text-muted-foreground"> | |
| <Loader2 className="w-4 h-4 animate-spin" /> | |
| {importProgress || 'Importing...'} | |
| </div> | |
| )} | |
| <div className="flex justify-end gap-2"> | |
| <Button variant="ghost" onClick={onClose} disabled={isImporting}> | |
| Cancel | |
| </Button> | |
| <Button onClick={handleImport} disabled={!url.trim() || isImporting}> | |
| {isImporting ? 'Importing...' : 'Import Repository'} | |
| </Button> | |
| </div> | |
| </div> | |
| </DialogContent> | |
| </Dialog> | |
| ); | |
| } | |