From b17b508a22e460b019c1491761a9cc96ffd90f17 Mon Sep 17 00:00:00 2001
From: "@mazikiou" <mazikiou@takima.fr>
Date: Wed, 20 Jul 2022 12:23:31 +0200
Subject: [PATCH] feat: watch workspace to update started missions

---
 .../deadlock-extension/src/core/controller.ts |  4 +++
 .../deadlock-extension/src/extension.ts       |  6 ++---
 .../src/view/startedMissionsView.ts           | 26 +++++++++++++++++++
 3 files changed, 33 insertions(+), 3 deletions(-)

diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts
index 5541b401..a60950a5 100644
--- a/deadlock-plugins/deadlock-extension/src/core/controller.ts
+++ b/deadlock-plugins/deadlock-extension/src/core/controller.ts
@@ -18,11 +18,13 @@ import { getReviewedStudentWorkdirPath } from './utils/mission.utils';
 import { join } from 'path';
 import Mission from '../model/mission';
 import ApiService from './api.service';
+import StartedMissionsView from '../view/startedMissionsView';
 
 export default class Controller {
   private static _instance: Controller;
   private briefingView?: BriefingView;
   private quickSetupView: QuickSetupView;
+  public readonly startedMissions?: StartedMissionsView;
 
   public constructor(public readonly context: ExtensionContext) {
     if (Controller._instance) {
@@ -31,6 +33,8 @@ export default class Controller {
     Controller._instance = this;
     if (isDocker()) {
       this.briefingView = new BriefingView();
+    } else {
+      this.startedMissions = new StartedMissionsView();
     }
     this.quickSetupView = new QuickSetupView();
 
diff --git a/deadlock-plugins/deadlock-extension/src/extension.ts b/deadlock-plugins/deadlock-extension/src/extension.ts
index 093a4d10..95cd3b2c 100644
--- a/deadlock-plugins/deadlock-extension/src/extension.ts
+++ b/deadlock-plugins/deadlock-extension/src/extension.ts
@@ -4,7 +4,6 @@ import Recorder from './recorder/recorder';
 import { extensionError as error } from './recorder/utils/log';
 import { DepNodeProvider } from './view/deadlockPanel';
 import { CommandTreeProvider } from './view/CommandTree';
-import StartedMissionsView from './view/startedMissionsView';
 import Controller from './core/controller';
 
 export async function activate(context: ExtensionContext) {
@@ -15,8 +14,9 @@ export async function activate(context: ExtensionContext) {
   if (!workspaceFolders) window.showInformationMessage('Pas de répertoires ouverts');
   const deadlockPanelProvider = new DepNodeProvider();
   window.registerTreeDataProvider('deadlockPanel', deadlockPanelProvider);
-  window.registerWebviewViewProvider('startedMissions', new StartedMissionsView());
-
+  if (Controller.instance.startedMissions) {
+    window.registerWebviewViewProvider('startedMissions', Controller.instance.startedMissions);
+  }
   if (isDocker()) {
     commands.executeCommand('setContext', 'deadlock.inContainer', true);
     window.registerTreeDataProvider('commandTree', new CommandTreeProvider());
diff --git a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
index dda4a28e..e52d9943 100644
--- a/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
+++ b/deadlock-plugins/deadlock-extension/src/view/startedMissionsView.ts
@@ -6,10 +6,36 @@ import Controller from '../core/controller';
 import { extensionWarn } from '../recorder/utils/log';
 import { getUri } from './webviewBase';
 import { missionWorkdir } from '../core/config';
+import { watch } from 'chokidar';
 import UserMission from '../core/mission/model/userMission';
 import { getExtensionUri } from '../recorder/utils/workdir';
+
 export default class StartedMissionsView implements WebviewViewProvider {
+  constructor() {
+    if (existsSync(missionWorkdir)) {
+      console.log('Watching mission directory');
+      const watcher = watch(missionWorkdir, {
+        ignoreInitial: true,
+        ignorePermissionErrors: true,
+        depth: 3,
+      });
+      watcher.on('all', (event, path) => {
+        if (event === 'add' || event === 'unlink' || (event === 'change' && path.includes('user-challenge.json'))) {
+          if (this.webviewView?.webview.html) {
+            this.webviewView.webview.html = this._getHtmlForWebview(this.webviewView?.webview);
+          }
+        }
+      });
+    }
+  }
+  private webviewView?: WebviewView;
+  public refresh(): void {
+    if (this.webviewView) {
+      this.webviewView.webview.html = this._getHtmlForWebview(this.webviewView?.webview);
+    }
+  }
   resolveWebviewView(webviewView: WebviewView): void | Thenable<void> {
+    this.webviewView = webviewView;
     webviewView.webview.options = {
       enableScripts: true,
       localResourceRoots: [getExtensionUri()],
-- 
GitLab