1- import type { TreeViewNode } from "reactive-vscode" ;
2- import type { TreeItem } from "vscode" ;
3- import { UNICODE_VERSION_METADATA } from "@luxass/unicode-utils" ;
4- import { computed , createSingletonComposable , ref , useTreeView } from "reactive-vscode" ;
5- import { ThemeIcon , TreeItemCollapsibleState } from "vscode" ;
6- import { useUCDStore } from "../composables/useUCDStore" ;
7- import { getFilesByVersion } from "../lib/files" ;
1+ import type { UCDTreeItem } from "../composables/useUCDExplorer" ;
2+ import { useTreeView } from "reactive-vscode" ;
3+ import { useUCDExplorer } from "../composables/useUCDExplorer" ;
84import { logger } from "../logger" ;
95
10- export interface UCDTreeItem extends TreeItem {
11- __ucd ?: {
12- ucdUrl : string ;
13- version : string ;
14- } ;
15- }
16-
17- export const useUCDExplorer = createSingletonComposable ( ( ) => {
18- const store = useUCDStore ( ) ;
19-
20- const childrenCache = ref < Map < string , TreeViewNode [ ] > > ( new Map ( ) ) ;
21- const loadingPromises = ref < Map < string , Promise < TreeViewNode [ ] > > > ( new Map ( ) ) ;
22-
23- async function loadChildrenForVersion ( version : string ) : Promise < TreeViewNode [ ] > {
24- const cached = childrenCache . value . get ( version ) ;
25- if ( cached ) {
26- return cached ;
27- }
28-
29- // return existing promise if already loading (prevents duplicate requests)
30- const existingPromise = loadingPromises . value . get ( version ) ;
31- if ( existingPromise ) {
32- return existingPromise ;
33- }
34-
35- // create new loading promise
36- const loadingPromise = ( async ( ) => {
37- try {
38- const files = await getFilesByVersion ( store . value ! , version ) ;
39- childrenCache . value . set ( version , files ) ;
40- return files ;
41- } catch ( error ) {
42- logger . error ( `Failed to load files for version ${ version } :` , error ) ;
43- return [ ] ;
44- } finally {
45- // clean up loading promise regardless of success/failure
46- loadingPromises . value . delete ( version ) ;
47- }
48- } ) ( ) ;
6+ export function initializeUCDExplorerView ( ) {
7+ const explorer = useUCDExplorer ( ) ;
498
50- // store the promise to prevent duplicate requests
51- loadingPromises . value . set ( version , loadingPromise ) ;
52- return loadingPromise ;
53- }
54-
55- const nodes = computed < TreeViewNode [ ] > ( ( ) =>
56- UNICODE_VERSION_METADATA . map ( ( metadata ) => {
57- const version = metadata . version ;
58- return {
59- treeItem : {
60- iconPath : new ThemeIcon ( "folder" ) ,
61- label : metadata . version + ( metadata . status === "draft" ? " (Draft)" : "" ) ,
62- description : metadata . date ? `Released in ${ metadata . date } ` : "" ,
63- tooltip : `Documentation: ${ metadata . documentationUrl } \nUCD URL: ${ metadata . ucdUrl } ` ,
64- collapsibleState : TreeItemCollapsibleState . Collapsed ,
65- contextValue : "ucd:version-folder" ,
66- __ucd : metadata ,
67- } as UCDTreeItem ,
68- children : childrenCache . value . get ( version ) || [ ] ,
69- } ;
70- } ) ,
71- ) ;
72-
73- const view = useTreeView ( "ucd:explorer" , nodes , {
9+ const view = useTreeView ( "ucd:explorer" , explorer . nodes , {
7410 showCollapseAll : true ,
7511 } ) ;
7612
@@ -84,13 +20,13 @@ export const useUCDExplorer = createSingletonComposable(() => {
8420 if ( treeItem . contextValue === "ucd:version-folder" ) {
8521 const version = ( treeItem as UCDTreeItem ) . __ucd ?. version ;
8622 if ( version ) {
87- await loadChildrenForVersion ( version ) ;
23+ await explorer . loadChildrenForVersion ( version ) ;
8824 }
8925 }
9026 } catch ( err ) {
9127 logger . error ( "An error occurred while expanding entry in UCD Explorer" , err ) ;
9228 }
9329 } ) ;
9430
95- return view ;
96- } ) ;
31+ return { view, explorer } ;
32+ }
0 commit comments