export default function()

in src/export.js [34:312]


export default function (context) {
  /**
   * To "log out", uncomment this line
   */
  // resetPluginState();

  let win = new BrowserWindow({
    width: 800,
    height: 750,
    frame: true,
    title: 'GitLab',
    backgroundColor: '#ffffff',
  });

  win.webContents.loadURL(require('./export.html'));

  win.webContents.on('needKey', (key) => {
    console.log('message:needKey');

    if (!getAccessToken()) {
      console.log('no access token. Loading login screen...');
      win.webContents.loadURL(GITLAB_OAUTH_AUTH_URL);
      return;
    }

    if (!Settings.settingForKey('user-id')) {
      fetch(`${GITLAB_API_BASE_URL}/user`, {
        method: 'GET',
        headers: {
          Authorization: 'Bearer ' + getAccessToken(),
        },
      })
        .then((response) => {
          return response.json();
        })
        .then((success) => {
          Settings.setSettingForKey('user-id', success.id);
          let name;
          const document = sketch.fromNative(context.document);
          let layerArray = new Array();
          document.selectedLayers.forEach((layer) => {
            name = layer.name;
            layerArray.push({
              image: sketch.export(layer, { formats: 'png', output: false }),
              name: layer.name,
            });
          });
          win.webContents
            .executeJavaScript(`getImage(${JSON.stringify(layerArray)})`)
            .then((res) => {});
          win.webContents.executeJavaScript(
            'getKey("' +
              getAccessToken() +
              '", "' +
              name +
              '", "' +
              context.document.fileURL().lastPathComponent() +
              '", ' +
              Settings.settingForKey('user-id') +
              ')',
          );
        });
    } else {
      let name;
      const document = sketch.fromNative(context.document);
      let layerArray = new Array();
      document.selectedLayers.forEach((layer) => {
        name = layer.name;
        layerArray.push({
          image: sketch.export(layer, { formats: 'png', output: false }),
          name: layer.name,
        });
      });
      win.webContents
        .executeJavaScript(`getImage(${JSON.stringify(layerArray)})`)
        .then((res) => {});
      win.webContents.executeJavaScript(
        'getKey("' +
          getAccessToken() +
          '", "' +
          name +
          '", "' +
          context.document.fileURL().lastPathComponent() +
          '", ' +
          Settings.settingForKey('user-id') +
          ')',
      );
    }
  });

  win.webContents.on('newKey', (key) => {
    win.webContents.loadURL(GITLAB_OAUTH_AUTH_URL);
  });

  win.webContents.on('will-navigate', (event, url) => {
    if (url.startsWith('file://')) {
      win.show();
      return;
    }

    let parser = new URL(url);

    if (!parser) return;
    if (parser.host !== GITLAB_INSTANCE_HOST) {
      console.warn('Hostname incorrect');
      return;
    }
    if (!parser.hash.startsWith('#access')) {
      console.warn('No access code provided in redirect URL');
      return;
    }

    Settings.setSettingForKey(
      'access-token',
      parser.hash
        .replace('#access_token=', '')
        .toLowerCase()
        .replace('&token_type=bearer&state=test', ''),
    );

    fetch(`${GITLAB_API_BASE_URL}/user?access_token=${getAccessToken()}`, {})
      .then((res) => res.json())
      .then((success) => {
        Settings.setSettingForKey('user-id', success.id);
        win.destroy();
        win = new BrowserWindow({
          width: 800,
          height: 750,
          frame: true,
          title: 'GitLab',
          backgroundColor: '#ffffff',
        });
        win.loadURL(require('./export.html'), {
          extraHeaders: 'pragma: no-cache\n',
        });
        let name;
        const document = sketch.fromNative(context.document);
        let layerArray = new Array();
        document.selectedLayers.forEach((layer) => {
          name = layer.name;
          layerArray.push({
            image: sketch.export(layer, {
              formats: 'png',
              output: false,
            }),
            name: layer.name,
          });
        });
        win.webContents
          .executeJavaScript(`getImage(${JSON.stringify(layerArray)})`)
          .then((res) => {});
        win.webContents.executeJavaScript(
          'getKey("' +
            getAccessToken() +
            '", "' +
            name +
            '", "' +
            context.document.fileURL().lastPathComponent() +
            '", ' +
            Settings.settingForKey('user-id') +
            ')',
        );
      });
  });

  win.webContents.on('openTodo', (url) => {
    NSWorkspace.sharedWorkspace().openURL(NSURL.URLWithString(url));
  });

  win.webContents.on('submitComment', (projectId, issueId, markdown) => {
    exportToComment(projectId, issueId, markdown);
  });

  win.webContents.on('submitDesign', (projectPath, issueId) => {
    console.log('message:submitDesign');
    exportToDesigns(projectPath, issueId);
  });

  function exportToComment(projectId, issueId, markdown) {
    const document = sketch.fromNative(context.document);
    document.selectedLayers.forEach((layer) => {
      let file = sketch.export(layer, { formats: 'png', output: false });
      var form = new FormData();
      form.append('file', {
        fileName: layer.name + '.png',
        mimeType: 'image/png',
        data: file,
      });

      return fetch(`${GITLAB_API_BASE_URL}/projects/` + projectId + '/uploads', {
        method: 'POST',
        headers: {
          Authorization: 'Bearer ' + getAccessToken(),
          'Content-Type': 'multipart/form-data',
        },
        body: form,
      })
        .then((response) => {
          return response.json();
        })
        .then((success) => {
          return fetch(
            `${GITLAB_API_BASE_URL}/projects/${projectId}/issues/${issueId}/notes?body=${encodeURI(
              markdown.replace(
                '[' + layer.name + '](/' + layer.name + '.png)',
                success.markdown.replace('![', '['),
              ),
            )}`,
            {
              method: 'POST',
              headers: {
                Authorization: 'Bearer ' + getAccessToken(),
              },
            },
          )
            .then((response) => {
              return response.json();
            })
            .then((success) => {
              win.destroy();
              sketch.UI.message('Comment submitted 🚀');
            });
        });
    });
  }

  function exportToDesigns(projectPath, issueId) {
    const document = sketch.fromNative(context.document);
    let v = new Array();
    let m = {};
    let fd = new FormData();
    document.selectedLayers.forEach((layer, index) => {
      m[index] = ['variables.somefile.' + index];
      v.push(null);
      let file = sketch.export(layer, { formats: 'png', output: false });
      fd.append(index, {
        fileName: layer.name + '.png',
        mimeType: 'image/png',
        data: file,
      });
    });
    fd.append('map', JSON.stringify(m));
    let o = {
      query: `mutation uploadDesign($somefile: [Upload!]!) {
      designManagementUpload(input: {projectPath: "${projectPath}", iid: ${issueId}, files: $somefile}) {
        designs {
          id
          filename
        }
      }
    }`,
      variables: {
        somefile: v,
      },
    };
    fd.append('operations', JSON.stringify(o));

    return fetch(GITLAB_GRAPHQL_BASE_URL, {
      headers: {
        Accept: 'application/json',
        Authorization: 'Bearer ' + getAccessToken(),
        'Content-type': 'multipart/form-data',
      },
      body: fd,
      method: 'POST',
    })
      .then((result) => {
        return result.json();
      })
      .then((result) => {
        win.destroy();
        if (document.selectedLayers.length > 1) {
          sketch.UI.message('Designs uploaded 🚀');
        } else {
          sketch.UI.message('Design uploaded 🚀');
        }
      });
  }
}