Skip to content

Commit 17eccfa

Browse files
committed
「さらに読み込む...」を実装 (#6)
1 parent 0232a96 commit 17eccfa

File tree

12 files changed

+173
-83
lines changed

12 files changed

+173
-83
lines changed

package.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@
8383
"command": "qiita.editTitle",
8484
"title": "%commands.editTitle.title%",
8585
"category": "Qiita"
86+
},
87+
{
88+
"command": "qiita.expandItems",
89+
"title": "%commands.expanditems.title%",
90+
"category": "Qiita"
8691
}
8792
],
8893
"configuration": [
@@ -115,7 +120,8 @@
115120
{ "command": "qiita.editTags", "when": "false" },
116121
{ "command": "qiita.openItemExternal", "when": "false"},
117122
{ "command": "qiita.makePublic", "when": "false"},
118-
{ "command": "qiita.editTitle", "when": "false" }
123+
{ "command": "qiita.editTitle", "when": "false" },
124+
{ "command": "qiita.expandItems", "when": "false" }
119125
],
120126
"editor/title": [
121127
{

package.nls.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
"commands.editTitle.title": "タイトルを編集",
3636
"commands.editTitle.success": "タイトルを編集しました",
3737

38+
"commands.expanditems.title": "さらに読み込む...",
39+
3840
"quickpicks.tagQuickPick.title": "投稿に登録するタグを入力してください",
3941
"quickpicks.tagQuickPick.placeholder": "例) Rails React Mastodon",
4042
"quickpicks.tagQuickPick.item.description": "{0}件の投稿",

src/commands/compose.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { commands, Uri, window, workspace } from 'vscode';
33
import * as nls from 'vscode-nls';
44
import { client } from '../client';
55
import { configuration } from '../configuration';
6-
import { qiitaItemsProvider } from '../explorer/qiitaItems';
6+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
77
import { tagQuickPickCreator, validateTagQuickPick } from '../quickpicks/tagQuickPickCreator';
88
import { titleInputBoxCreator, validateTitleInputBox } from '../quickpicks/titleInputBoxCreator';
99
import { privateLabel, visibilityQuickPickCreator } from '../quickpicks/visibilityQuickPickCreator';

src/commands/deleteItem.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Item } from 'qiita-js-2';
22
import { window } from 'vscode';
33
import * as nls from 'vscode-nls';
44
import { client } from '../client';
5-
import { qiitaItemsProvider } from '../explorer/qiitaItems';
5+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
66
import { handleErrorMessage } from '../utils/errorHandler';
77

88
const localize = nls.loadMessageBundle();

src/commands/editTags.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Item } from 'qiita-js-2';
22
import { QuickPickItem, window } from 'vscode';
33
import * as nls from 'vscode-nls';
44
import { client } from '../client';
5-
import { qiitaItemsProvider } from '../explorer/qiitaItems';
5+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
66
import { makeQuickPickItemFromTag, tagQuickPickCreator, validateTagQuickPick } from '../quickpicks/tagQuickPickCreator';
77
import { handleErrorMessage } from '../utils/errorHandler';
88

src/commands/editTitle.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Item } from 'qiita-js-2';
22
import { window } from 'vscode';
33
import * as nls from 'vscode-nls';
44
import { client } from '../client';
5-
import { qiitaItemsProvider } from '../explorer/qiitaItems';
5+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
66
import { titleInputBoxCreator, validateTitleInputBox } from '../quickpicks/titleInputBoxCreator';
77
import { handleErrorMessage } from '../utils/errorHandler';
88

src/commands/expandItems.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
2+
import { itemsStore } from '../stores/itemsStore';
3+
4+
export async function expandItems () {
5+
if (!itemsStore.done) {
6+
await itemsStore.expandItems();
7+
qiitaItemsProvider.refresh();
8+
}
9+
}

src/commands/makePublic.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Item } from 'qiita-js-2';
22
import { window } from 'vscode';
33
import * as nls from 'vscode-nls';
44
import { client } from '../client';
5-
import { qiitaItemsProvider } from '../explorer/qiitaItems';
5+
import { qiitaItemsProvider } from '../explorers/qiitaItems';
66
import { handleErrorMessage } from '../utils/errorHandler';
77

