76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { getDerivedReviewStateFromHistory } from '@shared/utils/taskHistory';
|
|
|
|
import type { TaskHistoryEvent, TeamReviewState } from '@shared/types';
|
|
|
|
interface ReviewStateLike {
|
|
reviewState?: TeamReviewState | null;
|
|
historyEvents?: unknown[];
|
|
kanbanColumn?: 'review' | 'approved' | null;
|
|
status?: string | null;
|
|
}
|
|
|
|
export function normalizeReviewState(value: unknown): TeamReviewState {
|
|
return value === 'review' || value === 'needsFix' || value === 'approved' ? value : 'none';
|
|
}
|
|
|
|
export function getReviewStateFromTask(task: ReviewStateLike): TeamReviewState {
|
|
const fallbackStatus = typeof task.status === 'string' ? task.status : null;
|
|
const normalizeForStatus = (value: unknown): TeamReviewState | null => {
|
|
const explicit = normalizeReviewState(value);
|
|
if (explicit === 'none') return null;
|
|
|
|
if (fallbackStatus === 'in_progress' || fallbackStatus === 'deleted') {
|
|
return 'none';
|
|
}
|
|
if (fallbackStatus === 'pending') {
|
|
return explicit === 'needsFix' ? 'needsFix' : 'none';
|
|
}
|
|
if (fallbackStatus === 'completed') {
|
|
return explicit === 'review' || explicit === 'approved' || explicit === 'needsFix'
|
|
? explicit
|
|
: 'none';
|
|
}
|
|
return explicit;
|
|
};
|
|
|
|
// Prefer derivation from historyEvents when available
|
|
if (Array.isArray(task.historyEvents) && task.historyEvents.length > 0) {
|
|
const derived = getDerivedReviewStateFromHistory({
|
|
historyEvents: task.historyEvents as TaskHistoryEvent[],
|
|
});
|
|
if (derived !== null) {
|
|
return normalizeForStatus(derived) ?? 'none';
|
|
}
|
|
}
|
|
|
|
const explicit = normalizeForStatus(task.reviewState);
|
|
if (explicit) return explicit;
|
|
|
|
if (task.kanbanColumn === 'review' || task.kanbanColumn === 'approved') {
|
|
return normalizeForStatus(task.kanbanColumn) ?? 'none';
|
|
}
|
|
|
|
return 'none';
|
|
}
|
|
|
|
export function getKanbanColumnFromReviewState(
|
|
reviewState: TeamReviewState
|
|
): 'review' | 'approved' | undefined {
|
|
return reviewState === 'review' || reviewState === 'approved' ? reviewState : undefined;
|
|
}
|
|
|
|
export function getTaskKanbanColumn(task: ReviewStateLike): 'review' | 'approved' | undefined {
|
|
return getKanbanColumnFromReviewState(getReviewStateFromTask(task));
|
|
}
|
|
|
|
export function isApprovedTask(task: ReviewStateLike): boolean {
|
|
return getReviewStateFromTask(task) === 'approved';
|
|
}
|
|
|
|
export function isReviewTask(task: ReviewStateLike): boolean {
|
|
return getReviewStateFromTask(task) === 'review';
|
|
}
|
|
|
|
export function isNeedsFixTask(task: ReviewStateLike): boolean {
|
|
return getReviewStateFromTask(task) === 'needsFix';
|
|
}
|