From cbdba20a238ad66cbca0cd47e81b3bfeb5699207 Mon Sep 17 00:00:00 2001 From: Chelsea Scott Date: Thu, 18 Jun 2026 19:59:34 -0700 Subject: [PATCH 1/2] feat: add task status transition utility --- nexus-frontend/src/utils/transitions.ts | 40 +++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 nexus-frontend/src/utils/transitions.ts diff --git a/nexus-frontend/src/utils/transitions.ts b/nexus-frontend/src/utils/transitions.ts new file mode 100644 index 0000000..e93cac2 --- /dev/null +++ b/nexus-frontend/src/utils/transitions.ts @@ -0,0 +1,40 @@ +import type { TaskStatus } from '../types/task'; + +/** + * Defines the valid status transitions for tasks. + * State machine: TODO → IN_PROGRESS → IN_REVIEW → DONE + */ +const TRANSITION_MAP: Record = { + TODO: ['IN_PROGRESS'], + IN_PROGRESS: ['IN_REVIEW'], + IN_REVIEW: ['DONE'], + DONE: [], +}; + +/** + * Returns the list of valid next statuses for a given current status. + * Returns an empty array if no transitions are available (terminal state). + */ +export function getValidTransitions(currentStatus: TaskStatus): TaskStatus[] { + return TRANSITION_MAP[currentStatus] ?? []; +} + +/** + * Checks whether transitioning from one status to another is valid. + */ +export function isValidTransition( + from: TaskStatus, + to: TaskStatus +): boolean { + return TRANSITION_MAP[from]?.includes(to) ?? false; +} + +/** + * Human-readable labels for task statuses. + */ +export const STATUS_LABELS: Record = { + TODO: 'To Do', + IN_PROGRESS: 'In Progress', + IN_REVIEW: 'In Review', + DONE: 'Done', +}; From 9c25db26e587fbf9dd6b6bf078ec6eaf1ae407a0 Mon Sep 17 00:00:00 2001 From: Chelsea Scott Date: Fri, 19 Jun 2026 23:15:26 -0700 Subject: [PATCH 2/2] refactor: make transition map readonly and return shallow copies --- nexus-frontend/src/utils/transitions.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nexus-frontend/src/utils/transitions.ts b/nexus-frontend/src/utils/transitions.ts index e93cac2..a3b0ac7 100644 --- a/nexus-frontend/src/utils/transitions.ts +++ b/nexus-frontend/src/utils/transitions.ts @@ -4,7 +4,7 @@ import type { TaskStatus } from '../types/task'; * Defines the valid status transitions for tasks. * State machine: TODO → IN_PROGRESS → IN_REVIEW → DONE */ -const TRANSITION_MAP: Record = { +const TRANSITION_MAP: Readonly> = { TODO: ['IN_PROGRESS'], IN_PROGRESS: ['IN_REVIEW'], IN_REVIEW: ['DONE'], @@ -16,7 +16,7 @@ const TRANSITION_MAP: Record = { * Returns an empty array if no transitions are available (terminal state). */ export function getValidTransitions(currentStatus: TaskStatus): TaskStatus[] { - return TRANSITION_MAP[currentStatus] ?? []; + return [...(TRANSITION_MAP[currentStatus] ?? [])]; } /**