webview_controller.js 2.0 KB
Newer Older
1 2 3
const fs = require('fs');
const path = require('path');
const vscode = require('vscode');
F
Fatih Acet 已提交
4
const gitLabService = require('./gitlab_service');
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

let context = null;

const addDeps = (ctx) => {
  context = ctx;
}

const getNonce = () => {
  let text = "";
  const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  for (let i = 0; i < 32; i++) {
    text += possible.charAt(Math.floor(Math.random() * possible.length));
  }
  return text;
}

const getResources = () => {
  const paths = {
    appScriptUri: 'src/webview/dist/js/app.js',
    vendorUri: 'src/webview/dist/js/chunk-vendors.js',
    styleUri: 'src/webview/dist/css/app.css',
    devScriptUri: 'src/webview/dist/app.js',
  }

  Object.keys(paths).forEach((key) => {
    const uri = vscode.Uri.file(path.join(context.extensionPath, paths[key]));

    paths[key] = uri.with({ scheme: 'vscode-resource' });
  });

  return paths;
}

F
Fatih Acet 已提交
38 39 40 41 42 43
const getIndexPath = () => {
  const isDev = !(fs.existsSync(path.join(context.extensionPath, 'src/webview/dist/js/app.js')));

  return isDev ? 'src/webview/public/dev.html' : 'src/webview/public/index.html';
}

44 45 46 47 48 49 50 51 52
async function create(issuable) {
  const panel = vscode.window.createWebviewPanel('glWorkflow', 'GL Workflow', vscode.ViewColumn.One, {
    enableScripts: true,
    localResourceRoots: [
      vscode.Uri.file(path.join(context.extensionPath, 'src'))
    ]
  });

  const { appScriptUri, vendorUri, styleUri, devScriptUri } = getResources();
F
Fatih Acet 已提交
53
  let html = fs.readFileSync(path.join(context.extensionPath, getIndexPath()), 'UTF-8');
54 55 56 57 58 59 60

  html = html.replace(/{{nonce}}/gm, getNonce())
          .replace('{{styleUri}}', styleUri)
          .replace('{{vendorUri}}', vendorUri)
          .replace('{{appScriptUri}}', appScriptUri)
          .replace('{{devScriptUri}}', devScriptUri);

F
Fatih Acet 已提交
61 62

  const discussions = await gitLabService.fetchDiscussions(issuable);
63
  panel.webview.html = html;
F
Fatih Acet 已提交
64
  panel.webview.postMessage({ issuable, discussions });
65 66 67 68
}

exports.addDeps = addDeps;
exports.create = create;