77 workspace ,
88 RelativePattern ,
99 Uri ,
10- FileSystemWatcher
10+ FileSystemWatcher ,
11+ ThemeIcon
1112} from 'vscode' ;
1213import * as yaml from 'js-yaml' ;
1314
@@ -26,6 +27,8 @@ export class DeepnoteTreeDataProvider implements TreeDataProvider<DeepnoteTreeIt
2627
2728 private fileWatcher : FileSystemWatcher | undefined ;
2829 private cachedProjects : Map < string , DeepnoteProject > = new Map ( ) ;
30+ private isInitialScanComplete : boolean = false ;
31+ private initialScanPromise : Promise < void > | undefined ;
2932
3033 constructor ( ) {
3134 this . setupFileWatcher ( ) ;
@@ -38,6 +41,8 @@ export class DeepnoteTreeDataProvider implements TreeDataProvider<DeepnoteTreeIt
3841
3942 public refresh ( ) : void {
4043 this . cachedProjects . clear ( ) ;
44+ this . isInitialScanComplete = false ;
45+ this . initialScanPromise = undefined ;
4146 this . _onDidChangeTreeData . fire ( ) ;
4247 }
4348
@@ -51,6 +56,15 @@ export class DeepnoteTreeDataProvider implements TreeDataProvider<DeepnoteTreeIt
5156 }
5257
5358 if ( ! element ) {
59+ if ( ! this . isInitialScanComplete ) {
60+ if ( ! this . initialScanPromise ) {
61+ this . initialScanPromise = this . performInitialScan ( ) ;
62+ }
63+
64+ // Show loading item
65+ return [ this . createLoadingTreeItem ( ) ] ;
66+ }
67+
5468 return this . getDeepnoteProjectFiles ( ) ;
5569 }
5670
@@ -61,6 +75,28 @@ export class DeepnoteTreeDataProvider implements TreeDataProvider<DeepnoteTreeIt
6175 return [ ] ;
6276 }
6377
78+ private createLoadingTreeItem ( ) : DeepnoteTreeItem {
79+ const loadingItem = new DeepnoteTreeItem (
80+ DeepnoteTreeItemType . Loading ,
81+ { filePath : '' , projectId : '' } ,
82+ null ,
83+ TreeItemCollapsibleState . None
84+ ) ;
85+ loadingItem . label = 'Scanning for Deepnote projects...' ;
86+ loadingItem . iconPath = new ThemeIcon ( 'loading~spin' ) ;
87+ return loadingItem ;
88+ }
89+
90+ private async performInitialScan ( ) : Promise < void > {
91+ try {
92+ await this . getDeepnoteProjectFiles ( ) ;
93+ } finally {
94+ this . isInitialScanComplete = true ;
95+ this . initialScanPromise = undefined ;
96+ this . _onDidChangeTreeData . fire ( ) ;
97+ }
98+ }
99+
64100 private async getDeepnoteProjectFiles ( ) : Promise < DeepnoteTreeItem [ ] > {
65101 const deepnoteFiles : DeepnoteTreeItem [ ] = [ ] ;
66102
0 commit comments