botframework-webchat-api 4.14.1 → 4.15.0

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 (308) hide show
  1. package/.eslintrc.yml +4 -105
  2. package/.prettierrc.yml +1 -1
  3. package/lib/StyleOptions.d.ts +242 -12
  4. package/lib/StyleOptions.d.ts.map +1 -1
  5. package/lib/defaultStyleOptions.d.ts.map +1 -1
  6. package/lib/defaultStyleOptions.js +67 -14
  7. package/lib/hooks/Composer.d.ts +1 -1
  8. package/lib/hooks/Composer.d.ts.map +1 -1
  9. package/lib/hooks/Composer.js +24 -8
  10. package/lib/hooks/index.d.ts +11 -1
  11. package/lib/hooks/index.d.ts.map +1 -1
  12. package/lib/hooks/index.js +81 -1
  13. package/lib/hooks/internal/useCreateActivityRendererInternal.d.ts.map +1 -1
  14. package/lib/hooks/internal/useCreateActivityRendererInternal.js +1 -1
  15. package/lib/hooks/internal/useDebugDeps.js +10 -4
  16. package/lib/hooks/internal/usePrevious.d.ts +2 -0
  17. package/lib/hooks/internal/usePrevious.d.ts.map +1 -0
  18. package/lib/hooks/internal/usePrevious.js +17 -0
  19. package/lib/hooks/internal/useValueRef.d.ts +3 -0
  20. package/lib/hooks/internal/useValueRef.d.ts.map +1 -0
  21. package/lib/hooks/internal/useValueRef.js +24 -0
  22. package/lib/hooks/middleware/concatMiddleware.d.ts.map +1 -1
  23. package/lib/hooks/middleware/concatMiddleware.js +2 -2
  24. package/lib/hooks/middleware/createDefaultCardActionMiddleware.d.ts.map +1 -1
  25. package/lib/hooks/middleware/createDefaultCardActionMiddleware.js +1 -1
  26. package/lib/hooks/useActivityKeys.d.ts +3 -0
  27. package/lib/hooks/useActivityKeys.d.ts.map +1 -0
  28. package/lib/hooks/useActivityKeys.js +14 -0
  29. package/lib/hooks/useActivityKeysByRead.d.ts +3 -0
  30. package/lib/hooks/useActivityKeysByRead.d.ts.map +1 -0
  31. package/lib/hooks/useActivityKeysByRead.js +14 -0
  32. package/lib/hooks/useCreateActivityStatusRenderer.d.ts.map +1 -1
  33. package/lib/hooks/useCreateActivityStatusRenderer.js +1 -1
  34. package/lib/hooks/useCreateAvatarRenderer.d.ts +4 -2
  35. package/lib/hooks/useCreateAvatarRenderer.d.ts.map +1 -1
  36. package/lib/hooks/useCreateAvatarRenderer.js +1 -1
  37. package/lib/hooks/useDateFormatter.d.ts.map +1 -1
  38. package/lib/hooks/useDateFormatter.js +1 -1
  39. package/lib/hooks/useDebouncedNotifications.js +1 -1
  40. package/lib/hooks/useGetActivityByKey.d.ts +3 -0
  41. package/lib/hooks/useGetActivityByKey.d.ts.map +1 -0
  42. package/lib/hooks/useGetActivityByKey.js +14 -0
  43. package/lib/hooks/useGetHasAcknowledgedByActivityKey.d.ts +3 -0
  44. package/lib/hooks/useGetHasAcknowledgedByActivityKey.d.ts.map +1 -0
  45. package/lib/hooks/useGetHasAcknowledgedByActivityKey.js +14 -0
  46. package/lib/hooks/useGetKeyByActivity.d.ts +3 -0
  47. package/lib/hooks/useGetKeyByActivity.d.ts.map +1 -0
  48. package/lib/hooks/useGetKeyByActivity.js +14 -0
  49. package/lib/hooks/useGetKeyByActivityId.d.ts +3 -0
  50. package/lib/hooks/useGetKeyByActivityId.d.ts.map +1 -0
  51. package/lib/hooks/useGetKeyByActivityId.js +14 -0
  52. package/lib/hooks/useGetSendTimeoutForActivity.d.ts.map +1 -1
  53. package/lib/hooks/useGetSendTimeoutForActivity.js +1 -1
  54. package/lib/hooks/useGroupActivities.d.ts.map +1 -1
  55. package/lib/hooks/useGroupActivities.js +1 -1
  56. package/lib/hooks/useLastAcknowledgedActivityKey.d.ts +3 -0
  57. package/lib/hooks/useLastAcknowledgedActivityKey.d.ts.map +1 -0
  58. package/lib/hooks/useLastAcknowledgedActivityKey.js +14 -0
  59. package/lib/hooks/useLastReadActivityKey.d.ts +3 -0
  60. package/lib/hooks/useLastReadActivityKey.d.ts.map +1 -0
  61. package/lib/hooks/useLastReadActivityKey.js +14 -0
  62. package/lib/hooks/useLocalizer.d.ts +1 -1
  63. package/lib/hooks/useLocalizer.d.ts.map +1 -1
  64. package/lib/hooks/useLocalizer.js +8 -2
  65. package/lib/hooks/useMarkActivityKeyAsRead.d.ts +3 -0
  66. package/lib/hooks/useMarkActivityKeyAsRead.d.ts.map +1 -0
  67. package/lib/hooks/useMarkActivityKeyAsRead.js +14 -0
  68. package/lib/hooks/useMarkAllAsAcknowledged.d.ts +3 -0
  69. package/lib/hooks/useMarkAllAsAcknowledged.d.ts.map +1 -0
  70. package/lib/hooks/useMarkAllAsAcknowledged.js +14 -0
  71. package/lib/hooks/usePerformCardAction.d.ts +2 -2
  72. package/lib/hooks/usePerformCardAction.d.ts.map +1 -1
  73. package/lib/hooks/usePerformCardAction.js +1 -1
  74. package/lib/hooks/useSubmitSendBox.d.ts.map +1 -1
  75. package/lib/hooks/useSubmitSendBox.js +8 -5
  76. package/lib/hooks/utils/ErrorBoundary.js +1 -1
  77. package/lib/index.js +7 -7
  78. package/lib/localization/Localize.d.ts.map +1 -1
  79. package/lib/localization/Localize.js +12 -6
  80. package/lib/localization/ar-SA.json +23 -4
  81. package/lib/localization/bg-BG.json +23 -4
  82. package/lib/localization/ca-ES.json +23 -4
  83. package/lib/localization/cs-CZ.json +23 -4
  84. package/lib/localization/da-DK.json +23 -4
  85. package/lib/localization/de-DE.json +23 -4
  86. package/lib/localization/el-GR.json +23 -4
  87. package/lib/localization/en-US.json +29 -7
  88. package/lib/localization/es-ES.json +23 -4
  89. package/lib/localization/et-EE.json +23 -4
  90. package/lib/localization/eu-ES.json +23 -4
  91. package/lib/localization/fi-FI.json +23 -4
  92. package/lib/localization/fr-FR.json +23 -4
  93. package/lib/localization/gl-ES.json +23 -4
  94. package/lib/localization/he-IL.json +23 -4
  95. package/lib/localization/hi-IN.json +23 -4
  96. package/lib/localization/hr-HR.json +23 -4
  97. package/lib/localization/hu-HU.json +23 -4
  98. package/lib/localization/id-ID.json +23 -4
  99. package/lib/localization/it-IT.json +23 -4
  100. package/lib/localization/ja-JP.json +23 -4
  101. package/lib/localization/kk-KZ.json +23 -4
  102. package/lib/localization/ko-KR.json +23 -4
  103. package/lib/localization/lt-LT.json +23 -4
  104. package/lib/localization/lv-LV.json +23 -4
  105. package/lib/localization/mergeLocalizedStrings.d.ts.map +1 -1
  106. package/lib/localization/mergeLocalizedStrings.js +11 -4
  107. package/lib/localization/ms-MY.json +23 -4
  108. package/lib/localization/nb-NO.json +23 -4
  109. package/lib/localization/nl-NL.json +23 -4
  110. package/lib/localization/pl-PL.json +23 -4
  111. package/lib/localization/pt-BR.json +23 -4
  112. package/lib/localization/pt-PT.json +23 -4
  113. package/lib/localization/ro-RO.json +23 -4
  114. package/lib/localization/ru-RU.json +23 -4
  115. package/lib/localization/sk-SK.json +23 -4
  116. package/lib/localization/sl-SI.json +23 -4
  117. package/lib/localization/sr-Cyrl-CS.json +23 -4
  118. package/lib/localization/sr-Latn-CS.json +23 -4
  119. package/lib/localization/sv-SE.json +23 -4
  120. package/lib/localization/th-TH.json +23 -4
  121. package/lib/localization/tr-TR.json +23 -4
  122. package/lib/localization/uk-UA.json +23 -4
  123. package/lib/localization/vi-VN.json +23 -4
  124. package/lib/localization/yue.json +26 -7
  125. package/lib/localization/zh-CN.json +23 -4
  126. package/lib/localization/zh-HK.json +23 -4
  127. package/lib/localization/zh-TW.json +23 -4
  128. package/lib/normalizeStyleOptions.d.ts.map +1 -1
  129. package/lib/normalizeStyleOptions.js +47 -2
  130. package/lib/patchStyleOptionsFromDeprecatedProps.js +1 -2
  131. package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.d.ts +5 -0
  132. package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.d.ts.map +1 -0
  133. package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.js +184 -0
  134. package/lib/providers/ActivityAcknowledgement/private/Context.d.ts +13 -0
  135. package/lib/providers/ActivityAcknowledgement/private/Context.d.ts.map +1 -0
  136. package/lib/providers/ActivityAcknowledgement/private/Context.js +13 -0
  137. package/lib/providers/ActivityAcknowledgement/private/types.d.ts +6 -0
  138. package/lib/providers/ActivityAcknowledgement/private/types.d.ts.map +1 -0
  139. package/lib/providers/ActivityAcknowledgement/private/types.js +2 -0
  140. package/lib/providers/ActivityAcknowledgement/private/useContext.d.ts +3 -0
  141. package/lib/providers/ActivityAcknowledgement/private/useContext.d.ts.map +1 -0
  142. package/lib/providers/ActivityAcknowledgement/private/useContext.js +24 -0
  143. package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.d.ts +5 -0
  144. package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.d.ts.map +1 -0
  145. package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.js +18 -0
  146. package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.d.ts +2 -0
  147. package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.d.ts.map +1 -0
  148. package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.js +15 -0
  149. package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.d.ts +2 -0
  150. package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.d.ts.map +1 -0
  151. package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.js +15 -0
  152. package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.d.ts +2 -0
  153. package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.d.ts.map +1 -0
  154. package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.js +15 -0
  155. package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.d.ts +2 -0
  156. package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.d.ts.map +1 -0
  157. package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.js +15 -0
  158. package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.d.ts +2 -0
  159. package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.d.ts.map +1 -0
  160. package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.js +15 -0
  161. package/lib/providers/ActivityKeyer/ActivityKeyerComposer.d.ts +18 -0
  162. package/lib/providers/ActivityKeyer/ActivityKeyerComposer.d.ts.map +1 -0
  163. package/lib/providers/ActivityKeyer/ActivityKeyerComposer.js +153 -0
  164. package/lib/providers/ActivityKeyer/private/Context.d.ts +12 -0
  165. package/lib/providers/ActivityKeyer/private/Context.d.ts.map +1 -0
  166. package/lib/providers/ActivityKeyer/private/Context.js +13 -0
  167. package/lib/providers/ActivityKeyer/private/getActivityId.d.ts +3 -0
  168. package/lib/providers/ActivityKeyer/private/getActivityId.d.ts.map +1 -0
  169. package/lib/providers/ActivityKeyer/private/getActivityId.js +11 -0
  170. package/lib/providers/ActivityKeyer/private/getClientActivityId.d.ts +3 -0
  171. package/lib/providers/ActivityKeyer/private/getClientActivityId.d.ts.map +1 -0
  172. package/lib/providers/ActivityKeyer/private/getClientActivityId.js +13 -0
  173. package/lib/providers/ActivityKeyer/private/uniqueId.d.ts +2 -0
  174. package/lib/providers/ActivityKeyer/private/uniqueId.d.ts.map +1 -0
  175. package/lib/providers/ActivityKeyer/private/uniqueId.js +18 -0
  176. package/lib/providers/ActivityKeyer/private/useContext.d.ts +3 -0
  177. package/lib/providers/ActivityKeyer/private/useContext.d.ts.map +1 -0
  178. package/lib/providers/ActivityKeyer/private/useContext.js +24 -0
  179. package/lib/providers/ActivityKeyer/useActivityKeys.d.ts +2 -0
  180. package/lib/providers/ActivityKeyer/useActivityKeys.d.ts.map +1 -0
  181. package/lib/providers/ActivityKeyer/useActivityKeys.js +15 -0
  182. package/lib/providers/ActivityKeyer/useGetActivityByKey.d.ts +3 -0
  183. package/lib/providers/ActivityKeyer/useGetActivityByKey.d.ts.map +1 -0
  184. package/lib/providers/ActivityKeyer/useGetActivityByKey.js +15 -0
  185. package/lib/providers/ActivityKeyer/useGetKeyByActivity.d.ts +3 -0
  186. package/lib/providers/ActivityKeyer/useGetKeyByActivity.d.ts.map +1 -0
  187. package/lib/providers/ActivityKeyer/useGetKeyByActivity.js +15 -0
  188. package/lib/providers/ActivityKeyer/useGetKeyByActivityId.d.ts +2 -0
  189. package/lib/providers/ActivityKeyer/useGetKeyByActivityId.d.ts.map +1 -0
  190. package/lib/providers/ActivityKeyer/useGetKeyByActivityId.js +15 -0
  191. package/lib/types/CardActionMiddleware.d.ts +3 -1
  192. package/lib/types/CardActionMiddleware.d.ts.map +1 -1
  193. package/lib/utils/createCustomEvent.d.ts.map +1 -1
  194. package/lib/utils/createCustomEvent.js +8 -2
  195. package/lib/utils/findLastIndex.d.ts +2 -0
  196. package/lib/utils/findLastIndex.d.ts.map +1 -0
  197. package/lib/utils/findLastIndex.js +32 -0
  198. package/lib/utils/findMin.js +1 -1
  199. package/lib/utils/mapMap.d.ts.map +1 -1
  200. package/lib/utils/mapMap.js +9 -2
  201. package/lib/utils/randomId.d.ts.map +1 -1
  202. package/lib/utils/randomId.js +1 -1
  203. package/package.json +13 -21
  204. package/src/StyleOptions.ts +293 -12
  205. package/src/defaultStyleOptions.ts +71 -13
  206. package/src/hooks/Composer.tsx +86 -49
  207. package/src/hooks/index.ts +20 -0
  208. package/src/hooks/internal/useCreateActivityRendererInternal.ts +21 -20
  209. package/src/hooks/internal/useDebugDeps.js +9 -2
  210. package/src/hooks/internal/usePrevious.ts +11 -0
  211. package/src/hooks/internal/useValueRef.ts +21 -0
  212. package/src/hooks/middleware/concatMiddleware.ts +6 -4
  213. package/src/hooks/middleware/createDefaultCardActionMiddleware.ts +29 -27
  214. package/src/hooks/useActivityKeys.ts +3 -0
  215. package/src/hooks/useActivityKeysByRead.ts +3 -0
  216. package/src/hooks/useCreateActivityStatusRenderer.tsx +10 -13
  217. package/src/hooks/useCreateAvatarRenderer.ts +23 -19
  218. package/src/hooks/useDateFormatter.ts +4 -3
  219. package/src/hooks/useGetActivityByKey.ts +3 -0
  220. package/src/hooks/useGetHasAcknowledgedByActivityKey.ts +3 -0
  221. package/src/hooks/useGetKeyByActivity.ts +3 -0
  222. package/src/hooks/useGetKeyByActivityId.ts +3 -0
  223. package/src/hooks/useGetSendTimeoutForActivity.ts +7 -6
  224. package/src/hooks/useGroupActivities.ts +1 -5
  225. package/src/hooks/useLastAcknowledgedActivityKey.ts +3 -0
  226. package/src/hooks/useLastReadActivityKey.ts +3 -0
  227. package/src/hooks/useLocalizer.ts +7 -2
  228. package/src/hooks/useMarkActivityKeyAsRead.ts +3 -0
  229. package/src/hooks/useMarkAllAsAcknowledged.ts +3 -0
  230. package/src/hooks/usePerformCardAction.ts +2 -3
  231. package/src/hooks/useSubmitSendBox.ts +2 -5
  232. package/src/localization/Localize.ts +9 -2
  233. package/src/localization/ar-SA.json +23 -4
  234. package/src/localization/bg-BG.json +23 -4
  235. package/src/localization/ca-ES.json +23 -4
  236. package/src/localization/cs-CZ.json +23 -4
  237. package/src/localization/da-DK.json +23 -4
  238. package/src/localization/de-DE.json +23 -4
  239. package/src/localization/el-GR.json +23 -4
  240. package/src/localization/en-US.json +29 -7
  241. package/src/localization/es-ES.json +23 -4
  242. package/src/localization/et-EE.json +23 -4
  243. package/src/localization/eu-ES.json +23 -4
  244. package/src/localization/fi-FI.json +23 -4
  245. package/src/localization/fr-FR.json +23 -4
  246. package/src/localization/gl-ES.json +23 -4
  247. package/src/localization/he-IL.json +23 -4
  248. package/src/localization/hi-IN.json +23 -4
  249. package/src/localization/hr-HR.json +23 -4
  250. package/src/localization/hu-HU.json +23 -4
  251. package/src/localization/id-ID.json +23 -4
  252. package/src/localization/it-IT.json +23 -4
  253. package/src/localization/ja-JP.json +23 -4
  254. package/src/localization/kk-KZ.json +23 -4
  255. package/src/localization/ko-KR.json +23 -4
  256. package/src/localization/lt-LT.json +23 -4
  257. package/src/localization/lv-LV.json +23 -4
  258. package/src/localization/mergeLocalizedStrings.ts +7 -1
  259. package/src/localization/ms-MY.json +23 -4
  260. package/src/localization/nb-NO.json +23 -4
  261. package/src/localization/nl-NL.json +23 -4
  262. package/src/localization/pl-PL.json +23 -4
  263. package/src/localization/pt-BR.json +23 -4
  264. package/src/localization/pt-PT.json +23 -4
  265. package/src/localization/ro-RO.json +23 -4
  266. package/src/localization/ru-RU.json +23 -4
  267. package/src/localization/sk-SK.json +23 -4
  268. package/src/localization/sl-SI.json +23 -4
  269. package/src/localization/sr-Cyrl-CS.json +23 -4
  270. package/src/localization/sr-Latn-CS.json +23 -4
  271. package/src/localization/sv-SE.json +23 -4
  272. package/src/localization/th-TH.json +23 -4
  273. package/src/localization/tr-TR.json +23 -4
  274. package/src/localization/uk-UA.json +23 -4
  275. package/src/localization/vi-VN.json +23 -4
  276. package/src/localization/yue.json +26 -7
  277. package/src/localization/zh-CN.json +23 -4
  278. package/src/localization/zh-HK.json +23 -4
  279. package/src/localization/zh-TW.json +23 -4
  280. package/src/normalizeStyleOptions.ts +70 -0
  281. package/src/patchStyleOptionsFromDeprecatedProps.js +0 -2
  282. package/src/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.tsx +180 -0
  283. package/src/providers/ActivityAcknowledgement/private/Context.ts +18 -0
  284. package/src/providers/ActivityAcknowledgement/private/types.ts +6 -0
  285. package/src/providers/ActivityAcknowledgement/private/useContext.ts +19 -0
  286. package/src/providers/ActivityAcknowledgement/useActivityKeysByRead.tsx +8 -0
  287. package/src/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.ts +5 -0
  288. package/src/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.ts +5 -0
  289. package/src/providers/ActivityAcknowledgement/useLastReadActivityKey.ts +5 -0
  290. package/src/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.ts +5 -0
  291. package/src/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.ts +5 -0
  292. package/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx +151 -0
  293. package/src/providers/ActivityKeyer/private/Context.ts +14 -0
  294. package/src/providers/ActivityKeyer/private/getActivityId.ts +5 -0
  295. package/src/providers/ActivityKeyer/private/getClientActivityId.ts +5 -0
  296. package/src/providers/ActivityKeyer/private/uniqueId.ts +8 -0
  297. package/src/providers/ActivityKeyer/private/useContext.ts +15 -0
  298. package/src/providers/ActivityKeyer/useActivityKeys.ts +5 -0
  299. package/src/providers/ActivityKeyer/useGetActivityByKey.ts +7 -0
  300. package/src/providers/ActivityKeyer/useGetKeyByActivity.ts +7 -0
  301. package/src/providers/ActivityKeyer/useGetKeyByActivityId.ts +5 -0
  302. package/src/types/CardActionMiddleware.ts +1 -1
  303. package/src/utils/createCustomEvent.ts +7 -1
  304. package/src/utils/findLastIndex.spec.js +31 -0
  305. package/src/utils/findLastIndex.ts +11 -0
  306. package/src/utils/mapMap.ts +7 -1
  307. package/src/utils/randomId.ts +1 -1
  308. package/.eslintignore +0 -1
