* Added scaffolding for unrevealed BoR post * Displayed reveal UI * Displayed expiry timer * WIP * Displayed own post indicator and blur text * restored button * Ungrouped BoR posts * WIP * WIP * DIsplayed error message on revealing * Added last run check on mobile app cleanup job * Cleanup * lint fix * i18n-fix * Added tests * test: add test suite for revealBoRPost function * test: add unrevealed burn on read post test file * feat: add tests for UnrevealedBurnOnReadPost component * test: update UnrevealedBurnOnReadPost test with PostModel type * test: replace toBeTruthy with toBeVisible for component visibility assertions * test: add initial test file for expiry timer component * test: add comprehensive tests for ExpiryCountdown component * refactor: clean up test formatting and remove redundant test case * fix: adjust test timing for ExpiryCountdown onExpiry callback * test: fix timer test by advancing timers in smaller increments * Added tests * Updated tests * fixed accidental change * restored package.resolved * WIP review fixes * Review fixes * Review fixes * Fixed tests * restored package.resolved * WIP * test: add test for skipping BoR post cleanup within 15 minutes * test: add comprehensive test cases for expiredBoRPostCleanup * WIP * WIP * test: add bor.test.ts placeholder file * test: add comprehensive tests for BoR utility functions * test: add comprehensive tests for formatTime function * WIP * test: add comprehensive tests for getLastBoRPostCleanupRun function * Added tests * removed a commented code * post list optimization * test: add test case for updating unrevealed burn-on-read post * fix: handle error logging in expiredBoRPostCleanup test * test: add test case for updateLastBoRCleanupRun error handling * review fixes * lint fixes * Added WS event handling (#9320) * Added WS event handling * test: add burn on read websocket action test * test: add tests for handleBoRPostRevealedEvent in burn_on_read * Added tests * test: add comprehensive error handling test cases for burn on read * Added tests and error handling * BoR post - restricted actions (#9315) * Restricted post actions for BoR post type * Prevent opening thread fr nBoR post * WIP * fix: remove redundant observable wrapping in post options * fixed a change * removed broken * restored package.resolved * Added tests * Awaiting for last run to be set * Added tests for validating expiry timer behaviour (#9338) * Added tests for validating expiry timer behaviour * No need of use event setup * Bor ux fixes (#9336) * WIP * UI and delete fixes * lint fixes * fixed tests * Improved mocking * Improved test
69 lines
2.3 KiB
TypeScript
69 lines
2.3 KiB
TypeScript
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
export function isSameDate(a: Date, b: Date = new Date()): boolean {
|
|
return a.getDate() === b.getDate() && isSameMonth(a, b) && isSameYear(a, b);
|
|
}
|
|
|
|
export function isSameMonth(a: Date, b: Date = new Date()): boolean {
|
|
return a.getMonth() === b.getMonth() && isSameYear(a, b);
|
|
}
|
|
|
|
export function isSameYear(a: Date, b: Date = new Date()): boolean {
|
|
return a.getFullYear() === b.getFullYear();
|
|
}
|
|
|
|
export function isToday(date: Date) {
|
|
const now = new Date();
|
|
|
|
return isSameDate(date, now);
|
|
}
|
|
|
|
export function isYesterday(date: Date): boolean {
|
|
const yesterday = new Date();
|
|
yesterday.setDate(yesterday.getDate() - 1);
|
|
|
|
return isSameDate(date, yesterday);
|
|
}
|
|
|
|
export function toMilliseconds({days, hours, minutes, seconds}: {days?: number; hours?: number; minutes?: number; seconds?: number}) {
|
|
const totalSeconds = toSeconds({days, hours, minutes, seconds});
|
|
return totalSeconds * 1000;
|
|
}
|
|
|
|
export function toSeconds({days, hours, minutes, seconds}: {days?: number; hours?: number; minutes?: number; seconds?: number}) {
|
|
const totalHours = ((days || 0) * 24) + (hours || 0);
|
|
const totalMinutes = (totalHours * 60) + (minutes || 0);
|
|
const totalSeconds = (totalMinutes * 60) + (seconds || 0);
|
|
return totalSeconds;
|
|
}
|
|
|
|
export function getReadableTimestamp(timestamp: number, timeZone: string, isMilitaryTime: boolean, currentUserLocale: string): string {
|
|
const date = new Date(timestamp);
|
|
const now = new Date();
|
|
const isCurrentYear = date.getFullYear() === now.getFullYear();
|
|
|
|
const options: Intl.DateTimeFormatOptions = {
|
|
month: 'short',
|
|
day: 'numeric',
|
|
hour: 'numeric',
|
|
minute: '2-digit',
|
|
hour12: !isMilitaryTime,
|
|
timeZone: timeZone as string,
|
|
...(isCurrentYear ? {} : {year: 'numeric'}),
|
|
};
|
|
|
|
return date.toLocaleString(currentUserLocale, options);
|
|
}
|
|
|
|
export function formatTime(seconds: number) {
|
|
const h = Math.max(Math.floor(seconds / 3600), 0);
|
|
const m = Math.max(Math.floor((seconds % 3600) / 60), 0);
|
|
const s = Math.max(Math.floor(seconds % 60), 0);
|
|
|
|
const hh = h > 0 ? `${h}:` : '';
|
|
const mm = h > 0 ? `${m.toString().padStart(2, '0')}` : `${m}`;
|
|
const ss = s.toString().padStart(2, '0');
|
|
|
|
return `${hh}${mm}:${ss}`;
|
|
}
|