From 7d6b8805dfc3b38515bf9752d85bce8f2c992179 Mon Sep 17 00:00:00 2001
From: Andrew Moore <andrewm.finewolf@gmail.com>
Date: Wed, 14 Feb 2024 23:45:55 -0500
Subject: [Feature] Freeze updates for devs (#582)

---
 frontend/src/frozen-plugins-service.tsx | 49 +++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)
 create mode 100644 frontend/src/frozen-plugins-service.tsx

(limited to 'frontend/src/frozen-plugins-service.tsx')

diff --git a/frontend/src/frozen-plugins-service.tsx b/frontend/src/frozen-plugins-service.tsx
new file mode 100644
index 00000000..fa43a99e
--- /dev/null
+++ b/frontend/src/frozen-plugins-service.tsx
@@ -0,0 +1,49 @@
+import { DeckyState } from './components/DeckyState';
+import { PluginUpdateMapping } from './store';
+import { getSetting, setSetting } from './utils/settings';
+
+/**
+ * A Service class for managing the state and actions related to the frozen plugins feature.
+ *
+ * It's mostly responsible for sending setting updates to the server and keeping the local state in sync.
+ */
+export class FrozenPluginService {
+  constructor(private deckyState: DeckyState) {}
+
+  init() {
+    getSetting<string[]>('frozenPlugins', []).then((frozenPlugins) => {
+      this.deckyState.setFrozenPlugins(frozenPlugins);
+    });
+  }
+
+  /**
+   * Sends the new frozen plugins list to the server and persists it locally in the decky state
+   *
+   * @param frozenPlugins The new list of frozen plugins
+   */
+  async update(frozenPlugins: string[]) {
+    await setSetting('frozenPlugins', frozenPlugins);
+    this.deckyState.setFrozenPlugins(frozenPlugins);
+
+    // Remove pending updates for frozen plugins
+    const updates = this.deckyState.publicState().updates;
+
+    if (updates) {
+      const filteredUpdates = new Map() as PluginUpdateMapping;
+      updates.forEach((v, k) => {
+        if (!frozenPlugins.includes(k)) {
+          filteredUpdates.set(k, v);
+        }
+      });
+
+      this.deckyState.setUpdates(filteredUpdates);
+    }
+  }
+
+  /**
+   * Refreshes the state of frozen plugins in the local state
+   */
+  async invalidate() {
+    this.deckyState.setFrozenPlugins(await getSetting('frozenPlugins', []));
+  }
+}
-- 
cgit v1.2.3

