perf(shared): cache derived team task state
This commit is contained in:
parent
a0bdb4648f
commit
effe9b522f
1 changed files with 99 additions and 64 deletions
|
|
@ -7,78 +7,73 @@ export interface TeamTaskStateLike {
|
||||||
|
|
||||||
export type TeamTaskWorkflowColumn = 'review' | 'approved';
|
export type TeamTaskWorkflowColumn = 'review' | 'approved';
|
||||||
|
|
||||||
export function isTeamTaskApproved(task: TeamTaskStateLike): boolean {
|
interface CachedTeamTaskState {
|
||||||
if (isTeamTaskDeleted(task) || task.status === 'pending') {
|
status: TeamTaskStateLike['status'];
|
||||||
return false;
|
reviewState: TeamTaskStateLike['reviewState'];
|
||||||
}
|
kanbanColumn: TeamTaskStateLike['kanbanColumn'];
|
||||||
|
deletedAt: TeamTaskStateLike['deletedAt'];
|
||||||
if (task.kanbanColumn === 'approved') {
|
deleted: boolean;
|
||||||
return true;
|
approved: boolean;
|
||||||
}
|
workflowColumn: TeamTaskWorkflowColumn | undefined;
|
||||||
|
needsFixActionable: boolean;
|
||||||
if (task.kanbanColumn === 'review') {
|
finishedForDependency: boolean;
|
||||||
return false;
|
terminalForActionableWork: boolean;
|
||||||
}
|
|
||||||
|
|
||||||
return task.reviewState === 'approved';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isTeamTaskDeleted(task: TeamTaskStateLike): boolean {
|
const teamTaskStateCache = new WeakMap<TeamTaskStateLike, CachedTeamTaskState>();
|
||||||
return task.status === 'deleted' || Boolean(task.deletedAt);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isTeamTaskActivelyWorked(task: TeamTaskStateLike): boolean {
|
function getCachedTeamTaskState(task: TeamTaskStateLike): CachedTeamTaskState {
|
||||||
return (
|
const cached = teamTaskStateCache.get(task);
|
||||||
task.status === 'in_progress' &&
|
if (
|
||||||
getTeamTaskWorkflowColumn(task) !== 'review' &&
|
cached &&
|
||||||
!isTeamTaskApproved(task) &&
|
cached.status === task.status &&
|
||||||
!isTeamTaskDeleted(task)
|
cached.reviewState === task.reviewState &&
|
||||||
);
|
cached.kanbanColumn === task.kanbanColumn &&
|
||||||
}
|
cached.deletedAt === task.deletedAt
|
||||||
|
) {
|
||||||
export function isTeamTaskNeedsFixActionable(task: TeamTaskStateLike): boolean {
|
return cached;
|
||||||
return (
|
|
||||||
task.reviewState === 'needsFix' &&
|
|
||||||
!isTeamTaskDeleted(task) &&
|
|
||||||
getTeamTaskWorkflowColumn(task) === undefined
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isTeamTaskFinishedForDependency(task: TeamTaskStateLike): boolean {
|
|
||||||
const workflowColumn = getTeamTaskWorkflowColumn(task);
|
|
||||||
if (workflowColumn === 'approved') {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return task.status === 'completed';
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): boolean {
|
|
||||||
if (isTeamTaskDeleted(task)) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const workflowColumn = getTeamTaskWorkflowColumn(task);
|
const deleted = task.status === 'deleted' || Boolean(task.deletedAt);
|
||||||
if (workflowColumn === 'approved') {
|
const workflowColumn = resolveTeamTaskWorkflowColumn(task, deleted);
|
||||||
return true;
|
const approved =
|
||||||
}
|
!deleted &&
|
||||||
|
task.status !== 'pending' &&
|
||||||
if (workflowColumn === 'review' || isTeamTaskNeedsFixActionable(task)) {
|
(task.kanbanColumn === 'approved' ||
|
||||||
return false;
|
(task.kanbanColumn !== 'review' && task.reviewState === 'approved'));
|
||||||
}
|
const needsFixActionable =
|
||||||
return task.status === 'completed';
|
task.reviewState === 'needsFix' && !deleted && workflowColumn === undefined;
|
||||||
|
const finishedForDependency =
|
||||||
|
workflowColumn === 'approved'
|
||||||
|
? true
|
||||||
|
: workflowColumn === 'review' || needsFixActionable
|
||||||
|
? false
|
||||||
|
: task.status === 'completed';
|
||||||
|
const terminalForActionableWork =
|
||||||
|
deleted ||
|
||||||
|
workflowColumn === 'approved' ||
|
||||||
|
(workflowColumn !== 'review' && !needsFixActionable && task.status === 'completed');
|
||||||
|
const next: CachedTeamTaskState = {
|
||||||
|
status: task.status,
|
||||||
|
reviewState: task.reviewState,
|
||||||
|
kanbanColumn: task.kanbanColumn,
|
||||||
|
deletedAt: task.deletedAt,
|
||||||
|
deleted,
|
||||||
|
approved,
|
||||||
|
workflowColumn,
|
||||||
|
needsFixActionable,
|
||||||
|
finishedForDependency,
|
||||||
|
terminalForActionableWork,
|
||||||
|
};
|
||||||
|
teamTaskStateCache.set(task, next);
|
||||||
|
return next;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean {
|
function resolveTeamTaskWorkflowColumn(
|
||||||
return isTeamTaskTerminalForActionableWork(task);
|
task: TeamTaskStateLike,
|
||||||
}
|
deleted: boolean
|
||||||
|
|
||||||
export function getTeamTaskWorkflowColumn(
|
|
||||||
task: TeamTaskStateLike
|
|
||||||
): TeamTaskWorkflowColumn | undefined {
|
): TeamTaskWorkflowColumn | undefined {
|
||||||
if (isTeamTaskDeleted(task) || task.status === 'pending') {
|
if (deleted || task.status === 'pending') {
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -100,3 +95,43 @@ export function getTeamTaskWorkflowColumn(
|
||||||
|
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskApproved(task: TeamTaskStateLike): boolean {
|
||||||
|
return getCachedTeamTaskState(task).approved;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskDeleted(task: TeamTaskStateLike): boolean {
|
||||||
|
return getCachedTeamTaskState(task).deleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskActivelyWorked(task: TeamTaskStateLike): boolean {
|
||||||
|
const cached = getCachedTeamTaskState(task);
|
||||||
|
return (
|
||||||
|
task.status === 'in_progress' &&
|
||||||
|
cached.workflowColumn !== 'review' &&
|
||||||
|
!cached.approved &&
|
||||||
|
!cached.deleted
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskNeedsFixActionable(task: TeamTaskStateLike): boolean {
|
||||||
|
return getCachedTeamTaskState(task).needsFixActionable;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskFinishedForDependency(task: TeamTaskStateLike): boolean {
|
||||||
|
return getCachedTeamTaskState(task).finishedForDependency;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskTerminalForActionableWork(task: TeamTaskStateLike): boolean {
|
||||||
|
return getCachedTeamTaskState(task).terminalForActionableWork;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isTeamTaskFinalForCompletionNotification(task: TeamTaskStateLike): boolean {
|
||||||
|
return isTeamTaskTerminalForActionableWork(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getTeamTaskWorkflowColumn(
|
||||||
|
task: TeamTaskStateLike
|
||||||
|
): TeamTaskWorkflowColumn | undefined {
|
||||||
|
return getCachedTeamTaskState(task).workflowColumn;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue