This repository has been archived on 2024-02-08. You can view files and clone it, but cannot push or open issues or pull requests.
frontend/src/modelSchema/common/repeats.ts

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>