Skip to content

Commit bb8918b

Browse files
committed
feat (core): 增加状态栏加载状态
1 parent 0323ca9 commit bb8918b

4 files changed

Lines changed: 91 additions & 13 deletions

File tree

src/App.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
</div>
4040

4141
<!-- 状态栏 -->
42-
<StatusBar :env-info="envInfo" :execution-time="lastExecutionTime" :code-length="(code || '').length"/>
42+
<StatusBar :env-info="envInfo" :is-loading="isLoadingEnvInfo" :execution-time="lastExecutionTime" :code-length="(code || '').length"/>
4343

4444
<!-- 关于组件 -->
4545
<About v-if="showAbout" @close="closeAbout"/>
@@ -96,6 +96,7 @@ const {
9696
currentLanguage,
9797
supportedLanguages,
9898
envInfo,
99+
isLoadingEnvInfo,
99100
getLanguageDisplayName,
100101
handleLanguageChange,
101102
initialize

src/components/StatusBar.vue

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
<template>
22
<div class="text-white px-3.5 py-1 text-sm flex items-center justify-between"
3-
:class="[envInfo.installed ? 'bg-green-500' : 'bg-red-500']">
3+
:class="[getStatusColor()]">
44
<div class="flex items-center space-x-6">
55
<div class="flex items-center space-x-2">
6-
<component :is="envInfo.installed ? CheckCircle : XCircle"
7-
:class="envInfo.installed ? 'text-green-300' : 'text-white'"
6+
<component :is="getStatusIcon()"
7+
:class="[getIconClass(), { 'animate-spin': isLoading }]"
88
class="w-4 h-4"/>
9-
<span>{{ envInfo.installed ? `${ envInfo.language }: ${ envInfo.version }` : `${ envInfo.language }: 环境未安装` }}</span>
9+
<span>{{ getStatusText() }}</span>
1010
</div>
1111

1212
<div v-if="executionTime > 0" class="flex items-center space-x-2">
@@ -25,16 +25,28 @@
2525
</template>
2626

2727
<script setup lang="ts">
28-
import { CheckCircle, Clock, Hash, XCircle } from 'lucide-vue-next'
28+
import { Clock, Hash } from 'lucide-vue-next'
29+
import { toRefs } from 'vue'
30+
import { useStatusBar } from '../composables/useStatusBar'
2931
30-
defineProps<{
32+
const props = defineProps<{
3133
envInfo: {
3234
installed: boolean
3335
version: string
3436
path: string,
3537
language: string
3638
}
39+
isLoading: boolean
3740
executionTime: number
3841
codeLength: number
3942
}>()
40-
</script>
43+
44+
const { envInfo, isLoading } = toRefs(props)
45+
46+
const {
47+
getStatusColor,
48+
getStatusIcon,
49+
getIconClass,
50+
getStatusText
51+
} = useStatusBar(envInfo, isLoading)
52+
</script>

src/composables/useLanguageManager.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ export function useLanguageManager(
1212
const supportedLanguages = ref<Language[]>([])
1313
const globalConfig = ref(null as any)
1414

15+
// 🔥 添加加载状态
16+
const isLoadingEnvInfo = ref(false)
17+
1518
const envInfo = ref<EnvInfo>({
1619
installed: false,
1720
version: '检查中...',
@@ -30,6 +33,15 @@ export function useLanguageManager(
3033
return
3134
}
3235

36+
// 🔥 设置加载状态
37+
isLoadingEnvInfo.value = true
38+
envInfo.value = {
39+
installed: false,
40+
version: '检查中...',
41+
path: '检查中...',
42+
language: getLanguageDisplayName(currentLanguage.value)
43+
}
44+
3345
try {
3446
const info: LanguageInfo = await invoke('get_info', {
3547
language: currentLanguage.value
@@ -48,9 +60,12 @@ export function useLanguageManager(
4860
installed: false,
4961
version: 'Error',
5062
path: 'Error',
51-
language: currentLanguage.value
63+
language: getLanguageDisplayName(currentLanguage.value)
5264
}
5365
}
66+
finally {
67+
isLoadingEnvInfo.value = false
68+
}
5469
}
5570

5671
const getSupportedLanguages = async () => {
@@ -93,8 +108,7 @@ export function useLanguageManager(
93108
// 清空输出
94109
clearOutput()
95110

96-
// 刷新环境信息
97-
await refreshEnvInfo()
111+
refreshEnvInfo()
98112

99113
toast.info(`已切换到 ${ getLanguageDisplayName(newLanguage) }`)
100114
}
@@ -115,8 +129,7 @@ export function useLanguageManager(
115129
console.log('使用的模板:', template)
116130
code.value = template
117131

118-
// 刷新环境信息(此时 currentLanguage 已经正确设置)
119-
await refreshEnvInfo()
132+
refreshEnvInfo()
120133
}
121134
else {
122135
code.value = 'No supported languages found'
@@ -127,6 +140,7 @@ export function useLanguageManager(
127140
currentLanguage,
128141
supportedLanguages,
129142
envInfo,
143+
isLoadingEnvInfo,
130144
getLanguageDisplayName,
131145
handleLanguageChange,
132146
initialize

src/composables/useStatusBar.ts

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import { type Ref } from 'vue'
2+
import { CheckCircle, Loader2, XCircle } from 'lucide-vue-next'
3+
import { EnvInfo } from '../types/app.ts'
4+
5+
export function useStatusBar(envInfo: Ref<EnvInfo>, isLoading: Ref<boolean>)
6+
{
7+
// 计算状态颜色
8+
const getStatusColor = () => {
9+
if (isLoading.value) {
10+
return 'bg-blue-500'
11+
}
12+
return envInfo.value.installed ? 'bg-green-500' : 'bg-red-500'
13+
}
14+
15+
// 计算状态图标
16+
const getStatusIcon = () => {
17+
if (isLoading.value) {
18+
return Loader2
19+
}
20+
return envInfo.value.installed ? CheckCircle : XCircle
21+
}
22+
23+
// 计算图标样式
24+
const getIconClass = () => {
25+
if (isLoading.value) {
26+
return 'text-blue-200'
27+
}
28+
return envInfo.value.installed ? 'text-green-300' : 'text-white'
29+
}
30+
31+
// 计算状态文本
32+
const getStatusText = () => {
33+
if (isLoading.value) {
34+
return `${ envInfo.value.language }: 检查环境中...`
35+
}
36+
37+
if (envInfo.value.installed) {
38+
return `${ envInfo.value.language }: ${ envInfo.value.version }`
39+
}
40+
else {
41+
return `${ envInfo.value.language }: 环境未安装`
42+
}
43+
}
44+
45+
return {
46+
getStatusColor,
47+
getStatusIcon,
48+
getIconClass,
49+
getStatusText
50+
}
51+
}

0 commit comments

Comments
 (0)