@@ -6,7 +6,8 @@
6
6
  "ACTIVITY_YOU_SAID_ALT": "您说:",
7
7
  "ACTIVITY_BOT_ATTACHED_ALT": "机器人附加了:",
8
8
  "ACTIVITY_ERROR_BOX_TITLE": "错误消息",
9
- "ACTIVITY_INTERACTIVE_LABEL_ALT": "按 Enter 键以进行交互。",
9
+ "ACTIVITY_INTERACTIVE_LABEL_ALT": "消息是交互式消息。单击可以进行交互。",
10
+ "ACTIVITY_INTERACTIVE_WITH_LINKS_LABEL_ALT": "消息中有一个或多个链接。单击可以进行交互。",
10
11
  "ACTIVITY_YOU_ATTACHED_ALT": "您附加了:",
11
12
  "ACTIVITY_NUM_ATTACHMENTS_ONE_ALT": "1 个附件。",
12
13
  "ACTIVITY_NUM_ATTACHMENTS_FEW_ALT": "$1 个附件。",
@@ -43,6 +44,22 @@
43
44
  "FILE_CONTENT_DOWNLOADABLE_ALT": "下载文件 '$1'",
44
45
  "FILE_CONTENT_DOWNLOADABLE_WITH_SIZE_ALT": "下载文件 '$1',大小为 $2",
