feat: add announcement section to WelcomePage and localize announcement title
This commit is contained in:
1 parent
80c22f4f72
commit
92d71fffe9
3 files changed
+74
-1
No files matched your search
@@ -6,6 +6,9 @@
|
|||||||
"newYear": "Happy New Year!"
|
"newYear": "Happy New Year!"
|
||||||
},
|
},
|
||||||
"subtitle": "You can complete the basic onboarding first. Platform and chat provider setup can both be skipped.",
|
"subtitle": "You can complete the basic onboarding first. Platform and chat provider setup can both be skipped.",
|
||||||
|
"announcement": {
|
||||||
|
"title": "Announcement"
|
||||||
|
},
|
||||||
"onboard": {
|
"onboard": {
|
||||||
"title": "Quick Onboarding",
|
"title": "Quick Onboarding",
|
||||||
"subtitle": "Complete initialization directly on the welcome page.",
|
"subtitle": "Complete initialization directly on the welcome page.",
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
"newYear": "新年快乐!"
|
"newYear": "新年快乐!"
|
||||||
},
|
},
|
||||||
"subtitle": "可以先完成基础引导,平台和对话提供商都支持稍后再配置。",
|
"subtitle": "可以先完成基础引导,平台和对话提供商都支持稍后再配置。",
|
||||||
|
"announcement": {
|
||||||
|
"title": "公告"
|
||||||
|
},
|
||||||
"onboard": {
|
"onboard": {
|
||||||
"title": "快速引导",
|
"title": "快速引导",
|
||||||
"subtitle": "欢迎页可直接完成初始化。",
|
"subtitle": "欢迎页可直接完成初始化。",
|
||||||
|
|||||||
@@ -116,6 +116,21 @@
|
|||||||
</v-card>
|
</v-card>
|
||||||
</v-col>
|
</v-col>
|
||||||
</v-row>
|
</v-row>
|
||||||
|
|
||||||
|
<v-row v-if="showAnnouncement" class="px-4 mb-4">
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-card class="welcome-card pa-6" elevation="0" border>
|
||||||
|
<div class="mb-4 text-h3 font-weight-bold">
|
||||||
|
{{ tm('announcement.title') }}
|
||||||
|
</div>
|
||||||
|
<MarkdownRender
|
||||||
|
:content="welcomeAnnouncement"
|
||||||
|
:typewriter="false"
|
||||||
|
class="welcome-announcement-markdown markdown-content"
|
||||||
|
/>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
</v-container>
|
</v-container>
|
||||||
|
|
||||||
<AddNewPlatform v-model:show="showAddPlatformDialog" :metadata="platformMetadata" :config_data="platformConfigData"
|
<AddNewPlatform v-model:show="showAddPlatformDialog" :metadata="platformMetadata" :config_data="platformConfigData"
|
||||||
@@ -129,12 +144,16 @@ import { computed, ref, watch, onMounted } from 'vue';
|
|||||||
import axios from 'axios';
|
import axios from 'axios';
|
||||||
import AddNewPlatform from '@/components/platform/AddNewPlatform.vue';
|
import AddNewPlatform from '@/components/platform/AddNewPlatform.vue';
|
||||||
import ProviderConfigDialog from '@/components/chat/ProviderConfigDialog.vue';
|
import ProviderConfigDialog from '@/components/chat/ProviderConfigDialog.vue';
|
||||||
import { useModuleI18n } from '@/i18n/composables';
|
import { useI18n, useModuleI18n } from '@/i18n/composables';
|
||||||
import { useToast } from '@/utils/toast';
|
import { useToast } from '@/utils/toast';
|
||||||
|
import { MarkdownRender } from 'markstream-vue';
|
||||||
|
import 'markstream-vue/index.css';
|
||||||
|
import 'highlight.js/styles/github.css';
|
||||||
|
|
||||||
type StepState = 'pending' | 'completed' | 'skipped';
|
type StepState = 'pending' | 'completed' | 'skipped';
|
||||||
|
|
||||||
const { tm } = useModuleI18n('features/welcome');
|
const { tm } = useModuleI18n('features/welcome');
|
||||||
|
const { locale } = useI18n();
|
||||||
const { success: showSuccess, error: showError } = useToast();
|
const { success: showSuccess, error: showError } = useToast();
|
||||||
|
|
||||||
const showAddPlatformDialog = ref(false);
|
const showAddPlatformDialog = ref(false);
|
||||||
@@ -148,6 +167,38 @@ const providerCountBeforeOpen = ref(0);
|
|||||||
|
|
||||||
const platformStepState = ref<StepState>('pending');
|
const platformStepState = ref<StepState>('pending');
|
||||||
const providerStepState = ref<StepState>('pending');
|
const providerStepState = ref<StepState>('pending');
|
||||||
|
const welcomeAnnouncementRaw = ref<unknown>(null);
|
||||||
|
|
||||||
|
function resolveWelcomeAnnouncement(raw: unknown, currentLocale: string) {
|
||||||
|
if (typeof raw === 'string') {
|
||||||
|
return raw.trim();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const localeMap = raw as Record<string, unknown>;
|
||||||
|
const normalized = currentLocale.replace('-', '_');
|
||||||
|
const preferredKeys =
|
||||||
|
normalized.startsWith('zh')
|
||||||
|
? [normalized, 'zh_CN', 'zh-CN', 'zh', 'en_US', 'en-US', 'en']
|
||||||
|
: [normalized, 'en_US', 'en-US', 'en', 'zh_CN', 'zh-CN', 'zh'];
|
||||||
|
|
||||||
|
for (const key of preferredKeys) {
|
||||||
|
const value = localeMap[key];
|
||||||
|
if (typeof value === 'string' && value.trim().length > 0) {
|
||||||
|
return value.trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
const welcomeAnnouncement = computed(() =>
|
||||||
|
resolveWelcomeAnnouncement(welcomeAnnouncementRaw.value, locale.value)
|
||||||
|
);
|
||||||
|
const showAnnouncement = computed(() => welcomeAnnouncement.value.length > 0);
|
||||||
|
|
||||||
const springFestivalDates: Record<number, string> = {
|
const springFestivalDates: Record<number, string> = {
|
||||||
2025: '01-29',
|
2025: '01-29',
|
||||||
@@ -285,7 +336,19 @@ async function syncDefaultConfigProviderIfNeeded() {
|
|||||||
showSuccess(tm('onboard.providerDefaultUpdated', { id: targetProviderId }));
|
showSuccess(tm('onboard.providerDefaultUpdated', { id: targetProviderId }));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function loadWelcomeAnnouncement() {
|
||||||
|
try {
|
||||||
|
const res = await axios.get('https://cloud.astrbot.app/api/v1/announcement');
|
||||||
|
welcomeAnnouncementRaw.value = res?.data?.data?.notice?.welcome_page ?? null;
|
||||||
|
} catch (e) {
|
||||||
|
welcomeAnnouncementRaw.value = null;
|
||||||
|
console.error(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
|
await loadWelcomeAnnouncement();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await loadPlatformConfigBase();
|
await loadPlatformConfigBase();
|
||||||
if ((platformConfigData.value.platform || []).length > 0) {
|
if ((platformConfigData.value.platform || []).length > 0) {
|
||||||
@@ -363,4 +426,8 @@ watch(showProviderDialog, async (visible, wasVisible) => {
|
|||||||
.welcome-card {
|
.welcome-card {
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.welcome-announcement-markdown {
|
||||||
|
line-height: 1.7;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
Reference in new issue
Block a user