优化: 前端DRY收敛与命名对齐
审批等待格式化与阈值沉 utils/time 正典 相对时间阶梯三套收敛 formatRelative 参数化 灵感状态表沉 constants,透传通道退役 aggText/clearOwn 等命名对齐,IPC 参数名统一 conversation_id
This commit is contained in:
+39
-2
@@ -44,8 +44,19 @@ export function formatDate(v: string | number | null | undefined): string {
|
||||
return d.toLocaleDateString(locale) + ' ' + d.toLocaleTimeString(locale, { hour: '2-digit', minute: '2-digit' })
|
||||
}
|
||||
|
||||
/** 相对时间(走 i18n:justNow/minutesAgo/hoursAgo/dayAgo;en/zh 双语);无效返回 '—' */
|
||||
export function formatRelative(v: string | number | null | undefined): string {
|
||||
/** 相对时间分档差异参数(formatRelative 选项;不传 = 原默认阶梯) */
|
||||
export interface FormatRelativeOpts {
|
||||
/** 开启「昨天」档:24~48h 显示 common.yesterday(如 GitChanges 提交时间),默认关 */
|
||||
yesterday?: boolean
|
||||
/** 超过 N 天回退绝对日期;缺省不截断,一直显示「N 天前」 */
|
||||
absAfterDays?: number
|
||||
/** 绝对日期回退样式:'ago' = 「{date}前」(i18n,默认);'iso' = YYYY-MM-DD(定宽,列表对齐用) */
|
||||
absStyle?: 'ago' | 'iso'
|
||||
}
|
||||
|
||||
/** 相对时间(走 i18n:justNow/minutesAgo/hoursAgo/dayAgo;en/zh 双语);无效返回 '—'。
|
||||
* 分档差异(yesterday 档 / N 天截断回退绝对日期)经 opts 表达,不传保持原行为 */
|
||||
export function formatRelative(v: string | number | null | undefined, opts?: FormatRelativeOpts): string {
|
||||
const ms = parseTs(v)
|
||||
if (ms == null) return '—'
|
||||
const diffMin = Math.floor((Date.now() - ms) / 60000)
|
||||
@@ -54,5 +65,31 @@ export function formatRelative(v: string | number | null | undefined): string {
|
||||
const diffH = Math.floor(diffMin / 60)
|
||||
if (diffH < 24) return t('common.hoursAgo', { n: diffH })
|
||||
const diffD = Math.floor(diffH / 24)
|
||||
if (opts?.yesterday && diffD < 2) return t('common.yesterday')
|
||||
if (opts?.absAfterDays != null && diffD >= opts.absAfterDays) {
|
||||
const d = new Date(ms)
|
||||
if (opts.absStyle === 'iso') {
|
||||
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`
|
||||
}
|
||||
return t('common.ago', { time: d.toLocaleDateString() })
|
||||
}
|
||||
return t('common.dayAgo', { n: diffD })
|
||||
}
|
||||
|
||||
// ── 审批等待时长(ToolCard / ApprovalPopup 双写收敛) ──
|
||||
|
||||
export type WaitLevel = 'normal' | 'long' | 'urgent'
|
||||
|
||||
/** 秒 → MM:SS(分秒两位补零,审批挂起时长展示) */
|
||||
export function formatWaitTime(secs: number): string {
|
||||
const m = Math.floor(secs / 60)
|
||||
const s = secs % 60
|
||||
return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`
|
||||
}
|
||||
|
||||
/** 等待分级阈值(与后端 APPROVAL_TIMEOUT_MS 5min 静默拒绝对齐):≥300s urgent / ≥120s long */
|
||||
export function waitLevelOf(secs: number): WaitLevel {
|
||||
if (secs >= 300) return 'urgent'
|
||||
if (secs >= 120) return 'long'
|
||||
return 'normal'
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user