45
46
  "FILE_CONTENT_WITH_SIZE_ALT": "'$1' 的大小为 $2",
47
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_BODY": "Enter 键",
48
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_HEADER": "访问消息中的项目",
49
+ "KEYBOARD_HELP_CHAT_HISTORY_HEADER": "聊天历史记录",
50
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_BODY": "Escape 键",
51
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_HEADER": "留言",
52
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_BODY": "Tab 键\nShift + Tab 键",
53
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_HEADER": "在消息中的项目之间移动",
54
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_BODY": "向上键\n向下键",
55
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_HEADER": "在消息之间移动",
56
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_BODY": "Enter 键",
57
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_HEADER": "执行操作",
58
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_BODY": "Tab 键\nShift + Tab 键",
59
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_HEADER": "在聊天窗口中的项目之间移动",
60
+ "KEYBOARD_HELP_CHAT_WINDOW_HEADER": "聊天窗口",
61
+ "KEYBOARD_HELP_CLOSE_BUTTON_ALT": "关闭",
62
+ "KEYBOARD_HELP_HEADER": "键盘控件",
46
63
  "MARKDOWN_EXTERNAL_LINK_ALT": "在新窗口中打开;外部。",
47
64
  "RECEIPT_CARD_TAX": "税款",
48
65
  "RECEIPT_CARD_TOTAL": "总额",
