Initial public release of Warp.
Repo-Sync-Origin: warpdotdev/warp-internal@12af1d983b
This commit is contained in:
@@ -0,0 +1,140 @@
|
||||
use warpui::AppContext;
|
||||
|
||||
use crate::server::cloud_objects::update_manager::{
|
||||
InitiatedBy, ObjectOperation, OperationSuccessType,
|
||||
};
|
||||
|
||||
use super::{CloudObject, GenericStringObjectFormat, JsonObjectType, ObjectType};
|
||||
|
||||
pub struct CloudObjectToastMessage;
|
||||
|
||||
impl CloudObjectToastMessage {
|
||||
pub fn toast_message(
|
||||
object: &dyn CloudObject,
|
||||
operation: &ObjectOperation,
|
||||
success_type: &OperationSuccessType,
|
||||
app: &AppContext,
|
||||
) -> Option<String> {
|
||||
let object_name = object.model_type_name().to_owned();
|
||||
let object_name_lowercase = object_name.to_ascii_lowercase();
|
||||
|
||||
match (object.object_type(), operation, success_type) {
|
||||
// We should only show toasts for creates initiated by the user, not by the system
|
||||
(_, ObjectOperation::Create { initiated_by: InitiatedBy::User }, OperationSuccessType::Success) => {
|
||||
let containing_object_name = object.containing_object_name(app);
|
||||
Some(format!("{object_name} saved to {containing_object_name}"))
|
||||
}
|
||||
// notebooks intentionally do not have an update message, as they are updated
|
||||
// as the user types and so toasts would be VERY noisy
|
||||
(
|
||||
ObjectType::Notebook,
|
||||
ObjectOperation::Update,
|
||||
OperationSuccessType::Success,
|
||||
) => None,
|
||||
(_, ObjectOperation::Update, OperationSuccessType::Success) => {
|
||||
Some(format!("{object_name} updated"))
|
||||
}
|
||||
(_, ObjectOperation::MoveToFolder, OperationSuccessType::Success) | (_, ObjectOperation::MoveToDrive, OperationSuccessType::Success) => {
|
||||
let containing_object_name = object.containing_object_name(app);
|
||||
Some(format!("{object_name} moved to {containing_object_name}"))
|
||||
}
|
||||
(_, ObjectOperation::Trash, OperationSuccessType::Success) => {
|
||||
Some(format!("{object_name} trashed"))
|
||||
}
|
||||
(_, ObjectOperation::Untrash, OperationSuccessType::Success) => {
|
||||
Some(format!("{object_name} restored"))
|
||||
}
|
||||
(_, ObjectOperation::Leave, OperationSuccessType::Success) => {
|
||||
Some(format!("Left {object_name}"))
|
||||
}
|
||||
(_, ObjectOperation::Create { initiated_by: InitiatedBy::User }, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to create {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::Create { initiated_by: InitiatedBy::User }, OperationSuccessType::Denied(message)) => {
|
||||
Some(message.to_string())
|
||||
}
|
||||
(_, ObjectOperation::Update, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to update {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::MoveToFolder, OperationSuccessType::Failure) | (_, ObjectOperation::MoveToDrive, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to move {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::Trash, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to trash {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::Untrash, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to restore {object_name_lowercase}"))
|
||||
}
|
||||
// We should only show deletion failure toasts for user-initiated deletions.
|
||||
(_, ObjectOperation::Delete { initiated_by: InitiatedBy::User }, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to delete {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::Leave, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to leave {object_name}"))
|
||||
}
|
||||
(
|
||||
ObjectType::Workflow,
|
||||
ObjectOperation::Update,
|
||||
OperationSuccessType::Rejection,
|
||||
) => {
|
||||
Some("This workflow could not be saved because changes were made while you were editing.".to_string())
|
||||
}
|
||||
(
|
||||
ObjectType::GenericStringObject(GenericStringObjectFormat::Json(JsonObjectType::EnvVarCollection)),
|
||||
ObjectOperation::Update,
|
||||
OperationSuccessType::Rejection,
|
||||
) => {
|
||||
Some("Environment variables could not be saved because changes were made while you were editing.".to_string())
|
||||
}
|
||||
(
|
||||
ObjectType::GenericStringObject(GenericStringObjectFormat::Json(JsonObjectType::AIFact)),
|
||||
ObjectOperation::Update,
|
||||
OperationSuccessType::Rejection,
|
||||
) => {
|
||||
Some("Rule could not be saved because changes were made while you were editing.".to_string())
|
||||
}
|
||||
(_, ObjectOperation::TakeEditAccess, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to start editing {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::UpdatePermissions, OperationSuccessType::Success) => {
|
||||
Some(format!("Successfully updated permissions for {object_name_lowercase}"))
|
||||
}
|
||||
(_, ObjectOperation::UpdatePermissions, OperationSuccessType::Failure) => {
|
||||
Some(format!("Failed to update permissions for {object_name_lowercase}"))
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn toast_deletion_confirm_message(
|
||||
num_objects: i32,
|
||||
operation: &ObjectOperation,
|
||||
success_type: &OperationSuccessType,
|
||||
) -> Option<String> {
|
||||
let count_objects_message = match num_objects {
|
||||
1 => "1 object".to_string(),
|
||||
n => {
|
||||
format!("{n} objects")
|
||||
}
|
||||
};
|
||||
match (operation, success_type) {
|
||||
// We should only show deletion failure toasts for user-initiated deletions.
|
||||
(
|
||||
ObjectOperation::Delete {
|
||||
initiated_by: InitiatedBy::User,
|
||||
},
|
||||
OperationSuccessType::Success,
|
||||
) => Some(format!("{count_objects_message} deleted forever")),
|
||||
(ObjectOperation::EmptyTrash, OperationSuccessType::Success) => Some(format!(
|
||||
"Trash emptied: {count_objects_message} deleted forever"
|
||||
)),
|
||||
(ObjectOperation::EmptyTrash, OperationSuccessType::Failure) => {
|
||||
Some("Failed to empty trash".to_string())
|
||||
}
|
||||
(ObjectOperation::EmptyTrash, OperationSuccessType::Rejection) => {
|
||||
Some("No objects in trash to empty".to_string())
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user