export const cancelablePromise = promise => { let isCanceled = false const wrappedPromise = new Promise((resolve, reject) => { promise.then( value => (isCanceled ? reject({ isCanceled, value }) : resolve(value)), error => reject({ isCanceled, error }) ) }) return { promise: wrappedPromise, cancel: () => (isCanceled = true), } } export const noop = () => {} export const delay = n => new Promise(resolve => setTimeout(resolve, n)) export const isObject = obj => { return Object.prototype.toString.call(obj) === '[object Object]' } export const convertToDuration = (milliseconds: number) => { const stringifyTime = (time: number): string => String(time).padStart(2, '0') const seconds = Math.floor(milliseconds / 1000) const minutes = Math.floor(seconds / 60) const hours = Math.floor(minutes / 60) return `${stringifyTime(hours)}:${stringifyTime( minutes % 60 )}:${stringifyTime(seconds % 60)}` } export const convertToTimeWorked = (milliseconds: number) => { const seconds = Math.floor(milliseconds / 1000) const minutes = Math.floor(seconds / 60) const hours = Math.floor(minutes / 60) if (hours > 0) { return `${hours}h, ${minutes % 60}m` } else { return `${minutes % 60}m` } }