|
1 | 1 | <script setup lang="ts"> |
2 | | -import { ref, onMounted, onUnmounted, watch } from 'vue' |
| 2 | +import { ref, computed, onMounted, onUnmounted, watch } from 'vue' |
3 | 3 | import { useI18n } from 'vue-i18n' |
4 | 4 | import { useRouter, useRoute } from 'vue-router' |
5 | 5 | import { toast } from 'vue-sonner' |
@@ -58,6 +58,10 @@ const selectedRuntime = ref('all') |
58 | 58 | const selectedFeatured = ref<'true' | 'false' | 'all'>('all') |
59 | 59 | const selectedAutoInstall = ref<'true' | 'false' | 'all'>('all') |
60 | 60 |
|
| 61 | +// Available runtimes (fetched from API) |
| 62 | +const availableRuntimes = ref<string[]>([]) |
| 63 | +const availableLanguages = ref<string[]>([]) |
| 64 | +
|
61 | 65 | // Sync state |
62 | 66 | const isSyncModalOpen = ref(false) |
63 | 67 | const isSyncing = ref(false) |
@@ -105,25 +109,22 @@ const statusOptions = [ |
105 | 109 | { value: 'maintenance', label: t('mcpCatalog.filters.status.maintenance') } |
106 | 110 | ] |
107 | 111 |
|
108 | | -const languageOptions = [ |
| 112 | +const languageOptions = computed(() => [ |
109 | 113 | { value: 'all', label: t('mcpCatalog.filters.language.all') }, |
110 | | - { value: 'TypeScript', label: 'TypeScript' }, |
111 | | - { value: 'JavaScript', label: 'JavaScript' }, |
112 | | - { value: 'Python', label: 'Python' }, |
113 | | - { value: 'Go', label: 'Go' }, |
114 | | - { value: 'Rust', label: 'Rust' }, |
115 | | - { value: 'Java', label: 'Java' }, |
116 | | - { value: 'C#', label: 'C#' }, |
117 | | - { value: 'Ruby', label: 'Ruby' } |
118 | | -] |
119 | | -
|
120 | | -const runtimeOptions = [ |
| 114 | + ...availableLanguages.value.map(language => ({ |
| 115 | + value: language, |
| 116 | + label: language |
| 117 | + })) |
| 118 | +]) |
| 119 | +
|
| 120 | +// Computed runtime options (dynamic from API) |
| 121 | +const runtimeOptions = computed(() => [ |
121 | 122 | { value: 'all', label: t('mcpCatalog.filters.runtime.all') }, |
122 | | - { value: 'node', label: 'Node.js' }, |
123 | | - { value: 'python', label: 'Python' }, |
124 | | - { value: 'docker', label: 'Docker' }, |
125 | | - { value: 'binary', label: 'Binary' } |
126 | | -] |
| 123 | + ...availableRuntimes.value.map(runtime => ({ |
| 124 | + value: runtime, |
| 125 | + label: runtime |
| 126 | + })) |
| 127 | +]) |
127 | 128 |
|
128 | 129 | const featuredOptions = [ |
129 | 130 | { value: 'all', label: t('mcpCatalog.filters.featured.all') }, |
@@ -437,9 +438,33 @@ const handleServerCreated = () => { |
437 | 438 | toast.success(t('mcpCatalog.messages.createSuccess')) |
438 | 439 | } |
439 | 440 |
|
| 441 | +// Fetch available runtimes |
| 442 | +const fetchRuntimes = async () => { |
| 443 | + try { |
| 444 | + availableRuntimes.value = await McpCatalogService.getRuntimes() |
| 445 | + } catch (err) { |
| 446 | + console.error('Failed to fetch runtimes:', err) |
| 447 | + availableRuntimes.value = [] |
| 448 | + } |
| 449 | +} |
| 450 | +
|
| 451 | +// Fetch available languages |
| 452 | +const fetchLanguages = async () => { |
| 453 | + try { |
| 454 | + availableLanguages.value = await McpCatalogService.getLanguages() |
| 455 | + } catch (err) { |
| 456 | + console.error('Failed to fetch languages:', err) |
| 457 | + availableLanguages.value = [] |
| 458 | + } |
| 459 | +} |
| 460 | +
|
440 | 461 | // Load data on component mount |
441 | 462 | onMounted(async () => { |
442 | | - await fetchServers() |
| 463 | + await Promise.all([ |
| 464 | + fetchServers(), |
| 465 | + fetchRuntimes(), |
| 466 | + fetchLanguages() |
| 467 | + ]) |
443 | 468 |
|
444 | 469 | // Check for delete success message from query parameters |
445 | 470 | const deletedServerName = route.query.deleted as string |
|
0 commit comments