diff --git a/deadlock-plugins/deadlock-extension/src/core/controller.ts b/deadlock-plugins/deadlock-extension/src/core/controller.ts index 5541b40178643dcac5f90fafa2120fd38a281845..a60950a5a6948b8e416bd96dc8752907e825b035 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 093a4d10fb36a6db2c6dce4c140f0e8ff2089300..95cd3b2cfedd9a3fc9f826d85f5c4981e962a3a7 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 dda4a28edbedd42f61f15f8d1c9b1aebe54da196..e52d9943da5573cd25aca571a122621417e1d2a1 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()],