From 4daf028e7acb49932e274ad5c32cd98045c7474a Mon Sep 17 00:00:00 2001
From: botato <63275405+botatooo@users.noreply.github.com>
Date: Fri, 1 Jul 2022 23:43:17 +0000
Subject: Uninstall functionality (#97)

* feat: POC uninstallation feature

* Fixes, placeholder

* bugfix: wrong function call

* add oncancel and change function called

* clean up plugin uninstall code

* bugfix, uninstall in store

* Limit scope of feature branch

* feat: PluginLoader.unloadPlugin

* problematic logs
---
 frontend/src/plugin-loader.tsx | 41 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 34 insertions(+), 7 deletions(-)

(limited to 'frontend/src/plugin-loader.tsx')

diff --git a/frontend/src/plugin-loader.tsx b/frontend/src/plugin-loader.tsx
index b3df0f28..fc48fdd9 100644
--- a/frontend/src/plugin-loader.tsx
+++ b/frontend/src/plugin-loader.tsx
@@ -47,6 +47,10 @@ class PluginLoader extends Logger {
     this.routerHook.addRoute('/decky/settings', () => <SettingsPage />);
   }
 
+  public getPlugins() {
+    return this.plugins;
+  }
+
   public addPluginInstallPrompt(artifact: string, version: string, request_id: string, hash: string) {
     showModal(
       <ModalRoot
@@ -66,6 +70,28 @@ class PluginLoader extends Logger {
     );
   }
 
+  public uninstall_plugin(name: string) {
+    showModal(
+      <ModalRoot
+        onOK={async () => {
+          const formData = new FormData();
+          formData.append('name', name);
+          await fetch('http://localhost:1337/browser/uninstall_plugin', {
+            method: 'POST',
+            body: formData,
+          });
+        }}
+        onCancel={() => {
+          // do nothing
+        }}
+      >
+        <div className={staticClasses.Title} style={{ flexDirection: 'column' }}>
+          Uninstall {name}?
+        </div>
+      </ModalRoot>,
+    );
+  }
+
   public dismountAll() {
     for (const plugin of this.plugins) {
       this.log(`Dismounting ${plugin.name}`);
@@ -78,6 +104,13 @@ class PluginLoader extends Logger {
     this.routerHook.removeRoute('/decky/settings');
   }
 
+  public unloadPlugin(name: string) {
+    const plugin = this.plugins.find((plugin) => plugin.name === name || plugin.name === name.replace('$LEGACY_', ''));
+    plugin?.onDismount?.();
+    this.plugins = this.plugins.filter((p) => p !== plugin);
+    this.deckyState.setPlugins(this.plugins);
+  }
+
   public async importPlugin(name: string) {
     if (this.reloadLock) {
       this.log('Reload currently in progress, adding to queue', name);
@@ -89,13 +122,7 @@ class PluginLoader extends Logger {
       this.reloadLock = true;
       this.log(`Trying to load ${name}`);
 
-      const oldPlugin = this.plugins.find(
-        (plugin) => plugin.name === name || plugin.name === name.replace('$LEGACY_', ''),
-      );
-      if (oldPlugin) {
-        oldPlugin.onDismount?.();
-        this.plugins = this.plugins.filter((plugin) => plugin !== oldPlugin);
-      }
+      this.unloadPlugin(name);
 
       if (name.startsWith('$LEGACY_')) {
         await this.importLegacyPlugin(name.replace('$LEGACY_', ''));
-- 
cgit v1.2.3

