11import { Item } from 'qiita-js-2' ;
2- import {
3- Command ,
4- Event ,
5- EventEmitter ,
6- TreeDataProvider ,
7- TreeItem ,
8- TreeItemCollapsibleState ,
9- Uri ,
10- } from 'vscode' ;
2+ import { Event , EventEmitter , TreeDataProvider , TreeItem , TreeItemCollapsibleState } from 'vscode' ;
113import * as nls from 'vscode-nls' ;
12- import { itemsStore } from '../stores/itemsStore' ;
4+ import { client } from '../client' ;
5+ import '../polyfills' ;
6+ import { ExpandItems } from './models/expandItemsNode' ;
7+ import { QiitaItem } from './models/qiitaItemsNode' ;
138
149const localize = nls . loadMessageBundle ( ) ;
1510
11+ class QiitaItemsProvider implements TreeDataProvider < TreeItem > {
12+ private _onDidChangeTreeData : EventEmitter < TreeItem | undefined > = new EventEmitter < TreeItem | undefined > ( ) ;
13+ public readonly onDidChangeTreeData : Event < TreeItem | undefined > = this . _onDidChangeTreeData . event ;
1614
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- }
15+ /** 取得した投稿 */
16+ protected items : Item [ ] = [ ] ;
3117
32- public resourceUri = Uri . parse ( 'file:///text.md' ) ; // Hack: アイコンをMarkdownのものに
33- public contextValue = 'qiitaItems' ;
34- }
18+ /** 全件取得したかどうか */
19+ protected done = false ;
3520
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 ;
21+ /** 自分の投稿の配列を返すイテラブル */
22+ protected itemsIterable = client . fetchMyItems ( { page : 1 , per_page : 60 } ) ;
6223
6324 /**
6425 * ツリーデータを更新
6526 */
6627 public async refresh ( ) {
67- await itemsStore . refreshItems ( ) ;
6828 this . _onDidChangeTreeData . fire ( ) ;
6929 }
7030
@@ -82,7 +42,7 @@ class QiitaItemsProvider implements TreeDataProvider<QiitaItem|ExpandItems> {
8242 * @param element 取得するelement
8343 */
8444 public async getChildren ( ) : Promise < ( QiitaItem | ExpandItems ) [ ] > {
85- if ( itemsStore . items . size === 0 ) {
45+ if ( ! itemsStore . items || ! itemsStore . items . length ) {
8646 await itemsStore . refreshItems ( ) ;
8747 }
8848
@@ -105,6 +65,24 @@ class QiitaItemsProvider implements TreeDataProvider<QiitaItem|ExpandItems> {
10565
10666 return children ;
10767 }
68+
69+ /**
70+ * イテラブルを初期化して最初のページを再取得
71+ */
72+ public async refreshItems ( ) {
73+ const { value : items , done } = await this . itemsIterable . next ( 'reset' ) ;
74+ this . items = items ;
75+ this . done = done ;
76+ }
77+
78+ /**
79+ * イテラブルのnextを呼び出し
80+ */
81+ public async expandItems ( ) {
82+ const { value : items , done } = await this . itemsIterable . next ( ) ;
83+ this . items . concat ( items ) ;
84+ this . done = done ;
85+ }
10886}
10987
11088export const qiitaItemsProvider = new QiitaItemsProvider ( ) ;
0 commit comments