@@ -70,10 +87,12 @@
70
87
  "TOAST_ALT_WARN": "警告",
71
88
  "TOAST_DISMISS_BUTTON": "取消",
72
89
  "TOAST_TITLE_ALT": "通知",
73
- "TRANSCRIPT_ARIA_LABEL_ALT": "记录,按箭头键导航。",
74
- "TRANSCRIPT_ARIA_ROLE_ALT": "脚本",
90
+ "TRANSCRIPT_ARIA_LABEL_ALT": "聊天历史记录,按箭头键导航。",
91
+ "TRANSCRIPT_ARIA_ROLE_ALT": "聊天历史记录",
92
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_LABEL_ALT": "消息是交互式消息。按 Shift Tab 键 2 到 3 次切换到聊天历史记录。然后单击消息以进行交互。",
93
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_WITH_LINKS_LABEL_ALT": "消息中有一个或多个链接。按 Shift Tab 键 2 到 3 次切换到聊天历史记录。然后单击消息以进行交互。",
75
94
  "TRANSCRIPT_MORE_MESSAGES": "更多消息",
76
95
  "TRANSCRIPT_NEW_MESSAGES": "新消息",
77
- "TRANSCRIPT_TERMINATOR_TEXT": "记录结束",
96
+ "TRANSCRIPT_TERMINATOR_TEXT": "聊天历史记录结束",
78
97
  "TYPING_INDICATOR_ALT": "显示键入指示器"
79
98
  }
@@ -6,7 +6,8 @@
6
6
  "ACTIVITY_YOU_SAID_ALT": "您說:",
7
7
  "ACTIVITY_BOT_ATTACHED_ALT": "機器人附加了:",
8
8
  "ACTIVITY_ERROR_BOX_TITLE": "錯誤訊息",
9
- "ACTIVITY_INTERACTIVE_LABEL_ALT": "按 ENTER 鍵進行互動。",
9
+ "ACTIVITY_INTERACTIVE_LABEL_ALT": "訊息為互動式。按一下即可互動。",
10
+ "ACTIVITY_INTERACTIVE_WITH_LINKS_LABEL_ALT": "訊息中的一或多個連結。按一下即可互動。",
10
11
  "ACTIVITY_YOU_ATTACHED_ALT": "您附加了:",
