| 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> | |
| ); | |
| } | |