返回 AiToEarn
calendarTiming.utils.ts
根目录 / project / aitoearn-web / src / app / [lng] / accounts / components / CalendarTiming / calendarTiming.utils.ts
1 import type { PublishRecordItem } from '@/api/platforms/publish.types'
2 import dayjs from 'dayjs'
3 import timezone from 'dayjs/plugin/timezone'
4 import utc from 'dayjs/plugin/utc'
5 import { PublishStatus } from '@/api/platforms/publish.constants'
6 import { getDayjsLocale } from '@/app/i18n/languageConfig'
7
8 dayjs.extend(utc)
9 dayjs.extend(timezone)
10
11 const publishNowStatuses = new Set<PublishStatus>([
12 PublishStatus.UNPUBLISH,
13 PublishStatus.QUEUED,
14 ])
15
16 const PUBLISH_MIN_LEAD_MINUTES = 10
17
18 const cancelableStatuses = new Set<PublishStatus>([
19 PublishStatus.UNPUBLISH,
20 PublishStatus.QUEUED,
21 PublishStatus.PLATFORM_SCHEDULED,
22 PublishStatus.WAITING_FOR_USER_ACTION,
23 ])
24
25 const deletableStatuses = new Set<PublishStatus>([
26 PublishStatus.CANCELED,
27 PublishStatus.RELEASED,
28 PublishStatus.FAIL,
29 ])
30
31 const retryableStatuses = new Set<PublishStatus>([
32 PublishStatus.FAIL,
33 ])
34
35 export function canPublishRecordNow(status: PublishStatus, publishTime?: dayjs.ConfigType) {
36 if (!publishNowStatuses.has(status)) {
37 return false
38 }
39
40 return hasPublishMinLeadTime(publishTime)
41 }
42
43 export function hasPublishMinLeadTime(publishTime?: dayjs.ConfigType) {
44 if (!publishTime) {
45 return true
46 }
47
48 return dayjs(publishTime).diff(dayjs(), 'minute', true) > PUBLISH_MIN_LEAD_MINUTES
49 }
50
51 export function isPublishTimeWithinMinLeadTime(publishTime?: dayjs.ConfigType) {
52 if (!publishTime) {
53 return false
54 }
55
56 const minutesUntilPublish = dayjs(publishTime).diff(dayjs(), 'minute', true)
57 return minutesUntilPublish > 0 && minutesUntilPublish <= PUBLISH_MIN_LEAD_MINUTES
58 }
59
60 export function canCancelPublishRecord(status: PublishStatus) {
61 return cancelableStatuses.has(status)
62 }
63
64 export function canDeletePublishRecord(status: PublishStatus) {
65 return deletableStatuses.has(status)
66 }
67
68 export function canRetryPublishRecord(status: PublishStatus) {
69 return retryableStatuses.has(status)
70 }
71
72 export function canReschedulePublishRecord(status: PublishStatus, publishTime?: dayjs.ConfigType) {
73 return publishNowStatuses.has(status) && hasPublishMinLeadTime(publishTime)
74 }
75
76 export function getPublishRecordTaskId(record: PublishRecordItem) {
77 return record.taskId || record.id
78 }
79
80 // 日历国际化
81 export function getFullCalendarLang(lang: string) {
82 return getDayjsLocale(lang)
83 }
84
85 // 封装classNames切换方法
86 export function getTransitionClassNames(direction: 'left' | 'right' | 'fade') {
87 if (direction === 'left') {
88 return {
89 enter: 'slideLeftEnter',
90 enterActive: 'slideLeftEnterActive',
91 exit: 'slideLeftExit',
92 exitActive: 'slideLeftExitActive',
93 }
94 }
95 else if (direction === 'right') {
96 return {
97 enter: 'slideRightEnter',
98 enterActive: 'slideRightEnterActive',
99 exit: 'slideRightExit',
100 exitActive: 'slideRightExitActive',
101 }
102 }
103 else {
104 // fade 动画
105 return {
106 enter: 'fadeEnter',
107 enterActive: 'fadeEnterActive',
108 exit: 'fadeExit',
109 exitActive: 'fadeExitActive',
110 }
111 }
112 }
113
114 // 获取UTC days
115 export function getUtcDays(date: dayjs.ConfigType) {
116 return dayjs(date).utc()
117 }
118
119 // 获取当前时区的days
120 export function getDays(date?: dayjs.ConfigType) {
121 return dayjs(date)
122 }
123
124 /**
125 * 获取指定日期所在周的开始和结束日期
126 * @param date 基准日期
127 * @returns [周开始日期, 周结束日期]
128 */
129 export function getWeekDateRange(date: Date): [Date, Date] {
130 const start = dayjs(date).startOf('week').toDate()
131 const end = dayjs(date).endOf('week').toDate()
132 return [start, end]
133 }
134
135 /**
136 * 获取指定日期所在月的可见日期范围(包含前后补齐的周)
137 * 与 FullCalendar dayGridMonth 视图的日期范围一致
138 * @param date 基准日期
139 * @returns [月视图开始日期, 月视图结束日期]
140 */
141 export function getMonthDateRange(date: Date): [Date, Date] {
142 // 获取当月第一天
143 const monthStart = dayjs(date).startOf('month')
144 // 获取当月最后一天
145 const monthEnd = dayjs(date).endOf('month')
146
147 // FullCalendar 月视图会显示完整的周,需要包含前后补齐的日期
148 // 月视图开始:当月第一天所在周的周日
149 const viewStart = monthStart.startOf('week').toDate()
150 // 月视图结束:当月最后一天所在周的周六
151 const viewEnd = monthEnd.endOf('week').toDate()
152
153 return [viewStart, viewEnd]
154 }
155
155 lines TYPESCRIPT