agx-chat-web 1.2.1 → 1.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -49
- package/package.json +91 -91
- package/src/__tests__/app/Messenger/classes/slaCalculations.spec.ts +122 -122
- package/src/app/ChatProvider/ChatProvider.tsx +20 -20
- package/src/app/Messenger/classes/slaCalculations.ts +197 -197
- package/src/app/Messenger/components/ChatButton/ChatButton.tsx +64 -64
- package/src/app/Messenger/components/ChatTabs/ChatTabs.less +18 -18
- package/src/app/Messenger/components/ChatTabs/ChatTabs.tsx +32 -32
- package/src/app/Messenger/components/DocMessage/DocMessage.less +71 -71
- package/src/app/Messenger/components/DocMessage/DocMessage.tsx +50 -50
- package/src/app/Messenger/components/ImagesContainer/ImagesContainer.less +79 -79
- package/src/app/Messenger/components/ImagesContainer/ImagesContainer.tsx +51 -51
- package/src/app/Messenger/components/IncomingMessage/IncomingMessage.tsx +170 -170
- package/src/app/Messenger/components/InfiniteScroll/InfiniteScroll.tsx +80 -80
- package/src/app/Messenger/components/InputFile/InputFile.tsx +147 -147
- package/src/app/Messenger/components/InputFile/inputFile.less +59 -59
- package/src/app/Messenger/components/MessageBallon/MessageBalloon.tsx +100 -100
- package/src/app/Messenger/components/MessengerAvatar/MessengerAvatar.tsx +29 -29
- package/src/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.tsx +62 -62
- package/src/app/Messenger/components/RenderFileIcon/RenderFileIcon.tsx +40 -40
- package/src/app/Messenger/components/SearchInput/SearchInput.less +45 -45
- package/src/app/Messenger/components/SearchInput/SearchInput.tsx +77 -77
- package/src/app/Messenger/components/Select/Select.less +22 -22
- package/src/app/Messenger/components/Select/Select.tsx +56 -56
- package/src/app/Messenger/components/SendMessageForm/SendMessageForm.tsx +254 -254
- package/src/app/Messenger/components/SenderMessages/SenderMessages.tsx +91 -91
- package/src/app/Messenger/components/SystemMessage/SystemMessage.tsx +25 -25
- package/src/app/Messenger/components/TextArea/TextArea.tsx +35 -35
- package/src/app/Messenger/components/TextArea/Textarea.less +22 -22
- package/src/app/Messenger/components/Tooltip/Tooltip.less +27 -27
- package/src/app/Messenger/components/Tooltip/Tooltip.tsx +17 -17
- package/src/app/Messenger/hooks/useConversations.tsx +143 -143
- package/src/app/Messenger/hooks/useMessages.tsx +49 -49
- package/src/app/Messenger/hooks/useThemes.tsx +14 -14
- package/src/app/Messenger/icons/AttachFileIcon.tsx +20 -20
- package/src/app/Messenger/icons/CSVFileIcon.tsx +26 -26
- package/src/app/Messenger/icons/CloseIcon.tsx +20 -20
- package/src/app/Messenger/icons/DOCFileIcon.tsx +54 -54
- package/src/app/Messenger/icons/DownloadMinimalistIcon.tsx +37 -37
- package/src/app/Messenger/icons/EmptyIcon.tsx +20 -20
- package/src/app/Messenger/icons/MP4FileIcon.tsx +26 -26
- package/src/app/Messenger/icons/MessageIcon.tsx +27 -27
- package/src/app/Messenger/icons/PDFFileIcon.tsx +54 -54
- package/src/app/Messenger/icons/ReadIcon.tsx +18 -18
- package/src/app/Messenger/icons/SearchIcon.tsx +20 -20
- package/src/app/Messenger/icons/TimerIcon.tsx +18 -18
- package/src/app/Messenger/icons/TrashIcon.tsx +21 -21
- package/src/app/Messenger/views/Messenger.less +623 -623
- package/src/app/Messenger/views/MessengerList.tsx +170 -170
- package/src/app/Messenger/views/MessengerListItem.tsx +178 -178
- package/src/app/Messenger/views/MessengerMessages.tsx +414 -414
- package/src/app/Messenger/views/NewFormChat.tsx +145 -145
- package/src/app/i18n/index.ts +36 -36
- package/src/app/i18n/locales/en.json +64 -64
- package/src/app/i18n/locales/pt.json +64 -64
- package/src/assets/right-arrow.svg +9 -9
- package/src/index.ts +23 -23
- package/src/react-app-env.d.ts +19 -19
- package/src/setupTests.ts +5 -5
- package/src/styles/abstracts/animations.less +8 -8
- package/src/styles/abstracts/mixins.less +5 -5
- package/src/styles/abstracts/variables.less +31 -31
- package/src/styles/base/base.less +6 -6
- package/src/styles/index.less +5 -5
- package/src/types.ts +174 -174
- package/dist/agx-chat.esm.js +0 -2
- package/dist/agx-chat.esm.js.map +0 -1
- package/dist/agx-chat.umd.js +0 -2
- package/dist/agx-chat.umd.js.map +0 -1
- package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.d.ts +0 -1
- package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.js +0 -46
- package/dist/esm/__tests__/app/Messenger/classes/slaCalculations.spec.js.map +0 -1
- package/dist/esm/app/ChatProvider/ChatProvider.d.ts +0 -7
- package/dist/esm/app/ChatProvider/ChatProvider.js +0 -14
- package/dist/esm/app/ChatProvider/ChatProvider.js.map +0 -1
- package/dist/esm/app/Messenger/classes/slaCalculations.d.ts +0 -30
- package/dist/esm/app/Messenger/classes/slaCalculations.js +0 -144
- package/dist/esm/app/Messenger/classes/slaCalculations.js.map +0 -1
- package/dist/esm/app/Messenger/components/ChatButton/ChatButton.d.ts +0 -14
- package/dist/esm/app/Messenger/components/ChatButton/ChatButton.js +0 -31
- package/dist/esm/app/Messenger/components/ChatButton/ChatButton.js.map +0 -1
- package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.d.ts +0 -10
- package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.js +0 -15
- package/dist/esm/app/Messenger/components/ChatTabs/ChatTabs.js.map +0 -1
- package/dist/esm/app/Messenger/components/DocMessage/DocMessage.d.ts +0 -5
- package/dist/esm/app/Messenger/components/DocMessage/DocMessage.js +0 -35
- package/dist/esm/app/Messenger/components/DocMessage/DocMessage.js.map +0 -1
- package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.d.ts +0 -4
- package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.js +0 -39
- package/dist/esm/app/Messenger/components/ImagesContainer/ImagesContainer.js.map +0 -1
- package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.d.ts +0 -7
- package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js +0 -53
- package/dist/esm/app/Messenger/components/IncomingMessage/IncomingMessage.js.map +0 -1
- package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.d.ts +0 -13
- package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.js +0 -43
- package/dist/esm/app/Messenger/components/InfiniteScroll/InfiniteScroll.js.map +0 -1
- package/dist/esm/app/Messenger/components/InputFile/InputFile.d.ts +0 -11
- package/dist/esm/app/Messenger/components/InputFile/InputFile.js +0 -74
- package/dist/esm/app/Messenger/components/InputFile/InputFile.js.map +0 -1
- package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.d.ts +0 -9
- package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.js +0 -34
- package/dist/esm/app/Messenger/components/MessageBallon/MessageBalloon.js.map +0 -1
- package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.d.ts +0 -4
- package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.js +0 -13
- package/dist/esm/app/Messenger/components/MessengerAvatar/MessengerAvatar.js.map +0 -1
- package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.d.ts +0 -41
- package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.js +0 -40
- package/dist/esm/app/Messenger/components/MessengerThemeWrapper/MessengerThemeWrapper.js.map +0 -1
- package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.d.ts +0 -6
- package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js +0 -29
- package/dist/esm/app/Messenger/components/RenderFileIcon/RenderFileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/components/SearchInput/SearchInput.d.ts +0 -11
- package/dist/esm/app/Messenger/components/SearchInput/SearchInput.js +0 -33
- package/dist/esm/app/Messenger/components/SearchInput/SearchInput.js.map +0 -1
- package/dist/esm/app/Messenger/components/Select/Select.d.ts +0 -14
- package/dist/esm/app/Messenger/components/Select/Select.js +0 -16
- package/dist/esm/app/Messenger/components/Select/Select.js.map +0 -1
- package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.d.ts +0 -13
- package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js +0 -143
- package/dist/esm/app/Messenger/components/SendMessageForm/SendMessageForm.js.map +0 -1
- package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.d.ts +0 -4
- package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js +0 -43
- package/dist/esm/app/Messenger/components/SenderMessages/SenderMessages.js.map +0 -1
- package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.d.ts +0 -4
- package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.js +0 -14
- package/dist/esm/app/Messenger/components/SystemMessage/SystemMessage.js.map +0 -1
- package/dist/esm/app/Messenger/components/TextArea/TextArea.d.ts +0 -9
- package/dist/esm/app/Messenger/components/TextArea/TextArea.js +0 -14
- package/dist/esm/app/Messenger/components/TextArea/TextArea.js.map +0 -1
- package/dist/esm/app/Messenger/components/Tooltip/Tooltip.d.ts +0 -7
- package/dist/esm/app/Messenger/components/Tooltip/Tooltip.js +0 -9
- package/dist/esm/app/Messenger/components/Tooltip/Tooltip.js.map +0 -1
- package/dist/esm/app/Messenger/hooks/useConversations.d.ts +0 -21
- package/dist/esm/app/Messenger/hooks/useConversations.js +0 -105
- package/dist/esm/app/Messenger/hooks/useConversations.js.map +0 -1
- package/dist/esm/app/Messenger/hooks/useMessages.d.ts +0 -9
- package/dist/esm/app/Messenger/hooks/useMessages.js +0 -37
- package/dist/esm/app/Messenger/hooks/useMessages.js.map +0 -1
- package/dist/esm/app/Messenger/hooks/useThemes.d.ts +0 -32
- package/dist/esm/app/Messenger/hooks/useThemes.js +0 -11
- package/dist/esm/app/Messenger/hooks/useThemes.js.map +0 -1
- package/dist/esm/app/Messenger/icons/AttachFileIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/AttachFileIcon.js +0 -10
- package/dist/esm/app/Messenger/icons/AttachFileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/CSVFileIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/CSVFileIcon.js +0 -7
- package/dist/esm/app/Messenger/icons/CSVFileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/CloseIcon.d.ts +0 -2
- package/dist/esm/app/Messenger/icons/CloseIcon.js +0 -9
- package/dist/esm/app/Messenger/icons/CloseIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/DOCFileIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/DOCFileIcon.js +0 -18
- package/dist/esm/app/Messenger/icons/DOCFileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.d.ts +0 -7
- package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.js +0 -12
- package/dist/esm/app/Messenger/icons/DownloadMinimalistIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/EmptyIcon.d.ts +0 -2
- package/dist/esm/app/Messenger/icons/EmptyIcon.js +0 -8
- package/dist/esm/app/Messenger/icons/EmptyIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/MP4FileIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/MP4FileIcon.js +0 -7
- package/dist/esm/app/Messenger/icons/MP4FileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/MessageIcon.d.ts +0 -6
- package/dist/esm/app/Messenger/icons/MessageIcon.js +0 -12
- package/dist/esm/app/Messenger/icons/MessageIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/PDFFileIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/PDFFileIcon.js +0 -18
- package/dist/esm/app/Messenger/icons/PDFFileIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/ReadIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/ReadIcon.js +0 -7
- package/dist/esm/app/Messenger/icons/ReadIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/SearchIcon.d.ts +0 -2
- package/dist/esm/app/Messenger/icons/SearchIcon.js +0 -8
- package/dist/esm/app/Messenger/icons/SearchIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/TimerIcon.d.ts +0 -4
- package/dist/esm/app/Messenger/icons/TimerIcon.js +0 -7
- package/dist/esm/app/Messenger/icons/TimerIcon.js.map +0 -1
- package/dist/esm/app/Messenger/icons/TrashIcon.d.ts +0 -6
- package/dist/esm/app/Messenger/icons/TrashIcon.js +0 -7
- package/dist/esm/app/Messenger/icons/TrashIcon.js.map +0 -1
- package/dist/esm/app/Messenger/views/MessengerList.d.ts +0 -40
- package/dist/esm/app/Messenger/views/MessengerList.js +0 -46
- package/dist/esm/app/Messenger/views/MessengerList.js.map +0 -1
- package/dist/esm/app/Messenger/views/MessengerListItem.d.ts +0 -12
- package/dist/esm/app/Messenger/views/MessengerListItem.js +0 -99
- package/dist/esm/app/Messenger/views/MessengerListItem.js.map +0 -1
- package/dist/esm/app/Messenger/views/MessengerMessages.d.ts +0 -35
- package/dist/esm/app/Messenger/views/MessengerMessages.js +0 -181
- package/dist/esm/app/Messenger/views/MessengerMessages.js.map +0 -1
- package/dist/esm/app/Messenger/views/NewFormChat.d.ts +0 -13
- package/dist/esm/app/Messenger/views/NewFormChat.js +0 -68
- package/dist/esm/app/Messenger/views/NewFormChat.js.map +0 -1
- package/dist/esm/app/i18n/index.d.ts +0 -3
- package/dist/esm/app/i18n/index.js +0 -32
- package/dist/esm/app/i18n/index.js.map +0 -1
- package/dist/esm/index.d.ts +0 -11
- package/dist/esm/index.js +0 -12
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/setupTests.d.ts +0 -1
- package/dist/esm/setupTests.js +0 -6
- package/dist/esm/setupTests.js.map +0 -1
- package/dist/esm/types.d.ts +0 -140
- package/dist/esm/types.js +0 -2
- package/dist/esm/types.js.map +0 -1
|
@@ -1,197 +1,197 @@
|
|
|
1
|
-
import dayjs, { ConfigType, Dayjs } from 'dayjs'
|
|
2
|
-
import dayjsBR from 'dayjs/locale/pt-br'
|
|
3
|
-
import utc from 'dayjs/plugin/utc'
|
|
4
|
-
import timezone from 'dayjs/plugin/timezone'
|
|
5
|
-
import isToday from 'dayjs/plugin/isToday'
|
|
6
|
-
const serverTz = 'America/Sao_Paulo'
|
|
7
|
-
|
|
8
|
-
dayjs.extend(utc)
|
|
9
|
-
dayjs.extend(timezone)
|
|
10
|
-
dayjs.extend(isToday)
|
|
11
|
-
dayjs.locale(dayjsBR)
|
|
12
|
-
|
|
13
|
-
export const timeAsDayjs = (
|
|
14
|
-
value: ConfigType = new Date(),
|
|
15
|
-
options?: { server?: boolean; applyTimezone?: boolean }
|
|
16
|
-
): Dayjs => {
|
|
17
|
-
const server = options?.server
|
|
18
|
-
const applyTimezone = options?.applyTimezone
|
|
19
|
-
|
|
20
|
-
let timezone = dayjs.tz.guess()
|
|
21
|
-
if (!(applyTimezone ?? true)) timezone = 'GMT'
|
|
22
|
-
else if (server ?? false) timezone = serverTz
|
|
23
|
-
|
|
24
|
-
return dayjs.tz(value, timezone)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export const time = (
|
|
28
|
-
value: ConfigType = new Date(),
|
|
29
|
-
options?: { server?: boolean; applyTimezone?: boolean }
|
|
30
|
-
): Date => {
|
|
31
|
-
const server = options?.server
|
|
32
|
-
const applyTimezone = options?.applyTimezone
|
|
33
|
-
let aux: Dayjs
|
|
34
|
-
|
|
35
|
-
if (!(applyTimezone ?? true))
|
|
36
|
-
aux = dayjs.tz(value, 'GMT') // Set applyTimezone to false when timezone is applied incorrectly (usually when working with JSDate and timestamps)
|
|
37
|
-
else if (server ?? false) aux = dayjs.tz(value, serverTz)
|
|
38
|
-
else aux = dayjs.tz(value, dayjs.tz.guess())
|
|
39
|
-
|
|
40
|
-
return new Date(
|
|
41
|
-
Date.UTC(
|
|
42
|
-
aux.year(),
|
|
43
|
-
aux.month(),
|
|
44
|
-
aux.date(),
|
|
45
|
-
aux.hour(),
|
|
46
|
-
aux.minute(),
|
|
47
|
-
aux.second(),
|
|
48
|
-
aux.millisecond()
|
|
49
|
-
)
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export class SlaDates {
|
|
54
|
-
public seconds: number | null
|
|
55
|
-
|
|
56
|
-
constructor (seconds: number) {
|
|
57
|
-
this.seconds = seconds
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
private holidays = {
|
|
61
|
-
2023: ['09-07', '10-12', '10-17', '11-02', '11-15', '11-20', '12-25'],
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private isWorkingDay (date: Dayjs) {
|
|
65
|
-
const dayOfWeek = date.day()
|
|
66
|
-
return dayOfWeek >= 1 && dayOfWeek <= 5 // Monday to Friday (1 to 5)
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
private isWorkingHour (date: Dayjs) {
|
|
70
|
-
const hour = date.hour()
|
|
71
|
-
return hour >= 9 && hour <= 18 // Between 9 AM and 5 PM (inclusive)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
public isWeekendOrHoliday (date: Dayjs | Date | string): boolean {
|
|
75
|
-
const weekDay = timeAsDayjs(date, { applyTimezone: false }).day()
|
|
76
|
-
if ([6, 0].includes(weekDay)) return true
|
|
77
|
-
|
|
78
|
-
const formatedDate = timeAsDayjs(date).format('MM-DD')
|
|
79
|
-
const isHollyday = this.holidays[2023].includes(formatedDate)
|
|
80
|
-
return isHollyday
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private isHoliday (date: Dayjs) {
|
|
84
|
-
const formatedDate = timeAsDayjs(date, { applyTimezone: false }).format(
|
|
85
|
-
'MM-DD'
|
|
86
|
-
)
|
|
87
|
-
const isHollyday = this.holidays[2023].includes(formatedDate)
|
|
88
|
-
return isHollyday
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
public canUpdateClock (date: Dayjs) {
|
|
92
|
-
const isWorking = this.isWorkingDay(date) && this.isWorkingHour(date)
|
|
93
|
-
return !this.isWeekendOrHoliday(date) && isWorking
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public getDiffInSeconds (
|
|
97
|
-
startDate: dayjs.Dayjs,
|
|
98
|
-
endDate: dayjs.Dayjs
|
|
99
|
-
): number {
|
|
100
|
-
const diffInSeconds = endDate.diff(startDate, 'second')
|
|
101
|
-
return diffInSeconds
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
calculateWorkingTime (
|
|
105
|
-
startDate: Dayjs,
|
|
106
|
-
endDate: Dayjs,
|
|
107
|
-
workingHours: { start: number; end: number }
|
|
108
|
-
) {
|
|
109
|
-
let current = startDate.clone()
|
|
110
|
-
let workingTime = 0
|
|
111
|
-
|
|
112
|
-
while (current.isBefore(endDate)) {
|
|
113
|
-
// Skip weekends (Saturday and Sunday) and Holydays
|
|
114
|
-
|
|
115
|
-
if (this.isWorkingDay(current) && !this.isHoliday(current)) {
|
|
116
|
-
const startOfDay = current
|
|
117
|
-
.clone()
|
|
118
|
-
.startOf('day')
|
|
119
|
-
.add(workingHours.start, 'hour')
|
|
120
|
-
const endOfDay = current
|
|
121
|
-
.clone()
|
|
122
|
-
.startOf('day')
|
|
123
|
-
.add(workingHours.end, 'hour')
|
|
124
|
-
|
|
125
|
-
if (current.isBefore(startOfDay)) {
|
|
126
|
-
// If current time is before the start of working hours, move to the start of working hours
|
|
127
|
-
current = startOfDay.clone()
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
if (current.isAfter(endOfDay)) {
|
|
131
|
-
current = current.clone().add(1, 'day').startOf('day')
|
|
132
|
-
} else if (endDate.isAfter(endOfDay)) {
|
|
133
|
-
// If end date is after the end of working hours, add a full working day
|
|
134
|
-
|
|
135
|
-
workingTime += Math.abs(endOfDay.clone().diff(current, 'second'))
|
|
136
|
-
current = current
|
|
137
|
-
.clone()
|
|
138
|
-
.add(1, 'day')
|
|
139
|
-
.startOf('day')
|
|
140
|
-
.add(workingHours.start, 'hour')
|
|
141
|
-
} else {
|
|
142
|
-
// Calculate working time for the last day (end date)
|
|
143
|
-
workingTime += Math.abs(endDate.clone().diff(current, 'second'))
|
|
144
|
-
|
|
145
|
-
break
|
|
146
|
-
}
|
|
147
|
-
} else {
|
|
148
|
-
// Move to the next day
|
|
149
|
-
current = current.clone().add(1, 'day').startOf('day')
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return workingTime
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Function to calculate the difference in seconds between two dates considering working hours
|
|
157
|
-
getDifferenceInSeconds (
|
|
158
|
-
startDate: Dayjs,
|
|
159
|
-
endDate: Dayjs,
|
|
160
|
-
workingHours: { start: number; end: number }
|
|
161
|
-
) {
|
|
162
|
-
if (endDate.isBefore(startDate)) {
|
|
163
|
-
throw new Error('End date should be after the start date.')
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
const workingTimeInSeconds = this.calculateWorkingTime(
|
|
167
|
-
startDate,
|
|
168
|
-
endDate,
|
|
169
|
-
workingHours
|
|
170
|
-
)
|
|
171
|
-
return workingTimeInSeconds
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
static secondsInHours (currentSeconds: number) {
|
|
175
|
-
const hours = Math.floor(currentSeconds / 3600)
|
|
176
|
-
const minutes = Math.floor((currentSeconds % 3600) / 60)
|
|
177
|
-
const seconds = currentSeconds % 60
|
|
178
|
-
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
static getColorsByTime (seconds: number) {
|
|
182
|
-
const hours = seconds / 3600
|
|
183
|
-
if (hours <= 2) {
|
|
184
|
-
return '#00CF7B'
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
if (hours >= 2 && hours < 3) {
|
|
188
|
-
return '#FF9838'
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
if (hours >= 3 && hours < 4) {
|
|
192
|
-
return '#DD4E4E'
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
return '#151919'
|
|
196
|
-
}
|
|
197
|
-
}
|
|
1
|
+
import dayjs, { ConfigType, Dayjs } from 'dayjs'
|
|
2
|
+
import dayjsBR from 'dayjs/locale/pt-br'
|
|
3
|
+
import utc from 'dayjs/plugin/utc'
|
|
4
|
+
import timezone from 'dayjs/plugin/timezone'
|
|
5
|
+
import isToday from 'dayjs/plugin/isToday'
|
|
6
|
+
const serverTz = 'America/Sao_Paulo'
|
|
7
|
+
|
|
8
|
+
dayjs.extend(utc)
|
|
9
|
+
dayjs.extend(timezone)
|
|
10
|
+
dayjs.extend(isToday)
|
|
11
|
+
dayjs.locale(dayjsBR)
|
|
12
|
+
|
|
13
|
+
export const timeAsDayjs = (
|
|
14
|
+
value: ConfigType = new Date(),
|
|
15
|
+
options?: { server?: boolean; applyTimezone?: boolean }
|
|
16
|
+
): Dayjs => {
|
|
17
|
+
const server = options?.server
|
|
18
|
+
const applyTimezone = options?.applyTimezone
|
|
19
|
+
|
|
20
|
+
let timezone = dayjs.tz.guess()
|
|
21
|
+
if (!(applyTimezone ?? true)) timezone = 'GMT'
|
|
22
|
+
else if (server ?? false) timezone = serverTz
|
|
23
|
+
|
|
24
|
+
return dayjs.tz(value, timezone)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const time = (
|
|
28
|
+
value: ConfigType = new Date(),
|
|
29
|
+
options?: { server?: boolean; applyTimezone?: boolean }
|
|
30
|
+
): Date => {
|
|
31
|
+
const server = options?.server
|
|
32
|
+
const applyTimezone = options?.applyTimezone
|
|
33
|
+
let aux: Dayjs
|
|
34
|
+
|
|
35
|
+
if (!(applyTimezone ?? true))
|
|
36
|
+
aux = dayjs.tz(value, 'GMT') // Set applyTimezone to false when timezone is applied incorrectly (usually when working with JSDate and timestamps)
|
|
37
|
+
else if (server ?? false) aux = dayjs.tz(value, serverTz)
|
|
38
|
+
else aux = dayjs.tz(value, dayjs.tz.guess())
|
|
39
|
+
|
|
40
|
+
return new Date(
|
|
41
|
+
Date.UTC(
|
|
42
|
+
aux.year(),
|
|
43
|
+
aux.month(),
|
|
44
|
+
aux.date(),
|
|
45
|
+
aux.hour(),
|
|
46
|
+
aux.minute(),
|
|
47
|
+
aux.second(),
|
|
48
|
+
aux.millisecond()
|
|
49
|
+
)
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class SlaDates {
|
|
54
|
+
public seconds: number | null
|
|
55
|
+
|
|
56
|
+
constructor (seconds: number) {
|
|
57
|
+
this.seconds = seconds
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
private holidays = {
|
|
61
|
+
2023: ['09-07', '10-12', '10-17', '11-02', '11-15', '11-20', '12-25'],
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private isWorkingDay (date: Dayjs) {
|
|
65
|
+
const dayOfWeek = date.day()
|
|
66
|
+
return dayOfWeek >= 1 && dayOfWeek <= 5 // Monday to Friday (1 to 5)
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private isWorkingHour (date: Dayjs) {
|
|
70
|
+
const hour = date.hour()
|
|
71
|
+
return hour >= 9 && hour <= 18 // Between 9 AM and 5 PM (inclusive)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public isWeekendOrHoliday (date: Dayjs | Date | string): boolean {
|
|
75
|
+
const weekDay = timeAsDayjs(date, { applyTimezone: false }).day()
|
|
76
|
+
if ([6, 0].includes(weekDay)) return true
|
|
77
|
+
|
|
78
|
+
const formatedDate = timeAsDayjs(date).format('MM-DD')
|
|
79
|
+
const isHollyday = this.holidays[2023].includes(formatedDate)
|
|
80
|
+
return isHollyday
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private isHoliday (date: Dayjs) {
|
|
84
|
+
const formatedDate = timeAsDayjs(date, { applyTimezone: false }).format(
|
|
85
|
+
'MM-DD'
|
|
86
|
+
)
|
|
87
|
+
const isHollyday = this.holidays[2023].includes(formatedDate)
|
|
88
|
+
return isHollyday
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public canUpdateClock (date: Dayjs) {
|
|
92
|
+
const isWorking = this.isWorkingDay(date) && this.isWorkingHour(date)
|
|
93
|
+
return !this.isWeekendOrHoliday(date) && isWorking
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public getDiffInSeconds (
|
|
97
|
+
startDate: dayjs.Dayjs,
|
|
98
|
+
endDate: dayjs.Dayjs
|
|
99
|
+
): number {
|
|
100
|
+
const diffInSeconds = endDate.diff(startDate, 'second')
|
|
101
|
+
return diffInSeconds
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
calculateWorkingTime (
|
|
105
|
+
startDate: Dayjs,
|
|
106
|
+
endDate: Dayjs,
|
|
107
|
+
workingHours: { start: number; end: number }
|
|
108
|
+
) {
|
|
109
|
+
let current = startDate.clone()
|
|
110
|
+
let workingTime = 0
|
|
111
|
+
|
|
112
|
+
while (current.isBefore(endDate)) {
|
|
113
|
+
// Skip weekends (Saturday and Sunday) and Holydays
|
|
114
|
+
|
|
115
|
+
if (this.isWorkingDay(current) && !this.isHoliday(current)) {
|
|
116
|
+
const startOfDay = current
|
|
117
|
+
.clone()
|
|
118
|
+
.startOf('day')
|
|
119
|
+
.add(workingHours.start, 'hour')
|
|
120
|
+
const endOfDay = current
|
|
121
|
+
.clone()
|
|
122
|
+
.startOf('day')
|
|
123
|
+
.add(workingHours.end, 'hour')
|
|
124
|
+
|
|
125
|
+
if (current.isBefore(startOfDay)) {
|
|
126
|
+
// If current time is before the start of working hours, move to the start of working hours
|
|
127
|
+
current = startOfDay.clone()
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (current.isAfter(endOfDay)) {
|
|
131
|
+
current = current.clone().add(1, 'day').startOf('day')
|
|
132
|
+
} else if (endDate.isAfter(endOfDay)) {
|
|
133
|
+
// If end date is after the end of working hours, add a full working day
|
|
134
|
+
|
|
135
|
+
workingTime += Math.abs(endOfDay.clone().diff(current, 'second'))
|
|
136
|
+
current = current
|
|
137
|
+
.clone()
|
|
138
|
+
.add(1, 'day')
|
|
139
|
+
.startOf('day')
|
|
140
|
+
.add(workingHours.start, 'hour')
|
|
141
|
+
} else {
|
|
142
|
+
// Calculate working time for the last day (end date)
|
|
143
|
+
workingTime += Math.abs(endDate.clone().diff(current, 'second'))
|
|
144
|
+
|
|
145
|
+
break
|
|
146
|
+
}
|
|
147
|
+
} else {
|
|
148
|
+
// Move to the next day
|
|
149
|
+
current = current.clone().add(1, 'day').startOf('day')
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
return workingTime
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// Function to calculate the difference in seconds between two dates considering working hours
|
|
157
|
+
getDifferenceInSeconds (
|
|
158
|
+
startDate: Dayjs,
|
|
159
|
+
endDate: Dayjs,
|
|
160
|
+
workingHours: { start: number; end: number }
|
|
161
|
+
) {
|
|
162
|
+
if (endDate.isBefore(startDate)) {
|
|
163
|
+
throw new Error('End date should be after the start date.')
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const workingTimeInSeconds = this.calculateWorkingTime(
|
|
167
|
+
startDate,
|
|
168
|
+
endDate,
|
|
169
|
+
workingHours
|
|
170
|
+
)
|
|
171
|
+
return workingTimeInSeconds
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
static secondsInHours (currentSeconds: number) {
|
|
175
|
+
const hours = Math.floor(currentSeconds / 3600)
|
|
176
|
+
const minutes = Math.floor((currentSeconds % 3600) / 60)
|
|
177
|
+
const seconds = currentSeconds % 60
|
|
178
|
+
return `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
static getColorsByTime (seconds: number) {
|
|
182
|
+
const hours = seconds / 3600
|
|
183
|
+
if (hours <= 2) {
|
|
184
|
+
return '#00CF7B'
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (hours >= 2 && hours < 3) {
|
|
188
|
+
return '#FF9838'
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (hours >= 3 && hours < 4) {
|
|
192
|
+
return '#DD4E4E'
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return '#151919'
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -1,64 +1,64 @@
|
|
|
1
|
-
import React from 'react'
|
|
2
|
-
import useTheme from '../../hooks/useThemes'
|
|
3
|
-
|
|
4
|
-
interface INewChatButton {
|
|
5
|
-
removeActiveItem: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void
|
|
6
|
-
messegerView: 'empty' | 'messages' | 'newChat'
|
|
7
|
-
chatButtons: {
|
|
8
|
-
label: string
|
|
9
|
-
onClick: () => void
|
|
10
|
-
type: string
|
|
11
|
-
canSee: boolean
|
|
12
|
-
disabled?: boolean
|
|
13
|
-
}[]
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function ChatButtons ({ chatButtons, removeActiveItem }: INewChatButton) {
|
|
17
|
-
const { theme } = useTheme()
|
|
18
|
-
|
|
19
|
-
const getButtonType = (type: string, disabled?: boolean) => {
|
|
20
|
-
if (type === 'primary')
|
|
21
|
-
return {
|
|
22
|
-
background: disabled ? theme?.buttonsDisabled : theme?.buttonPrimary,
|
|
23
|
-
color: theme?.buttonPrimaryText,
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
if (type === 'outlined')
|
|
27
|
-
return {
|
|
28
|
-
background: 'transparent',
|
|
29
|
-
color: theme?.asideFontColor,
|
|
30
|
-
border: `${theme?.asideFontColor} 1px solid`,
|
|
31
|
-
}
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return (
|
|
36
|
-
<>
|
|
37
|
-
{chatButtons.map((button) => {
|
|
38
|
-
return (
|
|
39
|
-
button.canSee && (
|
|
40
|
-
<>
|
|
41
|
-
<button
|
|
42
|
-
key={`button-${button.label}`}
|
|
43
|
-
className={
|
|
44
|
-
button.disabled
|
|
45
|
-
? 'messenger__chat-button messenger__chat-button--disabled'
|
|
46
|
-
: 'messenger__chat-button'
|
|
47
|
-
}
|
|
48
|
-
onClick={(event) => {
|
|
49
|
-
button.onClick()
|
|
50
|
-
removeActiveItem(event)
|
|
51
|
-
}}
|
|
52
|
-
style={getButtonType(button.type, button.disabled)}
|
|
53
|
-
>
|
|
54
|
-
{button.label}
|
|
55
|
-
</button>
|
|
56
|
-
</>
|
|
57
|
-
)
|
|
58
|
-
)
|
|
59
|
-
})}
|
|
60
|
-
</>
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export default ChatButtons
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import useTheme from '../../hooks/useThemes'
|
|
3
|
+
|
|
4
|
+
interface INewChatButton {
|
|
5
|
+
removeActiveItem: (e: React.MouseEvent<HTMLElement, MouseEvent>) => void
|
|
6
|
+
messegerView: 'empty' | 'messages' | 'newChat'
|
|
7
|
+
chatButtons: {
|
|
8
|
+
label: string
|
|
9
|
+
onClick: () => void
|
|
10
|
+
type: string
|
|
11
|
+
canSee: boolean
|
|
12
|
+
disabled?: boolean
|
|
13
|
+
}[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function ChatButtons ({ chatButtons, removeActiveItem }: INewChatButton) {
|
|
17
|
+
const { theme } = useTheme()
|
|
18
|
+
|
|
19
|
+
const getButtonType = (type: string, disabled?: boolean) => {
|
|
20
|
+
if (type === 'primary')
|
|
21
|
+
return {
|
|
22
|
+
background: disabled ? theme?.buttonsDisabled : theme?.buttonPrimary,
|
|
23
|
+
color: theme?.buttonPrimaryText,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
if (type === 'outlined')
|
|
27
|
+
return {
|
|
28
|
+
background: 'transparent',
|
|
29
|
+
color: theme?.asideFontColor,
|
|
30
|
+
border: `${theme?.asideFontColor} 1px solid`,
|
|
31
|
+
}
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return (
|
|
36
|
+
<>
|
|
37
|
+
{chatButtons.map((button) => {
|
|
38
|
+
return (
|
|
39
|
+
button.canSee && (
|
|
40
|
+
<>
|
|
41
|
+
<button
|
|
42
|
+
key={`button-${button.label}`}
|
|
43
|
+
className={
|
|
44
|
+
button.disabled
|
|
45
|
+
? 'messenger__chat-button messenger__chat-button--disabled'
|
|
46
|
+
: 'messenger__chat-button'
|
|
47
|
+
}
|
|
48
|
+
onClick={(event) => {
|
|
49
|
+
button.onClick()
|
|
50
|
+
removeActiveItem(event)
|
|
51
|
+
}}
|
|
52
|
+
style={getButtonType(button.type, button.disabled)}
|
|
53
|
+
>
|
|
54
|
+
{button.label}
|
|
55
|
+
</button>
|
|
56
|
+
</>
|
|
57
|
+
)
|
|
58
|
+
)
|
|
59
|
+
})}
|
|
60
|
+
</>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export default ChatButtons
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
.chat-tabs {
|
|
2
|
-
display: flex;
|
|
3
|
-
justify-content: center;
|
|
4
|
-
align-items: center;
|
|
5
|
-
&__button {
|
|
6
|
-
background: transparent;
|
|
7
|
-
border: none;
|
|
8
|
-
border-bottom: 1px solid transparent;
|
|
9
|
-
cursor: pointer;
|
|
10
|
-
padding: 0.5rem 1rem;
|
|
11
|
-
margin-bottom: 0.5rem;
|
|
12
|
-
|
|
13
|
-
&--active {
|
|
14
|
-
border-bottom: 1px solid var(--secondary-color);
|
|
15
|
-
transition: 0.5s;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
}
|
|
1
|
+
.chat-tabs {
|
|
2
|
+
display: flex;
|
|
3
|
+
justify-content: center;
|
|
4
|
+
align-items: center;
|
|
5
|
+
&__button {
|
|
6
|
+
background: transparent;
|
|
7
|
+
border: none;
|
|
8
|
+
border-bottom: 1px solid transparent;
|
|
9
|
+
cursor: pointer;
|
|
10
|
+
padding: 0.5rem 1rem;
|
|
11
|
+
margin-bottom: 0.5rem;
|
|
12
|
+
|
|
13
|
+
&--active {
|
|
14
|
+
border-bottom: 1px solid var(--secondary-color);
|
|
15
|
+
transition: 0.5s;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
import useTheme from '../../hooks/useThemes'
|
|
2
|
-
import { activeItem } from '../../views/MessengerListItem'
|
|
3
|
-
import React from 'react'
|
|
4
|
-
|
|
5
|
-
interface IProps {
|
|
6
|
-
handleChangeTickets: (tab: string) => void
|
|
7
|
-
chatListTabs: { value: string; label: string }[]
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
function ChatTabs ({ handleChangeTickets, chatListTabs }: IProps) {
|
|
11
|
-
const { theme } = useTheme()
|
|
12
|
-
return (
|
|
13
|
-
<div className='chat-tabs' style={{ color: theme.asideFontColor }}>
|
|
14
|
-
{chatListTabs.map((tab, index) => {
|
|
15
|
-
return (
|
|
16
|
-
<button
|
|
17
|
-
key={`chatListTab-${index}`}
|
|
18
|
-
className={`chat-tabs__button ${index === 0 && 'chat-tabs__button--active'}`}
|
|
19
|
-
onClick={(e) => {
|
|
20
|
-
handleChangeTickets(tab.value)
|
|
21
|
-
activeItem(e, 'chat-tabs__button', 'chat-tabs__button--active')
|
|
22
|
-
}}
|
|
23
|
-
>
|
|
24
|
-
{tab.label}
|
|
25
|
-
</button>
|
|
26
|
-
)
|
|
27
|
-
})}
|
|
28
|
-
</div>
|
|
29
|
-
)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export default ChatTabs
|
|
1
|
+
import useTheme from '../../hooks/useThemes'
|
|
2
|
+
import { activeItem } from '../../views/MessengerListItem'
|
|
3
|
+
import React from 'react'
|
|
4
|
+
|
|
5
|
+
interface IProps {
|
|
6
|
+
handleChangeTickets: (tab: string) => void
|
|
7
|
+
chatListTabs: { value: string; label: string }[]
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function ChatTabs ({ handleChangeTickets, chatListTabs }: IProps) {
|
|
11
|
+
const { theme } = useTheme()
|
|
12
|
+
return (
|
|
13
|
+
<div className='chat-tabs' style={{ color: theme.asideFontColor }}>
|
|
14
|
+
{chatListTabs.map((tab, index) => {
|
|
15
|
+
return (
|
|
16
|
+
<button
|
|
17
|
+
key={`chatListTab-${index}`}
|
|
18
|
+
className={`chat-tabs__button ${index === 0 && 'chat-tabs__button--active'}`}
|
|
19
|
+
onClick={(e) => {
|
|
20
|
+
handleChangeTickets(tab.value)
|
|
21
|
+
activeItem(e, 'chat-tabs__button', 'chat-tabs__button--active')
|
|
22
|
+
}}
|
|
23
|
+
>
|
|
24
|
+
{tab.label}
|
|
25
|
+
</button>
|
|
26
|
+
)
|
|
27
|
+
})}
|
|
28
|
+
</div>
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export default ChatTabs
|