diff --git a/src/settings.ts b/src/settings.ts index e76df77..58b7adb 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -3,7 +3,8 @@ import * as fs from 'fs'; import * as path from 'path'; import * as request from 'request'; import * as vscode from 'vscode'; -import { loadConfigs } from './config'; +import { deleteConfig, loadConfigsRaw, updateConfig } from './config'; +import { getLocations } from './fileSystemConfig'; import { Message } from './webviewMessages'; let webviewPanel: vscode.WebviewPanel | undefined; @@ -39,9 +40,44 @@ async function handleMessage(message: Message): Promise { console.log('Got message:', message); switch (message.type) { case 'requestData': { + const configs = await loadConfigsRaw(); + const locations = getLocations(configs); return postMessage({ + configs, locations, type: 'responseData', - configs: await loadConfigs(), + }); + } + case 'saveConfig': { + const { uniqueId, config, name, remove } = message; + let error: string | undefined; + try { + if (remove) { + await deleteConfig(config); + } else { + await updateConfig(config, name); + } + } catch (e) { + error = e.message; + } + return postMessage({ + uniqueId, config, error, + type: 'saveConfigResult', + }); + } + case 'promptPath': { + const { uniqueId } = message; + let uri: vscode.Uri | undefined; + let error: string | undefined; + try { + const uris = await vscode.window.showOpenDialog({}); + if (uris) [uri] = uris; + } catch (e) { + error = e.message; + } + return postMessage({ + uniqueId, + path: uri && uri.fsPath, + type: 'promptPathResult', }); } } diff --git a/src/webviewMessages.ts b/src/webviewMessages.ts index 9daede4..8f2ae68 100644 --- a/src/webviewMessages.ts +++ b/src/webviewMessages.ts @@ -1,4 +1,4 @@ -import { FileSystemConfig } from './fileSystemConfig'; +import { ConfigLocation, FileSystemConfig } from './fileSystemConfig'; export interface RequestDataMessage { type: 'requestData'; @@ -6,11 +6,41 @@ export interface RequestDataMessage { export interface ResponseDataMessage { type: 'responseData'; configs: FileSystemConfig[]; + locations: ConfigLocation[]; +} + +export interface SaveConfigMessage { + type: 'saveConfig'; + config: FileSystemConfig; + name?: string; + uniqueId?: string; + remove?: boolean; +} +export interface SaveConfigResultMessage { + type: 'saveConfigResult'; + error?: string; + config: FileSystemConfig; + uniqueId?: string; +} + +export interface PromptPathMessage { + type: 'promptPath'; + uniqueId?: string; +} +export interface PromptPathResultMessage { + type: 'promptPathResult'; + error?: string; + path?: string; + uniqueId?: string; } export interface MessageTypes { requestData: RequestDataMessage; responseData: ResponseDataMessage; + saveConfig: SaveConfigMessage; + saveConfigResult: SaveConfigResultMessage; + promptPath: PromptPathMessage; + promptPathResult: PromptPathResultMessage; } export type Message = MessageTypes[keyof MessageTypes];