|
2 | 2 | // SPDX-License-Identifier: Apache-2.0 |
3 | 3 |
|
4 | 4 | import { WaveAIModel } from "@/app/aipanel/waveai-model"; |
5 | | -import { getApi } from "@/app/store/global"; |
| 5 | +import { getApi, getBlockComponentModel, getConnStatusAtom, globalStore, WOS } from "@/app/store/global"; |
| 6 | +import type { TermViewModel } from "@/app/view/term/term-model"; |
6 | 7 | import { WorkspaceLayoutModel } from "@/app/workspace/workspace-layout-model"; |
7 | 8 | import { getLayoutModelForStaticTab } from "@/layout/index"; |
8 | 9 | import { base64ToArrayBuffer } from "@/util/util"; |
9 | 10 | import { RpcResponseHelper, WshClient } from "./wshclient"; |
| 11 | +import { RpcApi } from "./wshclientapi"; |
10 | 12 |
|
11 | 13 | export class TabClient extends WshClient { |
12 | 14 | constructor(routeId: string) { |
@@ -103,4 +105,73 @@ export class TabClient extends WshClient { |
103 | 105 |
|
104 | 106 | layoutModel.focusNode(node.id); |
105 | 107 | } |
| 108 | + |
| 109 | + async handle_getfocusedblockdata(rh: RpcResponseHelper): Promise<FocusedBlockData> { |
| 110 | + const layoutModel = getLayoutModelForStaticTab(); |
| 111 | + if (!layoutModel) { |
| 112 | + throw new Error("Layout model not found"); |
| 113 | + } |
| 114 | + |
| 115 | + const focusedNode = globalStore.get(layoutModel.focusedNode); |
| 116 | + const blockId = focusedNode?.data?.blockId; |
| 117 | + |
| 118 | + if (!blockId) { |
| 119 | + return null; |
| 120 | + } |
| 121 | + |
| 122 | + const blockAtom = WOS.getWaveObjectAtom<Block>(WOS.makeORef("block", blockId)); |
| 123 | + const blockData = globalStore.get(blockAtom); |
| 124 | + |
| 125 | + if (!blockData) { |
| 126 | + return null; |
| 127 | + } |
| 128 | + |
| 129 | + const viewType = blockData.meta?.view ?? ""; |
| 130 | + const controller = blockData.meta?.controller ?? ""; |
| 131 | + const connName = blockData.meta?.connection ?? ""; |
| 132 | + |
| 133 | + const result: FocusedBlockData = { |
| 134 | + blockid: blockId, |
| 135 | + viewtype: viewType, |
| 136 | + controller: controller, |
| 137 | + connname: connName, |
| 138 | + blockmeta: blockData.meta ?? {}, |
| 139 | + }; |
| 140 | + |
| 141 | + if (viewType === "term" && controller === "shell") { |
| 142 | + const jobStatus = await RpcApi.BlockJobStatusCommand(this, blockId); |
| 143 | + if (jobStatus) { |
| 144 | + result.termjobstatus = jobStatus; |
| 145 | + } |
| 146 | + } |
| 147 | + |
| 148 | + if (connName) { |
| 149 | + const connStatusAtom = getConnStatusAtom(connName); |
| 150 | + const connStatus = globalStore.get(connStatusAtom); |
| 151 | + if (connStatus) { |
| 152 | + result.connstatus = connStatus; |
| 153 | + } |
| 154 | + } |
| 155 | + |
| 156 | + if (viewType === "term") { |
| 157 | + try { |
| 158 | + const bcm = getBlockComponentModel(blockId); |
| 159 | + if (bcm?.viewModel) { |
| 160 | + const termViewModel = bcm.viewModel as TermViewModel; |
| 161 | + if (termViewModel.termRef?.current?.shellIntegrationStatusAtom) { |
| 162 | + const shellIntegrationStatus = globalStore.get(termViewModel.termRef.current.shellIntegrationStatusAtom); |
| 163 | + result.termshellintegrationstatus = shellIntegrationStatus || ""; |
| 164 | + } |
| 165 | + if (termViewModel.termRef?.current?.lastCommandAtom) { |
| 166 | + const lastCommand = globalStore.get(termViewModel.termRef.current.lastCommandAtom); |
| 167 | + result.termlastcommand = lastCommand || ""; |
| 168 | + } |
| 169 | + } |
| 170 | + } catch (e) { |
| 171 | + console.log("error getting term-specific data", e); |
| 172 | + } |
| 173 | + } |
| 174 | + |
| 175 | + return result; |
| 176 | + } |
106 | 177 | } |
0 commit comments