LeLab / src /components /landing /HfAuthDialog.tsx
GitHub CI
Sync from leLab @ 7317f7103e3a9d7f45fe4c0d6e4660a8f9d295e3
fc9bd9f
import React, { useState } from "react";
import { Check, Copy, RefreshCw } from "lucide-react";
import { Button } from "@/components/ui/button";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog";
import { useHfAuth } from "@/contexts/HfAuthContext";
interface HfAuthDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
}
const HfAuthDialog: React.FC<HfAuthDialogProps> = ({ open, onOpenChange }) => {
const { auth, refetch } = useHfAuth();
const [copied, setCopied] = useState(false);
const [refetching, setRefetching] = useState(false);
if (auth.status !== "unauthenticated") {
return null;
}
const handleCopy = async () => {
try {
await navigator.clipboard.writeText(auth.loginCommand);
setCopied(true);
setTimeout(() => setCopied(false), 1500);
} catch (err) {
console.warn("Clipboard write failed:", err);
}
};
const handleRefetch = async () => {
setRefetching(true);
try {
await refetch();
} finally {
setRefetching(false);
}
};
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="bg-gray-900 border-gray-800 text-white">
<DialogHeader>
<DialogTitle className="text-amber-200">
Hugging Face CLI not configured
</DialogTitle>
<DialogDescription className="text-gray-400">
Uploads, training, and replay-from-Hub require a logged-in HF CLI.
Run this in a terminal:
</DialogDescription>
</DialogHeader>
<pre className="bg-gray-950 p-3 rounded border border-gray-700 text-xs sm:text-sm overflow-x-auto flex items-center justify-between gap-2">
<code className="text-green-400">{auth.loginCommand}</code>
<button
type="button"
onClick={handleCopy}
className="flex-shrink-0 text-gray-400 hover:text-gray-200 transition-colors"
aria-label="Copy command"
>
{copied ? (
<Check className="w-4 h-4 text-green-400" />
) : (
<Copy className="w-4 h-4" />
)}
</button>
</pre>
<Button
variant="outline"
size="sm"
onClick={handleRefetch}
disabled={refetching}
className="border-amber-700 bg-transparent text-amber-100 hover:bg-amber-900/40 hover:text-amber-50"
>
<RefreshCw
className={`w-4 h-4 mr-2 ${refetching ? "animate-spin" : ""}`}
/>
I've logged in — recheck
</Button>
</DialogContent>
</Dialog>
);
};
export default HfAuthDialog;