59 lines
1.5 KiB
TypeScript
59 lines
1.5 KiB
TypeScript
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<typeof RepeatsSchema> |