/* eslint-disable @typescript-eslint/no-explicit-any */
import { useState } from "react";
import classNames from "classnames";
import { toast } from "react-toastify";
import SpaceIcon from "@/assets/space.svg";
import Loading from "../loading/loading";
import Login from "../login/login";
import { Auth } from "../../utils/types";
const MsgToast = ({ url }: { url: string }) => (
Your space is live!
window.open(url, "_blank")}
>
See Space
);
// ✅ DOWNLOAD FUNCTION (no JSZip needed)
const downloadFile = (filename: string, content: string) => {
const blob = new Blob([content], { type: "text/html" });
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
a.href = url;
a.download = filename;
a.click();
URL.revokeObjectURL(url);
};
function DeployButton({
html,
error = false,
auth,
}: {
html: string;
error: boolean;
auth?: Auth;
}) {
const [open, setOpen] = useState(false);
const [loading, setLoading] = useState(false);
const [path, setPath] = useState(undefined);
const [config, setConfig] = useState({ title: "" });
const createSpace = async () => {
setLoading(true);
try {
const request = await fetch("/api/deploy", {
method: "POST",
body: JSON.stringify({
title: config.title,
path,
html,
}),
headers: {
"Content-Type": "application/json",
},
});
const response = await request.json();
if (response.ok) {
toast.success(
);
setPath(response.path);
} else {
toast.error(response.message);
}
} catch (err: any) {
toast.error(err.message);
} finally {
setLoading(false);
setOpen(false);
}
};
return (
{auth && (
Connected as{" "}
{auth.preferred_username}
)}
{/* Deploy to Space Button */}
setOpen(!open)}
>
{path ? "Update Space" : "Deploy to Space"}
{/* Pop-up Overlay */}
setOpen(false)}
>
{/* Pop-up Content */}
{!auth ? (
Host this project for free and share it with your friends.
) : (
<>
Space
Configure Deployment
{path ? (
<>
Your space is live at{" "}
huggingface.co/{path}
. You can update it by deploying again.
>
) : (
"Deploy your project to a space on the Hub. Spaces are a way to share your project with the world."
)}
{!path && (
Space Title
setConfig({ ...config, title: e.target.value })
}
/>
)}
{error && (
Your code has errors. Fix them before deploying.
)}
{/* ✅ DOWNLOAD HTML BUTTON */}
downloadFile("index.html", html)}
>
Download index.html
{/* ✅ CREATE / UPDATE SPACE BUTTON */}
{path ? "Update Space" : "Create Space"}
{loading && }
>
)}
);
}
export default DeployButton;