diff --git a/frontend/realtime/src/KonvaRootComponent/KonvaRootComponent.tsx b/frontend/realtime/src/KonvaRootComponent/KonvaRootComponent.tsx index d50e92db1c..67fe699ce1 100644 --- a/frontend/realtime/src/KonvaRootComponent/KonvaRootComponent.tsx +++ b/frontend/realtime/src/KonvaRootComponent/KonvaRootComponent.tsx @@ -23,6 +23,7 @@ import { useLayoutContext } from "./contextSignals/layout"; import { useRenderCounter } from "~/hooks/useRenderCounter"; import { useNavigate } from "react-router-dom"; import { SignaledMagicBox } from "./SignaledMagicBox"; +import { SignaledPromptSlider } from "./SignaledPromptSlider"; export const KonvaRootComponent = ({ className, @@ -54,13 +55,14 @@ export const KonvaRootComponent = ({ + { + + const sliderValue = promptStrength.value + const onSliderValueChanged = dispatchUiEvents.promptSettings.setPromptStrength + + // This makes component re-render whenever the signal value changes + useSignalEffect(() => { + promptStrength.value; + }) + + return ( +
+ +
+ ) +} \ No newline at end of file diff --git a/frontend/realtime/src/signals/uiEvents/index.ts b/frontend/realtime/src/signals/uiEvents/index.ts index a3b629e145..d2a9239583 100644 --- a/frontend/realtime/src/signals/uiEvents/index.ts +++ b/frontend/realtime/src/signals/uiEvents/index.ts @@ -24,6 +24,10 @@ import { dispatchers as toolbarVideoExtractionDispatchers, eventsHandlers as toolbarVideoExtractionEvents, } from "./toolbarVideoExtraction"; +import { + dispatchers as promptDispatchers, + events as promptEvents, +} from "./promptSettings"; export const uiEvents = { ...addMediaEvents, @@ -34,6 +38,7 @@ export const uiEvents = { toolbarMain: toolbarMainEvents, toolbarNode: toolbarNodeEvents, toolbarVideoExtraction: toolbarVideoExtractionEvents, + promptEvents: promptEvents, }; export const dispatchUiEvents = { ...addMediaDispatchers, @@ -44,4 +49,5 @@ export const dispatchUiEvents = { toolbarMain: toolbarMainDispatchers, toolbarNode: toolbarNodeDispatchers, toolbarVideoExtraction: toolbarVideoExtractionDispatchers, + promptSettings: promptDispatchers, }; diff --git a/frontend/realtime/src/signals/uiEvents/promptSettings.ts b/frontend/realtime/src/signals/uiEvents/promptSettings.ts new file mode 100644 index 0000000000..104add5d3b --- /dev/null +++ b/frontend/realtime/src/signals/uiEvents/promptSettings.ts @@ -0,0 +1,44 @@ +import { effect, signal } from "@preact/signals-react"; + +// Prompt settings +// - Prompt text +// - Prompt strength +export const DEFAULT_PROMPT_TEXT: string = ""; +export const promptText = signal(DEFAULT_PROMPT_TEXT); +const setPrompt = (data: string) => { + promptText.value = data; +}; + +const onPromptTextChanged = (callback: (data: string) => void) => { + effect(() => { + if (promptText.value) { + callback(promptText.value); + } + }); +}; + +export const DEFAULT_PROMPT_STRENGTH = 100; +export const promptStrength = signal(DEFAULT_PROMPT_STRENGTH); +const setPromptStrength = (data: number) => { + // Round to integer, then clamp between 0 and 100 + promptStrength.value = Math.max(0, Math.min(100, Math.round(data))); +}; + +const onPromptStrengthChanged = (callback: (data: number) => void) => { + effect(() => { + if (promptStrength.value) { + callback(promptStrength.value); + } + }); +}; + +//EXPORTS +export const dispatchers = { + setPrompt, + setPromptStrength, +}; + +export const events = { + onPromptTextChanged, + onPromptStrengthChanged, +};