Adjust labels of buttons in extension list based on status (#8319)

Marshall Bowers created

This PR makes the labels of the buttons in the extension list adapt to
reflect the current status.

Release Notes:

- Changed the button labels in the extension list to reflect the current
status.

Change summary

crates/extension/src/extension_store.rs   | 14 +++++
crates/extensions_ui/src/extensions_ui.rs | 68 ++++++++++++++----------
2 files changed, 54 insertions(+), 28 deletions(-)

Detailed changes

crates/extension/src/extension_store.rs 🔗

@@ -52,6 +52,20 @@ pub enum ExtensionStatus {
     Removing,
 }
 
+impl ExtensionStatus {
+    pub fn is_installing(&self) -> bool {
+        matches!(self, Self::Installing)
+    }
+
+    pub fn is_upgrading(&self) -> bool {
+        matches!(self, Self::Upgrading)
+    }
+
+    pub fn is_removing(&self) -> bool {
+        matches!(self, Self::Removing)
+    }
+}
+
 pub struct ExtensionStore {
     manifest: Arc<RwLock<Manifest>>,
     fs: Arc<dyn Fs>,

crates/extensions_ui/src/extensions_ui.rs 🔗

@@ -181,36 +181,48 @@ impl ExtensionsPage {
         };
 
         let install_or_uninstall_button = match status {
-            ExtensionStatus::NotInstalled | ExtensionStatus::Installing => {
-                Button::new(SharedString::from(extension.id.clone()), "Install")
-                    .on_click(cx.listener({
-                        let extension_id = extension.id.clone();
-                        let version = extension.version.clone();
-                        move |this, _, cx| {
-                            this.telemetry
-                                .report_app_event("extensions: install extension".to_string());
-                            this.install_extension(extension_id.clone(), version.clone(), cx);
-                        }
-                    }))
-                    .disabled(matches!(status, ExtensionStatus::Installing))
-            }
+            ExtensionStatus::NotInstalled | ExtensionStatus::Installing => Button::new(
+                SharedString::from(extension.id.clone()),
+                if status.is_installing() {
+                    "Installing..."
+                } else {
+                    "Install"
+                },
+            )
+            .on_click(cx.listener({
+                let extension_id = extension.id.clone();
+                let version = extension.version.clone();
+                move |this, _, cx| {
+                    this.telemetry
+                        .report_app_event("extensions: install extension".to_string());
+                    this.install_extension(extension_id.clone(), version.clone(), cx);
+                }
+            }))
+            .disabled(status.is_installing()),
             ExtensionStatus::Installed(_)
             | ExtensionStatus::Upgrading
-            | ExtensionStatus::Removing => {
-                Button::new(SharedString::from(extension.id.clone()), "Uninstall")
-                    .on_click(cx.listener({
-                        let extension_id = extension.id.clone();
-                        move |this, _, cx| {
-                            this.telemetry
-                                .report_app_event("extensions: uninstall extension".to_string());
-                            this.uninstall_extension(extension_id.clone(), cx);
-                        }
-                    }))
-                    .disabled(matches!(
-                        status,
-                        ExtensionStatus::Upgrading | ExtensionStatus::Removing
-                    ))
-            }
+            | ExtensionStatus::Removing => Button::new(
+                SharedString::from(extension.id.clone()),
+                if status.is_upgrading() {
+                    "Upgrading..."
+                } else if status.is_removing() {
+                    "Removing..."
+                } else {
+                    "Uninstall"
+                },
+            )
+            .on_click(cx.listener({
+                let extension_id = extension.id.clone();
+                move |this, _, cx| {
+                    this.telemetry
+                        .report_app_event("extensions: uninstall extension".to_string());
+                    this.uninstall_extension(extension_id.clone(), cx);
+                }
+            }))
+            .disabled(matches!(
+                status,
+                ExtensionStatus::Upgrading | ExtensionStatus::Removing
+            )),
         }
         .color(Color::Accent);