From 3d3a8d9a6673dc588bc294fb0251b4dd6d7cebff Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 7 Aug 2025 20:03:28 -0400 Subject: [PATCH] send event for background removal --- ...anvas_background_removal_complete_event.rs | 16 +++++++ .../src/core/events/functional_events/mod.rs | 1 + .../desktop/artcraft/src/core/events/mod.rs | 3 +- ..._send_background_removal_complete_event.rs | 42 +++++++++++++++++++ .../storyteller/threads/events/mod.rs | 1 + .../src/services/storyteller/threads/mod.rs | 1 + .../storyteller_task_polling_thread.rs | 14 ++++++- .../app/src/pages/PageDraw/PageDraw.tsx | 3 ++ .../app/src/pages/PageEdit/PageEdit.tsx | 1 - frontend/libs/tauri-api/src/index.ts | 15 +++---- 10 files changed, 87 insertions(+), 10 deletions(-) create mode 100644 crates/desktop/artcraft/src/core/events/functional_events/canvas_background_removal_complete_event.rs create mode 100644 crates/desktop/artcraft/src/core/events/functional_events/mod.rs create mode 100644 crates/desktop/artcraft/src/services/storyteller/threads/events/maybe_send_background_removal_complete_event.rs create mode 100644 crates/desktop/artcraft/src/services/storyteller/threads/events/mod.rs diff --git a/crates/desktop/artcraft/src/core/events/functional_events/canvas_background_removal_complete_event.rs b/crates/desktop/artcraft/src/core/events/functional_events/canvas_background_removal_complete_event.rs new file mode 100644 index 0000000000..c9d25cd3aa --- /dev/null +++ b/crates/desktop/artcraft/src/core/events/functional_events/canvas_background_removal_complete_event.rs @@ -0,0 +1,16 @@ +use crate::core::events::basic_sendable_event_trait::{BasicEventStatus, BasicSendableEvent}; +use serde_derive::Serialize; +use url::Url; +use tokens::tokens::media_files::MediaFileToken; + +#[derive(Clone, Debug, Serialize)] +#[serde(rename_all = "snake_case")] +pub struct CanvasBackgroundRemovalCompleteEvent { + pub media_token: MediaFileToken, + pub image_cdn_url: Url, +} + +impl BasicSendableEvent for CanvasBackgroundRemovalCompleteEvent { + const FRONTEND_EVENT_NAME: &'static str = "canvas-background-removal-complete-event"; + const EVENT_STATUS: BasicEventStatus = BasicEventStatus::Success; +} diff --git a/crates/desktop/artcraft/src/core/events/functional_events/mod.rs b/crates/desktop/artcraft/src/core/events/functional_events/mod.rs new file mode 100644 index 0000000000..33fc716932 --- /dev/null +++ b/crates/desktop/artcraft/src/core/events/functional_events/mod.rs @@ -0,0 +1 @@ +pub mod canvas_background_removal_complete_event; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/events/mod.rs b/crates/desktop/artcraft/src/core/events/mod.rs index 7483d8a04c..5574c16772 100644 --- a/crates/desktop/artcraft/src/core/events/mod.rs +++ b/crates/desktop/artcraft/src/core/events/mod.rs @@ -1,4 +1,5 @@ pub mod basic_sendable_event_trait; pub mod generation_events; pub mod sendable_event_error; -pub mod sendable_event_trait; \ No newline at end of file +pub mod sendable_event_trait; +pub mod functional_events; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/storyteller/threads/events/maybe_send_background_removal_complete_event.rs b/crates/desktop/artcraft/src/services/storyteller/threads/events/maybe_send_background_removal_complete_event.rs new file mode 100644 index 0000000000..6c7da68e20 --- /dev/null +++ b/crates/desktop/artcraft/src/services/storyteller/threads/events/maybe_send_background_removal_complete_event.rs @@ -0,0 +1,42 @@ +use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; +use crate::core::events::functional_events::canvas_background_removal_complete_event::CanvasBackgroundRemovalCompleteEvent; +use crate::core::events::generation_events::generation_complete_event::GenerationCompleteEvent; +use artcraft_api_defs::jobs::list_session_jobs::ListSessionJobsItem; +use enums::tauri::tasks::task_type::TaskType; +use errors::AnyhowResult; +use log::error; +use sqlite_tasks::queries::list_tasks_by_provider_and_tokens::{list_tasks_by_provider_and_tokens, ListTasksArgs, Task}; +use tokens::tokens::media_files::MediaFileToken; + +pub async fn maybe_send_background_removal_complete_event( + app: &tauri::AppHandle, + task: &Task, + job: &ListSessionJobsItem, +) -> AnyhowResult<()> { + + match task.task_type { + TaskType::BackgroundRemoval => {} // NB: Fall-through + _ => { + return Ok(()) + }, + } + + let result = match job.maybe_result { + Some(ref res) => res, + None => { + error!("Job result is None for task: {:?}", task); + return Ok(()); // No result, nothing to do + }, + }; + + let event = CanvasBackgroundRemovalCompleteEvent { + media_token: MediaFileToken::new_from_str(&result.entity_token), + image_cdn_url: result.media_links.cdn_url.clone(), + }; + + if let Err(err) = event.send(&app) { + error!("Failed to send CanvasBackgroundRemovalCompleteEvent: {:?}", err); // Fail open + } + + Ok(()) +} \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/storyteller/threads/events/mod.rs b/crates/desktop/artcraft/src/services/storyteller/threads/events/mod.rs new file mode 100644 index 0000000000..69dea0fb23 --- /dev/null +++ b/crates/desktop/artcraft/src/services/storyteller/threads/events/mod.rs @@ -0,0 +1 @@ +pub mod maybe_send_background_removal_complete_event; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/storyteller/threads/mod.rs b/crates/desktop/artcraft/src/services/storyteller/threads/mod.rs index 09250df48d..6b38b6940d 100644 --- a/crates/desktop/artcraft/src/services/storyteller/threads/mod.rs +++ b/crates/desktop/artcraft/src/services/storyteller/threads/mod.rs @@ -1 +1,2 @@ +pub mod events; pub mod storyteller_task_polling_thread; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/services/storyteller/threads/storyteller_task_polling_thread.rs b/crates/desktop/artcraft/src/services/storyteller/threads/storyteller_task_polling_thread.rs index 6411c0fcf2..96b60b9b51 100644 --- a/crates/desktop/artcraft/src/services/storyteller/threads/storyteller_task_polling_thread.rs +++ b/crates/desktop/artcraft/src/services/storyteller/threads/storyteller_task_polling_thread.rs @@ -12,10 +12,12 @@ use crate::core::utils::enum_conversion::task_type::to_generation_action; use crate::services::sora::state::sora_credential_manager::SoraCredentialManager; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; +use crate::services::storyteller::threads::events::maybe_send_background_removal_complete_event::maybe_send_background_removal_complete_event; use anyhow::anyhow; use enums::common::generation_provider::GenerationProvider; use enums::common::job_status_plus::JobStatusPlus; use enums::tauri::tasks::task_status::TaskStatus; +use enums::tauri::tasks::task_type::TaskType; use errors::AnyhowResult; use log::{error, info}; use reqwest::Url; @@ -137,7 +139,17 @@ async fn polling_loop( if !updated { continue; // If anything breaks with queries, don't spam events. } - + + let result = maybe_send_background_removal_complete_event( + &app_handle, + &task, + &job, + ).await; + + if let Err(err) = result { + error!("Failed to send background removal complete event: {:?}", err); + } + let service = to_generation_service_provider(task.provider); let action = to_generation_action(task.task_type); diff --git a/frontend/apps/editor3d/app/src/pages/PageDraw/PageDraw.tsx b/frontend/apps/editor3d/app/src/pages/PageDraw/PageDraw.tsx index 92f159d88a..ab7c5fa8ad 100644 --- a/frontend/apps/editor3d/app/src/pages/PageDraw/PageDraw.tsx +++ b/frontend/apps/editor3d/app/src/pages/PageDraw/PageDraw.tsx @@ -382,6 +382,9 @@ const PageDraw = () => { return { success: false }; } try { + // ... + // Call API, on success, return a File object parsed from base64. + // ... const response = await FalBackgroundRemoval({ base64_image: image_base64, }); diff --git a/frontend/apps/editor3d/app/src/pages/PageEdit/PageEdit.tsx b/frontend/apps/editor3d/app/src/pages/PageEdit/PageEdit.tsx index b4ba782f14..b412ba7b03 100644 --- a/frontend/apps/editor3d/app/src/pages/PageEdit/PageEdit.tsx +++ b/frontend/apps/editor3d/app/src/pages/PageEdit/PageEdit.tsx @@ -10,7 +10,6 @@ import { setCanvasRenderBitmap } from "../../signals/canvasRenderBitmap" import { EnqueueImageInpaint, EnqueueImageInpaintModel, - FalBackgroundRemoval, } from "@storyteller/tauri-api"; import { ContextMenuContainer } from "../PageDraw/components/ui/ContextMenu"; import SideToolbar from "../PageDraw/components/ui/SideToolbar"; diff --git a/frontend/libs/tauri-api/src/index.ts b/frontend/libs/tauri-api/src/index.ts index a489337bc8..b2d087efd8 100644 --- a/frontend/libs/tauri-api/src/index.ts +++ b/frontend/libs/tauri-api/src/index.ts @@ -1,9 +1,10 @@ export * from "./lib/common/CommandStatus.js"; export * from "./lib/enqueue/EnqueueContextualEditImage.js"; -export * from "./lib/enqueue/EnqueueImageTo3dObject.js"; -export * from "./lib/enqueue/EnqueueTextToImage.js"; -export * from "./lib/enqueue/EnqueueImageToVideo.js"; +export * from "./lib/enqueue/EnqueueImageBgRemovalCommand.js"; export * from "./lib/enqueue/EnqueueImageInpaint.js"; +export * from "./lib/enqueue/EnqueueImageTo3dObject.js"; +export * from "./lib/enqueue/EnqueueImageToVideo.js"; +export * from "./lib/enqueue/EnqueueTextToImage.js"; export * from "./lib/fal/FalBackgroundRemoval.js"; export * from "./lib/fal/FalHunyuanImageTo3d.js"; export * from "./lib/fal/FalKlingImageToVideo.js"; @@ -11,6 +12,9 @@ export * from "./lib/fal/GetFalApiKey.js"; export * from "./lib/fal/SetFalApiKey.js"; export * from "./lib/openai/GetOpenAIApiKey.js"; export * from "./lib/openai/SetOpenAIApiKey.js"; +export * from "./lib/providers/GetProviderOrder.js"; +export * from "./lib/providers/Provider.js"; +export * from "./lib/providers/SetProviderOrder.js"; export * from "./lib/settings/GetAppPreferences.js"; export * from "./lib/settings/UpdateAppPreference.js"; export * from "./lib/sora/CheckSoraSession.js"; @@ -19,7 +23,4 @@ export * from "./lib/sora/SoraImageRemix.js"; export * from "./lib/sora/useSoraLoginListener.js"; export * from "./lib/sora/waitForSoraLogin.js"; export * from "./lib/system/GetAppInfo.js"; -export * from "./lib/providers/SetProviderOrder.js"; -export * from "./lib/providers/Provider.js"; -export * from "./lib/providers/GetProviderOrder.js"; -export * from "./lib/util/LoadWithoutCors.js"; +export * from "./lib/util/LoadWithoutCors.js"; \ No newline at end of file