diff --git a/invokeai/frontend/web/src/app/components/App.tsx b/invokeai/frontend/web/src/app/components/App.tsx index 8294fc0e8c..41f3d97051 100644 --- a/invokeai/frontend/web/src/app/components/App.tsx +++ b/invokeai/frontend/web/src/app/components/App.tsx @@ -19,6 +19,7 @@ import { languageSelector } from 'features/system/store/systemSelectors'; import InvokeTabs from 'features/ui/components/InvokeTabs'; import type { InvokeTabName } from 'features/ui/store/tabMap'; import { setActiveTab } from 'features/ui/store/uiSlice'; +import { useGetAndLoadLibraryWorkflow } from 'features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow'; import { AnimatePresence } from 'framer-motion'; import i18n from 'i18n'; import { size } from 'lodash-es'; @@ -37,10 +38,11 @@ interface Props { imageName: string; action: 'sendToImg2Img' | 'sendToCanvas' | 'useAllParameters'; }; + selectedWorkflowId?: string; destination?: InvokeTabName | undefined; } -const App = ({ config = DEFAULT_CONFIG, selectedImage, destination }: Props) => { +const App = ({ config = DEFAULT_CONFIG, selectedImage, selectedWorkflowId, destination }: Props) => { const language = useAppSelector(languageSelector); const logger = useLogger('system'); const dispatch = useAppDispatch(); @@ -71,6 +73,14 @@ const App = ({ config = DEFAULT_CONFIG, selectedImage, destination }: Props) => } }, [dispatch, config, logger]); + const { getAndLoadWorkflow } = useGetAndLoadLibraryWorkflow(); + + useEffect(() => { + if (selectedWorkflowId) { + getAndLoadWorkflow(selectedWorkflowId); + } + }, [selectedWorkflowId, getAndLoadWorkflow]); + useEffect(() => { if (destination) { dispatch(setActiveTab(destination)); diff --git a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx index 0a80b7e92d..5804902408 100644 --- a/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx +++ b/invokeai/frontend/web/src/app/components/InvokeAIUI.tsx @@ -44,6 +44,7 @@ interface Props extends PropsWithChildren { imageName: string; action: 'sendToImg2Img' | 'sendToCanvas' | 'useAllParameters'; }; + selectedWorkflowId?: string; destination?: InvokeTabName; customStarUi?: CustomStarUi; socketOptions?: Partial; @@ -64,6 +65,7 @@ const InvokeAIUI = ({ projectUrl, queueId, selectedImage, + selectedWorkflowId, destination, customStarUi, socketOptions, @@ -221,7 +223,12 @@ const InvokeAIUI = ({ }> - + diff --git a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow.ts b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow.ts index 89933999bd..9f86d11860 100644 --- a/invokeai/frontend/web/src/features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow.ts +++ b/invokeai/frontend/web/src/features/workflowLibrary/hooks/useGetAndLoadLibraryWorkflow.ts @@ -15,9 +15,9 @@ type UseGetAndLoadLibraryWorkflowReturn = { getAndLoadWorkflowResult: ReturnType[1]; }; -type UseGetAndLoadLibraryWorkflow = (arg: UseGetAndLoadLibraryWorkflowOptions) => UseGetAndLoadLibraryWorkflowReturn; +type UseGetAndLoadLibraryWorkflow = (arg?: UseGetAndLoadLibraryWorkflowOptions) => UseGetAndLoadLibraryWorkflowReturn; -export const useGetAndLoadLibraryWorkflow: UseGetAndLoadLibraryWorkflow = ({ onSuccess, onError }) => { +export const useGetAndLoadLibraryWorkflow: UseGetAndLoadLibraryWorkflow = (arg) => { const dispatch = useAppDispatch(); const toast = useToast(); const { t } = useTranslation(); @@ -29,17 +29,17 @@ export const useGetAndLoadLibraryWorkflow: UseGetAndLoadLibraryWorkflow = ({ onS // This action expects a stringified workflow, instead of updating the routes and services we will just stringify it here dispatch(workflowLoadRequested({ data: { workflow: JSON.stringify(workflow), graph: null }, asCopy: false })); // No toast - the listener for this action does that after the workflow is loaded - onSuccess && onSuccess(); + arg?.onSuccess && arg.onSuccess(); } catch { toast({ id: `AUTH_ERROR_TOAST_${workflowsApi.endpoints.getWorkflow.name}`, title: t('toast.problemRetrievingWorkflow'), status: 'error', }); - onError && onError(); + arg?.onError && arg.onError(); } }, - [_getAndLoadWorkflow, dispatch, onSuccess, t, onError, toast] + [_getAndLoadWorkflow, dispatch, arg, t, toast] ); return { getAndLoadWorkflow, getAndLoadWorkflowResult };