tcmmichaelb139's picture
added loading when space is starting
26574d0
import { useState, useEffect } from "react";
import "./App.css";
import Options from "./components/Options";
import Recipe from "./components/Recipe";
import { setModelLayers } from "./utils/modelCookies";
import { useAPI } from "./hooks/useAPI";
import { devError } from "./utils/devLogger";
function App() {
const [models, setModels] = useState([]);
const [selectedModel1, setSelectedModel1] = useState("");
const [selectedModel2, setSelectedModel2] = useState("");
const [layerRecipe, setLayerRecipe] = useState([]);
const [embeddingLambdas, setEmbeddingLambdas] = useState([0.5, 0.5]);
const [linearLambdas, setLinearLambdas] = useState([0.5, 0.5]);
const [mergedName, setMergedName] = useState("merged");
const [numLayers, setNumLayers] = useState(12);
const [isSpaceLoading, setIsSpaceLoading] = useState(true);
const { fetchModels, checkTaskStatus } = useAPI();
useEffect(() => {
setModelLayers("svamp", 24);
setModelLayers("tinystories", 24);
const loadModels = async () => {
try {
const taskId = await fetchModels();
if (taskId) {
checkTaskStatus(
taskId,
(result) => {
if (result && Array.isArray(result.response)) {
setModels(result.response);
setIsSpaceLoading(false);
}
},
(error) => {
devError("Failed to load models:", error);
setIsSpaceLoading(false); // Set to false even on error
}
);
} else {
setIsSpaceLoading(false);
}
} catch (error) {
devError("Error fetching models:", error);
setIsSpaceLoading(false); // Set to false even on error
}
};
loadModels();
}, [fetchModels, checkTaskStatus]);
return (
<div className="h-screen bg-secondary-50 overflow-hidden">
{/* GitHub Corner */}
<a
href="https://github.com/tcmmichaelb139/evolutiontransformer"
className="github-corner group absolute top-0 right-0 z-50"
aria-label="View source on GitHub"
target="_blank"
rel="noopener noreferrer"
>
<svg
width="40"
height="40"
viewBox="0 0 250 250"
className="fill-primary-500 text-background absolute top-0 right-0 border-0"
aria-hidden="true"
>
<path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
<path
d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
fill="currentColor"
className="group-hover:animate-pulse origin-[130px_106px] transition-transform duration-300"
/>
<path
d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
fill="currentColor"
className="octo-body"
/>
</svg>
</a>
{/* Loading Overlay */}
{isSpaceLoading && (
<div className="fixed inset-0 bg-background/90 backdrop-blur-sm z-50 flex items-center justify-center">
<div className="text-center">
<div className="animate-spin w-12 h-12 border-4 border-primary-500 border-t-transparent rounded-full mx-auto mb-4"></div>
<h2 className="text-xl font-semibold text-foreground mb-2">
Space is starting up...
</h2>
<p className="text-secondary-600">
Initializing Evolution Transformer
</p>
</div>
</div>
)}
<Options
models={models}
selectedModel1={selectedModel1}
selectedModel2={selectedModel2}
setSelectedModel1={setSelectedModel1}
setSelectedModel2={setSelectedModel2}
numLayers={numLayers}
setNumLayers={setNumLayers}
layerRecipe={layerRecipe}
embeddingLambdas={embeddingLambdas}
linearLambdas={linearLambdas}
setModels={setModels}
mergedName={mergedName}
setMergedName={setMergedName}
isSpaceLoading={isSpaceLoading}
/>
<Recipe
layerRecipe={layerRecipe}
setLayerRecipe={setLayerRecipe}
embeddingLambdas={embeddingLambdas}
setEmbeddingLambdas={setEmbeddingLambdas}
linearLambdas={linearLambdas}
setLinearLambdas={setLinearLambdas}
numLayers={numLayers}
selectedModel1={selectedModel1}
selectedModel2={selectedModel2}
/>
<div className="max-w-6xl mx-auto"></div>
</div>
);
}
export default App;