import moment from 'moment';
import 'moment-timezone';
import BN from 'bn.js';
import { EAC_SCHEDULING_CONFIG } from 'libs/scheduling';
import * as types from './types';
export interface ICurrentScheduleTimestamp {
raw: string;
value: Date;
}
export const isWindowStartValid = (transactionFields: types.ScheduleState, latestBlock: string) => {
const { windowStart } = transactionFields;
return Boolean(windowStart && windowStart.value && windowStart.value > parseInt(latestBlock, 10));
};
export const isScheduleTimestampValid = (transactionFields: types.ScheduleState) => {
const { scheduleTimestamp, scheduleTimezone } = transactionFields;
const selectedDate = dateTimeToTimezone(scheduleTimestamp, scheduleTimezone.value);
return Boolean(selectedDate >= minFromNow(EAC_SCHEDULING_CONFIG.ALLOW_SCHEDULING_MIN_AFTER_NOW));
export const dateTimeToTimezone = (
scheduleTimestamp: ICurrentScheduleTimestamp,
timezone: string
): Date => {
return moment.tz(scheduleTimestamp.raw, timezone).toDate();
export const dateTimeToUnixTimestamp = (dateTime: Date): number => moment(dateTime).unix();
export const minFromNow = (minutes: number): Date =>
moment()
.add(minutes, 'm')
.toDate();
export const windowSizeBlockToMin = (numberInput: BN | null, scheduleType: string | null) => {
if (numberInput && scheduleType && scheduleType === 'time') {
return numberInput.mul(new BN(60));
return numberInput;
export const calculateWindowStart = (
scheduleType: string | null,
scheduleTimezone: string,
blockWindowStart: number | null
): number =>
(scheduleType === 'time'
? dateTimeToUnixTimestamp(dateTimeToTimezone(scheduleTimestamp, scheduleTimezone))
: blockWindowStart) || 0;