@zhin.js/client 1.0.17 → 1.1.0

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.
Files changed (116) hide show
  1. package/client/app.ts +228 -0
  2. package/client/bootstrap/loadConsoleEntries.test.ts +32 -0
  3. package/client/bootstrap/loadConsoleEntries.ts +149 -0
  4. package/client/console-utils/cn.ts +6 -0
  5. package/client/console-utils/remoteApi.ts +48 -0
  6. package/client/index.ts +61 -14
  7. package/client/persistence/idb-store.ts +76 -0
  8. package/client/runtime/index.ts +12 -0
  9. package/client/store/createRegistryStore.ts +46 -0
  10. package/client/websocket/hooks.ts +218 -510
  11. package/client/websocket/index.ts +6 -43
  12. package/client/websocket/instance.ts +10 -32
  13. package/client/websocket/manager.ts +301 -385
  14. package/client/websocket/remote-settings.ts +25 -0
  15. package/client/websocket/types.ts +58 -222
  16. package/dist/app.d.ts +95 -0
  17. package/dist/app.d.ts.map +1 -0
  18. package/dist/app.js +147 -0
  19. package/dist/app.js.map +1 -0
  20. package/dist/bootstrap/loadConsoleEntries.d.ts +26 -0
  21. package/dist/bootstrap/loadConsoleEntries.d.ts.map +1 -0
  22. package/dist/bootstrap/loadConsoleEntries.js +111 -0
  23. package/dist/bootstrap/loadConsoleEntries.js.map +1 -0
  24. package/dist/bootstrap/loadConsoleEntries.test.d.ts +2 -0
  25. package/dist/bootstrap/loadConsoleEntries.test.d.ts.map +1 -0
  26. package/dist/bootstrap/loadConsoleEntries.test.js +27 -0
  27. package/dist/bootstrap/loadConsoleEntries.test.js.map +1 -0
  28. package/dist/console-utils/cn.d.ts +3 -0
  29. package/dist/console-utils/cn.d.ts.map +1 -0
  30. package/dist/console-utils/cn.js +6 -0
  31. package/dist/console-utils/cn.js.map +1 -0
  32. package/dist/console-utils/remoteApi.d.ts +7 -0
  33. package/dist/console-utils/remoteApi.d.ts.map +1 -0
  34. package/dist/console-utils/remoteApi.js +41 -0
  35. package/dist/console-utils/remoteApi.js.map +1 -0
  36. package/dist/index.d.ts +11 -7
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +13 -14
  39. package/dist/index.js.map +1 -1
  40. package/dist/persistence/idb-store.d.ts +15 -0
  41. package/dist/persistence/idb-store.d.ts.map +1 -0
  42. package/dist/persistence/idb-store.js +61 -0
  43. package/dist/persistence/idb-store.js.map +1 -0
  44. package/dist/runtime/index.d.ts +6 -0
  45. package/dist/runtime/index.d.ts.map +1 -0
  46. package/dist/runtime/index.js +10 -0
  47. package/dist/runtime/index.js.map +1 -0
  48. package/dist/store/createRegistryStore.d.ts +9 -0
  49. package/dist/store/createRegistryStore.d.ts.map +1 -0
  50. package/dist/store/createRegistryStore.js +38 -0
  51. package/dist/store/createRegistryStore.js.map +1 -0
  52. package/dist/websocket/hooks.d.ts +35 -58
  53. package/dist/websocket/hooks.d.ts.map +1 -1
  54. package/dist/websocket/hooks.js +134 -410
  55. package/dist/websocket/hooks.js.map +1 -1
  56. package/dist/websocket/index.d.ts +5 -10
  57. package/dist/websocket/index.d.ts.map +1 -1
  58. package/dist/websocket/index.js +5 -25
  59. package/dist/websocket/index.js.map +1 -1
  60. package/dist/websocket/instance.d.ts +1 -14
  61. package/dist/websocket/instance.d.ts.map +1 -1
  62. package/dist/websocket/instance.js +2 -20
  63. package/dist/websocket/instance.js.map +1 -1
  64. package/dist/websocket/manager.d.ts +28 -93
  65. package/dist/websocket/manager.d.ts.map +1 -1
  66. package/dist/websocket/manager.js +213 -221
  67. package/dist/websocket/manager.js.map +1 -1
  68. package/dist/websocket/remote-settings.d.ts +5 -0
  69. package/dist/websocket/remote-settings.d.ts.map +1 -0
  70. package/dist/websocket/remote-settings.js +23 -0
  71. package/dist/websocket/remote-settings.js.map +1 -0
  72. package/dist/websocket/types.d.ts +35 -122
  73. package/dist/websocket/types.d.ts.map +1 -1
  74. package/dist/websocket/types.js +4 -13
  75. package/dist/websocket/types.js.map +1 -1
  76. package/package.json +13 -11
  77. package/client/router/index.tsx +0 -54
  78. package/client/store/index.ts +0 -132
  79. package/client/store/reducers/config.ts +0 -135
  80. package/client/store/reducers/index.ts +0 -19
  81. package/client/store/reducers/route.ts +0 -126
  82. package/client/store/reducers/script.ts +0 -109
  83. package/client/store/reducers/ui.ts +0 -31
  84. package/client/websocket/messageHandler.ts +0 -208
  85. package/dist/router/index.d.ts +0 -25
  86. package/dist/router/index.d.ts.map +0 -1
  87. package/dist/router/index.js +0 -48
  88. package/dist/router/index.js.map +0 -1
  89. package/dist/store/index.d.ts +0 -19
  90. package/dist/store/index.d.ts.map +0 -1
  91. package/dist/store/index.js +0 -67
  92. package/dist/store/index.js.map +0 -1
  93. package/dist/store/reducers/config.d.ts +0 -54
  94. package/dist/store/reducers/config.d.ts.map +0 -1
  95. package/dist/store/reducers/config.js +0 -78
  96. package/dist/store/reducers/config.js.map +0 -1
  97. package/dist/store/reducers/index.d.ts +0 -13
  98. package/dist/store/reducers/index.d.ts.map +0 -1
  99. package/dist/store/reducers/index.js +0 -11
  100. package/dist/store/reducers/index.js.map +0 -1
  101. package/dist/store/reducers/route.d.ts +0 -30
  102. package/dist/store/reducers/route.d.ts.map +0 -1
  103. package/dist/store/reducers/route.js +0 -85
  104. package/dist/store/reducers/route.js.map +0 -1
  105. package/dist/store/reducers/script.d.ts +0 -13
  106. package/dist/store/reducers/script.d.ts.map +0 -1
  107. package/dist/store/reducers/script.js +0 -78
  108. package/dist/store/reducers/script.js.map +0 -1
  109. package/dist/store/reducers/ui.d.ts +0 -8
  110. package/dist/store/reducers/ui.d.ts.map +0 -1
  111. package/dist/store/reducers/ui.js +0 -23
  112. package/dist/store/reducers/ui.js.map +0 -1
  113. package/dist/websocket/messageHandler.d.ts +0 -58
  114. package/dist/websocket/messageHandler.d.ts.map +0 -1
  115. package/dist/websocket/messageHandler.js +0 -174
  116. package/dist/websocket/messageHandler.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../client/websocket/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,OAAO,EAAgB,MAAM,SAAS,CAAA;AAMhJ;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB;;;;;;oBAoBzB,GAAG;kBAIC,CAAC,iBAAiB,GAAG,KAAG,OAAO,CAAC,CAAC,CAAC;;;;EAuC1E;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB;;;;;;;2BAgC1B,GAAG,KAAG,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;;;EAwExG;AAMD;;GAEG;AACH,wBAAgB,aAAa;;;;;;;;EA2B5B;AAMD,wBAAgB,aAAa;;;;;;;;;oBA0Bc,MAAM;;;;EAyBhD;AAMD,wBAAgB,WAAW;;cAIwB,MAAM;gBAAU,OAAO;;;;;;;;wBAoB3B,MAAM;yBAWL,MAAM,WAAW,MAAM;;;;EAuBtE;AAMD,wBAAgB,QAAQ;;;;;yBAwBwB,MAAM;yBAWN,MAAM,WAAW,MAAM;;;;EAuBtE;AAMD,wBAAgB,WAAW;;;;;;;uBAiFmB,MAAM;;;oBAxCT,MAAM,SAAS,MAAM,aAAa,MAAM,UAAU,GAAG;oBAUrD,MAAM,OAAO,GAAG;;;oBAUhB,MAAM,OAAO,GAAG,SAAS,GAAG;;;;oBAU5B,MAAM,SAAS,GAAG;;;;mBAsBnB,MAAM,OAAO,MAAM;;;;mBAUnB,MAAM,OAAO,MAAM,SAAS,GAAG,QAAQ,MAAM;;;sBAU1C,MAAM,OAAO,MAAM;;;uBAUlB,MAAM;;;EAuBnD"}
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../client/websocket/hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAEnD,wBAAgB,YAAY,CAAC,OAAO,GAAE,mBAAwB;;;;oBAWzB,OAAO;kBAEvC,CAAC,qBAAqB,OAAO;;EASjC;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;;2BA2BlF,OAAO;;;;;;EAqC5B;AAED,wBAAgB,aAAa;;;;;;;;;oBA2BT,MAAM;;;;EAsBzB;AAED,wBAAgB,QAAQ;;;;;yBAwBwB,MAAM;yBAEjC,MAAM,WAAW,MAAM;;;;EAS3C;AAED,wBAAgB,WAAW;;cAGwB,MAAM;gBAAU,OAAO;;;;;;;;wBAsBrD,MAAM;yBAQN,MAAM,WAAW,MAAM;;;;EAY3C;AAED,wBAAgB,WAAW;;;;;;;uBA0CmB,MAAM;;;oBAJT,MAAM,SAAS,MAAM,aAAa,MAAM,UAAU,OAAO;oBACzD,MAAM,OAAO,OAAO;;;oBACpB,MAAM,OAAO,OAAO,SAAS,OAAO;;;;oBACpC,MAAM,SAAS,OAAO;;;;mBAEvB,MAAM,OAAO,MAAM;;;;mBACnB,MAAM,OAAO,MAAM,SAAS,OAAO,QAAQ,MAAM;;;sBAC9C,MAAM,OAAO,MAAM;;;uBAClB,MAAM;;;EAanD"}
@@ -1,523 +1,247 @@
1
- /**
2
- * WebSocket React Hooks
3
- * 提供在 React 组件中使用 WebSocket 功能的便捷接口
4
- */
5
- import { useCallback, useEffect, useMemo, useState } from 'react';
6
- import { useSelector, useDispatch, selectConfig, selectSchema, selectConfigLoading, selectConfigError, selectConfigConnected, selectAllConfigs, selectAllSchemas, setLoading, setError, updateConfig, updateSchema } from '../store';
7
- import { getWebSocketManager } from './instance';
8
- // ============================================================================
9
- // WebSocket 连接 Hook
10
- // ============================================================================
11
- /**
12
- * WebSocket 连接状态和基础功能 Hook
13
- */
1
+ import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { getWebSocketManager } from "./instance";
14
3
  export function useWebSocket(options = {}) {
15
4
  const { autoConnect = true } = options;
16
5
  const wsManager = getWebSocketManager();
17
- // 从 Redux 获取状态
18
- const connected = useSelector(selectConfigConnected);
19
- const entries = useSelector((state) => state.script?.entries || []);
20
- const loadedScripts = useSelector((state) => state.script?.loadedScripts || []);
21
- // 连接控制
22
- const connect = useCallback(() => {
23
- wsManager.connect();
24
- }, [wsManager]);
25
- const disconnect = useCallback(() => {
26
- wsManager.disconnect();
27
- }, [wsManager]);
28
- // 消息发送
29
- const send = useCallback((message) => {
30
- wsManager.send(message);
31
- }, [wsManager]);
32
- const sendRequest = useCallback(async (message) => {
33
- // 临时使用旧方法,后续完善
34
- return wsManager.sendRequest(message);
35
- }, [wsManager]);
36
- // 状态查询
37
- const isConnected = useCallback(() => {
38
- return wsManager.isConnected();
39
- }, [wsManager]);
40
- const getState = useCallback(() => {
41
- // 临时返回连接状态,后续完善
42
- return wsManager.isConnected() ? 'connected' : 'disconnected';
6
+ const [connected, setConnected] = useState(wsManager.isConnected());
7
+ useEffect(() => {
8
+ return wsManager.onConnectionChange(setConnected);
43
9
  }, [wsManager]);
44
- // 自动连接
10
+ const connect = useCallback(() => wsManager.connect(), [wsManager]);
11
+ const disconnect = useCallback(() => wsManager.disconnect(), [wsManager]);
12
+ const send = useCallback((message) => wsManager.send(message), [wsManager]);
13
+ const sendRequest = useCallback((message) => wsManager.sendRequest(message), [wsManager]);
45
14
  useEffect(() => {
46
- if (autoConnect && !connected) {
15
+ if (autoConnect && !connected)
47
16
  connect();
48
- }
49
17
  }, [autoConnect, connected, connect]);
50
- return {
51
- // 状态
52
- connected,
53
- entries,
54
- loadedScripts,
55
- // 方法
56
- connect,
57
- disconnect,
58
- send,
59
- sendRequest,
60
- isConnected,
61
- getState,
62
- // WebSocket 实例(高级用法)
63
- manager: wsManager
64
- };
18
+ return { connected, connect, disconnect, send, sendRequest, manager: wsManager };
65
19
  }
66
- // ============================================================================
67
- // 配置管理 Hook
68
- // ============================================================================
69
- /**
70
- * 插件配置管理 Hook
71
- */
72
- export function useConfig(pluginName, options = {}) {
73
- const { autoLoad = true, autoLoadSchema = true } = options;
74
- const dispatch = useDispatch();
20
+ export function useConfig(pluginName, options) {
21
+ const { autoLoad = true, autoLoadSchema = true } = options ?? {};
75
22
  const wsManager = getWebSocketManager();
76
- // 状态选择器
77
- const config = useSelector((state) => selectConfig(state, pluginName));
78
- const schema = useSelector((state) => selectSchema(state, pluginName));
79
- const loading = useSelector((state) => selectConfigLoading(state, pluginName));
80
- const error = useSelector((state) => selectConfigError(state, pluginName));
81
- const connected = useSelector(selectConfigConnected);
82
- // 配置操作
23
+ const [connected, setConnected] = useState(wsManager.isConnected());
24
+ const [config, setConfigState] = useState(null);
25
+ const [schema, setSchemaState] = useState(null);
26
+ const [loading, setLoading] = useState(false);
27
+ const [error, setError] = useState(null);
28
+ useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
83
29
  const getConfig = useCallback(async () => {
84
- dispatch(setLoading({ pluginName, loading: true }));
85
- dispatch(setError({ pluginName, error: null }));
30
+ setLoading(true);
31
+ setError(null);
86
32
  try {
87
33
  const result = await wsManager.getConfig(pluginName);
88
- dispatch(updateConfig({ pluginName, config: result }));
34
+ setConfigState(result);
89
35
  return result;
90
36
  }
91
- catch (error) {
92
- console.error('[useConfig] getConfig failed:', error);
93
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
94
- dispatch(setError({ pluginName, error: errorMessage }));
95
- throw error;
37
+ catch (e) {
38
+ setError(e instanceof Error ? e.message : "Unknown error");
39
+ throw e;
96
40
  }
97
41
  finally {
98
- dispatch(setLoading({ pluginName, loading: false }));
42
+ setLoading(false);
99
43
  }
100
- }, [pluginName, wsManager, dispatch]);
44
+ }, [pluginName, wsManager]);
101
45
  const setConfig = useCallback(async (newConfig) => {
102
- dispatch(setLoading({ pluginName, loading: true }));
103
- dispatch(setError({ pluginName, error: null }));
46
+ setLoading(true);
47
+ setError(null);
104
48
  try {
105
- const result = await wsManager.setConfig(pluginName, newConfig);
106
- return { reloaded: result?.reloaded, message: result?.message };
49
+ return await wsManager.setConfig(pluginName, newConfig);
107
50
  }
108
- catch (error) {
109
- console.error('[useConfig] setConfig failed:', error);
110
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
111
- dispatch(setError({ pluginName, error: errorMessage }));
112
- throw error;
51
+ catch (e) {
52
+ setError(e instanceof Error ? e.message : "Unknown error");
53
+ throw e;
113
54
  }
114
55
  finally {
115
- dispatch(setLoading({ pluginName, loading: false }));
56
+ setLoading(false);
116
57
  }
117
- }, [pluginName, wsManager, dispatch]);
58
+ }, [pluginName, wsManager]);
118
59
  const getSchema = useCallback(async () => {
119
60
  try {
120
61
  const result = await wsManager.getSchema(pluginName);
121
- if (result) {
122
- dispatch(updateSchema({ pluginName, schema: result }));
123
- }
62
+ if (result)
63
+ setSchemaState(result);
124
64
  return result;
125
65
  }
126
- catch (error) {
127
- console.error(`Failed to get schema for plugin ${pluginName}:`, error);
128
- throw error;
66
+ catch (e) {
67
+ throw e;
129
68
  }
130
- }, [pluginName, wsManager, dispatch]);
131
- // 重新加载配置和 Schema
132
- const reload = useCallback(async () => {
133
- const promises = [];
134
- if (autoLoad) {
135
- promises.push(getConfig());
136
- }
137
- if (autoLoadSchema) {
138
- promises.push(getSchema());
139
- }
140
- await Promise.all(promises);
141
- }, [autoLoad, autoLoadSchema, getConfig, getSchema]);
142
- // 自动加载
69
+ }, [pluginName, wsManager]);
143
70
  useEffect(() => {
144
- if (connected && autoLoad && !config && !loading) {
145
- getConfig().catch(console.error);
146
- }
71
+ if (connected && autoLoad && !config && !loading)
72
+ getConfig().catch(() => { });
147
73
  }, [connected, autoLoad, config, loading, getConfig]);
148
74
  useEffect(() => {
149
- if (connected && autoLoadSchema && !schema) {
150
- getSchema().catch(console.error);
151
- }
75
+ if (connected && autoLoadSchema && !schema)
76
+ getSchema().catch(() => { });
152
77
  }, [connected, autoLoadSchema, schema, getSchema]);
153
- return useMemo(() => ({
154
- // 状态
155
- config,
156
- schema,
157
- loading,
158
- error,
159
- connected,
160
- // 方法
161
- getConfig,
162
- setConfig,
163
- getSchema,
164
- reload
165
- }), [config, schema, loading, error, connected, getConfig, setConfig, getSchema, reload]);
78
+ return useMemo(() => ({ config, schema, loading, error, connected, getConfig, setConfig, getSchema }), [config, schema, loading, error, connected, getConfig, setConfig, getSchema]);
166
79
  }
