@@ -4,30 +4,49 @@ import * as vscode from 'vscode';
44
55export function useInsidersStatusItem ( context : vscode . ExtensionContext ) {
66 const item = vscode . languages . createLanguageStatusItem ( 'vue-insider' , 'vue' ) ;
7- item . text = 'Checking for Updates...' ;
8- item . busy = true ;
9- let succeed = false ;
7+ item . command = {
8+ title : 'Fetch Versions' ,
9+ command : 'vue-insiders.fetch' ,
10+ } ;
11+ let status : 'idle' | 'pending' | 'success' = 'idle' ;
12+
13+ useCommand ( 'vue-insiders.fetch' , ( ) => {
14+ if ( status === 'idle' ) {
15+ fetchJson ( ) ;
16+ }
17+ } ) ;
1018
1119 fetchJson ( ) ;
1220
1321 async function fetchJson ( ) {
22+ item . busy = true ;
23+ item . text = 'Checking for Updates...' ;
24+ item . severity = vscode . LanguageStatusSeverity . Warning ;
25+ status = 'pending' ;
26+
1427 for ( const url of [
1528 'https://raw.githubusercontent.com/vuejs/language-tools/HEAD/insiders.json' ,
1629 'https://cdn.jsdelivr.net/gh/vuejs/language-tools/insiders.json' ,
1730 ] ) {
1831 try {
19- const res = await fetch ( url ) ;
32+ const controller = new AbortController ( ) ;
33+ setTimeout ( ( ) => controller . abort ( ) , 15000 ) ;
34+
35+ const res = await fetch ( url , {
36+ signal : controller . signal ,
37+ } ) ;
2038 onJson ( await res . json ( ) as any ) ;
21- succeed = true ;
39+ status = 'success' ;
2240 break ;
2341 }
2442 catch { } ;
2543 }
2644
2745 item . busy = false ;
28- if ( ! succeed ) {
46+ if ( status !== 'success' ) {
2947 item . text = 'Failed to Fetch Versions' ;
3048 item . severity = vscode . LanguageStatusSeverity . Error ;
49+ status = 'idle' ;
3150 }
3251 }
3352
0 commit comments