mattermost-mobile/app/products/playbooks/utils/run.ts
Daniel Espino García 6d136a1343
Add post update to playbooks (#9120)
* Add Floating Label Autocomplete Selector

* Add post update to playbooks

* Add intro message and template default

* Fix type issue

* Add missing texts

* Fix test

* Minor fix and refactor

* Address feedback
2025-10-13 20:31:12 +02:00

76 lines
2.5 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import {toMilliseconds} from '@utils/datetime';
import type PlaybookChecklistItemModel from '@playbooks/types/database/models/playbook_checklist_item';
import type PlaybookRunModel from '@playbooks/types/database/models/playbook_run';
export function getRunScheduledTimestamp(run: PlaybookRunModel | PlaybookRun): number {
const endAt = 'endAt' in run ? run.endAt : run.end_at;
const lastStatusUpdateAt = 'lastStatusUpdateAt' in run ? run.lastStatusUpdateAt : run.last_status_update_at;
const previousReminder = 'previousReminder' in run ? run.previousReminder : run.previous_reminder;
const isNextUpdateScheduled = previousReminder !== 0;
const isFinished = isRunFinished(run);
let timestamp = lastStatusUpdateAt;
if (isFinished) {
timestamp = endAt;
} else if (isNextUpdateScheduled) {
const previousReminderMillis = Math.floor(previousReminder / 1e6);
timestamp = lastStatusUpdateAt + previousReminderMillis;
}
return timestamp;
}
export function isRunFinished(run?: PlaybookRunModel | PlaybookRun): boolean {
if (!run) {
return true;
}
const currentStatus = 'currentStatus' in run ? run.currentStatus : run.current_status;
return currentStatus === 'Finished';
}
export function getMaxRunUpdateAt(runs: PlaybookRun[]): number {
let max = 0;
for (const run of runs) {
if (run.update_at > max) {
max = run.update_at;
}
}
return max;
}
export function isPending(item: PlaybookChecklistItemModel | PlaybookChecklistItem): boolean {
return item.state === '' || item.state === 'in_progress';
}
export function isOverdue(item: PlaybookChecklistItemModel | PlaybookChecklistItem): boolean {
const dueDate = 'dueDate' in item ? item.dueDate : item.due_date;
if (dueDate <= 0) {
return false;
}
if (!isPending(item)) {
return false;
}
return dueDate < Date.now();
}
export function isDueSoon(item: PlaybookChecklistItemModel | PlaybookChecklistItem): boolean {
const dueDate = 'dueDate' in item ? item.dueDate : item.due_date;
if (dueDate <= 0) {
return false;
}
if (!isPending(item)) {
return false;
}
return dueDate < Date.now() + toMilliseconds({hours: 12});
}
export function isOutstanding(item: PlaybookChecklistItemModel | PlaybookChecklistItem): boolean {
return item.state === '' || item.state === 'in_progress';
}