chore: retire demo technical debt
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# Build Stage
|
||||
FROM node:18-alpine as build-stage
|
||||
FROM node:18-alpine AS build-stage
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
@@ -10,7 +10,7 @@ COPY . .
|
||||
RUN npm run build
|
||||
|
||||
# Production Stage
|
||||
FROM nginx:alpine as production-stage
|
||||
FROM nginx:alpine AS production-stage
|
||||
|
||||
# 复制构建产物到 Nginx
|
||||
COPY --from=build-stage /app/dist /usr/share/nginx/html
|
||||
|
||||
@@ -67,14 +67,11 @@ function formatDate(isoStr: string) {
|
||||
})
|
||||
}
|
||||
|
||||
async function fetchTimeline() {
|
||||
loading.value = true
|
||||
try {
|
||||
// Ideally we should also fetch profile basic info here or if the timeline endpoint included it
|
||||
// For now, let's just fetch timeline.
|
||||
// Wait, let's fetch profile first to get the name
|
||||
const profile = await api.get<any>(`/api/profiles/${profileId}`)
|
||||
profileName.value = profile.name
|
||||
async function fetchTimeline() {
|
||||
loading.value = true
|
||||
try {
|
||||
const profile = await api.get<any>(`/api/profiles/${profileId}`)
|
||||
profileName.value = profile.name
|
||||
|
||||
const data = await api.get<TimelineResponse>(`/api/profiles/${profileId}/timeline`)
|
||||
events.value = data.events
|
||||
@@ -85,18 +82,13 @@ async function fetchTimeline() {
|
||||
}
|
||||
}
|
||||
|
||||
function handleEventClick(event: TimelineEvent) {
|
||||
if (event.type === 'story' && event.metadata?.story_id) {
|
||||
// Check mode
|
||||
if (event.metadata.mode === 'storybook') {
|
||||
// 这里的逻辑有点复杂,因为目前 storybook viewer 是读 Store 的。
|
||||
// 如果要持久化查看,需要修改 Viewer 支持从 ID 加载。
|
||||
// 暂时先只支持跳转到普通故事详情,或者给出提示
|
||||
// TODO: Viewer support loading by ID
|
||||
router.push(`/story/${event.metadata.story_id}`)
|
||||
} else {
|
||||
router.push(`/story/${event.metadata.story_id}`)
|
||||
}
|
||||
function handleEventClick(event: TimelineEvent) {
|
||||
if (event.type === 'story' && event.metadata?.story_id) {
|
||||
if (event.metadata.mode === 'storybook') {
|
||||
router.push(`/storybook/view/${event.metadata.story_id}`)
|
||||
} else {
|
||||
router.push(`/story/${event.metadata.story_id}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ const canRetryAudio = computed(() =>
|
||||
&& story.value?.audio_status !== 'ready'
|
||||
&& story.value?.audio_status !== 'generating',
|
||||
)
|
||||
const isAudioGenerating = computed(() => story.value?.audio_status === 'generating')
|
||||
const assetGuidance = computed(() => {
|
||||
if (story.value?.generation_status === 'degraded_completed') {
|
||||
return '正文已经可读,失败的资源可以单独重试,不会覆盖当前故事。'
|
||||
@@ -358,13 +359,14 @@ onUnmounted(() => {
|
||||
<div v-if="!audioUrl" class="text-center">
|
||||
<BaseButton
|
||||
:loading="audioLoading"
|
||||
:disabled="isAudioGenerating"
|
||||
@click="story.audio_status === 'ready' ? loadAudio() : retryAudio()"
|
||||
class="mx-auto"
|
||||
>
|
||||
<template v-if="audioLoading">正在准备音频...</template>
|
||||
<template v-else>
|
||||
<SpeakerWaveIcon class="h-5 w-5" />
|
||||
{{ story.audio_status === 'ready' ? '试听故事' : '生成并试听故事' }}
|
||||
{{ isAudioGenerating ? '音频生成中...' : story.audio_status === 'ready' ? '试听故事' : '生成并试听故事' }}
|
||||
</template>
|
||||
</BaseButton>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user