88
const localize = nls.loadMessageBundle();

src/explorer/qiitaItems.ts

Lines changed: 0 additions & 75 deletions
This file was deleted.

src/explorers/qiitaItems.ts

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
import { Item } from 'qiita-js-2';
2+
import {
3+
Command,
4+
Event,
5+
EventEmitter,
6+
TreeDataProvider,
7+
TreeItem,
8+
TreeItemCollapsibleState,
9+
Uri,
10+
} from 'vscode';
11+
import * as nls from 'vscode-nls';
12+
import { itemsStore } from '../stores/itemsStore';
13+
14+
const localize = nls.loadMessageBundle();
15+
16+
17+
export class QiitaItem extends TreeItem {
18+
/**
19+
* "Qiitaの投稿" ビューに表示されるアイテム
20+
* @param item Qiitaの投稿
21+
* @param collapsibleState アイテムが折り畳まれているかの状態
22+
* @param command クリック時に発火するコマンド
23+
*/
24+
constructor (
25+
public readonly item: Item,
26+
public readonly collapsibleState: TreeItemCollapsibleState,
27+
public readonly command: Command,
28+
) {
29+
super(item.title, collapsibleState);
30+
}
31+
32+
public resourceUri = Uri.parse('file:///text.md'); // Hack: アイコンをMarkdownのものに
33+
public contextValue = 'qiitaItems';
34+
}
35+
36+
37+
export class ExpandItems extends TreeItem {
38+
/**
39+
* 「さらに読み込む」ボタンのためのアイテム
40+
* @param collapsibleState アイテムが折り畳まれているかの状態
41+
*/
42+
constructor (public readonly collapsibleState: TreeItemCollapsibleState) {
43+
super(localize(
44+
'commands.expandItems.title',
45+
'さらに読み込む...',
46+
), collapsibleState);
47+
}
48+
49+
public command = {
50+
command: 'qiita.expandItems',
51+
title: localize('commands.expandItems.title', 'さらに読み込む...'),
52+
arguments: [],
53+
};
54+
55+
public contextValue = 'qiitaItems';
56+
}
57+
58+
59+
class QiitaItemsProvider implements TreeDataProvider<QiitaItem|ExpandItems> {
60+
private _onDidChangeTreeData: EventEmitter<QiitaItem|ExpandItems|undefined> = new EventEmitter<QiitaItem|ExpandItems|undefined>();
61+
public readonly onDidChangeTreeData: Event<QiitaItem|ExpandItems|undefined> = this._onDidChangeTreeData.event;
62+
63+
/**
64+
* ツリーデータを更新
65+
*/
66+
public refresh () {
67+
this._onDidChangeTreeData.fire();
68+
}
69+
70+
/**
71+
* `element` に対応するツリーアイテムを取得
72+
* @param element 取得するelement
73+
* @return ツリーアイテム
74+
*/
75+
public getTreeItem (element: QiitaItem): TreeItem {
76+
return element;
77+
}
78+
79+
/**
80+
* 子要素を取得
81+
* @param element 取得するelement
82+
*/
83+
public async getChildren (): Promise<(QiitaItem|ExpandItems)[]> {
84+
if (itemsStore.items.size === 0) {
85+
await itemsStore.refreshItems();
86+
}
87+
88+
const children = [];
89+
90+
for (const item of itemsStore.items) {
91+
const command = {
92+
command: 'qiita.openItem',
93+
title: localize('commands.openItem.title', '開く'),
94+
arguments: [ item ],
95+
};
96+
97+
children.push(new QiitaItem(item, TreeItemCollapsibleState.None, command));
98+
}
99+
100+
// アイテムが最後まで読み込まれていない場合、「さらに読み込む...」を挿入する
101+
if (!itemsStore.done) {
102+
children.push(new ExpandItems(TreeItemCollapsibleState.None));
103+
}
104+
105+
return children;
106+
}
107+
}
108+
109+
export const qiitaItemsProvider = new QiitaItemsProvider();

0 commit comments

Comments
 (0)