diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs index 3d32a3f3f..fd4752633 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/enqueue_image_bg_removal_command.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, EnqueueTextToImageSuccessResponse}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_bg_removal::errors::InternalBgRemovalError; use crate::core::commands::enqueue::image_bg_removal::generic::handle_generic_bg_removal::handle_generic_bg_removal; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; @@ -29,6 +27,7 @@ use crate::services::sora::state::sora_task_queue::SoraTaskQueue; use crate::services::storyteller::state::storyteller_credential_manager::StorytellerCredentialManager; use enums::tauri::tasks::task_status::TaskStatus; use enums::tauri::tasks::task_type::TaskType; +use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; use errors::AnyhowError; use log::{error, info, warn}; use openai_sora_client::recipes::image_remix_with_session_auto_renew::{image_remix_with_session_auto_renew, ImageRemixAutoRenewRequest}; @@ -43,7 +42,6 @@ use storyteller_client::error::storyteller_error::StorytellerError; use storyteller_client::media_files::get_media_file::get_media_file; use storyteller_client::utils::api_host::ApiHost; use tauri::{AppHandle, Manager, State}; -use enums::tauri::ux::tauri_command_caller::TauriCommandCaller; use tokens::tokens::media_files::MediaFileToken; #[derive(Deserialize, Debug)] diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs index 40ed63b9c..26ba52051 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_bg_removal/generic/handle_generic_bg_removal_artcraft.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_bg_removal::enqueue_image_bg_removal_command::EnqueueImageBgRemovalCommand; use crate::core::commands::enqueue::image_bg_removal::errors::InternalBgRemovalError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize, EnqueueContextualEditImageCommand}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs index 88bf34b80..262e72dcc 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/enqueue_contextual_edit_image_command.rs @@ -1,6 +1,5 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, EnqueueTextToImageSuccessResponse}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; +use crate::core::commands::enqueue::image_edit::flux_kontext::handle_flux_kontext_edit::handle_flux_kontext_edit; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit::handle_gpt_image_1_edit; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; @@ -43,7 +42,6 @@ use storyteller_client::media_files::get_media_file::get_media_file; use storyteller_client::utils::api_host::ApiHost; use tauri::{AppHandle, Manager, State}; use tokens::tokens::media_files::MediaFileToken; -use crate::core::commands::enqueue::image_edit::flux_kontext::handle_flux_kontext_edit::handle_flux_kontext_edit; #[derive(Deserialize, Debug)] pub struct EnqueueContextualEditImageCommand { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs index caa6f4b37..a62e00541 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/flux_kontext/handle_flux_kontext_edit_artcraft.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize, EnqueueContextualEditImageCommand}; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs index 1559a3813..5778b4e7d 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_edit/gpt_image_1/handle_gpt_image_1_edit_artcraft.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize, EnqueueContextualEditImageCommand}; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit::MAX_IMAGES; @@ -23,6 +21,8 @@ use artcraft_api_defs::generate::image::generate_flux_1_dev_text_to_image::Gener use artcraft_api_defs::generate::image::generate_flux_1_schnell_text_to_image::GenerateFlux1SchnellTextToImageRequest; use artcraft_api_defs::generate::image::generate_flux_pro_11_text_to_image::GenerateFluxPro11TextToImageRequest; use artcraft_api_defs::generate::image::generate_flux_pro_11_ultra_text_to_image::GenerateFluxPro11UltraTextToImageRequest; +use enums::common::generation_provider::GenerationProvider; +use enums::tauri::tasks::task_type::TaskType; 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 fal_client::requests::webhook::image::enqueue_gpt_image_1_edit_image_webhook::GptEditImageQuality; use idempotency::uuid::generate_random_uuid; @@ -33,8 +33,6 @@ use storyteller_client::generate::image::generate_flux_1_schnell_text_to_image:: use storyteller_client::generate::image::generate_flux_pro_11_text_to_image::generate_flux_pro_11_text_to_image; use storyteller_client::generate::image::generate_flux_pro_11_ultra_text_to_image::generate_flux_pro_11_ultra_text_to_image; use tauri::AppHandle; -use enums::common::generation_provider::GenerationProvider; -use enums::tauri::tasks::task_type::TaskType; pub async fn handle_gpt_image_1_edit_artcraft( request: &EnqueueContextualEditImageCommand, 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 6d3a4d316..0b213be14 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 @@ -1,11 +1,10 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageSize, EnqueueContextualEditImageCommand, EnqueueContextualEditImageErrorType}; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit::MAX_IMAGES; 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; @@ -57,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)); } }; @@ -113,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/image_inpaint/enqueue_image_inpaint_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs index 0ccd42908..d825104b5 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/enqueue_image_inpaint_command.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, EnqueueTextToImageSuccessResponse}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit::handle_gpt_image_1_edit; use crate::core::commands::enqueue::image_inpaint::errors::InternalImageInpaintError; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs index 2db53a0eb..3c34e8161 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_inpaint/flux_pro_1_inpaint/handle_flux_pro_1_inpaint_artcraft.rs @@ -1,5 +1,3 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_bg_removal::enqueue_image_bg_removal_command::EnqueueImageBgRemovalCommand; use crate::core::commands::enqueue::image_bg_removal::errors::InternalBgRemovalError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize, EnqueueContextualEditImageCommand}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/enqueue_image_to_3d_object_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs similarity index 97% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/enqueue_image_to_3d_object_command.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs index cdd1ce24d..881575303 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/object/enqueue_image_to_3d_object_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/enqueue_image_to_3d_object_command.rs @@ -1,12 +1,15 @@ -use crate::core::commands::enqueue::object::generic::handle_object::handle_object; -use crate::core::commands::enqueue::object::internal_object_error::InternalObjectError; +use crate::core::commands::enqueue::image_to_object::generic::handle_object::handle_object; +use crate::core::commands::enqueue::image_to_object::internal_object_error::InternalObjectError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::commands::response::shorthand::Response; use crate::core::commands::response::success_response_wrapper::SerializeMarker; +use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; +use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::data_dir::app_data_root::AppDataRoot; use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; +use crate::core::state::task_database::TaskDatabase; use crate::services::fal::state::fal_credential_manager::FalCredentialManager; use crate::services::fal::state::fal_task_queue::FalTaskQueue; use crate::services::sora::state::sora_task_queue::SoraTaskQueue; @@ -16,9 +19,6 @@ use log::{error, info, warn}; use serde_derive::{Deserialize, Serialize}; use tauri::{AppHandle, State}; use tokens::tokens::media_files::MediaFileToken; -use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; -use crate::core::events::generation_events::generation_enqueue_success_event::GenerationEnqueueSuccessEvent; -use crate::core::state::task_database::TaskDatabase; #[derive(Deserialize)] pub struct EnqueueImageTo3dObjectRequest { diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs similarity index 80% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs index 516df0354..5f82d60f8 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object.rs @@ -1,7 +1,7 @@ -use crate::core::commands::enqueue::object::enqueue_image_to_3d_object_command::EnqueueImageTo3dObjectRequest; -use crate::core::commands::enqueue::object::generic::handle_object_artcraft::handle_object_artcraft; -use crate::core::commands::enqueue::object::generic::handle_object_fal::handle_object_fal; -use crate::core::commands::enqueue::object::internal_object_error::InternalObjectError; +use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::EnqueueImageTo3dObjectRequest; +use crate::core::commands::enqueue::image_to_object::generic::handle_object_artcraft::handle_object_artcraft; +use crate::core::commands::enqueue::image_to_object::generic::handle_object_fal::handle_object_fal; +use crate::core::commands::enqueue::image_to_object::internal_object_error::InternalObjectError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::data_dir::app_data_root::AppDataRoot; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs similarity index 95% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs index 3c38444e7..2e746991e 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_artcraft.rs @@ -1,5 +1,5 @@ -use crate::core::commands::enqueue::object::enqueue_image_to_3d_object_command::{EnqueueImageTo3dObjectModel, EnqueueImageTo3dObjectRequest}; -use crate::core::commands::enqueue::object::internal_object_error::InternalObjectError; +use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::{EnqueueImageTo3dObjectModel, EnqueueImageTo3dObjectRequest}; +use crate::core::commands::enqueue::image_to_object::internal_object_error::InternalObjectError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs similarity index 94% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_fal.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs index 636d483bc..7a7ccfa1c 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/handle_object_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/handle_object_fal.rs @@ -1,5 +1,5 @@ -use crate::core::commands::enqueue::object::enqueue_image_to_3d_object_command::{EnqueueImageTo3dObjectModel, EnqueueImageTo3dObjectRequest}; -use crate::core::commands::enqueue::object::internal_object_error::InternalObjectError; +use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::{EnqueueImageTo3dObjectModel, EnqueueImageTo3dObjectRequest}; +use crate::core::commands::enqueue::image_to_object::internal_object_error::InternalObjectError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/generic/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/generic/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/generic/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/internal_object_error.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/internal_object_error.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/internal_object_error.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/internal_object_error.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/object/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/object/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_object/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs similarity index 97% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs index 109ddc3f3..88d6edb11 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/video/enqueue_image_to_video_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/enqueue_image_to_video_command.rs @@ -1,6 +1,6 @@ +use crate::core::commands::enqueue::image_to_video::generic::handle_video::handle_video; +use crate::core::commands::enqueue::image_to_video::internal_video_error::InternalVideoError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::commands::enqueue::video::generic::handle_video::handle_video; -use crate::core::commands::enqueue::video::internal_video_error::InternalVideoError; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::commands::response::shorthand::Response; use crate::core::commands::response::success_response_wrapper::SerializeMarker; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs similarity index 80% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs index 4955d8639..477f96364 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video.rs @@ -1,8 +1,8 @@ +use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; +use crate::core::commands::enqueue::image_to_video::generic::handle_video_artcraft::handle_video_artcraft; +use crate::core::commands::enqueue::image_to_video::generic::handle_video_fal::handle_video_fal; +use crate::core::commands::enqueue::image_to_video::internal_video_error::InternalVideoError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::commands::enqueue::video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; -use crate::core::commands::enqueue::video::generic::handle_video_artcraft::handle_video_artcraft; -use crate::core::commands::enqueue::video::generic::handle_video_fal::handle_video_fal; -use crate::core::commands::enqueue::video::internal_video_error::InternalVideoError; use crate::core::state::app_env_configs::app_env_configs::AppEnvConfigs; use crate::core::state::data_dir::app_data_root::AppDataRoot; use crate::core::state::provider_priority::{Provider, ProviderPriorityStore}; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs similarity index 97% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs index 59251e621..38a91fece 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_artcraft.rs @@ -1,6 +1,6 @@ +use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; +use crate::core::commands::enqueue::image_to_video::internal_video_error::InternalVideoError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::commands::enqueue::video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; -use crate::core::commands::enqueue::video::internal_video_error::InternalVideoError; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs similarity index 95% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_fal.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs index 22f945d67..0ca4c4a31 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/handle_video_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/handle_video_fal.rs @@ -1,6 +1,6 @@ +use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; +use crate::core::commands::enqueue::image_to_video::internal_video_error::InternalVideoError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; -use crate::core::commands::enqueue::video::enqueue_image_to_video_command::EnqueueImageToVideoRequest; -use crate::core::commands::enqueue::video::internal_video_error::InternalVideoError; use crate::core::events::basic_sendable_event_trait::BasicSendableEvent; use crate::core::events::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/generic/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/generic/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/generic/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/internal_video_error.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/internal_video_error.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/internal_video_error.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/internal_video_error.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/video/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/video/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/image_to_video/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/mod.rs index 17c32cf1b..1434ea5d9 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/mod.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/mod.rs @@ -1,7 +1,7 @@ -pub mod image; pub mod image_bg_removal; pub mod image_edit; pub mod image_inpaint; -pub mod object; +pub mod image_to_object; +pub mod image_to_video; pub mod task_enqueue_success; -pub mod video; \ No newline at end of file +pub mod text_to_image; \ No newline at end of file diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/enqueue_text_to_image_command.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs similarity index 93% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/enqueue_text_to_image_command.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs index 42bc44dea..09056a554 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/enqueue_text_to_image_command.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/enqueue_text_to_image_command.rs @@ -1,10 +1,10 @@ -use crate::core::commands::enqueue::image::generic::handle_image_artcraft::handle_image_artcraft; -use crate::core::commands::enqueue::image::generic::handle_image_fal::handle_image_fal; -use crate::core::commands::enqueue::image::gpt_image_1::handle_gpt_image_1::handle_gpt_image_1; -use crate::core::commands::enqueue::image::gpt_image_1::handle_gpt_image_1_sora::handle_gpt_image_1_sora; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; -use crate::core::commands::enqueue::image::midjourney::handle_midjourney::handle_midjourney; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; +use crate::core::commands::enqueue::text_to_image::generic::handle_image_artcraft::handle_image_artcraft; +use crate::core::commands::enqueue::text_to_image::generic::handle_image_fal::handle_image_fal; +use crate::core::commands::enqueue::text_to_image::gpt_image_1::handle_gpt_image_1::handle_gpt_image_1; +use crate::core::commands::enqueue::text_to_image::gpt_image_1::handle_gpt_image_1_sora::handle_gpt_image_1_sora; +use crate::core::commands::enqueue::text_to_image::internal_image_error::InternalImageError; +use crate::core::commands::enqueue::text_to_image::midjourney::handle_midjourney::handle_midjourney; use crate::core::commands::response::failure_response_wrapper::{CommandErrorResponseWrapper, CommandErrorStatus}; use crate::core::commands::response::shorthand::Response; use crate::core::commands::response::success_response_wrapper::SerializeMarker; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs similarity index 98% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs index b8624e47f..6052dcb71 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_artcraft.rs @@ -1,6 +1,6 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; 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::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_fal.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs similarity index 95% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_fal.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs index 1d699ab5b..8ca27f1b7 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/generic/handle_image_fal.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/handle_image_fal.rs @@ -1,6 +1,6 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::EnqueueTextToImageRequest; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::task_enqueue_success::TaskEnqueueSuccess; +use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::EnqueueTextToImageRequest; +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::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/generic/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/generic/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/generic/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs similarity index 88% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs index c4ce6cb31..6e08d8486 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1.rs @@ -1,11 +1,11 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; -use crate::core::commands::enqueue::image::gpt_image_1::handle_gpt_image_1_artcraft::handle_gpt_image_1_artcraft; -use crate::core::commands::enqueue::image::gpt_image_1::handle_gpt_image_1_sora::handle_gpt_image_1_sora; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit_artcraft::handle_gpt_image_1_edit_artcraft; use crate::core::commands::enqueue::image_edit::gpt_image_1::handle_gpt_image_1_edit_sora::handle_gpt_image_1_edit_sora; 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::gpt_image_1::handle_gpt_image_1_artcraft::handle_gpt_image_1_artcraft; +use crate::core::commands::enqueue::text_to_image::gpt_image_1::handle_gpt_image_1_sora::handle_gpt_image_1_sora; +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::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1_artcraft.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs similarity index 95% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1_artcraft.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs index 3d864871c..482e0348d 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1_artcraft.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_artcraft.rs @@ -1,8 +1,8 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize}; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; 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::generation_events::common::{GenerationAction, GenerationModel, GenerationServiceProvider}; use crate::core::events::generation_events::generation_enqueue_failure_event::GenerationEnqueueFailureEvent; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/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 similarity index 81% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/handle_gpt_image_1_sora.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/handle_gpt_image_1_sora.rs index 6bc35a4d1..149a737ef 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/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 @@ -1,7 +1,8 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; 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/image/gpt_image_1/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/gpt_image_1/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/gpt_image_1/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/internal_image_error.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/internal_image_error.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/internal_image_error.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/internal_image_error.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/midjourney/handle_midjourney.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs similarity index 91% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/midjourney/handle_midjourney.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs index 86a9f64b6..045db6495 100644 --- a/crates/desktop/artcraft/src/core/commands/enqueue/image/midjourney/handle_midjourney.rs +++ b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/handle_midjourney.rs @@ -1,10 +1,11 @@ -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::{EnqueueTextToImageRequest, TextToImageSize}; -use crate::core::commands::enqueue::image::internal_image_error::InternalImageError; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::{EditImageQuality, EditImageSize}; use crate::core::commands::enqueue::image_edit::errors::InternalContextualEditImageError; 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::canvas_background_removal_complete_event::CanvasBackgroundRemovalCompleteEvent; +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::warning_events::flash_user_input_error_event::FlashUserInputErrorEvent; @@ -46,10 +47,13 @@ pub async fn handle_midjourney( let creds = match mj_creds_manager.maybe_copy_cookie_store() { Ok(Some(creds)) => creds, Ok(None) => { + error!("Midjourney credentials not found."); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Midjourney, &app); return Err(InternalImageError::NeedsMidjourneyCredentials); } Err(err) => { error!("Error reading Midjourney credentials: {:?}", err); + ShowProviderLoginModalEvent::send_for_provider(GenerationProvider::Midjourney, &app); return Err(InternalImageError::NeedsMidjourneyCredentials); }, }; diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/midjourney/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/midjourney/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/midjourney/mod.rs diff --git a/crates/desktop/artcraft/src/core/commands/enqueue/image/mod.rs b/crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/mod.rs similarity index 100% rename from crates/desktop/artcraft/src/core/commands/enqueue/image/mod.rs rename to crates/desktop/artcraft/src/core/commands/enqueue/text_to_image/mod.rs diff --git a/crates/desktop/artcraft/src/core/events/functional_events/mod.rs b/crates/desktop/artcraft/src/core/events/functional_events/mod.rs index b4253b3ec..42443cda3 100644 --- a/crates/desktop/artcraft/src/core/events/functional_events/mod.rs +++ b/crates/desktop/artcraft/src/core/events/functional_events/mod.rs @@ -1,2 +1,3 @@ pub mod canvas_background_removal_complete_event; -pub mod refresh_account_state_event; \ No newline at end of file +pub mod refresh_account_state_event; +pub mod show_provider_login_modal_event; \ No newline at end of file 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 new file mode 100644 index 000000000..2deb3af95 --- /dev/null +++ b/crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs @@ -0,0 +1,28 @@ +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)] +#[serde(rename_all = "snake_case")] +pub struct ShowProviderLoginModalEvent { + pub provider: GenerationProvider, +} + +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; +} diff --git a/crates/desktop/artcraft/src/lib.rs b/crates/desktop/artcraft/src/lib.rs index d5f34f4f6..3ea90f483 100644 --- a/crates/desktop/artcraft/src/lib.rs +++ b/crates/desktop/artcraft/src/lib.rs @@ -5,12 +5,12 @@ use tauri::Manager; use crate::core::commands::app_preferences::get_app_preferences_command::get_app_preferences_command; use crate::core::commands::app_preferences::update_app_preference_command::update_app_preferences_command; -use crate::core::commands::enqueue::image::enqueue_text_to_image_command::enqueue_text_to_image_command; use crate::core::commands::enqueue::image_bg_removal::enqueue_image_bg_removal_command::enqueue_image_bg_removal_command; use crate::core::commands::enqueue::image_edit::enqueue_contextual_edit_image_command::enqueue_contextual_edit_image_command; use crate::core::commands::enqueue::image_inpaint::enqueue_image_inpaint_command::enqueue_image_inpaint_command; -use crate::core::commands::enqueue::object::enqueue_image_to_3d_object_command::enqueue_image_to_3d_object_command; -use crate::core::commands::enqueue::video::enqueue_image_to_video_command::enqueue_image_to_video_command; +use crate::core::commands::enqueue::image_to_object::enqueue_image_to_3d_object_command::enqueue_image_to_3d_object_command; +use crate::core::commands::enqueue::image_to_video::enqueue_image_to_video_command::enqueue_image_to_video_command; +use crate::core::commands::enqueue::text_to_image::enqueue_text_to_image_command::enqueue_text_to_image_command; use crate::core::commands::flip_image::flip_image; use crate::core::commands::get_app_info_command::get_app_info_command; use crate::core::commands::load_without_cors_command::load_without_cors_command; diff --git a/crates/schema/public/enums/src/tauri/ux/tauri_event_name.rs b/crates/schema/public/enums/src/tauri/ux/tauri_event_name.rs index a79afc7e0..6f6c57737 100644 --- a/crates/schema/public/enums/src/tauri/ux/tauri_event_name.rs +++ b/crates/schema/public/enums/src/tauri/ux/tauri_event_name.rs @@ -47,6 +47,11 @@ pub enum TauriEventName { /// Refresh account states #[serde(rename = "refresh_account_state_event")] RefreshAccountStateEvent, + + /// Special event: + /// Show a login modal (or a suggestion to login) + #[serde(rename = "show_provider_login_modal_event")] + ShowProviderLoginModalEvent, /// Warning event: /// Flash a user input error message @@ -69,6 +74,7 @@ impl TauriEventName { Self::GenerationFailedEvent => "generation-failed-event", Self::CanvasBgRemovedEvent => "canvas_bg_removed_event", Self::RefreshAccountStateEvent => "refresh_account_state_event", + Self::ShowProviderLoginModalEvent => "show_provider_login_modal_event", Self::FlashUserInputErrorEvent => "flash_user_input_error_event", } } @@ -81,6 +87,7 @@ impl TauriEventName { "generation-failed-event" => Ok(Self::GenerationFailedEvent), "canvas_bg_removed_event" => Ok(Self::CanvasBgRemovedEvent), "refresh_account_state_event" => Ok(Self::RefreshAccountStateEvent), + "show_provider_login_modal_event" => Ok(Self::ShowProviderLoginModalEvent), "flash_user_input_error_event" => Ok(Self::FlashUserInputErrorEvent), _ => Err(format!("invalid tauri_event_name: {:?}", job_status)), } @@ -96,6 +103,7 @@ impl TauriEventName { Self::GenerationFailedEvent, Self::CanvasBgRemovedEvent, Self::RefreshAccountStateEvent, + Self::ShowProviderLoginModalEvent, Self::FlashUserInputErrorEvent, ]) } @@ -117,6 +125,7 @@ mod tests { assert_serialization(TauriEventName::GenerationFailedEvent, "generation-failed-event"); assert_serialization(TauriEventName::CanvasBgRemovedEvent, "canvas_bg_removed_event"); assert_serialization(TauriEventName::RefreshAccountStateEvent, "refresh_account_state_event"); + assert_serialization(TauriEventName::ShowProviderLoginModalEvent, "show_provider_login_modal_event"); assert_serialization(TauriEventName::FlashUserInputErrorEvent, "flash_user_input_error_event"); } @@ -128,6 +137,7 @@ mod tests { assert_eq!(TauriEventName::GenerationFailedEvent.to_str(), "generation-failed-event"); assert_eq!(TauriEventName::CanvasBgRemovedEvent.to_str(), "canvas_bg_removed_event"); assert_eq!(TauriEventName::RefreshAccountStateEvent.to_str(), "refresh_account_state_event"); + assert_eq!(TauriEventName::ShowProviderLoginModalEvent.to_str(), "show_provider_login_modal_event"); assert_eq!(TauriEventName::FlashUserInputErrorEvent.to_str(), "flash_user_input_error_event"); } @@ -139,19 +149,21 @@ mod tests { assert_eq!(TauriEventName::from_str("generation-failed-event").unwrap(), TauriEventName::GenerationFailedEvent); assert_eq!(TauriEventName::from_str("canvas_bg_removed_event").unwrap(), TauriEventName::CanvasBgRemovedEvent); assert_eq!(TauriEventName::from_str("refresh_account_state_event").unwrap(), TauriEventName::RefreshAccountStateEvent); + assert_eq!(TauriEventName::from_str("show_provider_login_modal_event").unwrap(), TauriEventName::ShowProviderLoginModalEvent); assert_eq!(TauriEventName::from_str("flash_user_input_error_event").unwrap(), TauriEventName::FlashUserInputErrorEvent); } #[test] fn all_variants() { let mut variants = TauriEventName::all_variants(); - assert_eq!(variants.len(), 7); + assert_eq!(variants.len(), 8); assert_eq!(variants.pop_first(), Some(TauriEventName::GenerationEnqueueSuccessEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::GenerationEnqueueFailureEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::GenerationCompleteEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::GenerationFailedEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::CanvasBgRemovedEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::RefreshAccountStateEvent)); + assert_eq!(variants.pop_first(), Some(TauriEventName::ShowProviderLoginModalEvent)); assert_eq!(variants.pop_first(), Some(TauriEventName::FlashUserInputErrorEvent)); assert_eq!(variants.pop_first(), None); } diff --git a/frontend/apps/editor3d/app/src/pages/PageEnigma/PageEnigma.tsx b/frontend/apps/editor3d/app/src/pages/PageEnigma/PageEnigma.tsx index d59e9e3f0..571fd43de 100644 --- a/frontend/apps/editor3d/app/src/pages/PageEnigma/PageEnigma.tsx +++ b/frontend/apps/editor3d/app/src/pages/PageEnigma/PageEnigma.tsx @@ -28,6 +28,7 @@ import { PageEditor } from "~/pages/PageEnigma/PageEditor"; import { GalleryDragComponent } from "@storyteller/ui-gallery-modal"; import { LoadingDots } from "@storyteller/ui-loading"; import { PricingModal } from "@storyteller/ui-pricing-modal"; +import { ProviderSetupModal } from "@storyteller/provider-setup-modal"; import { isActionReminderOpen, @@ -120,6 +121,7 @@ export const PageEnigma = ({ sceneToken }: { sceneToken?: string }) => { /> + diff --git a/frontend/apps/editor3d/tsconfig.json b/frontend/apps/editor3d/tsconfig.json index d85bc4953..0bc2dd50d 100644 --- a/frontend/apps/editor3d/tsconfig.json +++ b/frontend/apps/editor3d/tsconfig.json @@ -115,6 +115,9 @@ { "path": "../../libs/components/upload-modal" }, + { + "path": "../../libs/components/provider-setup-modal" + }, { "path": "../../libs/components/modal" }, diff --git a/frontend/libs/common/src/lib/enums/GenerationProvider.ts b/frontend/libs/common/src/lib/enums/GenerationProvider.ts new file mode 100644 index 000000000..e25d9f1a4 --- /dev/null +++ b/frontend/libs/common/src/lib/enums/GenerationProvider.ts @@ -0,0 +1,6 @@ +export enum GenerationProvider { + Artcraft = "artcraft", + Fal = "fal", + Midjourney = "midjourney", + Sora = "sora", +} diff --git a/frontend/libs/common/src/lib/enums/index.ts b/frontend/libs/common/src/lib/enums/index.ts index 424823d2f..4fbc72244 100644 --- a/frontend/libs/common/src/lib/enums/index.ts +++ b/frontend/libs/common/src/lib/enums/index.ts @@ -1,8 +1,9 @@ -export * from "./EditorState"; -export * from "./Queue"; -export * from "./UploaderStates"; -export * from "./Hotkeys"; -export * from "./Toaster"; export * from "./AssetFilterOption"; -export * from "./ThumbnailsFileType"; +export * from "./EditorState"; +export * from "./GenerationProvider"; +export * from "./Hotkeys"; export * from "./MediaFileAnimationType"; +export * from "./Queue"; +export * from "./ThumbnailsFileType"; +export * from "./Toaster"; +export * from "./UploaderStates"; diff --git a/frontend/libs/components/provider-setup-modal/.babelrc b/frontend/libs/components/provider-setup-modal/.babelrc new file mode 100644 index 000000000..1ea870ead --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nx/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/frontend/libs/components/provider-setup-modal/README.md b/frontend/libs/components/provider-setup-modal/README.md new file mode 100644 index 000000000..73ba461fa --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/README.md @@ -0,0 +1,7 @@ +# @frontend/provider-setup-modal + +This library was generated with [Nx](https://nx.dev). + +## Running unit tests + +Run `nx test @frontend/provider-setup-modal` to execute the unit tests via [Vitest](https://vitest.dev/). diff --git a/frontend/libs/components/provider-setup-modal/package.json b/frontend/libs/components/provider-setup-modal/package.json new file mode 100644 index 000000000..cc6d4b7b1 --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/package.json @@ -0,0 +1,17 @@ +{ + "name": "@storyteller/provider-setup-modal", + "version": "0.0.1", + "type": "module", + "main": "./dist/index.js", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "exports": { + "./package.json": "./package.json", + ".": { + "development": "./src/index.ts", + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "default": "./dist/index.js" + } + } +} diff --git a/frontend/libs/components/provider-setup-modal/src/index.ts b/frontend/libs/components/provider-setup-modal/src/index.ts new file mode 100644 index 000000000..27cb6b35a --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/src/index.ts @@ -0,0 +1 @@ +export * from './lib/provider-setup-modal'; diff --git a/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.module.css b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.module.css new file mode 100644 index 000000000..d0246c74b --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.module.css @@ -0,0 +1,7 @@ +/* + * Replace this with your own classes + * + * e.g. + * .container { + * } +*/ \ No newline at end of file diff --git a/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.spec.tsx b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.spec.tsx new file mode 100644 index 000000000..f97e6c502 --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.spec.tsx @@ -0,0 +1,12 @@ +import { render } from '@testing-library/react'; + +import FrontendProviderSetupModal from './provider-setup-modal'; + +describe('FrontendProviderSetupModal', () => { + + it('should render successfully', () => { + const { baseElement } = render(); + expect(baseElement).toBeTruthy(); + }); + +}); diff --git a/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.tsx b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.tsx new file mode 100644 index 000000000..15b08a797 --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.tsx @@ -0,0 +1,118 @@ +import { Modal } from "@storyteller/ui-modal"; +import { invoke } from "@tauri-apps/api/core"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { + faArrowRight, + faMagicWandSparkles, +} from "@fortawesome/pro-solid-svg-icons"; +import { Button } from "@storyteller/ui-button"; +import { useState } from "react"; +import { useShowProviderLoginModalEvent } from "@storyteller/tauri-events"; +import { GenerationProvider } from "@storyteller/common"; + +interface ProviderSetupModalProps { +} + +export function ProviderSetupModal({ +}: ProviderSetupModalProps) { + const [showModal, setShowModal] = useState(false); + const [provider, setProvider] = useState(GenerationProvider.Artcraft); + + useShowProviderLoginModalEvent(async (event) => { + console.log("Show provider login modal event received from Tauri:", event); + setProvider(event.provider); + setShowModal(true); + }); + + const serviceProviderName = getServiceProviderName(provider); + + const modalTitle = `Set up ${serviceProviderName}`; + const modalSubTitle = `Add your ${serviceProviderName} account to ArtCraft!`; + + const modalDescription = `You can add your ${serviceProviderName} account to ArtCraft by simply logging in. Use your credits and account directly within Artcraft. You can add all of your AI accounts to Artcraft to use them all in one place and build the ultimate AI art tool.`; + + const modalButtonText = `Set up ${serviceProviderName}`; + + const buttonOnClick = async () => { + switch (provider) { + case GenerationProvider.Midjourney: + await invoke("midjourney_open_login_command"); + break; + case GenerationProvider.Sora: + await invoke("open_sora_login_command"); // TODO: Rename in Tauri + break; + case GenerationProvider.Fal: + break; // TODO: None yet. + default: + break; + } + setShowModal(false); + }; + + return ( + { + setShowModal(false); + }} + className="max-w-2xl max-h-[500px] p-6" + showClose={true} + > +
+
+ +
+ +

