| | <script setup lang="ts"> |
| | import { ref, watch } from "vue"; |
| | import { Modal } from 'ant-design-vue'; |
| | import axios from "axios"; |
| |
|
| | const base_url = axios.defaults.baseURL; |
| |
|
| | |
| | const props = defineProps({ |
| | open: { |
| | type: Boolean, |
| | default: false |
| | } |
| | }); |
| |
|
| | |
| | const emit = defineEmits(['update:open']); |
| |
|
| | |
| | const default_prompt_en = ref<string>(''); |
| | const default_prompt_zh = ref<string>(''); |
| |
|
| | |
| | const current_prompt_en = ref<string>(''); |
| | const current_prompt_zh = ref<string>(''); |
| |
|
| | const modalLoading = ref<boolean>(false); |
| | const languageSegment = ref<string>('zh'); |
| |
|
| | const fetchDefaultPrompt = async () => { |
| | try { |
| | const response = await fetch(`${base_url}/settings/settings/prompts/default`); |
| | const data = await response.json(); |
| |
|
| | if (data) { |
| | |
| | default_prompt_en.value = data.english_prompt; |
| | default_prompt_zh.value = data.chinese_prompt; |
| | } |
| | } catch (error) { |
| | console.error('Error fetching default prompt:', error); |
| | } |
| | }; |
| |
|
| | const fetchCurrentPrompt = async () => { |
| | try { |
| | const response = await fetch(`${base_url}/settings/settings/prompts`); |
| | const data = await response.json(); |
| |
|
| | if (data) { |
| | |
| | current_prompt_en.value = data.english_prompt; |
| | current_prompt_zh.value = data.chinese_prompt; |
| | } |
| | } catch (error) { |
| | console.error('Error fetching current prompt:', error); |
| | } |
| | }; |
| |
|
| | const updateCurrentPrompt = async () => { |
| | try { |
| | modalLoading.value = true; |
| | const response = await fetch(`${base_url}/settings/settings/prompts`, { |
| | method: 'POST', |
| | headers: { |
| | 'Content-Type': 'application/json', |
| | }, |
| | body: JSON.stringify({ |
| | chinese_prompt: current_prompt_zh.value, |
| | english_prompt: current_prompt_en.value |
| | }) |
| | }); |
| | if (!response.ok) { |
| | throw new Error(`HTTP error! status: ${response.status}`); |
| | } |
| | const data = await response.json(); |
| | console.log('Current prompt updated successfully:', data); |
| | } catch (error) { |
| | console.error('Error updating current prompt:', error); |
| | } finally { |
| | modalLoading.value = false; |
| | } |
| | }; |
| |
|
| | const resetDefaultPrompt = async () => { |
| | try { |
| | modalLoading.value = true; |
| | const response = await fetch(`${base_url}/settings/settings/prompts`, { |
| | method: 'DELETE', |
| | }); |
| | if (!response.ok) { |
| | throw new Error(`HTTP error! status: ${response.status}`); |
| | } |
| | const data = await response.json(); |
| | console.log('Default prompt reset successfully:', data); |
| | current_prompt_en.value = default_prompt_en.value; |
| | current_prompt_zh.value = default_prompt_zh.value; |
| | } catch (error) { |
| | console.error('Error resetting default prompt:', error); |
| | } finally { |
| | modalLoading.value = false; |
| | } |
| | }; |
| |
|
| |
|
| | |
| | const handleCancel = async () => { |
| | await fetchCurrentPrompt(); |
| | emit('update:open', false); |
| | }; |
| |
|
| | const handleSubmit = async () => { |
| | await updateCurrentPrompt(); |
| | await fetchCurrentPrompt(); |
| | emit('update:open', false); |
| | }; |
| |
|
| | const handleResetPrompt = async (language: string) => { |
| | await fetchDefaultPrompt(); |
| | if (language == 'en') { |
| | current_prompt_en.value = default_prompt_en.value; |
| | } else { |
| | current_prompt_zh.value = default_prompt_zh.value; |
| | } |
| | }; |
| |
|
| | |
| | watch(() => props.open, (newOpen) => { |
| | if (newOpen) { |
| | fetchCurrentPrompt(); |
| | fetchDefaultPrompt(); |
| | } |
| | }); |
| |
|
| | </script> |
| |
|
| | <template> |
| | <a-modal |
| | key="prompt-text-modal" |
| | v-model:open="props.open" |
| | :title="null" |
| | :mask-closable="false" |
| | centered |
| | @update:open="(val: boolean) => emit('update:open', val)" |
| | > |
| | <template #footer> |
| | <div class="btn-groups"> |
| | <div class="btn-group"> |
| | <a-button key="back" @click="handleCancel">Cancel</a-button> |
| | <a-button key="submit" type="primary" :loading="modalLoading" @click="handleSubmit">Submit</a-button> |
| | </div> |
| | </div> |
| | </template> |
| | |
| | <div class="prompt-content"> |
| | <div class="prompt-title"> |
| | <p>Prompt Debug</p> |
| | </div> |
| | <a-radio-group button-style="solid" size="medium" v-model:value="languageSegment" class="language-segment"> |
| | <a-radio-button value="zh">Chinese</a-radio-button> |
| | <a-radio-button value="en">English</a-radio-button> |
| | </a-radio-group> |
| | <div v-if="languageSegment == 'en'" class="prompt-item"> |
| | <a-textarea |
| | v-model:value="current_prompt_en" |
| | :placeholder="default_prompt_en" |
| | :auto-size="{ minRows: 10, maxRows: 20 }" |
| | show-count |
| | :maxlength="2000" |
| | allow-clear |
| | class="prompt-textarea" |
| | /> |
| | <a-button key="back" @click="handleResetPrompt('en')" style="margin-top: 16px;">Reset</a-button> |
| | </div> |
| | <div v-if="languageSegment == 'zh'" class="prompt-item"> |
| | <a-textarea |
| | v-model:value="current_prompt_zh" |
| | :placeholder="default_prompt_zh" |
| | :auto-size="{ minRows: 10, maxRows: 20 }" |
| | show-count |
| | :maxlength="2000" |
| | allow-clear |
| | class="prompt-textarea" |
| | /> |
| | <a-button key="back" @click="handleResetPrompt('zh')" style="margin-top: 16px;">Reset</a-button> |
| | </div> |
| | </div> |
| | </a-modal> |
| | </template> |
| |
|
| | <style lang="scss" scoped> |
| | .btn-groups { |
| | margin-top: 36px; |
| | display: flex; |
| | justify-content: flex-end; |
| | align-items: center; |
| | } |
| | |
| | .prompt-title { |
| | p { |
| | margin: 0; |
| | font-size: 16px; |
| | font-weight: 500; |
| | } |
| | } |
| | |
| | .prompt-content { |
| | margin-top: 2px; |
| | |
| | .prompt-title { |
| | margin-bottom: 24px; |
| | font-size: 22px; |
| | font-weight: 500; |
| | text-align: center; |
| | } |
| | |
| | .language-segment { |
| | display: flex; |
| | justify-content: center; |
| | margin-bottom: 16px; |
| | } |
| | |
| | .prompt-item { |
| | margin-top: 16px; |
| | } |
| | } |
| | </style> |
| |
|