neet/vscode-qiita

View on GitHub
src/commands/editTags.ts

Summary

Maintainability
A
0 mins
Test Coverage
import { Item } from 'qiita-js-2';
import { QuickPickItem, window } from 'vscode';
import * as nls from 'vscode-nls';
import { client } from '../client';
import { qiitaItemsProvider } from '../explorers/qiitaItems';
import { makeQuickPickItemFromTag, tagQuickPickCreator, validateTagQuickPick } from '../quickpicks/tagQuickPick';
import { handleErrorMessage } from '../utils/errorHandler';

const localize = nls.loadMessageBundle();

export const updater = async (item: Item, selectedItems: ReadonlyArray<QuickPickItem>) => {
  const taggings = selectedItems.map((item) => ({
    name: item.label,
    versions: [],
  }));

  await client.updateItem(item.id, {
    tags: taggings,
    title: item.title,
    body: item.body,
  });
};

/**
 * タグを編集するためのquickPickを作成
 * @param resource コマンドから渡される引数
 */
export async function editTags (resource: { item: Item }) {
  const { item } = resource;
  const taggings = resource.item.tags;

  // 既存のタグを取得してselectedItemsとして初期化
  const selectedItems = await Promise.all(taggings.map(async (tagging) => {
    const tag = await client.fetchTag(tagging.name);
    return makeQuickPickItemFromTag(tag.id, tag.followers_count);
  }));

  const quickPick = tagQuickPickCreator(selectedItems);

  quickPick.onDidAccept(async () => {
    if (!validateTagQuickPick(quickPick)) {
      return window.showErrorMessage(localize(
        'quickpicks.tagQuickPick.failure.validationError',
        'タグは1つ以上5つ以内で選択してください。',
      ));
    }

    try {
      quickPick.hide();
      await updater(item, quickPick.selectedItems);
      await qiitaItemsProvider.refreshItems();

      return window.showInformationMessage(localize(
        'commands.editTags.success',
        'タグを編集しました',
      ));
    } catch (error) {
      // tslint:disable-next-line:no-console
      console.warn(error);

      return handleErrorMessage(error);
    }
  });

  quickPick.show();
}