From 26c856ed43b90ee4f3f799e06fb23c0cdb3b60ca Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 16 Aug 2025 21:25:28 -0400 Subject: [PATCH] send events for sora too --- .../handle_gpt_image_1_edit_sora.rs | 8 +++---- .../gpt_image_1/handle_gpt_image_1_sora.rs | 21 +++++++++++++------ .../midjourney/handle_midjourney.rs | 15 +++---------- .../show_provider_login_modal_event.rs | 14 ++++++++++++- 4 files changed, 35 insertions(+), 23 deletions(-) diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs index 023dd2a95e..0b213be14c 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_sora.rs @@ -4,6 +4,7 @@ use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_ use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; +use crate::core::events::functional_events::show_provider_login_modal_event::ShowProviderLoginModalEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; @@ -55,14 +56,16 @@ pub async fn handle_gpt_image_1_edit_sora( sora_task_queue: &SoraTaskQueue, ) -> Result { - let sora_creds = match sora_creds_manager.get_credentials() { + let mut creds = match sora_creds_manager.get_credentials() { Ok(Some(creds)) => creds, Ok(None) => { warn!("No Sora credentials found."); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Sora, &app); return Err(InternalContextualEditImageError::NeedsSoraCredentials); } Err(err) => { error!("Failed to get Sora credentials: {:?}", err); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Sora, &app); return Err(InternalContextualEditImageError::AnyhowError(err)); } }; @@ -111,9 +114,6 @@ pub async fn handle_gpt_image_1_edit_sora( files_to_upload_to_sora.push(filename); } - - let mut creds = sora_creds_manager.get_credentials_required()?; - let credential_updated = maybe_upgrade_or_renew_session(&mut creds) .await .map_err(|err| { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs index 87c8714455..149a737ef0 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs @@ -2,6 +2,7 @@ use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; use crate::core::commands::enqueue::text_to_image::internal_image_error::InternalImageError; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; +use crate::core::events::functional_events::show_provider_login_modal_event::ShowProviderLoginModalEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; use crate::core::model::image_models::ImageModel; @@ -9,6 +10,7 @@ use crate::services::sora::state::sora_credential_manager::SoraCredentialManager use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use enums::common::generation_provider::GenerationProvider; use enums::tauri::tasks::task_type::TaskType; +use errors::AnyhowResult; use fal_client::requests::queue::image_gen::enqueue_flux_pro_11_ultra_text_to_image::{enqueue_flux_pro_11_ultra_text_to_image, FluxPro11UltraTextToImageArgs}; use log::{error, info}; use openai_sora_client::recipes::maybe_upgrade_or_renew_session::maybe_upgrade_or_renew_session; @@ -26,12 +28,19 @@ pub async fn handle_gpt_image_1_sora( sora_task_queue: &SoraTaskQueue, ) -> Result { - let mut creds = sora_creds_manager - .get_credentials_required() - .map_err(|err| { - error!("EnqueueTextToImage Sora creds required: {:?}", err); - InternalImageError::NeedsFalApiKey - })?; + let mut creds = match sora_creds_manager.get_credentials() { + Ok(Some(creds)) => creds, + Ok(None) => { + error!("Sora credentials not found."); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Sora, &app); + return Err(InternalImageError::NeedsSoraCredentials); + } + Err(err) => { + error!("Error reading Sora credentials: {:?}", err); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Sora, &app); + return Err(InternalImageError::NeedsSoraCredentials); + } + }; let credential_updated = maybe_upgrade_or_renew_session(&mut creds) .await diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs index d4869bb826..045db64954 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs @@ -47,12 +47,13 @@ pub async fn handle_midjourney( let creds = match mj_creds_manager.maybe_copy_cookie_store() { Ok(Some(creds)) => creds, Ok(None) => { - show_login_screen(&app); + error!("Midjourney credentials not found."); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Midjourney, &app); return Err(InternalImageError::NeedsMidjourneyCredentials); } Err(err) => { error!("Error reading Midjourney credentials: {:?}", err); - show_login_screen(&app); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Midjourney, &app); return Err(InternalImageError::NeedsMidjourneyCredentials); }, }; @@ -143,13 +144,3 @@ fn handle_midjourney_errors( Err(InternalImageError::MidjourneyJobEnqueueFailed) } - -fn show_login_screen(app: &AppHandle) { - let event = ShowProviderLoginModalEvent { - provider: GenerationProvider::Midjourney, - }; - - if let Err(err) = event.send(&app) { - error!("Failed to send ShowProviderLoginModalEvent: {:?}", err); // Fail open - } -} diff --git a/crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs b/crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs index a078e78236..2deb3af957 100644 --- a/crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs +++ b/crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs @@ -1,7 +1,10 @@ use crate::core::events::basic_sendable_event_trait::{BasicEventStatus, BasicSendableEvent}; +use crate::core::events::sendable_event_error::SendableEventError; use enums::common::generation_provider::GenerationProvider; use enums::tauri::ux::tauri_event_name::TauriEventName; +use log::error; use serde_derive::Serialize; +use tauri::AppHandle; /// Send a signal to the frontend to show a modal that suggests service setup. #[derive(Clone, Debug, Serialize)] @@ -10,7 +13,16 @@ pub struct ShowProviderLoginModalEvent { pub provider: GenerationProvider, } -impl BasicSendableEvent for ShowProviderLoginModalEvent{ +impl ShowProviderLoginModalEvent { + pub fn send_for_provider(provider: GenerationProvider, app: &AppHandle) { + let event = Self { provider }; + if let Err(err) = event.send(&app) { + error!("Failed to send ShowProviderLoginModalEvent: {:?}", err); // Fail open + } + } +} + +impl BasicSendableEvent for ShowProviderLoginModalEvent { const FRONTEND_EVENT_NAME: TauriEventName = TauriEventName::ShowProviderLoginModalEvent; const EVENT_STATUS: BasicEventStatus = BasicEventStatus::Failure; }