TranslateGemma-WebGPU / src /Initialize.tsx
nico-martin's picture
nico-martin HF Staff
added thumbnail
b2425fb
import { Button } from "./theme";
import cn from "./utils/classnames.ts";
import { formatBytes } from "./utils/format.ts";
import Translator from "./ai/Translator.ts";
import Card from "./theme/misc/Card.tsx";
import Introduction from "./components/Introduction.tsx";
import ModelLoader from "./components/ModelLoader.tsx";
import { flushSync } from "react-dom";
import Waiting from "./components/Waiting.tsx";
interface InitializeProps {
progress: number;
onInitialize: () => Promise<void>;
isInitializing?: boolean;
className?: string;
}
export default function Initialize({
progress,
onInitialize,
isInitializing = false,
className = "",
}: InitializeProps) {
const handleInitialize = async () => {
if (document.startViewTransition) {
document.startViewTransition(() => {
flushSync(() => {
onInitialize();
});
});
} else {
await onInitialize();
}
};
return (
<div className={cn("max-w-2xl w-full mx-auto px-8", className)}>
<Card className="flex flex-col items-center gap-6">
{isInitializing ? (
<div className="w-full space-y-8">
<Waiting />
<ModelLoader className="w-full" progress={progress} />
</div>
) : (
<div className="w-full space-y-8">
<Introduction />
<Button
variant="primary"
onClick={handleInitialize}
disabled={isInitializing}
className="text-lg! w-full"
>
Download TranslateGemma 4B ({formatBytes(Translator.size)})
</Button>
</div>
)}
</Card>
</div>
);
}