mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-04 09:28:11 +00:00
Refactor model selection to use ModelCategory enum across PageEditor, TextToImage, and ImageToVideo components
This commit is contained in:
1 parent
7ed3d6ae08
commit
97bef45a4f
8 files changed
+40
-8
No files matched your search
@@ -75,7 +75,10 @@ import {
|
||||
} from "@storyteller/ui-gallery-modal";
|
||||
import {
|
||||
imageGenerationModels,
|
||||
// ModelCategory,
|
||||
ModelSelector,
|
||||
// videoGenerationModels,
|
||||
// useModelSelectorStore,
|
||||
} from "@storyteller/ui-model-selector";
|
||||
|
||||
export const PageEditor = () => {
|
||||
@@ -85,6 +88,12 @@ export const PageEditor = () => {
|
||||
event.stopPropagation();
|
||||
};
|
||||
|
||||
// TODO: For 3d Promptbox to accept this later on
|
||||
// const { selectedModels } = useModelSelectorStore();
|
||||
// const selectedModel =
|
||||
// selectedModels[ModelCategory.Editor3D] ||
|
||||
// videoGenerationModels[0]?.label;
|
||||
|
||||
useEffect(() => {
|
||||
timelineHeight.value = 0; //timelineHeight.value = 208;
|
||||
sidePanelWidth.value = 340;
|
||||
@@ -460,7 +469,7 @@ export const PageEditor = () => {
|
||||
<div className="absolute bottom-6 left-6 z-20 flex items-center gap-2">
|
||||
<ModelSelector
|
||||
items={imageGenerationModels}
|
||||
category="image-generation"
|
||||
category="3d-editor"
|
||||
panelTitle="Select Model"
|
||||
panelClassName="min-w-[280px]"
|
||||
buttonClassName="bg-transparent p-0 text-lg hover:bg-transparent text-white/80 hover:text-white"
|
||||
|
||||
@@ -4,6 +4,7 @@ import { PromptBoxImage } from "@storyteller/ui-promptbox";
|
||||
import BackgroundGallery from "./BackgroundGallery";
|
||||
import {
|
||||
imageGenerationModels,
|
||||
ModelCategory,
|
||||
ModelSelector,
|
||||
useModelSelectorStore,
|
||||
} from "@storyteller/ui-model-selector";
|
||||
@@ -17,7 +18,8 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const { selectedModels } = useModelSelectorStore();
|
||||
const selectedModel =
|
||||
selectedModels["text-to-image"] || imageGenerationModels[0]?.label;
|
||||
selectedModels[ModelCategory.TextToImage] ||
|
||||
imageGenerationModels[0]?.label;
|
||||
|
||||
const jobContext: JobContextType = {
|
||||
jobTokens: [],
|
||||
@@ -58,7 +60,7 @@ const TextToImage = ({ imageMediaId, imageUrl }: TextToImageProps) => {
|
||||
<div className="absolute bottom-6 left-6 z-20 flex items-center gap-2">
|
||||
<ModelSelector
|
||||
items={imageGenerationModels}
|
||||
category="text-to-image"
|
||||
category={ModelCategory.TextToImage}
|
||||
mode="hoverSelect"
|
||||
panelTitle="Select Model"
|
||||
panelClassName="min-w-[280px]"
|
||||
|
||||
@@ -3,6 +3,7 @@ import { JobContextType } from "@storyteller/common";
|
||||
import { PromptBoxVideo } from "@storyteller/ui-promptbox";
|
||||
import BackgroundGallery from "./BackgroundGallery";
|
||||
import {
|
||||
ModelCategory,
|
||||
ModelSelector,
|
||||
useModelSelectorStore,
|
||||
videoGenerationModels,
|
||||
@@ -17,7 +18,8 @@ const ImageToVideo = ({ imageMediaId, imageUrl }: ImageToVideoProps) => {
|
||||
const containerRef = useRef<HTMLDivElement>(null);
|
||||
const { selectedModels } = useModelSelectorStore();
|
||||
const selectedModel =
|
||||
selectedModels["image-to-video"] || videoGenerationModels[0]?.label;
|
||||
selectedModels[ModelCategory.ImageToVideo] ||
|
||||
videoGenerationModels[0]?.label;
|
||||
|
||||
const jobContext: JobContextType = {
|
||||
jobTokens: [],
|
||||
@@ -59,7 +61,7 @@ const ImageToVideo = ({ imageMediaId, imageUrl }: ImageToVideoProps) => {
|
||||
<div className="absolute bottom-6 left-6 z-20 flex items-center gap-2">
|
||||
<ModelSelector
|
||||
items={videoGenerationModels}
|
||||
category="image-to-video"
|
||||
category={ModelCategory.ImageToVideo}
|
||||
panelTitle="Select Model"
|
||||
panelClassName="min-w-[280px]"
|
||||
buttonClassName="bg-transparent p-0 text-lg hover:bg-transparent text-white/80 hover:text-white"
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export * from "./lib/model-selector";
|
||||
export * from "./lib/model-selector-store";
|
||||
export * from "./lib/model-lists";
|
||||
export * from "./lib/model-categories";
|
||||
@@ -0,0 +1,10 @@
|
||||
/**
|
||||
* Defines the unique categories for each product or context where a model
|
||||
* selection is required. Using an enum prevents typos and ensures type safety.
|
||||
*/
|
||||
export enum ModelCategory {
|
||||
TextToImage = "text-to-image",
|
||||
ImageToVideo = "image-to-video",
|
||||
Canvas2D = "2d-canvas",
|
||||
Editor3D = "3d-editor",
|
||||
}
|
||||
@@ -38,6 +38,12 @@ export const allModels = {
|
||||
description: "Fast and high-quality model",
|
||||
badges: [{ label: "15 sec.", icon: <FontAwesomeIcon icon={faClock} /> }],
|
||||
},
|
||||
{
|
||||
label: "Flux.1 Kontext",
|
||||
icon: <FontAwesomeIcon icon={faImage} className="h-4 w-4" />,
|
||||
description: "New model with advanced context",
|
||||
badges: [{ label: "25 sec.", icon: <FontAwesomeIcon icon={faClock} /> }],
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { create } from "zustand";
|
||||
import { ModelCategory } from "./model-categories";
|
||||
|
||||
interface ModelSelectorState {
|
||||
selectedModels: { [category: string]: string | undefined };
|
||||
setSelectedModel: (category: string, modelLabel: string) => void;
|
||||
selectedModels: { [category in ModelCategory]?: string };
|
||||
setSelectedModel: (category: ModelCategory, modelLabel: string) => void;
|
||||
}
|
||||
|
||||
export const useModelSelectorStore = create<ModelSelectorState>((set) => ({
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
import { PopoverMenu, type PopoverItem } from "@storyteller/ui-popover";
|
||||
import { useModelSelectorStore } from "./model-selector-store";
|
||||
import { useMemo } from "react";
|
||||
import { ModelCategory } from "./model-categories";
|
||||
|
||||
interface ModelSelectorProps {
|
||||
items: Omit<PopoverItem, "selected">[];
|
||||
category: string;
|
||||
category: ModelCategory;
|
||||
mode?: "hoverSelect" | "default" | "toggle" | "button";
|
||||
panelTitle?: string;
|
||||
buttonClassName?: string;
|
||||
|
||||
Reference in new issue
Block a user