@whitewall/blip-sdk 0.0.173 → 0.0.175
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 +13 -6
- package/dist/cjs/client.js +3 -0
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/index.js +3 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/namespaces/account.js +23 -11
- package/dist/cjs/namespaces/account.js.map +1 -1
- package/dist/cjs/namespaces/analytics.js +54 -0
- package/dist/cjs/namespaces/analytics.js.map +1 -1
- package/dist/cjs/namespaces/desk.js +264 -45
- package/dist/cjs/namespaces/desk.js.map +1 -1
- package/dist/cjs/namespaces/plugins.js +1 -0
- package/dist/cjs/namespaces/plugins.js.map +1 -1
- package/dist/cjs/namespaces/portal.js +45 -0
- package/dist/cjs/namespaces/portal.js.map +1 -1
- package/dist/cjs/namespaces/tunnel.js +46 -0
- package/dist/cjs/namespaces/tunnel.js.map +1 -0
- package/dist/cjs/namespaces/whatsapp.js +2 -23
- package/dist/cjs/namespaces/whatsapp.js.map +1 -1
- package/dist/cjs/sender/multi/multisender.js +28 -9
- package/dist/cjs/sender/multi/multisender.js.map +1 -1
- package/dist/cjs/sender/sessionnegotiator.js +1 -1
- package/dist/cjs/sender/sessionnegotiator.js.map +1 -1
- package/dist/cjs/sender/tcp/tcpsender.js +35 -2
- package/dist/cjs/sender/tcp/tcpsender.js.map +1 -1
- package/dist/cjs/sender/websocket/websocketsender.js +1 -1
- package/dist/cjs/sender/websocket/websocketsender.js.map +1 -1
- package/dist/cjs/types/desk.js.map +1 -1
- package/dist/cjs/types/flow.js +344 -0
- package/dist/cjs/types/flow.js.map +1 -1
- package/dist/cjs/utils/desk.js +65 -0
- package/dist/cjs/utils/desk.js.map +1 -0
- package/dist/cjs/utils/thread.js +84 -0
- package/dist/cjs/utils/thread.js.map +1 -0
- package/dist/cjs/utils/whatsapp.js +268 -0
- package/dist/cjs/utils/whatsapp.js.map +1 -0
- package/dist/esm/client.js +3 -0
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/namespaces/account.js +19 -10
- package/dist/esm/namespaces/account.js.map +1 -1
- package/dist/esm/namespaces/analytics.js +54 -0
- package/dist/esm/namespaces/analytics.js.map +1 -1
- package/dist/esm/namespaces/desk.js +264 -45
- package/dist/esm/namespaces/desk.js.map +1 -1
- package/dist/esm/namespaces/plugins.js +1 -0
- package/dist/esm/namespaces/plugins.js.map +1 -1
- package/dist/esm/namespaces/portal.js +45 -0
- package/dist/esm/namespaces/portal.js.map +1 -1
- package/dist/esm/namespaces/tunnel.js +42 -0
- package/dist/esm/namespaces/tunnel.js.map +1 -0
- package/dist/esm/namespaces/whatsapp.js +2 -23
- package/dist/esm/namespaces/whatsapp.js.map +1 -1
- package/dist/esm/sender/multi/multisender.js +28 -9
- package/dist/esm/sender/multi/multisender.js.map +1 -1
- package/dist/esm/sender/sessionnegotiator.js +1 -1
- package/dist/esm/sender/sessionnegotiator.js.map +1 -1
- package/dist/esm/sender/tcp/tcpsender.js +1 -1
- package/dist/esm/sender/tcp/tcpsender.js.map +1 -1
- package/dist/esm/sender/websocket/websocketsender.js +1 -1
- package/dist/esm/sender/websocket/websocketsender.js.map +1 -1
- package/dist/esm/types/desk.js.map +1 -1
- package/dist/esm/types/flow.js +343 -1
- package/dist/esm/types/flow.js.map +1 -1
- package/dist/esm/utils/desk.js +59 -0
- package/dist/esm/utils/desk.js.map +1 -0
- package/dist/esm/utils/thread.js +80 -0
- package/dist/esm/utils/thread.js.map +1 -0
- package/dist/esm/utils/whatsapp.js +263 -0
- package/dist/esm/utils/whatsapp.js.map +1 -0
- package/dist/types/client.d.ts +2 -0
- package/dist/types/client.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/namespaces/account.d.ts +1791 -3
- package/dist/types/namespaces/account.d.ts.map +1 -1
- package/dist/types/namespaces/analytics.d.ts +60 -0
- package/dist/types/namespaces/analytics.d.ts.map +1 -1
- package/dist/types/namespaces/desk.d.ts +124 -4
- package/dist/types/namespaces/desk.d.ts.map +1 -1
- package/dist/types/namespaces/plugins.d.ts +1 -0
- package/dist/types/namespaces/plugins.d.ts.map +1 -1
- package/dist/types/namespaces/portal.d.ts +45 -0
- package/dist/types/namespaces/portal.d.ts.map +1 -1
- package/dist/types/namespaces/tunnel.d.ts +28 -0
- package/dist/types/namespaces/tunnel.d.ts.map +1 -0
- package/dist/types/namespaces/whatsapp.d.ts +3 -2
- package/dist/types/namespaces/whatsapp.d.ts.map +1 -1
- package/dist/types/schemas/webhook.d.ts +2 -2
- package/dist/types/sender/gateway/customgatewaysender.d.ts +1 -1
- package/dist/types/sender/http/httpsender.d.ts +1 -1
- package/dist/types/sender/multi/multisender.d.ts +1 -0
- package/dist/types/sender/multi/multisender.d.ts.map +1 -1
- package/dist/types/sender/sender.d.ts +1 -1
- package/dist/types/sender/tcp/tcpsender.d.ts +1 -1
- package/dist/types/sender/websocket/websocketsender.d.ts +1 -1
- package/dist/types/types/desk.d.ts +57 -1
- package/dist/types/types/desk.d.ts.map +1 -1
- package/dist/types/types/flow.d.ts +3269 -142
- package/dist/types/types/flow.d.ts.map +1 -1
- package/dist/types/types/message.d.ts +1 -1
- package/dist/types/types/whatsapp.d.ts +10 -2
- package/dist/types/types/whatsapp.d.ts.map +1 -1
- package/dist/types/utils/desk.d.ts +6 -0
- package/dist/types/utils/desk.d.ts.map +1 -0
- package/dist/types/utils/thread.d.ts +4 -0
- package/dist/types/utils/thread.d.ts.map +1 -0
- package/dist/types/utils/whatsapp.d.ts +103 -0
- package/dist/types/utils/whatsapp.d.ts.map +1 -0
- package/package.json +8 -11
- package/src/client.ts +3 -0
- package/src/index.ts +3 -0
- package/src/namespaces/account.ts +27 -13
- package/src/namespaces/analytics.ts +154 -0
- package/src/namespaces/desk.ts +428 -77
- package/src/namespaces/plugins.ts +2 -0
- package/src/namespaces/portal.ts +110 -0
- package/src/namespaces/tunnel.ts +58 -0
- package/src/namespaces/whatsapp.ts +4 -39
- package/src/sender/multi/multisender.ts +38 -14
- package/src/sender/sessionnegotiator.ts +1 -1
- package/src/sender/tcp/tcpsender.ts +1 -1
- package/src/sender/websocket/websocketsender.ts +1 -1
- package/src/types/desk.ts +66 -1
- package/src/types/flow.ts +387 -246
- package/src/types/message.ts +1 -1
- package/src/types/whatsapp.ts +11 -2
- package/src/utils/desk.ts +78 -0
- package/src/utils/thread.ts +119 -0
- package/src/utils/whatsapp.ts +530 -0
package/src/types/message.ts
CHANGED
package/src/types/whatsapp.ts
CHANGED
|
@@ -145,7 +145,8 @@ type ExampleType<T extends 'TEXT' | 'LOCATION' | HandleFormats> = T extends 'TEX
|
|
|
145
145
|
export type HeaderComponent<T extends 'TEXT' | 'LOCATION' | HandleFormats> = {
|
|
146
146
|
type: 'HEADER'
|
|
147
147
|
format: T
|
|
148
|
-
|
|
148
|
+
text?: T extends 'TEXT' ? string : never
|
|
149
|
+
example?: ExampleType<T>
|
|
149
150
|
}
|
|
150
151
|
|
|
151
152
|
export type BodyComponent = {
|
|
@@ -191,7 +192,7 @@ export type MessageTemplate = {
|
|
|
191
192
|
status: 'APPROVED' | 'REJECTED' | 'PENDING'
|
|
192
193
|
rejected_reason: string
|
|
193
194
|
language: WhatsAppTemplateLanguage
|
|
194
|
-
last_update_time
|
|
195
|
+
last_update_time?: string
|
|
195
196
|
components: Array<UnknownComponent>
|
|
196
197
|
}
|
|
197
198
|
|
|
@@ -199,3 +200,11 @@ export type MessageTemplateVariable = {
|
|
|
199
200
|
type: 'BODY' | 'MEDIA' | 'BUTTON'
|
|
200
201
|
example?: string
|
|
201
202
|
}
|
|
203
|
+
|
|
204
|
+
export type MessageTemplatePreview = {
|
|
205
|
+
headerFormat?: 'TEXT' | 'LOCATION' | 'IMAGE' | 'VIDEO' | 'DOCUMENT'
|
|
206
|
+
headerText?: string
|
|
207
|
+
bodyText?: string
|
|
208
|
+
footerText?: string
|
|
209
|
+
buttons: Array<string>
|
|
210
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { DayOfWeek, type DeskRule, type DeskRuleCondition, type DetailedAttendanceHour } from '../types/desk.ts'
|
|
2
|
+
|
|
3
|
+
const dayOfWeekByIndex = [
|
|
4
|
+
DayOfWeek.Sunday,
|
|
5
|
+
DayOfWeek.Monday,
|
|
6
|
+
DayOfWeek.Tuesday,
|
|
7
|
+
DayOfWeek.Wednesday,
|
|
8
|
+
DayOfWeek.Thursday,
|
|
9
|
+
DayOfWeek.Friday,
|
|
10
|
+
DayOfWeek.Saturday,
|
|
11
|
+
] as const
|
|
12
|
+
|
|
13
|
+
export function normalizeDeskRuleConditions(
|
|
14
|
+
rule: Pick<DeskRule, 'property' | 'relation' | 'values' | 'conditions'>,
|
|
15
|
+
): Array<DeskRuleCondition> {
|
|
16
|
+
if (rule.conditions) {
|
|
17
|
+
return rule.conditions
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (rule.property && rule.relation && rule.values) {
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
property: rule.property,
|
|
24
|
+
relation: rule.relation,
|
|
25
|
+
values: rule.values,
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return []
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getDayOfWeek(value: Date): DayOfWeek {
|
|
34
|
+
return dayOfWeekByIndex[value.getDay()]
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function matchesAttendanceHourQueue(attendanceHour: DetailedAttendanceHour, queueIdOrName: string): boolean {
|
|
38
|
+
return (
|
|
39
|
+
attendanceHour.attendanceHour.isMain ||
|
|
40
|
+
attendanceHour.queues.some((queue) => queue.id === queueIdOrName || queue.description === queueIdOrName)
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function isOnAttendanceTime(attendanceHour: DetailedAttendanceHour, value: Date): boolean {
|
|
45
|
+
const isInsideOffTime = attendanceHour.attendanceHourOffItems.some((offItem) => {
|
|
46
|
+
const startDate = new Date(offItem.startDate)
|
|
47
|
+
const endDate = new Date(offItem.endDate)
|
|
48
|
+
|
|
49
|
+
return value.getTime() >= startDate.getTime() && value.getTime() <= endDate.getTime()
|
|
50
|
+
})
|
|
51
|
+
if (isInsideOffTime) {
|
|
52
|
+
return false
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const todaySchedule = attendanceHour.attendanceHourScheduleItems.find(
|
|
56
|
+
(schedule) => schedule.dayOfWeek === getDayOfWeek(value),
|
|
57
|
+
)
|
|
58
|
+
if (!todaySchedule) {
|
|
59
|
+
return false
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const startTime = applyTime(value, todaySchedule.startTime)
|
|
63
|
+
const endTime = applyTime(value, todaySchedule.endTime)
|
|
64
|
+
|
|
65
|
+
return value.getTime() >= startTime.getTime() && value.getTime() <= endTime.getTime()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function applyTime(value: Date, time: string): Date {
|
|
69
|
+
const [hours, minutes] = time.split(':')
|
|
70
|
+
const date = new Date(value)
|
|
71
|
+
|
|
72
|
+
date.setHours(Number(hours))
|
|
73
|
+
date.setMinutes(Number(minutes))
|
|
74
|
+
date.setSeconds(0)
|
|
75
|
+
date.setMilliseconds(0)
|
|
76
|
+
|
|
77
|
+
return date
|
|
78
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { isDocumentOfType, messageToDocument, type ThreadItem, type UnknownDocument } from '../types/index.ts'
|
|
2
|
+
|
|
3
|
+
export function formatThreadItemPreview(item: ThreadItem): string {
|
|
4
|
+
return formatDocumentPreview(messageToDocument(item))
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function formatDocumentPreview(document: UnknownDocument): string {
|
|
8
|
+
if (isDocumentOfType(document, 'text/plain')) {
|
|
9
|
+
return document.value
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
if (isDocumentOfType(document, 'application/vnd.lime.media-link+json')) {
|
|
13
|
+
return `[media] ${document.value.title || document.value.text || document.value.uri}`
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (isDocumentOfType(document, 'application/vnd.lime.web-link+json')) {
|
|
17
|
+
return `[link] ${document.value.text}`
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (isDocumentOfType(document, 'application/vnd.lime.reply+json')) {
|
|
21
|
+
return formatDocumentPreview(document.value.replied)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
if (isDocumentOfType(document, 'application/vnd.iris.ticket+json')) {
|
|
25
|
+
return `[ticket #${document.value.sequentialId}]`
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (isDocumentOfType(document, 'application/vnd.lime.select+json')) {
|
|
29
|
+
const options = document.value.options.map((option) => option.text).join(' | ')
|
|
30
|
+
return `[select] ${document.value.text} [select-options] ${options}`
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (isDocumentOfType(document, 'application/json')) {
|
|
34
|
+
const value = document.value
|
|
35
|
+
|
|
36
|
+
if (
|
|
37
|
+
value.type === 'template' &&
|
|
38
|
+
value.template &&
|
|
39
|
+
typeof value.template === 'object' &&
|
|
40
|
+
'name' in value.template
|
|
41
|
+
) {
|
|
42
|
+
return `[whatsapp template: ${value.template.name as string}]`
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (value.type === 'interactive' && value.interactive && typeof value.interactive === 'object') {
|
|
46
|
+
return interactiveToHumanReadable(value.interactive as Record<string, unknown>)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return `[${document.type}]`
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function interactiveToHumanReadable(interactive: Record<string, unknown>): string {
|
|
54
|
+
const parts: Array<string> = []
|
|
55
|
+
|
|
56
|
+
const header = interactive.header as { type?: string; text?: string } | undefined
|
|
57
|
+
if (header?.type === 'text' && header.text) {
|
|
58
|
+
parts.push(header.text)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const body = interactive.body as { text?: string } | undefined
|
|
62
|
+
if (body?.text) {
|
|
63
|
+
parts.push(body.text)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const footer = interactive.footer as { text?: string } | undefined
|
|
67
|
+
if (footer?.text) {
|
|
68
|
+
parts.push(footer.text)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const action = interactive.action as
|
|
72
|
+
| {
|
|
73
|
+
name: 'cta_url'
|
|
74
|
+
parameters: { display_text: string }
|
|
75
|
+
}
|
|
76
|
+
| {
|
|
77
|
+
name: 'flow'
|
|
78
|
+
parameters: { flow_cta: string }
|
|
79
|
+
}
|
|
80
|
+
| {
|
|
81
|
+
buttons: Array<{
|
|
82
|
+
type: 'reply'
|
|
83
|
+
reply: { id: string; title: string }
|
|
84
|
+
}>
|
|
85
|
+
}
|
|
86
|
+
| {
|
|
87
|
+
sections: Array<{
|
|
88
|
+
rows?: Array<{ title: string }>
|
|
89
|
+
}>
|
|
90
|
+
}
|
|
91
|
+
| undefined
|
|
92
|
+
|
|
93
|
+
if (!action) {
|
|
94
|
+
return parts.join('\n')
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if ('buttons' in action) {
|
|
98
|
+
const items = action.buttons
|
|
99
|
+
.filter((button) => button.type === 'reply')
|
|
100
|
+
.map((button) => button.reply.title)
|
|
101
|
+
.join('')
|
|
102
|
+
|
|
103
|
+
if (items) {
|
|
104
|
+
parts.push(items)
|
|
105
|
+
}
|
|
106
|
+
} else if ('sections' in action) {
|
|
107
|
+
const items = action.sections.flatMap((section) => section.rows?.map((row) => row.title) ?? []).join('')
|
|
108
|
+
|
|
109
|
+
if (items) {
|
|
110
|
+
parts.push(items)
|
|
111
|
+
}
|
|
112
|
+
} else if (action.name === 'cta_url') {
|
|
113
|
+
parts.push(`Link: ${action.parameters.display_text}`)
|
|
114
|
+
} else if (action.name === 'flow') {
|
|
115
|
+
parts.push(`Flow: ${action.parameters.flow_cta}`)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return parts.join('\n')
|
|
119
|
+
}
|