Skip to content

Commit 3bcec5e

Browse files
committed
feat: add 'Update AI Queue Status' command and integrate it into the status bar and API handling
1 parent 5f74419 commit 3bcec5e

File tree

5 files changed

+148
-8
lines changed

5 files changed

+148
-8
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ A VS Code extension for managing and generating code from YAPI APIs.
4242
| `crabu.compareWithLatestVersion` | Compare with Latest Version |
4343
| `crabu.copyApiPath` | Copy API Path |
4444
| `crabu.aiGenerateMock` | AI Generate Mock |
45+
| `crabu.updateAiQueueStatus` | Crabu: Update AI Queue Status |
4546

4647
<!-- commands -->
4748

package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@
141141
"title": "AI Generate Mock",
142142
"icon": "$(copilot)",
143143
"enablement": "viewItem == mockItem"
144+
},
145+
{
146+
"command": "crabu.updateAiQueueStatus",
147+
"title": "Update AI Queue Status",
148+
"category": "Crabu"
144149
}
145150
],
146151
"configuration": {
@@ -334,6 +339,7 @@
334339
"@types/node": "catalog:types",
335340
"@types/vscode": "^1.99.3",
336341
"@vscode/vsce": "catalog:dev",
342+
"@vueuse/core": "catalog:frontend",
337343
"bumpp": "catalog:dev",
338344
"comment-json": "catalog:build",
339345
"eslint": "catalog:dev",

pnpm-lock.yaml

Lines changed: 97 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/status.ts

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useTimeoutPoll } from '@vueuse/core'
12
import { computed, ref, useCommand, useStatusBarItem, watchEffect } from 'reactive-vscode'
23
import { StatusBarAlignment, ThemeColor, window } from 'vscode'
34
import { config } from './config'
@@ -9,33 +10,57 @@ export async function useCrabuMockStatus() {
910
const crabuMockStatus = ref(false)
1011
const crabuMockStatusError = ref(false)
1112

12-
const statusBarItemText = computed(() => {
13+
const crabuStatusBarItemText = computed(() => {
1314
if (crabuMockStatusError.value)
1415
return 'Crabu 服务异常'
1516

1617
return crabuMockStatus.value ? 'Mock 已启动' : 'Mock 未启动'
1718
})
1819

19-
const statusBarItemColor = computed(() => {
20+
const crabuStatusBarItemColor = computed(() => {
2021
return crabuMockStatus.value
2122
? new ThemeColor('statusBarItem.prominentBackground')
2223
: undefined
2324
})
2425

25-
const statusBarItemBackgroundColor = computed(() => {
26+
const crabuStatusBarItemBackgroundColor = computed(() => {
2627
return crabuMockStatusError.value
2728
? new ThemeColor('statusBarItem.warningBackground')
2829
: undefined
2930
})
3031

31-
const statusBarItem = useStatusBarItem({
32+
const crabuStatusBarItem = useStatusBarItem({
3233
alignment: StatusBarAlignment.Left,
33-
text: statusBarItemText,
34-
color: statusBarItemColor,
35-
backgroundColor: statusBarItemBackgroundColor,
34+
text: crabuStatusBarItemText,
35+
color: crabuStatusBarItemColor,
36+
backgroundColor: crabuStatusBarItemBackgroundColor,
3637
command: commands.switchMockStatus,
3738
})
3839

40+
const aiQueueStatusBarItemText = ref('')
41+
const { pause, resume } = useTimeoutPoll(updateAiQueueStatus, 1000)
42+
43+
async function updateAiQueueStatus() {
44+
logger.info('更新 AI 队列状态中...')
45+
const aiQueue = await ofetch<{
46+
processing: number
47+
waiting: number
48+
}>(`${config.crabuServerBaseUrl}/mock/template/ai/process`)
49+
50+
if (aiQueue.processing + aiQueue.waiting === 0) {
51+
pause()
52+
aiQueueStatusBarItemText.value = ''
53+
return
54+
}
55+
aiQueueStatusBarItemText.value = `$(loading~spin) 进行中 ${aiQueue.processing} 排队中 ${aiQueue.waiting}`
56+
}
57+
58+
useStatusBarItem({
59+
alignment: StatusBarAlignment.Left,
60+
text: aiQueueStatusBarItemText,
61+
color: new ThemeColor('statusBarItem.prominentBackground'),
62+
})
63+
3964
window.onDidChangeWindowState((e) => {
4065
if (e.focused) {
4166
updateCrabuMockStatus()
@@ -61,7 +86,7 @@ export async function useCrabuMockStatus() {
6186
return
6287

6388
isSwitching = true
64-
statusBarItem.text = `$(loading~spin) ${crabuMockStatus.value ? '停止中...' : '启动中...'}`
89+
crabuStatusBarItem.text = `$(loading~spin) ${crabuMockStatus.value ? '停止中...' : '启动中...'}`
6590
await sleep(1000)
6691
await ofetch(`${config.crabuServerBaseUrl}/mock/on`, {
6792
method: 'POST',
@@ -71,4 +96,13 @@ export async function useCrabuMockStatus() {
7196

7297
logger.info('Mock 状态更新为:', crabuMockStatus.value)
7398
})
99+
100+
useCommand(commands.updateAiQueueStatus, async (action: 'start' | 'stop') => {
101+
if (action === 'start') {
102+
resume()
103+
}
104+
else {
105+
pause()
106+
}
107+
})
74108
}

src/views/api.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ export const useApiTreeView = createSingletonComposable(async () => {
120120
await ofetch(`${config.crabuServerBaseUrl}/interface/add/${api.project_id}/${api._id}`, { method: 'POST' })
121121
await executeCommand(commands.refreshMockTreeView)
122122
await executeCommand(commands.aiGenerateMock, { treeItem: { mockItem: transformApiToMock(api) } })
123+
await executeCommand(commands.updateAiQueueStatus, 'start')
123124
})
124125

125126
useCommand(commands.addApiGroupToMock, async (event) => {
@@ -145,6 +146,7 @@ export const useApiTreeView = createSingletonComposable(async () => {
145146
try {
146147
await ofetch(`${config.crabuServerBaseUrl}/interface/add/${api.project_id}/${api._id}`, { method: 'POST' })
147148
await executeCommand(commands.aiGenerateMock, { treeItem: { mockItem: transformApiToMock(api) } })
149+
await executeCommand(commands.updateAiQueueStatus, 'start')
148150
progress.report({
149151
message: `正在导入API... ${i + 1}/${totalCount}`,
150152
increment: 100 / totalCount,

0 commit comments

Comments
 (0)