11
12
  "ACTIVITY_NUM_ATTACHMENTS_ONE_ALT": "1 個附件。",
12
13
  "ACTIVITY_NUM_ATTACHMENTS_FEW_ALT": "$1 個附件。",
@@ -43,6 +44,22 @@
43
44
  "FILE_CONTENT_DOWNLOADABLE_ALT": "下載 '$1' 檔案",
44
45
  "FILE_CONTENT_DOWNLOADABLE_WITH_SIZE_ALT": "下載 '$1' 檔案,大小為 $2",
45
46
  "FILE_CONTENT_WITH_SIZE_ALT": "'$1',大小為 $2",
47
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_BODY": "ENTER 鍵",
48
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_HEADER": "存取訊息中的項目",
49
+ "KEYBOARD_HELP_CHAT_HISTORY_HEADER": "聊天記錄",
50
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_BODY": "ESC 鍵",
51
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_HEADER": "離開訊息",
52
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_BODY": "Tab 鍵\nShift + Tab 鍵",
53
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_HEADER": "在訊息中的項目之間移動",
54
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_BODY": "向上鍵\n向下鍵",
55
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_HEADER": "在訊息之間移動",
56
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_BODY": "ENTER 鍵",
57
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_HEADER": "執行動作",
58
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_BODY": "Tab 鍵\nShift + Tab 鍵",
59
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_HEADER": "在聊天視窗中的項目之間移動",
60
+ "KEYBOARD_HELP_CHAT_WINDOW_HEADER": "聊天視窗",
61
+ "KEYBOARD_HELP_CLOSE_BUTTON_ALT": "關閉",
62
+ "KEYBOARD_HELP_HEADER": "鍵盤控制項",
46
63
  "MARKDOWN_EXTERNAL_LINK_ALT": "在新視窗中開啟; 外部。",
47
64
  "RECEIPT_CARD_TAX": "稅金",
48
65
  "RECEIPT_CARD_TOTAL": "總計",
@@ -70,10 +87,12 @@
70
87
  "TOAST_ALT_WARN": "警告",
71
88
  "TOAST_DISMISS_BUTTON": "關閉",
72
89
  "TOAST_TITLE_ALT": "通知",
73
- "TRANSCRIPT_ARIA_LABEL_ALT": "文字記錄,按方向鍵進行瀏覽。",
74
- "TRANSCRIPT_ARIA_ROLE_ALT": "文字記錄",
90
+ "TRANSCRIPT_ARIA_LABEL_ALT": "聊天記錄,按方向鍵進行瀏覽。",
91
+ "TRANSCRIPT_ARIA_ROLE_ALT": "聊天記錄",
92
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_LABEL_ALT": "訊息為互動式。請按 Shift Tab 鍵 2 到 3 次切換至聊天記錄,然後按一下訊息進行互動。",
93
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_WITH_LINKS_LABEL_ALT": "訊息中的一或多個連結。請按 Shift Tab 鍵 2 到 3 次切換至聊天記錄,然後按一下訊息進行互動。",
75
94
  "TRANSCRIPT_MORE_MESSAGES": "更多訊息",
76
95
  "TRANSCRIPT_NEW_MESSAGES": "新訊息",
77
- "TRANSCRIPT_TERMINATOR_TEXT": "文字記錄結束",
96
+ "TRANSCRIPT_TERMINATOR_TEXT": "聊天記錄結尾",
78
97
  "TYPING_INDICATOR_ALT": "顯示輸入指示器"
79
98
  }
@@ -6,7 +6,8 @@
6
6
  "ACTIVITY_YOU_SAID_ALT": "您說:",
7
7
  "ACTIVITY_BOT_ATTACHED_ALT": "機器人附加了:",
8
8
  "ACTIVITY_ERROR_BOX_TITLE": "錯誤訊息",
9
- "ACTIVITY_INTERACTIVE_LABEL_ALT": "按 ENTER 鍵進行互動。",
9
+ "ACTIVITY_INTERACTIVE_LABEL_ALT": "訊息為互動式。按一下即可互動。",
10
+ "ACTIVITY_INTERACTIVE_WITH_LINKS_LABEL_ALT": "訊息中的一或多個連結。按一下即可互動。",
10
11
  "ACTIVITY_YOU_ATTACHED_ALT": "您附加了:",
11
12
  "ACTIVITY_NUM_ATTACHMENTS_ONE_ALT": "1 個附件。",
12
13
  "ACTIVITY_NUM_ATTACHMENTS_FEW_ALT": "$1 個附件。",
@@ -43,6 +44,22 @@
43
44
  "FILE_CONTENT_DOWNLOADABLE_ALT": "下載 '$1' 檔案",
44
45
  "FILE_CONTENT_DOWNLOADABLE_WITH_SIZE_ALT": "下載 '$1' 檔案,大小為 $2",
45
46
  "FILE_CONTENT_WITH_SIZE_ALT": "'$1',大小為 $2",
47
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_BODY": "ENTER 鍵",
48
+ "KEYBOARD_HELP_CHAT_HISTORY_ACCESS_ITEMS_IN_MESSAGE_HEADER": "存取訊息中的項目",
49
+ "KEYBOARD_HELP_CHAT_HISTORY_HEADER": "聊天記錄",
50
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_BODY": "ESC 鍵",
51
+ "KEYBOARD_HELP_CHAT_HISTORY_LEAVE_MESSAGE_HEADER": "離開訊息",
52
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_BODY": "Tab 鍵\nShift + Tab 鍵",
53
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_ITEMS_HEADER": "在訊息中的項目之間移動",
54
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_BODY": "向上鍵\n向下鍵",
55
+ "KEYBOARD_HELP_CHAT_HISTORY_MOVE_BETWEEN_MESSAGES_HEADER": "在訊息之間移動",
56
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_BODY": "ENTER 鍵",
57
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_DO_ACTION_HEADER": "執行動作",
58
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_BODY": "Tab 鍵\nShift + Tab 鍵",
59
+ "KEYBOARD_HELP_CHAT_WINDOW_BODY_MOVE_BETWEEN_ITEMS_HEADER": "在聊天視窗中的項目之間移動",
60
+ "KEYBOARD_HELP_CHAT_WINDOW_HEADER": "聊天視窗",
61
+ "KEYBOARD_HELP_CLOSE_BUTTON_ALT": "關閉",
62
+ "KEYBOARD_HELP_HEADER": "鍵盤控制項",
46
63
  "MARKDOWN_EXTERNAL_LINK_ALT": "在新視窗中開啟; 外部。",
47
64
  "RECEIPT_CARD_TAX": "稅金",
