43 lines
No EOL
1.2 KiB
TypeScript
43 lines
No EOL
1.2 KiB
TypeScript
import { REPEAT_TYPES, type IRepeatAfter } from '@/types/IRepeatAfter'
|
|
import { nativeEnum, number, object, preprocess } from 'zod'
|
|
|
|
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: '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 = 'weeks'
|
|
repeatAfter.amount = repeatAfterDays / 7
|
|
} else if (repeatAfterDays % 30 === 0) {
|
|
repeatAfter.type = 'months'
|
|
repeatAfter.amount = repeatAfterDays / 30
|
|
} else if (repeatAfterDays % 365 === 0) {
|
|
repeatAfter.type = 'years'
|
|
repeatAfter.amount = repeatAfterDays / 365
|
|
} else {
|
|
repeatAfter.type = 'days'
|
|
repeatAfter.amount = repeatAfterDays
|
|
}
|
|
}
|
|
|
|
return repeatAfter
|
|
},
|
|
object({
|
|
type: nativeEnum(REPEAT_TYPES),
|
|
amount: number().int(),
|
|
}),
|
|
) |