167
- // ============================================================================
168
- // 批量配置管理 Hook
169
- // ============================================================================
170
- /**
171
- * 所有配置管理 Hook
172
- */
173
- export function useAllConfigs() {
174
- const wsManager = getWebSocketManager();
175
- const allConfigs = useSelector(selectAllConfigs);
176
- const allSchemas = useSelector(selectAllSchemas);
177
- const connected = useSelector(selectConfigConnected);
178
- const refreshAll = useCallback(async () => {
179
- try {
180
- const [configs, schemas] = await Promise.all([
181
- wsManager.getAllConfigs(),
182
- wsManager.getAllSchemas()
183
- ]);
184
- return { configs, schemas };
185
- }
186
- catch (error) {
187
- console.error('Failed to refresh all configs:', error);
188
- throw error;
189
- }
190
- }, [wsManager]);
191
- return useMemo(() => ({
192
- configs: allConfigs,
193
- schemas: allSchemas,
194
- connected,
195
- refreshAll
196
- }), [allConfigs, allSchemas, connected, refreshAll]);
197
- }
198
- // ============================================================================
199
- // 配置文件 YAML 读写 Hook
200
- // ============================================================================
201
80
  export function useConfigYaml() {
202
81
  const wsManager = getWebSocketManager();
203
- const connected = useSelector(selectConfigConnected);
204
- const [yaml, setYaml] = useState('');
82
+ const [connected, setConnected] = useState(wsManager.isConnected());
83
+ const [yaml, setYaml] = useState("");
205
84
  const [pluginKeys, setPluginKeys] = useState([]);
206
- const [loading, setLoadingState] = useState(false);
207
- const [error, setErrorState] = useState(null);
85
+ const [loading, setLoading] = useState(false);
86
+ const [error, setError] = useState(null);
87
+ useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
208
88
  const load = useCallback(async () => {
209
- setLoadingState(true);
210
- setErrorState(null);
89
+ setLoading(true);
90
+ setError(null);
211
91
  try {
212
92
  const result = await wsManager.getConfigYaml();
213
93
  setYaml(result.yaml);
214
94
  setPluginKeys(result.pluginKeys);
215
95
  return result;
216
96
  }
217
- catch (err) {
218
- const msg = err instanceof Error ? err.message : 'Unknown error';
219
- setErrorState(msg);
220
- throw err;
97
+ catch (e) {
98
+ setError(e instanceof Error ? e.message : "Unknown error");
99
+ throw e;
221
100
  }
222
101
  finally {
223
- setLoadingState(false);
102
+ setLoading(false);
224
103
  }
225
104
  }, [wsManager]);
226
105
  const save = useCallback(async (content) => {
227
- setLoadingState(true);
228
- setErrorState(null);
106
+ setLoading(true);
107
+ setError(null);
229
108
  try {
230
109
  const result = await wsManager.saveConfigYaml(content);
231
110
  setYaml(content);
232
111
  return result;
233
112
  }
234
- catch (err) {
235
- const msg = err instanceof Error ? err.message : 'Unknown error';
236
- setErrorState(msg);
237
- throw err;
113
+ catch (e) {
114
+ setError(e instanceof Error ? e.message : "Unknown error");
115
+ throw e;
238
116
  }
239
117
  finally {
240
- setLoadingState(false);
118
+ setLoading(false);
241
119
  }
242
120
  }, [wsManager]);
243
121
  useEffect(() => {
244
- if (connected && !yaml && !loading) {
122
+ if (connected && !yaml && !loading)
245
123
  load().catch(() => { });
246
- }
247
124
  }, [connected, yaml, loading, load]);
248
- return useMemo(() => ({
249
- yaml, pluginKeys, loading, error, load, save
250
- }), [yaml, pluginKeys, loading, error, load, save]);
251
- }
252
- // ============================================================================
253
- // 环境变量文件管理 Hook
254
- // ============================================================================
255
- export function useEnvFiles() {
256
- const wsManager = getWebSocketManager();
257
- const connected = useSelector(selectConfigConnected);
258
- const [files, setFiles] = useState([]);
259
- const [loading, setLoadingState] = useState(false);
260
- const [error, setErrorState] = useState(null);
261
- const listFiles = useCallback(async () => {
262
- setLoadingState(true);
263
- setErrorState(null);
264
- try {
265
- const result = await wsManager.getEnvList();
266
- setFiles(result.files);
267
- return result.files;
268
- }
269
- catch (err) {
270
- const msg = err instanceof Error ? err.message : 'Unknown error';
271
- setErrorState(msg);
272
- throw err;
273
- }
274
- finally {
275
- setLoadingState(false);
276
- }
277
- }, [wsManager]);
278
- const getFile = useCallback(async (filename) => {
279
- try {
280
- const result = await wsManager.getEnvFile(filename);
281
- return result.content;
282
- }
283
- catch (err) {
284
- const msg = err instanceof Error ? err.message : 'Unknown error';
285
- setErrorState(msg);
286
- throw err;
287
- }
288
- }, [wsManager]);
289
- const saveFile = useCallback(async (filename, content) => {
290
- setLoadingState(true);
291
- setErrorState(null);
292
- try {
293
- return await wsManager.saveEnvFile(filename, content);
294
- }
295
- catch (err) {
296
- const msg = err instanceof Error ? err.message : 'Unknown error';
297
- setErrorState(msg);
298
- throw err;
299
- }
300
- finally {
301
- setLoadingState(false);
302
- }
303
- }, [wsManager]);
304
- useEffect(() => {
305
- if (connected && files.length === 0 && !loading) {
306
- listFiles().catch(() => { });
307
- }
308
- }, [connected, files.length, loading, listFiles]);
309
- return useMemo(() => ({
310
- files, loading, error, listFiles, getFile, saveFile
311
- }), [files, loading, error, listFiles, getFile, saveFile]);
125
+ return useMemo(() => ({ yaml, pluginKeys, loading, error, load, save }), [yaml, pluginKeys, loading, error, load, save]);
312
126
  }
313
- // ============================================================================
314
- // 文件管理 Hook
315
- // ============================================================================
316
127
  export function useFiles() {
317
128
  const wsManager = getWebSocketManager();
318
- const connected = useSelector(selectConfigConnected);
129
+ const [connected, setConnected] = useState(wsManager.isConnected());
319
130
  const [tree, setTree] = useState([]);
320
- const [loading, setLoadingState] = useState(false);
321
- const [error, setErrorState] = useState(null);
131
+ const [loading, setLoading] = useState(false);
132
+ const [error, setError] = useState(null);
133
+ useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
322
134
  const loadTree = useCallback(async () => {
323
- setLoadingState(true);
324
- setErrorState(null);
135
+ setLoading(true);
136
+ setError(null);
325
137
  try {
326
138
  const result = await wsManager.getFileTree();
327
139
  setTree(result.tree);
328
140
  return result.tree;
329
141
  }
330
- catch (err) {
331
- const msg = err instanceof Error ? err.message : 'Unknown error';
332
- setErrorState(msg);
333
- throw err;
142
+ catch (e) {
143
+ setError(e instanceof Error ? e.message : "Unknown error");
144
+ throw e;
334
145
  }
335
146
  finally {
336
- setLoadingState(false);
147
+ setLoading(false);
337
148
  }
338
149
  }, [wsManager]);
339
- const readFile = useCallback(async (filePath) => {
340
- try {
341
- const result = await wsManager.readFile(filePath);
342
- return result.content;
343
- }
344
- catch (err) {
345
- const msg = err instanceof Error ? err.message : 'Unknown error';
346
- setErrorState(msg);
347
- throw err;
348
- }
349
- }, [wsManager]);
350
- const saveFile = useCallback(async (filePath, content) => {
351
- setLoadingState(true);
352
- setErrorState(null);
150
+ const readFile = useCallback(async (filePath) => (await wsManager.readFile(filePath)).content, [wsManager]);
151
+ const saveFile = useCallback(async (filePath, content) => wsManager.saveFile(filePath, content), [wsManager]);
152
+ useEffect(() => {
153
+ if (connected && tree.length === 0 && !loading)
154
+ loadTree().catch(() => { });
155
+ }, [connected, tree.length, loading, loadTree]);
156
+ return useMemo(() => ({ tree, loading, error, loadTree, readFile, saveFile }), [tree, loading, error, loadTree, readFile, saveFile]);
157
+ }
158
+ export function useEnvFiles() {
159
+ const wsManager = getWebSocketManager();
160
+ const [connected, setConnected] = useState(wsManager.isConnected());
161
+ const [files, setFiles] = useState([]);
162
+ const [loading, setLoading] = useState(false);
163
+ const [error, setError] = useState(null);
164
+ useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
165
+ const listFiles = useCallback(async () => {
166
+ setLoading(true);
167
+ setError(null);
353
168
  try {
354
- return await wsManager.saveFile(filePath, content);
169
+ const result = await wsManager.getEnvList();
170
+ setFiles(result.files);
171
+ return result.files;
355
172
  }
356
- catch (err) {
357
- const msg = err instanceof Error ? err.message : 'Unknown error';
358
- setErrorState(msg);
359
- throw err;
173
+ catch (e) {
174
+ setError(e instanceof Error ? e.message : "Unknown error");
175
+ throw e;
360
176
  }
361
177
  finally {
362
- setLoadingState(false);
178
+ setLoading(false);
363
179
  }
364
180
  }, [wsManager]);
181
+ const getFile = useCallback(async (filename) => {
182
+ const result = await wsManager.getEnvFile(filename);
183
+ return result.content;
184
+ }, [wsManager]);
185
+ const saveFile = useCallback(async (filename, content) => wsManager.saveEnvFile(filename, content), [wsManager]);
365
186
  useEffect(() => {
366
- if (connected && tree.length === 0 && !loading) {
367
- loadTree().catch(() => { });
368
- }
369
- }, [connected, tree.length, loading, loadTree]);
370
- return useMemo(() => ({
371
- tree, loading, error, loadTree, readFile, saveFile
372
- }), [tree, loading, error, loadTree, readFile, saveFile]);
187
+ if (connected && files.length === 0 && !loading)
188
+ listFiles().catch(() => { });
189
+ }, [connected, files.length, loading, listFiles]);
190
+ return useMemo(() => ({ files, loading, error, listFiles, getFile, saveFile }), [files, loading, error, listFiles, getFile, saveFile]);
373
191
  }
374
- // ============================================================================
375
- // 数据库管理 Hook
376
- // ============================================================================
377
192
  export function useDatabase() {
378
193
  const wsManager = getWebSocketManager();
379
- const connected = useSelector(selectConfigConnected);
194
+ const [connected, setConnected] = useState(wsManager.isConnected());
380
195
  const [info, setInfo] = useState(null);
381
196
  const [tables, setTables] = useState([]);
382
- const [loading, setLoadingState] = useState(false);
383
- const [error, setErrorState] = useState(null);
197
+ const [loading, setLoading] = useState(false);
198
+ const [error, setError] = useState(null);
199
+ useEffect(() => wsManager.onConnectionChange(setConnected), [wsManager]);
384
200
  const loadInfo = useCallback(async () => {
385
- setLoadingState(true);
386
- setErrorState(null);
201
+ setLoading(true);
387
202
  try {
388
203
  const result = await wsManager.getDbInfo();
389
204
  setInfo(result);
390
205
  return result;
391
206
  }
392
- catch (err) {
393
- const msg = err instanceof Error ? err.message : 'Unknown error';
394
- setErrorState(msg);
395
- throw err;
207
+ catch (e) {
208
+ setError(e instanceof Error ? e.message : "Unknown error");
209
+ throw e;
396
210
  }
397
211
  finally {
398
- setLoadingState(false);
212
+ setLoading(false);
399
213
  }
400
214
  }, [wsManager]);
401
215
  const loadTables = useCallback(async () => {
402
- setLoadingState(true);
403
- setErrorState(null);
216
+ setLoading(true);
404
217
  try {
405
218
  const result = await wsManager.getDbTables();
406
219
  setTables(result.tables);
407
220
  return result.tables;
408
221
  }
409
- catch (err) {
410
- const msg = err instanceof Error ? err.message : 'Unknown error';
411
- setErrorState(msg);
412
- throw err;
222
+ catch (e) {
223
+ setError(e instanceof Error ? e.message : "Unknown error");
224
+ throw e;
413
225
  }
414
226
  finally {
415
- setLoadingState(false);
416
- }
417
- }, [wsManager]);
418
- const select = useCallback(async (table, page, pageSize, where) => {
419
- try {
420
- return await wsManager.dbSelect(table, page, pageSize, where);
421
- }
422
- catch (err) {
423
- const msg = err instanceof Error ? err.message : 'Unknown error';
424
- setErrorState(msg);
425
- throw err;
426
- }
427
- }, [wsManager]);
428
- const insert = useCallback(async (table, row) => {
429
- try {
430
- return await wsManager.dbInsert(table, row);
431
- }
432
- catch (err) {
433
- const msg = err instanceof Error ? err.message : 'Unknown error';
434
- setErrorState(msg);
435
- throw err;
436
- }
437
- }, [wsManager]);
438
- const update = useCallback(async (table, row, where) => {
439
- try {
440
- return await wsManager.dbUpdate(table, row, where);
441
- }
442
- catch (err) {
443
- const msg = err instanceof Error ? err.message : 'Unknown error';
444
- setErrorState(msg);
445
- throw err;
446
- }
447
- }, [wsManager]);
448
- const remove = useCallback(async (table, where) => {
449
- try {
450
- return await wsManager.dbDelete(table, where);
451
- }
452
- catch (err) {
453
- const msg = err instanceof Error ? err.message : 'Unknown error';
454
- setErrorState(msg);
455
- throw err;
456
- }
457
- }, [wsManager]);
458
- const dropTable = useCallback(async (table) => {
459
- try {
460
- const result = await wsManager.dbDropTable(table);
461
- await loadTables();
462
- return result;
463
- }
464
- catch (err) {
465
- const msg = err instanceof Error ? err.message : 'Unknown error';
466
- setErrorState(msg);
467
- throw err;
468
- }
469
- }, [wsManager, loadTables]);
470
- const kvGet = useCallback(async (table, key) => {
471
- try {
472
- return await wsManager.kvGet(table, key);
473
- }
474
- catch (err) {
475
- const msg = err instanceof Error ? err.message : 'Unknown error';
476
- setErrorState(msg);
477
- throw err;
478
- }
479
- }, [wsManager]);
480
- const kvSet = useCallback(async (table, key, value, ttl) => {
481
- try {
482
- return await wsManager.kvSet(table, key, value, ttl);
483
- }
484
- catch (err) {
485
- const msg = err instanceof Error ? err.message : 'Unknown error';
486
- setErrorState(msg);
487
- throw err;
488
- }
489
- }, [wsManager]);
490
- const kvDelete = useCallback(async (table, key) => {
491
- try {
492
- return await wsManager.kvDelete(table, key);
493
- }
494
- catch (err) {
495
- const msg = err instanceof Error ? err.message : 'Unknown error';
496
- setErrorState(msg);
497
- throw err;
498
- }
499
- }, [wsManager]);
500
- const kvEntries = useCallback(async (table) => {
501
- try {
502
- return await wsManager.kvGetEntries(table);
503
- }
504
- catch (err) {
505
- const msg = err instanceof Error ? err.message : 'Unknown error';
506
- setErrorState(msg);
507
- throw err;
508
- }
509
- }, [wsManager]);
227
+ setLoading(false);
228
+ }
229
+ }, [wsManager]);
230
+ const select = useCallback(async (table, page, pageSize, where) => wsManager.dbSelect(table, page, pageSize, where), [wsManager]);
231
+ const insert = useCallback(async (table, row) => wsManager.dbInsert(table, row), [wsManager]);
232
+ const update = useCallback(async (table, row, where) => wsManager.dbUpdate(table, row, where), [wsManager]);
233
+ const remove = useCallback(async (table, where) => wsManager.dbDelete(table, where), [wsManager]);
234
+ const dropTable = useCallback(async (table) => { const r = await wsManager.dbDropTable(table); await loadTables(); return r; }, [wsManager, loadTables]);
235
+ const kvGet = useCallback(async (table, key) => wsManager.kvGet(table, key), [wsManager]);
236
+ const kvSet = useCallback(async (table, key, value, ttl) => wsManager.kvSet(table, key, value, ttl), [wsManager]);
237
+ const kvDelete = useCallback(async (table, key) => wsManager.kvDelete(table, key), [wsManager]);
238
+ const kvEntries = useCallback(async (table) => wsManager.kvGetEntries(table), [wsManager]);
510
239
  useEffect(() => {
511
240
  if (connected && !info && !loading) {
512
241
  loadInfo().catch(() => { });
513
242
  loadTables().catch(() => { });
514
243
  }
515
244
  }, [connected, info, loading, loadInfo, loadTables]);
516
- return useMemo(() => ({
517
- info, tables, loading, error,
518
- loadInfo, loadTables, dropTable,
519
- select, insert, update, remove,
520
- kvGet, kvSet, kvDelete, kvEntries,
521
- }), [info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries]);
245
+ return useMemo(() => ({ info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries }), [info, tables, loading, error, loadInfo, loadTables, dropTable, select, insert, update, remove, kvGet, kvSet, kvDelete, kvEntries]);
522
246
  }
523
247
  //# sourceMappingURL=hooks.js.map