48
65
  "RECEIPT_CARD_TOTAL": "總計",
@@ -70,10 +87,12 @@
70
87
  "TOAST_ALT_WARN": "警告",
71
88
  "TOAST_DISMISS_BUTTON": "關閉",
72
89
  "TOAST_TITLE_ALT": "通知",
73
- "TRANSCRIPT_ARIA_LABEL_ALT": "文字記錄,按方向鍵進行瀏覽。",
74
- "TRANSCRIPT_ARIA_ROLE_ALT": "文字記錄",
90
+ "TRANSCRIPT_ARIA_LABEL_ALT": "聊天記錄,按方向鍵進行瀏覽。",
91
+ "TRANSCRIPT_ARIA_ROLE_ALT": "聊天記錄",
92
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_LABEL_ALT": "訊息為互動式。請按 Shift Tab 鍵 2 到 3 次切換至聊天記錄,然後按一下訊息進行互動。",
93
+ "TRANSCRIPT_LIVE_REGION_INTERACTIVE_WITH_LINKS_LABEL_ALT": "訊息中的一或多個連結。請按 Shift Tab 鍵 2 到 3 次切換至聊天記錄,然後按一下訊息進行互動。",
75
94
  "TRANSCRIPT_MORE_MESSAGES": "更多訊息",
76
95
  "TRANSCRIPT_NEW_MESSAGES": "新訊息",
77
- "TRANSCRIPT_TERMINATOR_TEXT": "文字記錄結束",
96
+ "TRANSCRIPT_TERMINATOR_TEXT": "聊天記錄結尾",
78
97
  "TYPING_INDICATOR_ALT": "顯示輸入指示器"
79
98
  }
@@ -11,6 +11,18 @@ const newMessagesButtonFontSizeDeprecation = warnOnce(
11
11
  '"styleOptions.newMessagesButtonFontSize" has been renamed to "styleOptions.scrollToEndButtonFontSize". This deprecation migration will be removed on or after 2023-06-02.'
12
12
  );
13
13
 
14
+ const suggestedActionBackgroundDeprecation = warnOnce(
15
+ '"styleOptions.suggestedActionBackground" has been deprecated. Please use "styleOptions.suggestedActionBackgroundColor" instead. This deprecation migration will be removed on or after 2021-09-16.'
16
+ );
17
+
18
+ const suggestedActionXXXBackgroundDeprecation = warnOnce(
19
+ '"styleOptions.suggestedActionXXXBackground" has been deprecated. Please use "styleOptions.suggestedActionBackgroundColorOnXXX" instead. This deprecation migration will be removed on or after 2021-09-16.'
20
+ );
21
+
22
+ const suggestedActionDisabledDeprecation = warnOnce(
23
+ '"styleOptions.suggestedActionDisabledXXX" has been renamed to "styleOptions.suggestedActionXXXOnDisabled". This deprecation migration will be removed on or after 2021-09-16.'
24
+ );
25
+
14
26
  // TODO: [P4] We should add a notice for people who want to use "styleSet" instead of "styleOptions".
15
27
  // "styleSet" is actually CSS stylesheet and it is based on the DOM tree.
16
28
  // DOM tree may change from time to time, thus, maintaining "styleSet" becomes a constant effort.
