@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.
Files changed (131) hide show
  1. package/README.md +13 -6
  2. package/dist/cjs/client.js +3 -0
  3. package/dist/cjs/client.js.map +1 -1
  4. package/dist/cjs/index.js +3 -0
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/namespaces/account.js +23 -11
  7. package/dist/cjs/namespaces/account.js.map +1 -1
  8. package/dist/cjs/namespaces/analytics.js +54 -0
  9. package/dist/cjs/namespaces/analytics.js.map +1 -1
  10. package/dist/cjs/namespaces/desk.js +264 -45
  11. package/dist/cjs/namespaces/desk.js.map +1 -1
  12. package/dist/cjs/namespaces/plugins.js +1 -0
  13. package/dist/cjs/namespaces/plugins.js.map +1 -1
  14. package/dist/cjs/namespaces/portal.js +45 -0
  15. package/dist/cjs/namespaces/portal.js.map +1 -1
  16. package/dist/cjs/namespaces/tunnel.js +46 -0
  17. package/dist/cjs/namespaces/tunnel.js.map +1 -0
  18. package/dist/cjs/namespaces/whatsapp.js +2 -23
  19. package/dist/cjs/namespaces/whatsapp.js.map +1 -1
  20. package/dist/cjs/sender/multi/multisender.js +28 -9
  21. package/dist/cjs/sender/multi/multisender.js.map +1 -1
  22. package/dist/cjs/sender/sessionnegotiator.js +1 -1
  23. package/dist/cjs/sender/sessionnegotiator.js.map +1 -1
  24. package/dist/cjs/sender/tcp/tcpsender.js +35 -2
  25. package/dist/cjs/sender/tcp/tcpsender.js.map +1 -1
  26. package/dist/cjs/sender/websocket/websocketsender.js +1 -1
  27. package/dist/cjs/sender/websocket/websocketsender.js.map +1 -1
  28. package/dist/cjs/types/desk.js.map +1 -1
  29. package/dist/cjs/types/flow.js +344 -0
  30. package/dist/cjs/types/flow.js.map +1 -1
  31. package/dist/cjs/utils/desk.js +65 -0
  32. package/dist/cjs/utils/desk.js.map +1 -0
  33. package/dist/cjs/utils/thread.js +84 -0
  34. package/dist/cjs/utils/thread.js.map +1 -0
  35. package/dist/cjs/utils/whatsapp.js +268 -0
  36. package/dist/cjs/utils/whatsapp.js.map +1 -0
  37. package/dist/esm/client.js +3 -0
  38. package/dist/esm/client.js.map +1 -1
  39. package/dist/esm/index.js +3 -0
  40. package/dist/esm/index.js.map +1 -1
  41. package/dist/esm/namespaces/account.js +19 -10
  42. package/dist/esm/namespaces/account.js.map +1 -1
  43. package/dist/esm/namespaces/analytics.js +54 -0
  44. package/dist/esm/namespaces/analytics.js.map +1 -1
  45. package/dist/esm/namespaces/desk.js +264 -45
  46. package/dist/esm/namespaces/desk.js.map +1 -1
  47. package/dist/esm/namespaces/plugins.js +1 -0
  48. package/dist/esm/namespaces/plugins.js.map +1 -1
  49. package/dist/esm/namespaces/portal.js +45 -0
  50. package/dist/esm/namespaces/portal.js.map +1 -1
  51. package/dist/esm/namespaces/tunnel.js +42 -0
  52. package/dist/esm/namespaces/tunnel.js.map +1 -0
  53. package/dist/esm/namespaces/whatsapp.js +2 -23
  54. package/dist/esm/namespaces/whatsapp.js.map +1 -1
  55. package/dist/esm/sender/multi/multisender.js +28 -9
  56. package/dist/esm/sender/multi/multisender.js.map +1 -1
  57. package/dist/esm/sender/sessionnegotiator.js +1 -1
  58. package/dist/esm/sender/sessionnegotiator.js.map +1 -1
  59. package/dist/esm/sender/tcp/tcpsender.js +1 -1
  60. package/dist/esm/sender/tcp/tcpsender.js.map +1 -1
  61. package/dist/esm/sender/websocket/websocketsender.js +1 -1
  62. package/dist/esm/sender/websocket/websocketsender.js.map +1 -1
  63. package/dist/esm/types/desk.js.map +1 -1
  64. package/dist/esm/types/flow.js +343 -1
  65. package/dist/esm/types/flow.js.map +1 -1
  66. package/dist/esm/utils/desk.js +59 -0
  67. package/dist/esm/utils/desk.js.map +1 -0
  68. package/dist/esm/utils/thread.js +80 -0
  69. package/dist/esm/utils/thread.js.map +1 -0
  70. package/dist/esm/utils/whatsapp.js +263 -0
  71. package/dist/esm/utils/whatsapp.js.map +1 -0
  72. package/dist/types/client.d.ts +2 -0
  73. package/dist/types/client.d.ts.map +1 -1
  74. package/dist/types/index.d.ts +3 -0
  75. package/dist/types/index.d.ts.map +1 -1
  76. package/dist/types/namespaces/account.d.ts +1791 -3
  77. package/dist/types/namespaces/account.d.ts.map +1 -1
  78. package/dist/types/namespaces/analytics.d.ts +60 -0
  79. package/dist/types/namespaces/analytics.d.ts.map +1 -1
  80. package/dist/types/namespaces/desk.d.ts +124 -4
  81. package/dist/types/namespaces/desk.d.ts.map +1 -1
  82. package/dist/types/namespaces/plugins.d.ts +1 -0
  83. package/dist/types/namespaces/plugins.d.ts.map +1 -1
  84. package/dist/types/namespaces/portal.d.ts +45 -0
  85. package/dist/types/namespaces/portal.d.ts.map +1 -1
  86. package/dist/types/namespaces/tunnel.d.ts +28 -0
  87. package/dist/types/namespaces/tunnel.d.ts.map +1 -0
  88. package/dist/types/namespaces/whatsapp.d.ts +3 -2
  89. package/dist/types/namespaces/whatsapp.d.ts.map +1 -1
  90. package/dist/types/schemas/webhook.d.ts +2 -2
  91. package/dist/types/sender/gateway/customgatewaysender.d.ts +1 -1
  92. package/dist/types/sender/http/httpsender.d.ts +1 -1
  93. package/dist/types/sender/multi/multisender.d.ts +1 -0
  94. package/dist/types/sender/multi/multisender.d.ts.map +1 -1
  95. package/dist/types/sender/sender.d.ts +1 -1
  96. package/dist/types/sender/tcp/tcpsender.d.ts +1 -1
  97. package/dist/types/sender/websocket/websocketsender.d.ts +1 -1
  98. package/dist/types/types/desk.d.ts +57 -1
  99. package/dist/types/types/desk.d.ts.map +1 -1
  100. package/dist/types/types/flow.d.ts +3269 -142
  101. package/dist/types/types/flow.d.ts.map +1 -1
  102. package/dist/types/types/message.d.ts +1 -1
  103. package/dist/types/types/whatsapp.d.ts +10 -2
  104. package/dist/types/types/whatsapp.d.ts.map +1 -1
  105. package/dist/types/utils/desk.d.ts +6 -0
  106. package/dist/types/utils/desk.d.ts.map +1 -0
  107. package/dist/types/utils/thread.d.ts +4 -0
  108. package/dist/types/utils/thread.d.ts.map +1 -0
  109. package/dist/types/utils/whatsapp.d.ts +103 -0
  110. package/dist/types/utils/whatsapp.d.ts.map +1 -0
  111. package/package.json +8 -11
  112. package/src/client.ts +3 -0
  113. package/src/index.ts +3 -0
  114. package/src/namespaces/account.ts +27 -13
  115. package/src/namespaces/analytics.ts +154 -0
  116. package/src/namespaces/desk.ts +428 -77
  117. package/src/namespaces/plugins.ts +2 -0
  118. package/src/namespaces/portal.ts +110 -0
  119. package/src/namespaces/tunnel.ts +58 -0
  120. package/src/namespaces/whatsapp.ts +4 -39
  121. package/src/sender/multi/multisender.ts +38 -14
  122. package/src/sender/sessionnegotiator.ts +1 -1
  123. package/src/sender/tcp/tcpsender.ts +1 -1
  124. package/src/sender/websocket/websocketsender.ts +1 -1
  125. package/src/types/desk.ts +66 -1
  126. package/src/types/flow.ts +387 -246
  127. package/src/types/message.ts +1 -1
  128. package/src/types/whatsapp.ts +11 -2
  129. package/src/utils/desk.ts +78 -0
  130. package/src/utils/thread.ts +119 -0
  131. package/src/utils/whatsapp.ts +530 -0
@@ -8,7 +8,7 @@ export type PlainText = string
8
8
 
9
9
  export type Ticket<Type extends MessageTypes | undefined = undefined> = {
10
10
  id: string
11
- sequentialId: string
11
+ sequentialId: number
12
12
  ownerIdentity: Identity
13
13
  customerIdentity: Identity
14
14
  customerDomain: string
@@ -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
- example: ExampleType<T>
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: string
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
+ }