Files
2024-02-15 17:01:50 +00:00

55 lines
1.7 KiB
TypeScript

import moment from 'moment';
import {getFormat} from 'sentry/utils/dates';
import type {TimeWindow, TimeWindowOptions} from './types';
// Stores the elapsed minutes for each selectable resolution
export const resolutionElapsedMinutes: Record<TimeWindow, number> = {
'1h': 60,
'24h': 60 * 24,
'7d': 60 * 24 * 7,
'30d': 60 * 24 * 30,
};
export function getStartFromTimeWindow(end: Date, timeWindow: TimeWindow): Date {
const start = moment(end).subtract(resolutionElapsedMinutes[timeWindow], 'minute');
return start.toDate();
}
// The pixels to allocate to each time label based on (MMM DD HH:SS AM/PM)
const TIMELABEL_WIDTH = 100;
export function getConfigFromTimeRange(
start: Date,
end: Date,
timelineWidth: number
): TimeWindowOptions {
// Acceptable intervals between time labels, in minutes
const minuteRanges = [1, 10, 30, 60, 4 * 60, 8 * 60, 12 * 60];
const startEndMinutes = (end.getTime() - start.getTime()) / (1000 * 60);
const timeLabelMinutes = startEndMinutes * (TIMELABEL_WIDTH / timelineWidth);
const subMinutePxBuckets = startEndMinutes < timelineWidth;
for (const minutes of minuteRanges) {
if (minutes >= Math.floor(timeLabelMinutes)) {
return {
dateLabelFormat: getFormat({timeOnly: true, seconds: subMinutePxBuckets}),
elapsedMinutes: startEndMinutes,
timeMarkerInterval: minutes,
dateTimeProps: {timeOnly: true},
};
}
}
// Calculate days between each time label interval for larger time ranges
const timeLabelIntervalDays = Math.ceil(timeLabelMinutes / (60 * 24));
return {
dateLabelFormat: getFormat(),
elapsedMinutes: startEndMinutes,
timeMarkerInterval: timeLabelIntervalDays * 60 * 24,
dateTimeProps: {dateOnly: true},
};
}