@@ -107,6 +119,64 @@ export default function normalizeStyleOptions({
107
119
  filledOptions.scrollToEndButtonFontSize = options.scrollToEndButtonFontSize || newMessagesButtonFontSize;
108
120
  }
109
121
 
122
+ options.suggestedActionBackground && suggestedActionBackgroundDeprecation();
123
+
124
+ if (options.suggestedActionActiveBackground) {
125
+ suggestedActionXXXBackgroundDeprecation();
126
+
127
+ filledOptions.suggestedActionBackgroundColorOnActive =
128
+ options.suggestedActionBackgroundColorOnActive || options.suggestedActionActiveBackground;
129
+ }
130
+
131
+ if (options.suggestedActionFocusBackground) {
132
+ suggestedActionXXXBackgroundDeprecation();
133
+
134
+ filledOptions.suggestedActionBackgroundColorOnFocus =
135
+ options.suggestedActionBackgroundColorOnFocus || options.suggestedActionFocusBackground;
136
+ }
137
+
138
+ if (options.suggestedActionHoverBackground) {
139
+ suggestedActionXXXBackgroundDeprecation();
140
+
141
+ filledOptions.suggestedActionBackgroundColorOnHover =
142
+ options.suggestedActionBackgroundColorOnHover || options.suggestedActionHoverBackground;
143
+ }
144
+
145
+ if (options.suggestedActionDisabledBackground) {
146
+ suggestedActionXXXBackgroundDeprecation();
147
+
148
+ filledOptions.suggestedActionBackgroundColorOnDisabled =
149
+ options.suggestedActionBackgroundColorOnDisabled || options.suggestedActionDisabledBackground;
150
+ }
151
+
152
+ if (options.suggestedActionDisabledBorderColor) {
153
+ suggestedActionDisabledDeprecation();
154
+
155
+ filledOptions.suggestedActionBorderColorOnDisabled =
156
+ options.suggestedActionBorderColorOnDisabled || options.suggestedActionDisabledBorderColor;
157
+ }
158
+
159
+ if (options.suggestedActionDisabledBorderStyle) {
160
+ suggestedActionDisabledDeprecation();
161
+
162
+ filledOptions.suggestedActionBorderStyleOnDisabled =
163
+ options.suggestedActionBorderStyleOnDisabled || options.suggestedActionDisabledBorderStyle;
164
+ }
165
+
166
+ if (options.suggestedActionDisabledBorderWidth) {
167
+ suggestedActionDisabledDeprecation();
168
+
169
+ filledOptions.suggestedActionBorderWidthOnDisabled =
170
+ options.suggestedActionBorderWidthOnDisabled || options.suggestedActionDisabledBorderWidth;
171
+ }
172
+
173
+ if (options.suggestedActionDisabledTextColor) {
174
+ suggestedActionDisabledDeprecation();
175
+
176
+ filledOptions.suggestedActionTextColorOnDisabled =
177
+ options.suggestedActionTextColorOnDisabled || options.suggestedActionDisabledTextColor;
178
+ }
179
+
110
180
  return {
111
181
  ...filledOptions,
112
182
  bubbleFromUserNubOffset: normalizedBubbleFromUserNubOffset,
@@ -3,8 +3,6 @@ import updateIn from 'simple-update-in';
3
3
  // TODO: [P4] We should add a notice for people who want to use "styleSet" instead of "styleOptions".
4
4
  // "styleSet" is actually CSS stylesheet and it is based on the DOM tree.
5
5
  // DOM tree may change from time to time, thus, maintaining "styleSet" becomes a constant effort.
6
-
7
- // eslint-disable-next-line complexity
8
6
  export default function patchStyleOptionsFromDeprecatedProps(
9
7
  styleOptions,
10
8
  { groupTimestamp: groupTimestampFromProps, sendTimeout: sendTimeoutFromProps }
@@ -0,0 +1,180 @@
1
+ import React, { useCallback, useMemo, useState } from 'react';
2
+
3
+ import type { FC, PropsWithChildren } from 'react';
4
+
5
+ import ActivityAcknowledgementContext, { ActivityAcknowledgementContextType } from './private/Context';
6
+ import findLastIndex from '../../utils/findLastIndex';
7
+ import useActivities from '../../hooks/useActivities';
8
+ import useActivityKeys from '../ActivityKeyer/useActivityKeys';
9
+ import usePrevious from '../../hooks/internal/usePrevious';
10
+ import useValueRef from '../../hooks/internal/useValueRef';
11
+
12
+ import type { ActivityAcknowledgement } from './private/types';
13
+
14
+ type ActivityAcknowledgementComposerProps = PropsWithChildren<{}>;
15
+
16
+ function findClosestActivityKeyIfNotExists(
17
+ activityKey: string,
18
+ keys: readonly string[],
19
+ prevKeys: readonly string[]
20
+ ): string | undefined {
21
+ if (keys.includes(activityKey)) {
22
+ return activityKey;
23
+ } else if (!prevKeys || !activityKey) {
24
+ // Initially, when the transcript was empty, there should be nothing read.
25
+ return;
26
+ }
27
+
28
+ // If the last activity key is no longer in this activities (say, deleted), we try to find the closest one.
29
+ const prevIndex = prevKeys.indexOf(activityKey);
30
+
31
+ if (~prevIndex) {
32
+ // List out all previously activity keys, find the closest one that is in the new transcript.
33
+ const acknowledgedActivityKeys = prevKeys.slice(0, prevIndex).reverse();
34
+
35
+ for (const prevAcknowledgedActivityKey of acknowledgedActivityKeys) {
36
+ if (keys.includes(prevAcknowledgedActivityKey)) {
37
+ return prevAcknowledgedActivityKey;
38
+ }
39
+ }
40
+ }
41
+
42
+ // If nothing is found, return `undefined`.
43
+ }
44
+
45
+ const ActivityAcknowledgementComposer: FC<ActivityAcknowledgementComposerProps> = ({ children }) => {
46
+ const [activities] = useActivities();
47
+ const [allActivityKeys] = useActivityKeys();
48
+ const [rawLastAcknowledgedActivityKey, setRawLastAcknowledgedActivityKey] = useState<string | undefined>();
49
+ const [rawLastReadActivityKey, setRawLastReadActivityKey] = useState<string | undefined>();
50
+
51
+ const allActivityKeysRef = useValueRef(allActivityKeys);
52
+ const prevAllActivityKeys = usePrevious(allActivityKeys);
53
+
54
+ const lastOutgoingActivityKeyIndex = useMemo(
55
+ () => findLastIndex(activities, activity => activity.from?.role === 'user'),
56
+ [activities]
57
+ );
58
+
59
+ // Make sure when we return "lastReadActivityKey" exists in the current transcript.
60
+ const lastReadActivityKey = useMemo(() => {
61
+ rawLastReadActivityKey &&
62
+ !~prevAllActivityKeys.includes(rawLastReadActivityKey) &&
63
+ console.warn(
64
+ `botframework-webchat internal assertion: "rawLastReadActivityKey" of value ${rawLastReadActivityKey} should be in the "prevAllActivityKeys" array.`
65
+ );
66
+
67
+ return findClosestActivityKeyIfNotExists(rawLastReadActivityKey, allActivityKeys, prevAllActivityKeys);
68
+ }, [allActivityKeys, prevAllActivityKeys, rawLastReadActivityKey]);
69
+
70
+ const lastReadActivityKeyRef = useValueRef(lastReadActivityKey);
71
+
72
+ // Make sure when we return "lastAcknowledgedActivityKey" exists in the current transcript.
73
+ const lastAcknowledgedActivityKey = useMemo(() => {
74
+ rawLastAcknowledgedActivityKey &&
75
+ !~prevAllActivityKeys.includes(rawLastAcknowledgedActivityKey) &&
76
+ console.warn(
77
+ `botframework-webchat internal assertion: "rawLastAcknowledgedActivityKey" of value ${rawLastAcknowledgedActivityKey} should be in the "prevAllActivityKeys" array.`
78
+ );
79
+
80
+ const lastAcknowledgedActivityKey = findClosestActivityKeyIfNotExists(
81
+ rawLastAcknowledgedActivityKey,
82
+ allActivityKeys,
83
+ prevAllActivityKeys
84
+ );
85
+
86
+ // TODO: [P2] Since Direct Line may send history and does not have read receipt.
87
+ // Thus, if we don't assume everything is acknowledged initially, while displaying the history,
88
+ // the transcript would soon stop scrolling.
89
+ // Thus, before the first outgoing activity is detected, we need to assume everything is acknowledged.
90
+ return (
91
+ allActivityKeys[Math.max(allActivityKeys.indexOf(lastAcknowledgedActivityKey), lastOutgoingActivityKeyIndex)] ||
92
+ allActivityKeys[allActivityKeys.length - 1]
93
+ );
94
+ }, [allActivityKeys, lastOutgoingActivityKeyIndex, prevAllActivityKeys, rawLastAcknowledgedActivityKey]);
95
+
96
+ const activityAcknowledgements = useMemo<Readonly<Map<string, ActivityAcknowledgement>>>(() => {
97
+ const activityAcknowledgements = new Map<string, ActivityAcknowledgement>();
98
+ const lastAcknowledgedIndex = allActivityKeys.indexOf(lastAcknowledgedActivityKey);
99
+ const lastReadIndex = allActivityKeys.indexOf(lastReadActivityKey);
100
+
101
+ allActivityKeys.forEach((activityKey, index) => {
102
+ activityAcknowledgements.set(activityKey, {
103
+ acknowledged: index <= lastAcknowledgedIndex,
104
+ read: index <= lastReadIndex
105
+ });
106
+ });
107
+
108
+ return Object.freeze(activityAcknowledgements);
109
+ }, [allActivityKeys, lastAcknowledgedActivityKey, lastReadActivityKey]);
110
+
111
+ const activityAcknowledgementsRef = useValueRef(activityAcknowledgements);
112
+
113
+ const getHasAcknowledgedByActivityKey = useCallback<(activityKey: string) => boolean>(
114
+ (activityKey: string) => activityAcknowledgementsRef.current.get(activityKey)?.acknowledged,
115
+ [activityAcknowledgementsRef]
116
+ );
117
+
118
+ // TODO: [P2] Memoize with `useMemoWithPrevious` for better memoization of arrays.
119
+ const activityKeysByReadState = useMemo<readonly [readonly string[], readonly string[]]>(() => {
120
+ const index = allActivityKeys.indexOf(lastReadActivityKey);
121
+
122
+ return Object.freeze([
123
+ Object.freeze(allActivityKeys.slice(0, index + 1)),
124
+ Object.freeze(allActivityKeys.slice(index + 1))
125
+ ]) as readonly [readonly string[], readonly string[]];
126
+ }, [allActivityKeys, lastReadActivityKey]);
127
+
128
+ const markAllAsAcknowledged = useCallback((): void => {
129
+ const { current: allActivityKeys } = allActivityKeysRef;
130
+
131
+ setRawLastAcknowledgedActivityKey(allActivityKeys[allActivityKeys.length - 1]);
132
+ }, [allActivityKeysRef, setRawLastAcknowledgedActivityKey]);
133
+
134
+ const markActivityKeyAsRead = useCallback(
135
+ (activityKey: string): void => {
136
+ const { current: allActivityKeys } = allActivityKeysRef;
137
+ const index = allActivityKeys.indexOf(activityKey);
138
+
139
+ if (!~index) {
140
+ return console.warn(
141
+ `botframework-webchat: Cannot mark activity with key ${activityKey} as read because it is not in the transcript.`
142
+ );
143
+ }
144
+
145
+ index > allActivityKeys.indexOf(lastReadActivityKeyRef.current) && setRawLastReadActivityKey(activityKey);
146
+ },
147
+ [allActivityKeysRef, lastReadActivityKeyRef, setRawLastReadActivityKey]
148
+ );
149
+
150
+ if (activityKeysByReadState[0].length + activityKeysByReadState[1].length !== allActivityKeys.length) {
151
+ console.warn(
152
+ 'botframework-webchat internal: Sum of count of read and unread activity keys MUST equals to total number of activity keys.'
153
+ );
154
+ }
155
+
156
+ const contextValue = useMemo<ActivityAcknowledgementContextType>(
157
+ () => ({
158
+ activityKeysByReadState,
159
+ getHasAcknowledgedByActivityKey,
160
+ lastAcknowledgedActivityKeyState: Object.freeze([lastAcknowledgedActivityKey]) as readonly [string],
161
+ lastReadActivityKeyState: Object.freeze([lastReadActivityKey]) as readonly [string],
162
+ markActivityKeyAsRead,
163
+ markAllAsAcknowledged
164
+ }),
165
+ [
166
+ activityKeysByReadState,
167
+ getHasAcknowledgedByActivityKey,
168
+ lastAcknowledgedActivityKey,
169
+ lastReadActivityKey,
170
+ markActivityKeyAsRead,
171
+ markAllAsAcknowledged
172
+ ]
173
+ );
174
+
175
+ return (
176
+ <ActivityAcknowledgementContext.Provider value={contextValue}>{children}</ActivityAcknowledgementContext.Provider>
177
+ );
178
+ };
179
+
180
+ export default ActivityAcknowledgementComposer;
@@ -0,0 +1,18 @@
1
+ import { createContext } from 'react';
2
+
3
+ // TODO: [P1] It seems acknowledgement is only for transcript scrolling and not very beneficial to everyone.
4
+ // We should move acknowledgement logic to transcript.
5
+ type ActivityAcknowledgementContextType = {
6
+ activityKeysByReadState: readonly [readonly string[], readonly string[]];
7
+ getHasAcknowledgedByActivityKey: (activityKey: string) => boolean | undefined;
8
+ lastAcknowledgedActivityKeyState: readonly [string];
9
+ lastReadActivityKeyState: readonly [string];
10
+ markActivityKeyAsRead: (activityKey: string) => void;
11
+ markAllAsAcknowledged: () => void;
12
+ };
13
+
14
+ const ActivityAcknowledgementContext = createContext<ActivityAcknowledgementContextType>(undefined);
15
+
16
+ export default ActivityAcknowledgementContext;
17
+
18
+ export type { ActivityAcknowledgementContextType };
@@ -0,0 +1,6 @@
1
+ type ActivityAcknowledgement = {
2
+ get acknowledged(): boolean;
3
+ get read(): boolean;
4
+ };
5
+
6
+ export type { ActivityAcknowledgement };
@@ -0,0 +1,19 @@
1
+ import { useContext } from 'react';
2
+
3
+ import ActivityAcknowledgementContext from './Context';
4
+
5
+ import type { ActivityAcknowledgementContextType } from './Context';
6
+
7
+ export default function useActivityAcknowledgementContext(
8
+ thrownOnUndefined = true
9
+ ): ActivityAcknowledgementContextType {
10
+ const contextValue = useContext(ActivityAcknowledgementContext);
11
+
12
+ if (thrownOnUndefined && !contextValue) {
13
+ throw new Error(
14
+ 'botframework-webchat internal: This hook can only be used under <ActivityAcknowledgementContext>.'
15
+ );
16
+ }
17
+
18
+ return contextValue;
19
+ }
@@ -0,0 +1,8 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ /**
4
+ * Returns an arrays of two list of activity keys: read and unread.
5
+ */
6
+ export default function useActivityKeysByRead(): readonly [readonly string[], readonly string[]] {
7
+ return useActivityAcknowledgementContext().activityKeysByReadState;
8
+ }
@@ -0,0 +1,5 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ export default function useGetHasAcknoweledgedByActivityKey(): (activityKey: string) => boolean | undefined {
4
+ return useActivityAcknowledgementContext().getHasAcknowledgedByActivityKey;
5
+ }
@@ -0,0 +1,5 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ export default function useLastAcknowledgedActivityKey(): readonly [string] {
4
+ return useActivityAcknowledgementContext().lastAcknowledgedActivityKeyState;
5
+ }
@@ -0,0 +1,5 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ export default function useLastReadActivityKey(): readonly [string] {
4
+ return useActivityAcknowledgementContext().lastReadActivityKeyState;
5
+ }
@@ -0,0 +1,5 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ export default function useMarkActivityKeyAsRead(): (activityKey: string) => void {
4
+ return useActivityAcknowledgementContext().markActivityKeyAsRead;
5
+ }
@@ -0,0 +1,5 @@
1
+ import useActivityAcknowledgementContext from './private/useContext';
2
+
3
+ export default function useMarkAllAsAcknowledged(): () => void {
4
+ return useActivityAcknowledgementContext().markAllAsAcknowledged;
5
+ }