20 lines
1.5 KiB
TypeScript
20 lines
1.5 KiB
TypeScript
import type { Decision } from '@/lib/types'
|
|
export function decisionStatus(decision: Decision) {
|
|
return decision.status === 'decided' || decision.status === 'pending_verification' ? (decision.response ? 'pending_review' : 'open') : decision.status
|
|
}
|
|
export const decisionLabels = { open: '等待决定', pending_review: '等待检查', accepted: '已接受,待落实', completed: '已完成', needs_reconsideration: '需要重新考虑' }
|
|
export type DecisionDraft = { option: string | null; comment: string; revision: number; conflict: boolean; attempt?: { signature: string; key: string }; sending?: boolean }
|
|
export type ChatDraft = { text: string; sending: boolean; error: string; attempt?: { text: string; key: string } }
|
|
export function writable(decision: Decision) { return ['open', 'needs_reconsideration'].includes(decisionStatus(decision)) }
|
|
export function submissionBody(decision: Decision, draft: DecisionDraft) {
|
|
const revision = decision.revision
|
|
if (!Number.isInteger(revision) || (revision ?? 0) < 1) return null
|
|
if (!writable(decision) || draft.sending || draft.conflict || draft.revision !== revision) return null
|
|
if (draft.option && !decision.options.some(option => option.id === draft.option)) return null
|
|
if (!draft.option && !draft.comment.trim()) return null
|
|
return { expected_revision: revision, option_id: draft.option, comment: draft.comment }
|
|
}
|
|
export function confirmDraft(decision: Decision, draft: DecisionDraft) {
|
|
draft.revision = decision.revision ?? 1; draft.conflict = false; draft.option = null; draft.attempt = undefined
|
|
}
|