From 5719a2743ab7d556ee4b7c5dc0847006a56211a8 Mon Sep 17 00:00:00 2001 From: Zabilsya Date: Fri, 17 Jan 2025 17:41:51 +0600 Subject: [PATCH] [DOP-22993] rewrite cronService --- .../services/cronService/cronService.ts | 77 ++++++++++++------- src/shared/services/cronService/types.ts | 6 ++ .../components/DynamicSelect/index.tsx | 12 +-- .../components/DynamicSelect/types.ts | 6 +- src/shared/ui/CronSelect/constants.ts | 4 +- .../ui/CronSelect/hooks/useCron/useCron.ts | 32 +------- src/shared/ui/CronSelect/index.tsx | 11 +-- src/shared/ui/CronSelect/types.ts | 6 -- 8 files changed, 73 insertions(+), 81 deletions(-) diff --git a/src/shared/services/cronService/cronService.ts b/src/shared/services/cronService/cronService.ts index 633a1c47..5b0a6216 100644 --- a/src/shared/services/cronService/cronService.ts +++ b/src/shared/services/cronService/cronService.ts @@ -1,16 +1,19 @@ import { getOrdinalNumber } from '@shared/utils'; import { CRON_VALUE_DEFAULT, DAYS_OF_WEEK } from './constants'; -import { CronSegmentKey, CronSegmentValue } from './types'; +import { CronSegmentKey, CronSegmentValue, Period } from './types'; /** Class for convenient handling cron settings */ export class CronService { private initialValueLength = 5; + private period: Period; + private value: Map; constructor(initialValue?: string) { this.value = this.transformInitialValueToMap(initialValue); + this.period = this.initPeriod(); } private transformInitialValueToMap(initialValue?: string) { @@ -35,6 +38,20 @@ export class CronService { ]); } + private initPeriod() { + if (this.getMonthDay() === null && this.getWeekDay() === null) { + return Period.DAY; + } + if (this.getMonthDay()) { + return Period.MONTH; + } + return Period.WEEK; + } + + getPeriod() { + return this.period; + } + getMinute(): number { return this.value.get('minute')!; } @@ -43,6 +60,10 @@ export class CronService { return this.value.get('hour')!; } + getTime() { + return `${this.getHour()}:${this.getMinute()}`; + } + getMonthDay(): CronSegmentValue { return this.value.get('date') ?? null; } @@ -51,24 +72,40 @@ export class CronService { return this.value.get('day') ?? null; } - getTime() { - return `${this.getHour()}:${this.getMinute()}`; + setPeriod(period: Period) { + this.period = period; + switch (period) { + case Period.DAY: + this.setMonthDay(null); + this.setWeekDay(null); + break; + case Period.WEEK: + this.setWeekDay(new Date().getDay()); + this.setMonthDay(null); + break; + case Period.MONTH: + this.setWeekDay(null); + this.setMonthDay(new Date().getDate()); + } } setMinute(value: number) { if (value < 0 || value > 59) { - this.value.set('minute', new Date().getMinutes()); - } else { - this.value.set('minute', value); + throw new Error('Invalid value'); } + this.value.set('minute', value); } setHour(value: number) { if (value < 0 || value > 23) { - this.value.set('hour', new Date().getHours()); - } else { - this.value.set('hour', value); + throw new Error('Invalid value'); } + this.value.set('hour', value); + } + + setTime(hour?: number, minute?: number) { + this.setHour(hour ?? new Date().getHours()); + this.setMinute(minute ?? new Date().getMinutes()); } setMonthDay(value: CronSegmentValue) { @@ -77,11 +114,9 @@ export class CronService { return; } if (value < 1 || value > 31) { - this.value.set('date', new Date().getDate()); - } else { - this.value.set('date', value); + throw new Error('Invalid value'); } - this.setWeekDay(null); + this.value.set('date', value); } setWeekDay(value: CronSegmentValue) { @@ -90,11 +125,9 @@ export class CronService { return; } if (value < 0 || value > 6) { - this.value.set('day', new Date().getDay()); - } else { - this.value.set('day', value); + throw new Error('Invalid value'); } - this.setMonthDay(null); + this.value.set('day', value); } toString() { @@ -110,15 +143,7 @@ export class CronService { const day = this.getWeekDay(); const date = this.getMonthDay(); - let schedule = 'Every '; - - if (day === null && !date) { - schedule += 'day '; - } else if (day !== null && !date) { - schedule += 'week '; - } else { - schedule += 'month '; - } + let schedule = `Every ${this.period} `; if (day !== null) { schedule += `on ${DAYS_OF_WEEK[day]} `; diff --git a/src/shared/services/cronService/types.ts b/src/shared/services/cronService/types.ts index e5eec6b1..2c46f3b6 100644 --- a/src/shared/services/cronService/types.ts +++ b/src/shared/services/cronService/types.ts @@ -2,6 +2,12 @@ export type CronSegmentValue = number | null; export type CronSegmentKey = 'date' | 'day' | 'hour' | 'minute'; +export enum Period { + DAY = 'day', + WEEK = 'week', + MONTH = 'month', +} + export enum DayOfWeek { SUNDAY, MONDAY, diff --git a/src/shared/ui/CronSelect/components/DynamicSelect/index.tsx b/src/shared/ui/CronSelect/components/DynamicSelect/index.tsx index 9c6d0773..a93d2117 100644 --- a/src/shared/ui/CronSelect/components/DynamicSelect/index.tsx +++ b/src/shared/ui/CronSelect/components/DynamicSelect/index.tsx @@ -1,21 +1,15 @@ import React from 'react'; import { Select } from 'antd'; import { getOrdinalNumber } from '@shared/utils'; +import { Period } from '@shared/services'; import classes from '../../styles.module.less'; import { DAYS_OF_MONTH_SELECT_OPTIONS, DAYS_OF_WEEK_SELECT_OPTIONS } from '../../constants'; -import { Period } from '../../types'; import { DynamicSelectProps } from './types'; -export const DynamicSelect = ({ - periodSelectValue, - weekDay, - monthDay, - onChangeWeekDay, - onChangeMonthDay, -}: DynamicSelectProps) => { - switch (periodSelectValue) { +export const DynamicSelect = ({ period, weekDay, monthDay, onChangeWeekDay, onChangeMonthDay }: DynamicSelectProps) => { + switch (period) { case Period.WEEK: return (