@lvce-editor/api 9.16.0 → 9.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,10 @@
1
1
  import { ExtensionApiError } from "../ExtensionApiError/ExtensionApiError.js";
2
2
  import { registerStatusBarItemProvider } from "../StatusBarItemProviderRegistry/StatusBarItemProviderRegistry.js";
3
- const handlesByUid = Object.create(null);
3
+ const activeUidByViewId = Object.create(null);
4
+ const handlesByViewId = Object.create(null);
4
5
  const itemsByUid = Object.create(null);
6
+ const renderedUidsByViewId = Object.create(null);
7
+ const viewIdByUid = Object.create(null);
5
8
  const stringProperties = ['ariaLabel', 'icon', 'name', 'onClick', 'text', 'title'];
6
9
  const normalizeStatusBarItem = (item, index) => {
7
10
  if (!item || typeof item !== 'object' || Array.isArray(item)) {
@@ -47,44 +50,91 @@ const areItemsEqual = (oldItems, newItems) => {
47
50
  oldItem.title === newItem.title);
48
51
  });
49
52
  };
50
- const disposeHandles = (uid) => {
51
- for (const handle of handlesByUid[uid] || []) {
53
+ const disposeHandles = (viewId) => {
54
+ for (const handle of handlesByViewId[viewId] || []) {
52
55
  handle.dispose();
53
56
  }
54
- delete handlesByUid[uid];
57
+ delete handlesByViewId[viewId];
55
58
  };
56
- const replaceItems = (uid, viewId, items) => {
57
- disposeHandles(uid);
58
- itemsByUid[uid] = items;
59
- handlesByUid[uid] = items.map((_item, index) => registerStatusBarItemProvider({
59
+ const replaceItems = (viewId, itemCount) => {
60
+ disposeHandles(viewId);
61
+ handlesByViewId[viewId] = Array.from({ length: itemCount }, (_item, index) => registerStatusBarItemProvider({
60
62
  getStatusBarItem() {
61
- return itemsByUid[uid]?.[index];
63
+ return itemsByUid[activeUidByViewId[viewId]]?.[index];
62
64
  },
63
- id: `view:${viewId}:${uid}:${index}`,
65
+ id: `view:${viewId}:${index}`,
64
66
  }));
65
67
  };
68
+ const refreshItems = async (viewId) => {
69
+ await Promise.all((handlesByViewId[viewId] || []).map((handle) => handle.refresh()));
70
+ };
71
+ const setActiveUid = (viewId, uid) => {
72
+ const renderedUids = renderedUidsByViewId[viewId] || [];
73
+ const index = renderedUids.indexOf(uid);
74
+ if (index !== -1) {
75
+ renderedUids.splice(index, 1);
76
+ }
77
+ renderedUids.push(uid);
78
+ renderedUidsByViewId[viewId] = renderedUids;
79
+ activeUidByViewId[viewId] = uid;
80
+ };
66
81
  export const renderViewStatusBarItems = async (uid, viewId, instance) => {
67
82
  if (typeof instance.renderStatusBarItems !== 'function') {
68
83
  return;
69
84
  }
70
85
  const items = normalizeStatusBarItems(await instance.renderStatusBarItems());
71
86
  const oldItems = itemsByUid[uid] || [];
72
- if (areItemsEqual(oldItems, items)) {
87
+ const wasActive = activeUidByViewId[viewId] === uid;
88
+ itemsByUid[uid] = items;
89
+ viewIdByUid[uid] = viewId;
90
+ setActiveUid(viewId, uid);
91
+ if (wasActive && areItemsEqual(oldItems, items)) {
73
92
  return;
74
93
  }
75
- if ((handlesByUid[uid]?.length || 0) !== items.length) {
76
- replaceItems(uid, viewId, items);
94
+ if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
95
+ replaceItems(viewId, items.length);
77
96
  return;
78
97
  }
79
- itemsByUid[uid] = items;
80
- await Promise.all((handlesByUid[uid] || []).map((handle) => handle.refresh()));
98
+ await refreshItems(viewId);
81
99
  };
82
100
  export const disposeViewStatusBarItems = (uid) => {
83
- disposeHandles(uid);
101
+ const viewId = viewIdByUid[uid];
102
+ if (!viewId) {
103
+ return;
104
+ }
84
105
  delete itemsByUid[uid];
106
+ delete viewIdByUid[uid];
107
+ const renderedUids = renderedUidsByViewId[viewId] || [];
108
+ const remainingUids = renderedUids.filter((renderedUid) => renderedUid !== uid);
109
+ if (remainingUids.length === 0) {
110
+ disposeHandles(viewId);
111
+ delete activeUidByViewId[viewId];
112
+ delete renderedUidsByViewId[viewId];
113
+ return;
114
+ }
115
+ renderedUidsByViewId[viewId] = remainingUids;
116
+ if (activeUidByViewId[viewId] !== uid) {
117
+ return;
118
+ }
119
+ const activeUid = remainingUids.at(-1);
120
+ const items = itemsByUid[activeUid] || [];
121
+ activeUidByViewId[viewId] = activeUid;
122
+ if ((handlesByViewId[viewId]?.length || 0) !== items.length) {
123
+ replaceItems(viewId, items.length);
124
+ return;
125
+ }
126
+ void refreshItems(viewId);
85
127
  };
86
128
  export const resetViewStatusBarItems = () => {
129
+ for (const viewId of Object.keys(handlesByViewId)) {
130
+ disposeHandles(viewId);
131
+ }
87
132
  for (const uid of Object.keys(itemsByUid)) {
88
- disposeViewStatusBarItems(Number(uid));
133
+ delete itemsByUid[Number(uid)];
134
+ delete viewIdByUid[Number(uid)];
135
+ }
136
+ for (const viewId of Object.keys(activeUidByViewId)) {
137
+ delete activeUidByViewId[viewId];
138
+ delete renderedUidsByViewId[viewId];
89
139
  }
90
140
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/api",
3
- "version": "9.16.0",
3
+ "version": "9.16.1",
4
4
  "description": "Tree-shakeable extension API for Lvce Editor extensions.",
5
5
  "keywords": [
6
6
  "lvce-editor",