+ + {modalTitle} +

+
+

{modalSubTitle}

+ +
+ +

{modalDescription}

+ +
+ +
+
+ + {/*
+ Test +
*/} + +
+
+ ); +} + +function getServiceProviderName(provider: GenerationProvider) : string { + switch (provider) { + case GenerationProvider.Sora: + return "Sora"; + case GenerationProvider.Fal: + return "Fal"; + case GenerationProvider.Midjourney: + return "Midjourney"; + case GenerationProvider.Artcraft: + default: + return "Artcraft"; + } +} + +export default ProviderSetupModal; diff --git a/frontend/libs/components/provider-setup-modal/tsconfig.json b/frontend/libs/components/provider-setup-modal/tsconfig.json new file mode 100644 index 000000000..12b1e10ef --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/tsconfig.json @@ -0,0 +1,28 @@ +{ + "files": [], + "include": [], + "references": [ + { + "path": "../button" + }, + { + "path": "../modal" + }, + { + "path": "../../tauri-events" + }, + { + "path": "../../tauri-api" + }, + { + "path": "../../common" + }, + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ], + "extends": "../../../tsconfig.base.json" +} diff --git a/frontend/libs/components/provider-setup-modal/tsconfig.lib.json b/frontend/libs/components/provider-setup-modal/tsconfig.lib.json new file mode 100644 index 000000000..4b429f449 --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/tsconfig.lib.json @@ -0,0 +1,62 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "types": [ + "node", + "@nx/react/typings/cssmodule.d.ts", + "@nx/react/typings/image.d.ts", + "vite/client" + ], + "rootDir": "src", + "jsx": "react-jsx", + "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo" + }, + "exclude": [ + "out-tsc", + "dist", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx", + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx" + ], + "include": [ + "src/**/*.js", + "src/**/*.jsx", + "src/**/*.ts", + "src/**/*.tsx" + ], + "references": [ + { + "path": "../button/tsconfig.lib.json" + }, + { + "path": "../modal/tsconfig.lib.json" + }, + { + "path": "../../tauri-events/tsconfig.lib.json" + }, + { + "path": "../../tauri-api/tsconfig.lib.json" + }, + { + "path": "../../common/tsconfig.lib.json" + } + ] +} diff --git a/frontend/libs/components/provider-setup-modal/tsconfig.spec.json b/frontend/libs/components/provider-setup-modal/tsconfig.spec.json new file mode 100644 index 000000000..18b7de51b --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/tsconfig.spec.json @@ -0,0 +1,34 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./out-tsc/vitest", + "types": [ + "vitest/globals", + "vitest/importMeta", + "vite/client", + "node", + "vitest" + ], + "jsx": "react-jsx" + }, + "include": [ + "vite.config.ts", + "vite.config.mts", + "vitest.config.ts", + "vitest.config.mts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ], + "references": [ + { + "path": "./tsconfig.lib.json" + } + ] +} diff --git a/frontend/libs/components/provider-setup-modal/vite.config.ts b/frontend/libs/components/provider-setup-modal/vite.config.ts new file mode 100644 index 000000000..6720cbb26 --- /dev/null +++ b/frontend/libs/components/provider-setup-modal/vite.config.ts @@ -0,0 +1,49 @@ +/// +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import dts from 'vite-plugin-dts'; +import * as path from 'path'; + +export default defineConfig(() => ({ + root: __dirname, + cacheDir: '../../../node_modules/.vite/libs/components/provider-setup-modal', + plugins: [react(), dts({ entryRoot: 'src', tsconfigPath: path.join(__dirname, 'tsconfig.lib.json') })], + // Uncomment this if you are using workers. + // worker: { + // plugins: [ nxViteTsPaths() ], + // }, + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + outDir: './dist', + emptyOutDir: true, + reportCompressedSize: true, + commonjsOptions: { + transformMixedEsModules: true, + }, + lib: { + // Could also be a dictionary or array of multiple entry points. + entry: 'src/index.ts', + name: '@storyteller/provider-setup-modal', + fileName: 'index', + // Change this to the formats you want to support. + // Don't forget to update your package.json as well. + formats: ['es' as const] + }, + rollupOptions: { + // External packages that should not be bundled into your library. + external: ['react','react-dom','react/jsx-runtime'] + }, + }, + test: { + watch: false, + globals: true, + environment: 'jsdom', + include: ['{src,tests}/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default'], + coverage: { + reportsDirectory: './test-output/vitest/coverage', + provider: 'v8' as const, + } + }, +})); diff --git a/frontend/libs/tauri-api/src/lib/midjourney/MidjourneyGetCredentialInfo.ts b/frontend/libs/tauri-api/src/lib/midjourney/MidjourneyGetCredentialInfo.ts index de9000a77..db5f23a90 100644 --- a/frontend/libs/tauri-api/src/lib/midjourney/MidjourneyGetCredentialInfo.ts +++ b/frontend/libs/tauri-api/src/lib/midjourney/MidjourneyGetCredentialInfo.ts @@ -12,6 +12,5 @@ export interface MidjourneyGetCredentialInfoSuccess extends CommandResult { export const MidjourneyGetCredentialInfo = async (): Promise => { const result = await invoke("midjourney_get_credential_info_command"); - console.log(">>> mj result", result); return result as MidjourneyGetCredentialInfoSuccess; }; diff --git a/frontend/libs/tauri-events/src/index.ts b/frontend/libs/tauri-events/src/index.ts index c0fffe071..6dbc91bf2 100644 --- a/frontend/libs/tauri-events/src/index.ts +++ b/frontend/libs/tauri-events/src/index.ts @@ -1,4 +1,5 @@ -export * from './lib/tauri-events'; export * from './lib/common/BasicEventWrapper'; -export * from './lib/events/RefreshAccountStateEvent'; export * from './lib/events/FlashUserInputErrorEvent'; +export * from './lib/events/RefreshAccountStateEvent'; +export * from './lib/events/ShowProviderLoginModalEvent'; +export * from './lib/tauri-events'; diff --git a/frontend/libs/tauri-events/src/lib/events/ShowProviderLoginModalEvent.ts b/frontend/libs/tauri-events/src/lib/events/ShowProviderLoginModalEvent.ts new file mode 100644 index 000000000..9801cb9d7 --- /dev/null +++ b/frontend/libs/tauri-events/src/lib/events/ShowProviderLoginModalEvent.ts @@ -0,0 +1,35 @@ +import { listen, UnlistenFn } from '@tauri-apps/api/event'; +import { BasicEventWrapper } from '../common/BasicEventWrapper'; +import { useEffect } from 'react'; +import { GenerationProvider } from '@storyteller/common'; + +const EVENT_NAME : string = 'show_provider_login_modal_event'; + +export interface ShowProviderLoginModalEvent { + provider: GenerationProvider, +} + +export const useShowProviderLoginModalEvent = (asyncCallback: (event: ShowProviderLoginModalEvent) => Promise) => { + useEffect(() => { + let isUnmounted = false; + let unlisten: Promise; + + const setup = async () => { + unlisten = listen>(EVENT_NAME, async (wrappedEvent) => { + await asyncCallback(wrappedEvent.payload.data); + }); + + if (isUnmounted) { + unlisten.then(f => f()); // Unsubscribe if unmounted early. + } + }; + + setup(); + + return () => { + isUnmounted = true; + unlisten.then(f => f()); + }; + + }, []); +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 22f5de6bb..657699274 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1304,6 +1304,10 @@ "name": "@storyteller/ui-promptbox", "version": "0.0.1" }, + "libs/components/provider-setup-modal": { + "name": "@storyteller/provider-setup-modal", + "version": "0.0.1" + }, "libs/components/search": { "name": "@storyteller/ui-search", "version": "0.0.1" @@ -10363,6 +10367,10 @@ "resolved": "libs/model-list", "link": true }, + "node_modules/@storyteller/provider-setup-modal": { + "resolved": "libs/components/provider-setup-modal", + "link": true + }, "node_modules/@storyteller/soundboard": { "resolved": "libs/soundboard", "link": true diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json index 0a5bffeb2..5952311a0 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -152,6 +152,9 @@ }, { "path": "./libs/tauri-events" + }, + { + "path": "./libs/components/provider-setup-modal" } ] }