import { nativeEnum, number, object, preprocess, type TypeOf } from 'zod' export enum REPEAT_TYPES { HOURS = 'hours', DAYS = 'days', WEEKS = 'weeks', MONTHS = 'months', YEARS = 'years', } export type IRepeatType = typeof REPEAT_TYPES[keyof typeof REPEAT_TYPES] export interface IRepeatAfter { type: IRepeatType, amount: number, } export const RepeatsSchema = preprocess( (repeats: unknown) => { // Parses the "repeat after x seconds" from the task into a usable js object inside the task. if (typeof repeats !== 'number') { return repeats } const repeatAfterHours = (repeats / 60) / 60 const repeatAfter : IRepeatAfter = { type: REPEAT_TYPES.HOURS, amount: repeatAfterHours, } // if its dividable by 24, its something with days, otherwise hours if (repeatAfterHours % 24 === 0) { const repeatAfterDays = repeatAfterHours / 24 if (repeatAfterDays % 7 === 0) { repeatAfter.type = REPEAT_TYPES.WEEKS repeatAfter.amount = repeatAfterDays / 7 } else if (repeatAfterDays % 30 === 0) { repeatAfter.type = REPEAT_TYPES.MONTHS repeatAfter.amount = repeatAfterDays / 30 } else if (repeatAfterDays % 365 === 0) { repeatAfter.type = REPEAT_TYPES.YEARS repeatAfter.amount = repeatAfterDays / 365 } else { repeatAfter.type = REPEAT_TYPES.DAYS repeatAfter.amount = repeatAfterDays } } return repeatAfter }, object({ type: nativeEnum(REPEAT_TYPES), amount: number().int(), }), ) export type RepeatAfter = TypeOf