优化: 前端扫描文案 i18n + parseStack 抽公共 + alert/confirm 换组件

- 扫描/目录状态文案走 $t(Projects/ProjectDetail,zh-CN+en 同步)
- parseStack 抽公共到 src/utils/project.ts(删两份本地实现)
- 8 处原生 alert/confirm 全换(confirm→ConfirmDialog / alert→Arco Message),控制流语义不变

Sprint 20 审查 ⑥⑦⑧。vue-tsc 0 error,验证 safe 0 issue
This commit is contained in:
2026-06-14 14:22:57 +08:00
parent d5a641797c
commit 02ff88fc61
8 changed files with 126 additions and 36 deletions

View File

@@ -193,6 +193,9 @@
</div>
</div>
</div>
<!-- 确认弹层删除想法替代原生 window.confirm -->
<ConfirmDialog :visible="confirmState.visible" :msg="confirmState.msg" @result="answerConfirm" />
</div>
</template>
@@ -200,14 +203,31 @@
import { ref, computed, onMounted } from 'vue'
import { useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { Message } from '@arco-design/web-vue'
import { useProjectStore } from '../stores/project'
import { formatDate } from '../utils/time'
import ConfirmDialog from '../components/ConfirmDialog.vue'
import type { IdeaRecord } from '../api/types'
const { t } = useI18n()
const router = useRouter()
const store = useProjectStore()
// ── 确认弹层(替代原生 window.confirm后者在 Tauri webview 带 localhost 来源信息无法去除) ──
const confirmState = ref({ visible: false, msg: '', resolve: null as null | ((v: boolean) => void) })
function confirmDialog(msg: string): Promise<boolean> {
return new Promise(resolve => {
confirmState.value.msg = msg
confirmState.value.visible = true
confirmState.value.resolve = resolve
})
}
function answerConfirm(ok: boolean) {
confirmState.value.visible = false
confirmState.value.resolve?.(ok)
confirmState.value.resolve = null
}
type FilterKey = 'all' | 'hot' | 'pending' | 'promoted'
const activeFilter = ref<FilterKey>('all')
@@ -375,7 +395,7 @@ async function confirmCapture() {
async function deleteCurrentIdea() {
if (!currentIdea.value) return
if (!confirm(t('ideas.confirmDelete', { title: currentIdea.value.title }))) return
if (!await confirmDialog(t('ideas.confirmDelete', { title: currentIdea.value.title }))) return
await store.deleteIdea(currentIdea.value.id)
selectedId.value = null
}
@@ -388,7 +408,7 @@ async function promoteToProject() {
} catch (e: any) {
const msg = e?.toString() ?? t('ideas.promoteFailed')
console.error(t('ideas.promoteFailed'), e)
alert(msg)
Message.error(msg)
}
}