From b157f8bfbd3e2a26c461bcb789918140cf703b4a Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 16 Aug 2025 23:48:06 -0400 Subject: [PATCH] account provider setup modal (#766) --- .../enqueue_image_bg_removal_command.rs | 4 +- .../handle_generic_bg_removal_artcraft.rs | 2 - .../enqueue_contextual_edit_image_command.rs | 4 +- .../handle_flux_kontext_edit_artcraft.rs | 2 - .../handle_gpt_image_1_edit_artcraft.rs | 6 +- .../handle_gpt_image_1_edit_sora.rs | 10 +- .../enqueue_image_inpaint_command.rs | 2 - .../handle_flux_pro_1_inpaint_artcraft.rs | 2 - .../enqueue_image_to_3d_object_command.rs | 10 +- .../generic/handle_object.rs | 8 +- .../generic/handle_object_artcraft.rs | 4 +- .../generic/handle_object_fal.rs | 4 +- .../generic/mod.rs | 0 .../internal_object_error.rs | 0 .../{object => image_to_object}/mod.rs | 0 .../enqueue_image_to_video_command.rs | 4 +- .../generic/handle_video.rs | 8 +- .../generic/handle_video_artcraft.rs | 4 +- .../generic/handle_video_fal.rs | 4 +- .../{video => image_to_video}/generic/mod.rs | 0 .../internal_video_error.rs | 0 .../enqueue/{video => image_to_video}/mod.rs | 0 .../artcraft/src/core/commands/enqueue/mod.rs | 6 +- .../enqueue_text_to_image_command.rs | 12 +- .../generic/handle_image_artcraft.rs | 4 +- .../generic/handle_image_fal.rs | 4 +- .../{image => text_to_image}/generic/mod.rs | 0 .../gpt_image_1/handle_gpt_image_1.rs | 8 +- .../handle_gpt_image_1_artcraft.rs | 4 +- .../gpt_image_1/handle_gpt_image_1_sora.rs | 25 ++-- .../gpt_image_1/mod.rs | 0 .../internal_image_error.rs | 0 .../midjourney/handle_midjourney.rs | 8 +- .../midjourney/mod.rs | 0 .../enqueue/{image => text_to_image}/mod.rs | 0 .../src/core/events/functional_events/mod.rs | 3 +- .../show_provider_login_modal_event.rs | 28 +++++ crates/desktop/artcraft/src/lib.rs | 6 +- .../enums/src/tauri/ux/tauri_event_name.rs | 14 ++- .../app/src/pages/PageEnigma/PageEnigma.tsx | 2 + frontend/apps/editor3d/tsconfig.json | 3 + .../src/lib/enums/GenerationProvider.ts | 6 + frontend/libs/common/src/lib/enums/index.ts | 13 +- .../components/provider-setup-modal/.babelrc | 12 ++ .../components/provider-setup-modal/README.md | 7 ++ .../provider-setup-modal/package.json | 17 +++ .../provider-setup-modal/src/index.ts | 1 + .../src/lib/provider-setup-modal.module.css | 7 ++ .../src/lib/provider-setup-modal.spec.tsx | 12 ++ .../src/lib/provider-setup-modal.tsx | 118 ++++++++++++++++++ .../provider-setup-modal/tsconfig.json | 28 +++++ .../provider-setup-modal/tsconfig.lib.json | 62 +++++++++ .../provider-setup-modal/tsconfig.spec.json | 34 +++++ .../provider-setup-modal/vite.config.ts | 49 ++++++++ .../midjourney/MidjourneyGetCredentialInfo.ts | 1 - frontend/libs/tauri-events/src/index.ts | 5 +- .../lib/events/ShowProviderLoginModalEvent.ts | 35 ++++++ frontend/package-lock.json | 8 ++ frontend/tsconfig.json | 3 + 59 files changed, 533 insertions(+), 90 deletions(-) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/enqueue_image_to_3d_object_command.rs (97%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/generic/handle_object.rs (80%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/generic/handle_object_artcraft.rs (95%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/generic/handle_object_fal.rs (94%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/generic/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/internal_object_error.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{object => image_to_object}/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/enqueue_image_to_video_command.rs (97%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/generic/handle_video.rs (80%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/generic/handle_video_artcraft.rs (97%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/generic/handle_video_fal.rs (95%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/generic/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/internal_video_error.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{video => image_to_video}/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/enqueue_text_to_image_command.rs (93%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/generic/handle_image_artcraft.rs (98%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/generic/handle_image_fal.rs (95%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/generic/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/gpt_image_1/handle_gpt_image_1.rs (88%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/gpt_image_1/handle_gpt_image_1_artcraft.rs (95%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/gpt_image_1/handle_gpt_image_1_sora.rs (81%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/gpt_image_1/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/internal_image_error.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/midjourney/handle_midjourney.rs (91%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/midjourney/mod.rs (100%) rename crates/desktop/artcraft/src/core/commands/enqueue/{image => text_to_image}/mod.rs (100%) create mode 100644 crates/desktop/artcraft/src/core/events/functional_events/show_provider_login_modal_event.rs create mode 100644 frontend/libs/common/src/lib/enums/GenerationProvider.ts create mode 100644 frontend/libs/components/provider-setup-modal/.babelrc create mode 100644 frontend/libs/components/provider-setup-modal/README.md create mode 100644 frontend/libs/components/provider-setup-modal/package.json create mode 100644 frontend/libs/components/provider-setup-modal/src/index.ts create mode 100644 frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.module.css create mode 100644 frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.spec.tsx create mode 100644 frontend/libs/components/provider-setup-modal/src/lib/provider-setup-modal.tsx create mode 100644 frontend/libs/components/provider-setup-modal/tsconfig.json create mode 100644 frontend/libs/components/provider-setup-modal/tsconfig.lib.json create mode 100644 frontend/libs/components/provider-setup-modal/tsconfig.spec.json create mode 100644 frontend/libs/components/provider-setup-modal/vite.config.ts create mode 100644 frontend/libs/tauri-events/src/lib/events/ShowProviderLoginModalEvent.ts 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 3d32a3f3f4..fd47526333 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 40ed63b9ce..26ba520514 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 88bf34b801..262e72dccf 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 caa6f4b37f..a62e005419 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 1559a38131..5778b4e7d8 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 6d3a4d3166..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 @@ -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 0ccd429086..d825104b5f 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 2db53a0eb8..3c34e81614 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 cdd1ce24d3..881575303d 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 516df03548..5f82d60f8a 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 3c38444e70..2e746991e2 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 636d483bc7..7a7ccfa1c5 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 109ddc3f33..88d6edb11e 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 4955d86393..477f96364d 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 59251e621a..38a91fece7 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 22f945d671..0ca4c4a31e 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 17c32cf1b2..1434ea5d9c 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 42bc44dea4..09056a554f 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 b8624e47fd..6052dcb71b 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 1d699ab5b4..8ca27f1b76 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 c4ce6cb318..6e08d84863 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 3d864871cc..482e0348d3 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 6bc35a4d1b..149a737ef0 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 86a9f64b67..045db64954 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 b4253b3ecb..42443cda30 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 0000000000..2deb3af957 --- /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 d5f34f4f68..3ea90f483f 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 a79afc7e0f..6f6c577379 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 d59e9e3f08..571fd43def 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 d85bc49534..0bc2dd50d0 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 0000000000..e25d9f1a46 --- /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 424823d2f9..4fbc722446 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 0000000000..1ea870ead4 --- /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 0000000000..73ba461fa6 --- /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 0000000000..cc6d4b7b11 --- /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 0000000000..27cb6b35a3 --- /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 0000000000..d0246c74b9 --- /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 0000000000..f97e6c5022 --- /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 0000000000..15b08a797d --- /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 0000000000..12b1e10ef8 --- /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 0000000000..4b429f449b --- /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 0000000000..18b7de51b8 --- /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 0000000000..6720cbb26e --- /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 de9000a778..db5f23a90a 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 c0fffe071d..6dbc91bf26 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 0000000000..9801cb9d77 --- /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 22f5de6bbf..657699274c 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 0a5bffeb2e..5952311a0e 100644 --- a/frontend/tsconfig.json +++ b/frontend/tsconfig.json @@ -152,6 +152,9 @@ }, { "path": "./libs/tauri-events" + }, + { + "path": "./libs/components/provider-setup-modal" } ] }