@messenger-box/tailwind-ui-inbox 10.0.3-alpha.100

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 (373) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/LICENSE +21 -0
  3. package/jest.config.js +9 -0
  4. package/lib/cdm-locales/en/translations.json +31 -0
  5. package/lib/cdm-locales/es/translations.json +31 -0
  6. package/lib/components/AIAgent/AIAgent.d.ts +21 -0
  7. package/lib/components/AIAgent/AIAgent.d.ts.map +1 -0
  8. package/lib/components/AIAgent/AIAgent.js +904 -0
  9. package/lib/components/AIAgent/AIAgent.js.map +1 -0
  10. package/lib/components/AIAgent/index.d.ts +2 -0
  11. package/lib/components/AIAgent/index.d.ts.map +1 -0
  12. package/lib/components/InboxMessage/CommonMessage.d.ts +8 -0
  13. package/lib/components/InboxMessage/CommonMessage.d.ts.map +1 -0
  14. package/lib/components/InboxMessage/CommonMessage.js +35 -0
  15. package/lib/components/InboxMessage/CommonMessage.js.map +1 -0
  16. package/lib/components/InboxMessage/ConversationItem.d.ts +14 -0
  17. package/lib/components/InboxMessage/ConversationItem.d.ts.map +1 -0
  18. package/lib/components/InboxMessage/ConversationItem.js +200 -0
  19. package/lib/components/InboxMessage/ConversationItem.js.map +1 -0
  20. package/lib/components/InboxMessage/InputComponent.d.ts +12 -0
  21. package/lib/components/InboxMessage/InputComponent.d.ts.map +1 -0
  22. package/lib/components/InboxMessage/InputComponent.js +359 -0
  23. package/lib/components/InboxMessage/InputComponent.js.map +1 -0
  24. package/lib/components/InboxMessage/LeftSidebar.d.ts +20 -0
  25. package/lib/components/InboxMessage/LeftSidebar.d.ts.map +1 -0
  26. package/lib/components/InboxMessage/LeftSidebar.js +102 -0
  27. package/lib/components/InboxMessage/LeftSidebar.js.map +1 -0
  28. package/lib/components/InboxMessage/MessageInput.d.ts +9 -0
  29. package/lib/components/InboxMessage/MessageInput.d.ts.map +1 -0
  30. package/lib/components/InboxMessage/MessageInput.js +154 -0
  31. package/lib/components/InboxMessage/MessageInput.js.map +1 -0
  32. package/lib/components/InboxMessage/MessageInputComponent.d.ts +9 -0
  33. package/lib/components/InboxMessage/MessageInputComponent.d.ts.map +1 -0
  34. package/lib/components/InboxMessage/Messages.d.ts +17 -0
  35. package/lib/components/InboxMessage/Messages.d.ts.map +1 -0
  36. package/lib/components/InboxMessage/Messages.js +99 -0
  37. package/lib/components/InboxMessage/Messages.js.map +1 -0
  38. package/lib/components/InboxMessage/MessagesBuilderUi.d.ts +17 -0
  39. package/lib/components/InboxMessage/MessagesBuilderUi.d.ts.map +1 -0
  40. package/lib/components/InboxMessage/Popover.d.ts +3 -0
  41. package/lib/components/InboxMessage/Popover.d.ts.map +1 -0
  42. package/lib/components/InboxMessage/Popover.js +31 -0
  43. package/lib/components/InboxMessage/Popover.js.map +1 -0
  44. package/lib/components/InboxMessage/RightSidebar.d.ts +9 -0
  45. package/lib/components/InboxMessage/RightSidebar.d.ts.map +1 -0
  46. package/lib/components/InboxMessage/RightSidebar.js +9 -0
  47. package/lib/components/InboxMessage/RightSidebar.js.map +1 -0
  48. package/lib/components/InboxMessage/RightSidebarAi.d.ts +23 -0
  49. package/lib/components/InboxMessage/RightSidebarAi.d.ts.map +1 -0
  50. package/lib/components/InboxMessage/RightSidebarAi.js +9 -0
  51. package/lib/components/InboxMessage/RightSidebarAi.js.map +1 -0
  52. package/lib/components/InboxMessage/ServiceConversationItem.d.ts +12 -0
  53. package/lib/components/InboxMessage/ServiceConversationItem.d.ts.map +1 -0
  54. package/lib/components/InboxMessage/ServiceConversationItem.js +185 -0
  55. package/lib/components/InboxMessage/ServiceConversationItem.js.map +1 -0
  56. package/lib/components/InboxMessage/ServiceInboxItem.d.ts +12 -0
  57. package/lib/components/InboxMessage/ServiceInboxItem.d.ts.map +1 -0
  58. package/lib/components/InboxMessage/ServiceInboxItem.js +182 -0
  59. package/lib/components/InboxMessage/ServiceInboxItem.js.map +1 -0
  60. package/lib/components/InboxMessage/SubscriptionHandler.d.ts +19 -0
  61. package/lib/components/InboxMessage/SubscriptionHandler.d.ts.map +1 -0
  62. package/lib/components/InboxMessage/SubscriptionHandler.js +41 -0
  63. package/lib/components/InboxMessage/SubscriptionHandler.js.map +1 -0
  64. package/lib/components/InboxMessage/UploadImageButton.d.ts +7 -0
  65. package/lib/components/InboxMessage/UploadImageButton.d.ts.map +1 -0
  66. package/lib/components/InboxMessage/UploadImageButton.js +34 -0
  67. package/lib/components/InboxMessage/UploadImageButton.js.map +1 -0
  68. package/lib/components/InboxMessage/UserModalContent.d.ts +3 -0
  69. package/lib/components/InboxMessage/UserModalContent.d.ts.map +1 -0
  70. package/lib/components/InboxMessage/UserModalContent.js +60 -0
  71. package/lib/components/InboxMessage/UserModalContent.js.map +1 -0
  72. package/lib/components/InboxMessage/index.d.ts +17 -0
  73. package/lib/components/InboxMessage/index.d.ts.map +1 -0
  74. package/lib/components/InboxMessage/message-widgets/CommonMessage.d.ts +11 -0
  75. package/lib/components/InboxMessage/message-widgets/CommonMessage.d.ts.map +1 -0
  76. package/lib/components/InboxMessage/message-widgets/CommonMessage.js +44 -0
  77. package/lib/components/InboxMessage/message-widgets/CommonMessage.js.map +1 -0
  78. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts +11 -0
  79. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.d.ts.map +1 -0
  80. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js +194 -0
  81. package/lib/components/InboxMessage/message-widgets/ErrorFixCard.js.map +1 -0
  82. package/lib/components/InboxMessage/message-widgets/MessageCard.d.ts +8 -0
  83. package/lib/components/InboxMessage/message-widgets/MessageCard.d.ts.map +1 -0
  84. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.d.ts +12 -0
  85. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.d.ts.map +1 -0
  86. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.js +37 -0
  87. package/lib/components/InboxMessage/message-widgets/MessageSliceRenderer.js.map +1 -0
  88. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts +18 -0
  89. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.d.ts.map +1 -0
  90. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js +1082 -0
  91. package/lib/components/InboxMessage/message-widgets/ModernMessageGroup.js.map +1 -0
  92. package/lib/components/InboxMessage/message-widgets/PlainMessage.d.ts +8 -0
  93. package/lib/components/InboxMessage/message-widgets/PlainMessage.d.ts.map +1 -0
  94. package/lib/components/InboxMessage/message-widgets/PlainMessage.js +14 -0
  95. package/lib/components/InboxMessage/message-widgets/PlainMessage.js.map +1 -0
  96. package/lib/components/InboxMessage/message-widgets/PropertyMessageWidget.d.ts +9 -0
  97. package/lib/components/InboxMessage/message-widgets/PropertyMessageWidget.d.ts.map +1 -0
  98. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.d.ts +14 -0
  99. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.d.ts.map +1 -0
  100. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.js +333 -0
  101. package/lib/components/InboxMessage/message-widgets/SlackLikeMessageGroup.js.map +1 -0
  102. package/lib/components/InboxMessage/message-widgets/index.d.ts +4 -0
  103. package/lib/components/InboxMessage/message-widgets/index.d.ts.map +1 -0
  104. package/lib/components/ModelConfigPanel.d.ts +37 -0
  105. package/lib/components/ModelConfigPanel.d.ts.map +1 -0
  106. package/lib/components/ModelConfigPanel.js +317 -0
  107. package/lib/components/ModelConfigPanel.js.map +1 -0
  108. package/lib/components/filler-components/RightSiderBar.d.ts +24 -0
  109. package/lib/components/filler-components/RightSiderBar.d.ts.map +1 -0
  110. package/lib/components/filler-components/RightSiderBar.js +335 -0
  111. package/lib/components/filler-components/RightSiderBar.js.map +1 -0
  112. package/lib/components/inbox/FilesList.d.ts +20 -0
  113. package/lib/components/inbox/FilesList.d.ts.map +1 -0
  114. package/lib/components/inbox/FilesList.js +68 -0
  115. package/lib/components/inbox/FilesList.js.map +1 -0
  116. package/lib/components/inbox/MessageItem.d.ts +17 -0
  117. package/lib/components/inbox/MessageItem.d.ts.map +1 -0
  118. package/lib/components/inbox/MessageItem.js +50 -0
  119. package/lib/components/inbox/MessageItem.js.map +1 -0
  120. package/lib/components/inbox/ThreadItem.d.ts +11 -0
  121. package/lib/components/inbox/ThreadItem.d.ts.map +1 -0
  122. package/lib/components/inbox/ThreadItem.js +147 -0
  123. package/lib/components/inbox/ThreadItem.js.map +1 -0
  124. package/lib/components/inbox/index.d.ts +4 -0
  125. package/lib/components/inbox/index.d.ts.map +1 -0
  126. package/lib/components/index.d.ts +7 -0
  127. package/lib/components/index.d.ts.map +1 -0
  128. package/lib/components/live-code-editor/hybrid-live-editor.d.ts +20 -0
  129. package/lib/components/live-code-editor/hybrid-live-editor.d.ts.map +1 -0
  130. package/lib/components/live-code-editor/hybrid-live-editor.js +68 -0
  131. package/lib/components/live-code-editor/hybrid-live-editor.js.map +1 -0
  132. package/lib/components/live-code-editor/index.d.ts +4 -0
  133. package/lib/components/live-code-editor/index.d.ts.map +1 -0
  134. package/lib/components/live-code-editor/live-code-editor.d.ts +14 -0
  135. package/lib/components/live-code-editor/live-code-editor.d.ts.map +1 -0
  136. package/lib/components/live-code-editor/live-code-editor.js +207 -0
  137. package/lib/components/live-code-editor/live-code-editor.js.map +1 -0
  138. package/lib/components/slot-fill/chat-message-filler.d.ts +4 -0
  139. package/lib/components/slot-fill/chat-message-filler.d.ts.map +1 -0
  140. package/lib/components/slot-fill/chat-message-filler.js +5 -0
  141. package/lib/components/slot-fill/chat-message-filler.js.map +1 -0
  142. package/lib/components/slot-fill/chat-message-slot.d.ts +11 -0
  143. package/lib/components/slot-fill/chat-message-slot.d.ts.map +1 -0
  144. package/lib/components/slot-fill/chat-message-slot.js +6 -0
  145. package/lib/components/slot-fill/chat-message-slot.js.map +1 -0
  146. package/lib/components/slot-fill/index.d.ts +4 -0
  147. package/lib/components/slot-fill/index.d.ts.map +1 -0
  148. package/lib/components/slot-fill/right-sidebar-filler.d.ts +4 -0
  149. package/lib/components/slot-fill/right-sidebar-filler.d.ts.map +1 -0
  150. package/lib/components/slot-fill/right-sidebar-filler.js +13 -0
  151. package/lib/components/slot-fill/right-sidebar-filler.js.map +1 -0
  152. package/lib/components/ui/button.d.ts +9 -0
  153. package/lib/components/ui/button.d.ts.map +1 -0
  154. package/lib/compute.d.ts +8 -0
  155. package/lib/compute.d.ts.map +1 -0
  156. package/lib/compute.js +137 -0
  157. package/lib/compute.js.map +1 -0
  158. package/lib/config/env-config.d.ts +13 -0
  159. package/lib/config/env-config.d.ts.map +1 -0
  160. package/lib/config/env-config.js +34 -0
  161. package/lib/config/env-config.js.map +1 -0
  162. package/lib/config/index.d.ts +2 -0
  163. package/lib/config/index.d.ts.map +1 -0
  164. package/lib/constants/breakpoints.d.ts +8 -0
  165. package/lib/constants/breakpoints.d.ts.map +1 -0
  166. package/lib/constants/index.d.ts +3 -0
  167. package/lib/constants/index.d.ts.map +1 -0
  168. package/lib/container/AiInbox.d.ts +15 -0
  169. package/lib/container/AiInbox.d.ts.map +1 -0
  170. package/lib/container/AiInboxWithLoader.d.ts +36 -0
  171. package/lib/container/AiInboxWithLoader.d.ts.map +1 -0
  172. package/lib/container/AiLandingInput.d.ts +4 -0
  173. package/lib/container/AiLandingInput.d.ts.map +1 -0
  174. package/lib/container/AiLandingInput.js +101 -0
  175. package/lib/container/AiLandingInput.js.map +1 -0
  176. package/lib/container/Inbox.d.ts +15 -0
  177. package/lib/container/Inbox.d.ts.map +1 -0
  178. package/lib/container/Inbox.js +955 -0
  179. package/lib/container/Inbox.js.map +1 -0
  180. package/lib/container/InboxAiMessagesLoader.d.ts +15 -0
  181. package/lib/container/InboxAiMessagesLoader.d.ts.map +1 -0
  182. package/lib/container/InboxAiMessagesLoader.js +30 -0
  183. package/lib/container/InboxAiMessagesLoader.js.map +1 -0
  184. package/lib/container/InboxContainer.d.ts +12 -0
  185. package/lib/container/InboxContainer.d.ts.map +1 -0
  186. package/lib/container/InboxContainer.js +31 -0
  187. package/lib/container/InboxContainer.js.map +1 -0
  188. package/lib/container/InboxTemplate1.d.ts +15 -0
  189. package/lib/container/InboxTemplate1.d.ts.map +1 -0
  190. package/lib/container/InboxTemplate1WithLoader.d.ts +36 -0
  191. package/lib/container/InboxTemplate1WithLoader.d.ts.map +1 -0
  192. package/lib/container/InboxTemplate2.d.ts +15 -0
  193. package/lib/container/InboxTemplate2.d.ts.map +1 -0
  194. package/lib/container/InboxWithAiLoader.d.ts +15 -0
  195. package/lib/container/InboxWithAiLoader.d.ts.map +1 -0
  196. package/lib/container/InboxWithAiLoader.js +56 -0
  197. package/lib/container/InboxWithAiLoader.js.map +1 -0
  198. package/lib/container/InboxWithLoader.d.ts +36 -0
  199. package/lib/container/InboxWithLoader.d.ts.map +1 -0
  200. package/lib/container/InboxWithLoader.js +277 -0
  201. package/lib/container/InboxWithLoader.js.map +1 -0
  202. package/lib/container/ServiceInbox.d.ts +9 -0
  203. package/lib/container/ServiceInbox.d.ts.map +1 -0
  204. package/lib/container/ServiceInbox.js +144 -0
  205. package/lib/container/ServiceInbox.js.map +1 -0
  206. package/lib/container/ThreadMessages.d.ts +13 -0
  207. package/lib/container/ThreadMessages.d.ts.map +1 -0
  208. package/lib/container/ThreadMessages.js +314 -0
  209. package/lib/container/ThreadMessages.js.map +1 -0
  210. package/lib/container/ThreadMessagesInbox.d.ts +14 -0
  211. package/lib/container/ThreadMessagesInbox.d.ts.map +1 -0
  212. package/lib/container/ThreadMessagesInbox.js +341 -0
  213. package/lib/container/ThreadMessagesInbox.js.map +1 -0
  214. package/lib/container/Threads.d.ts +8 -0
  215. package/lib/container/Threads.d.ts.map +1 -0
  216. package/lib/container/Threads.js +231 -0
  217. package/lib/container/Threads.js.map +1 -0
  218. package/lib/container/ThreadsInbox.d.ts +21 -0
  219. package/lib/container/ThreadsInbox.d.ts.map +1 -0
  220. package/lib/container/ThreadsInbox.js +244 -0
  221. package/lib/container/ThreadsInbox.js.map +1 -0
  222. package/lib/container/apply-footer-styles.d.ts +2 -0
  223. package/lib/container/apply-footer-styles.d.ts.map +1 -0
  224. package/lib/container/apply-footer-styles.js +16 -0
  225. package/lib/container/apply-footer-styles.js.map +1 -0
  226. package/lib/container/index.d.ts +13 -0
  227. package/lib/container/index.d.ts.map +1 -0
  228. package/lib/enums/index.d.ts +2 -0
  229. package/lib/enums/index.d.ts.map +1 -0
  230. package/lib/enums/messenger-slot-fill-name-enum.d.ts +5 -0
  231. package/lib/enums/messenger-slot-fill-name-enum.d.ts.map +1 -0
  232. package/lib/enums/messenger-slot-fill-name-enum.js +5 -0
  233. package/lib/enums/messenger-slot-fill-name-enum.js.map +1 -0
  234. package/lib/hooks/index.d.ts +3 -0
  235. package/lib/hooks/index.d.ts.map +1 -0
  236. package/lib/hooks/use-file-sync.d.ts +16 -0
  237. package/lib/hooks/use-file-sync.d.ts.map +1 -0
  238. package/lib/hooks/use-file-sync.js +63 -0
  239. package/lib/hooks/use-file-sync.js.map +1 -0
  240. package/lib/hooks/usePersistentModelConfig.d.ts +15 -0
  241. package/lib/hooks/usePersistentModelConfig.d.ts.map +1 -0
  242. package/lib/hooks/usePersistentModelConfig.js +46 -0
  243. package/lib/hooks/usePersistentModelConfig.js.map +1 -0
  244. package/lib/index.d.ts +10 -0
  245. package/lib/index.d.ts.map +1 -0
  246. package/lib/index.js +1 -0
  247. package/lib/index.js.map +1 -0
  248. package/lib/interfaces/index.d.ts +2 -0
  249. package/lib/interfaces/index.d.ts.map +1 -0
  250. package/lib/interfaces/message-widgets.interface.d.ts +21 -0
  251. package/lib/interfaces/message-widgets.interface.d.ts.map +1 -0
  252. package/lib/machines/aiAgentMachine.d.ts +3 -0
  253. package/lib/machines/aiAgentMachine.d.ts.map +1 -0
  254. package/lib/machines/aiAgentMachine.js +1083 -0
  255. package/lib/machines/aiAgentMachine.js.map +1 -0
  256. package/lib/machines/aiAgentMachine.simple.d.ts +3 -0
  257. package/lib/machines/aiAgentMachine.simple.d.ts.map +1 -0
  258. package/lib/machines/aiAgentMachine.simple.js +108 -0
  259. package/lib/machines/aiAgentMachine.simple.js.map +1 -0
  260. package/lib/machines/index.d.ts +3 -0
  261. package/lib/machines/index.d.ts.map +1 -0
  262. package/lib/machines/types.d.ts +77 -0
  263. package/lib/machines/types.d.ts.map +1 -0
  264. package/lib/module.d.ts +7 -0
  265. package/lib/module.d.ts.map +1 -0
  266. package/lib/module.js +26 -0
  267. package/lib/module.js.map +1 -0
  268. package/lib/routes.json +98 -0
  269. package/lib/styles/responsive.css +76 -0
  270. package/lib/templates/InboxWithAi.d.ts +15 -0
  271. package/lib/templates/InboxWithAi.d.ts.map +1 -0
  272. package/lib/templates/InboxWithAi.js +440 -0
  273. package/lib/templates/InboxWithAi.js.map +1 -0
  274. package/lib/templates/InboxWithAi.tsx +533 -0
  275. package/lib/templates/index.d.ts +2 -0
  276. package/lib/templates/index.d.ts.map +1 -0
  277. package/lib/templates/index.ts +1 -0
  278. package/lib/utils/utils.d.ts +2 -0
  279. package/lib/utils/utils.d.ts.map +1 -0
  280. package/lib/utils/utils.js +3 -0
  281. package/lib/utils/utils.js.map +1 -0
  282. package/package.json +62 -0
  283. package/rollup.config.mjs +35 -0
  284. package/src/cdm-locales/en/translations.json +31 -0
  285. package/src/cdm-locales/es/translations.json +31 -0
  286. package/src/components/AIAgent/AIAgent.tsx +1103 -0
  287. package/src/components/AIAgent/AIAgent.tsx.bk +1365 -0
  288. package/src/components/AIAgent/README.md +82 -0
  289. package/src/components/AIAgent/index.ts +1 -0
  290. package/src/components/InboxMessage/CommonMessage.tsx +40 -0
  291. package/src/components/InboxMessage/ConversationItem.tsx +255 -0
  292. package/src/components/InboxMessage/InputComponent.tsx +462 -0
  293. package/src/components/InboxMessage/LeftSidebar.tsx +140 -0
  294. package/src/components/InboxMessage/MessageInput.tsx +209 -0
  295. package/src/components/InboxMessage/MessageInputComponent.tsx +245 -0
  296. package/src/components/InboxMessage/Messages.tsx +137 -0
  297. package/src/components/InboxMessage/MessagesBuilderUi.tsx +205 -0
  298. package/src/components/InboxMessage/Popover.tsx +42 -0
  299. package/src/components/InboxMessage/RightSidebar.tsx +22 -0
  300. package/src/components/InboxMessage/RightSidebarAi.tsx +37 -0
  301. package/src/components/InboxMessage/ServiceConversationItem.tsx +234 -0
  302. package/src/components/InboxMessage/ServiceInboxItem.tsx +223 -0
  303. package/src/components/InboxMessage/SubscriptionHandler.tsx +55 -0
  304. package/src/components/InboxMessage/UploadImageButton.tsx +46 -0
  305. package/src/components/InboxMessage/UserModalContent.tsx +60 -0
  306. package/src/components/InboxMessage/index.ts +16 -0
  307. package/src/components/InboxMessage/message-widgets/CommonMessage.tsx +69 -0
  308. package/src/components/InboxMessage/message-widgets/ErrorFixCard.tsx +240 -0
  309. package/src/components/InboxMessage/message-widgets/MessageCard.tsx +127 -0
  310. package/src/components/InboxMessage/message-widgets/MessageSliceRenderer.tsx +40 -0
  311. package/src/components/InboxMessage/message-widgets/ModernMessageGroup.tsx +1295 -0
  312. package/src/components/InboxMessage/message-widgets/PlainMessage.tsx +18 -0
  313. package/src/components/InboxMessage/message-widgets/PropertyMessageWidget.tsx +29 -0
  314. package/src/components/InboxMessage/message-widgets/SlackLikeMessageGroup.tsx +492 -0
  315. package/src/components/InboxMessage/message-widgets/index.ts +3 -0
  316. package/src/components/ModelConfigPanel.tsx +345 -0
  317. package/src/components/filler-components/RightSiderBar.tsx +408 -0
  318. package/src/components/inbox/FilesList.tsx +89 -0
  319. package/src/components/inbox/MessageItem.tsx +50 -0
  320. package/src/components/inbox/ThreadItem.tsx +295 -0
  321. package/src/components/inbox/index.ts +3 -0
  322. package/src/components/index.ts +22 -0
  323. package/src/components/live-code-editor/hybrid-live-editor.tsx +105 -0
  324. package/src/components/live-code-editor/index.ts +3 -0
  325. package/src/components/live-code-editor/live-code-editor.tsx +257 -0
  326. package/src/components/slot-fill/chat-message-filler.tsx +18 -0
  327. package/src/components/slot-fill/chat-message-slot.tsx +18 -0
  328. package/src/components/slot-fill/index.ts +3 -0
  329. package/src/components/slot-fill/right-sidebar-filler.tsx +39 -0
  330. package/src/components/ui/button.tsx +32 -0
  331. package/src/compute.ts +134 -0
  332. package/src/config/env-config.ts +17 -0
  333. package/src/config/index.ts +1 -0
  334. package/src/constants/breakpoints.ts +7 -0
  335. package/src/constants/index.ts +5 -0
  336. package/src/container/AiInbox.tsx +1819 -0
  337. package/src/container/AiInboxWithLoader.tsx +356 -0
  338. package/src/container/AiLandingInput.tsx +221 -0
  339. package/src/container/Inbox.tsx +1092 -0
  340. package/src/container/InboxAiMessagesLoader.tsx +44 -0
  341. package/src/container/InboxContainer.tsx +35 -0
  342. package/src/container/InboxTemplate1.tsx +1542 -0
  343. package/src/container/InboxTemplate1WithLoader.tsx +338 -0
  344. package/src/container/InboxTemplate2.tsx +1606 -0
  345. package/src/container/InboxWithAiLoader.tsx +76 -0
  346. package/src/container/InboxWithLoader.tsx +341 -0
  347. package/src/container/ServiceInbox.tsx +190 -0
  348. package/src/container/ThreadMessages.tsx +371 -0
  349. package/src/container/ThreadMessagesInbox.tsx +450 -0
  350. package/src/container/Threads.tsx +270 -0
  351. package/src/container/ThreadsInbox.tsx +354 -0
  352. package/src/container/apply-footer-styles.ts +17 -0
  353. package/src/container/index.ts +31 -0
  354. package/src/enums/index.ts +1 -0
  355. package/src/enums/messenger-slot-fill-name-enum.ts +4 -0
  356. package/src/hooks/index.ts +2 -0
  357. package/src/hooks/use-file-sync.ts +91 -0
  358. package/src/hooks/usePersistentModelConfig.ts +63 -0
  359. package/src/index.ts +37 -0
  360. package/src/interfaces/index.ts +1 -0
  361. package/src/interfaces/message-widgets.interface.ts +21 -0
  362. package/src/machines/aiAgentMachine.simple.ts +89 -0
  363. package/src/machines/aiAgentMachine.ts +1296 -0
  364. package/src/machines/aiAgentMachine.ts.bk +1296 -0
  365. package/src/machines/index.ts +2 -0
  366. package/src/machines/types.ts +59 -0
  367. package/src/module.tsx +32 -0
  368. package/src/styles/responsive.css +76 -0
  369. package/src/templates/InboxWithAi.tsx +533 -0
  370. package/src/templates/index.ts +1 -0
  371. package/src/utils/utils.ts +3 -0
  372. package/tsconfig.json +14 -0
  373. package/webpack.config.js +92 -0
@@ -0,0 +1,408 @@
1
+ import * as React from 'react';
2
+ import { HybridLiveEditor, HybridLiveEditorRef } from '../live-code-editor/hybrid-live-editor';
3
+ import { useOnChatMessageAddedSubscription } from 'common/graphql';
4
+
5
+ type RightSidebarProps = {
6
+ channelId: string;
7
+ detailSidebarOptions: {
8
+ isMobileView: boolean;
9
+ isSmallTabletView: boolean;
10
+ isTabletView: boolean;
11
+ isDesktopView: boolean;
12
+ isLargeDesktopView: boolean;
13
+ isSmallScreen: boolean;
14
+ [key: string]: any;
15
+ };
16
+ windowWidth: number;
17
+ windowHeight: number;
18
+ activeTab?: string;
19
+ selectedPost?: any;
20
+ messages?: any[];
21
+ setIsLoading?: (isLoading: boolean) => void;
22
+ isLoading?: boolean;
23
+ [key: string]: any;
24
+ };
25
+
26
+ export const RightSidebarFillComponent = (props: RightSidebarProps) => {
27
+ const {
28
+ channelId,
29
+ detailSidebarOptions,
30
+ windowWidth,
31
+ windowHeight,
32
+ activeTab,
33
+ messages,
34
+ selectedPost,
35
+ setIsLoading,
36
+ isLoading,
37
+ } = props;
38
+
39
+ const hybridLiveEditorRef = React.useRef<HybridLiveEditorRef>(null);
40
+ const previewIframeRef = React.useRef<HTMLIFrameElement>(null);
41
+
42
+ // State for subscription data and active fragment
43
+ const [subscriptionData, setSubscriptionData] = React.useState<any>(null);
44
+ const [activeFragment, setActiveFragment] = React.useState<any>(null);
45
+ const [currentFiles, setCurrentFiles] = React.useState<Record<string, string>>({});
46
+ const [canvasLayers, setCanvasLayers] = React.useState<any[]>([]);
47
+ // const [isLoading, setIsLoading] = React.useState(false);
48
+
49
+ // Component mount tracking
50
+ const componentId = React.useMemo(
51
+ () => `right-sidebar-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,
52
+ [],
53
+ );
54
+
55
+ const handleCopyToClipboard = React.useCallback((text: string) => {
56
+ navigator.clipboard.writeText(text);
57
+ }, []);
58
+
59
+ const handleFileUpdate = React.useCallback(async (filePath: string, content: string) => {
60
+ // TODO: Implement file update logic for the channel
61
+ console.log('File update:', { filePath, content });
62
+ }, []);
63
+
64
+ // Create complete file context by merging currentFiles with activeFragment files
65
+ const completeFileContext = React.useMemo(() => {
66
+ if (!activeFragment?.files) {
67
+ console.log('📂 Using currentFiles as complete context (no activeFragment.files)');
68
+ return currentFiles;
69
+ }
70
+
71
+ // Merge currentFiles with activeFragment files, giving priority to activeFragment files
72
+ const merged = { ...currentFiles };
73
+
74
+ // Override with activeFragment files (these are the most recent changes)
75
+ Object.entries(activeFragment.files).forEach(([path, content]) => {
76
+ merged[path] = content as string;
77
+ });
78
+
79
+ // Validate file context integrity
80
+ const hasPackageJson = 'package.json' in merged;
81
+ const hasMainFiles = Object.keys(merged).some(
82
+ (path) =>
83
+ path.includes('index.') || path.includes('main.') || path.includes('App.') || path.includes('src/'),
84
+ );
85
+
86
+ console.log('📂 Complete file context created:', {
87
+ currentFilesCount: Object.keys(currentFiles).length,
88
+ activeFragmentFilesCount: Object.keys(activeFragment.files).length,
89
+ mergedFilesCount: Object.keys(merged).length,
90
+ hasPackageJson,
91
+ hasMainFiles,
92
+ activeFragmentFiles: Object.keys(activeFragment.files),
93
+ allFiles: Object.keys(merged),
94
+ validation: {
95
+ isComplete: hasPackageJson && hasMainFiles,
96
+ missingPackageJson: !hasPackageJson,
97
+ missingMainFiles: !hasMainFiles,
98
+ },
99
+ });
100
+
101
+ if (!hasPackageJson) {
102
+ console.warn('⚠️ File context missing package.json - this may cause issues in sandbox');
103
+ }
104
+ if (!hasMainFiles) {
105
+ console.warn('⚠️ File context missing main application files - this may cause issues in sandbox');
106
+ }
107
+
108
+ return merged;
109
+ }, [currentFiles, activeFragment?.files]);
110
+
111
+ // Determine if we should show preview or editor based on activeTab
112
+ const isPreviewMode = activeTab === 'preview';
113
+
114
+ const { data: chatMessageAddedData } = useOnChatMessageAddedSubscription({
115
+ variables: { channelId: channelId?.toString() || '' },
116
+ skip: !channelId,
117
+ });
118
+
119
+ // Turn on loader when new data is about to be processed
120
+ React.useEffect(() => {
121
+ if (chatMessageAddedData?.chatMessageAdded || selectedPost) {
122
+ // setIsLoading(true);
123
+ }
124
+ }, [chatMessageAddedData, selectedPost]);
125
+
126
+ // Handle subscription data updates - prefer response update structure like use-ai-messages.ts
127
+ React.useEffect(() => {
128
+ if (chatMessageAddedData?.chatMessageAdded || selectedPost) {
129
+ // Prefer explicitly selected post to ensure UI updates when it changes
130
+ const message = selectedPost || chatMessageAddedData?.chatMessageAdded;
131
+ // console.log('=== SUBSCRIPTION MESSAGE DEBUG ===');
132
+ // console.log('Full message:', JSON.stringify(message, null, 2));
133
+ // console.log('Message props:', message.props);
134
+ // console.log('Message propsConfiguration:', message.propsConfiguration);
135
+
136
+ // Extract strictly from message.propsConfiguration (fragment only)
137
+ let extracted: any = null;
138
+ let fragmentSource:
139
+ | 'propsConfiguration.contents.props.fragment'
140
+ | 'propsConfiguration.contents.fragment'
141
+ | 'propsConfiguration.fragment'
142
+ | null = null;
143
+
144
+ try {
145
+ // 1) Preferred: contents.props.fragment
146
+ const cfg: any = message.propsConfiguration || {};
147
+ const contents: any = cfg.contents || cfg.content || {};
148
+
149
+ if (contents?.props?.fragment) {
150
+ const frag = contents.props.fragment;
151
+ extracted = {
152
+ sandboxUrl: frag.sandboxUrl || frag.url,
153
+ sandboxId: frag.sandboxId,
154
+ projectId: cfg.projectId || contents.projectId || frag.projectId,
155
+ modelConfig: cfg.modelConfig || contents.modelConfig || frag.modelConfig,
156
+ files: frag.files || {},
157
+ canvasLayers: contents.canvasLayers || cfg.canvasLayers || frag.canvasLayers,
158
+ summary: contents.summary || cfg.summary || frag.summary,
159
+ title: frag.title || contents.title || cfg.title,
160
+ isError: frag.isError,
161
+ };
162
+ fragmentSource = 'propsConfiguration.contents.props.fragment';
163
+ }
164
+
165
+ // 2) Fallback: contents.fragment
166
+ if (!extracted && contents?.fragment) {
167
+ const frag = contents.fragment;
168
+ extracted = {
169
+ sandboxUrl: frag.sandboxUrl || frag.url,
170
+ sandboxId: frag.sandboxId,
171
+ projectId: cfg.projectId || contents.projectId || frag.projectId,
172
+ modelConfig: cfg.modelConfig || contents.modelConfig || frag.modelConfig,
173
+ files: frag.files || {},
174
+ canvasLayers: contents.canvasLayers || cfg.canvasLayers || frag.canvasLayers,
175
+ summary: contents.summary || cfg.summary || frag.summary,
176
+ title: frag.title || contents.title || cfg.title,
177
+ isError: frag.isError,
178
+ };
179
+ fragmentSource = 'propsConfiguration.contents.fragment';
180
+ }
181
+
182
+ // 3) Fallback: propsConfiguration.fragment (top-level)
183
+ if (!extracted && cfg?.fragment) {
184
+ const frag = cfg.fragment;
185
+ extracted = {
186
+ sandboxUrl: frag.sandboxUrl || frag.url,
187
+ sandboxId: frag.sandboxId,
188
+ projectId: cfg.projectId || frag.projectId,
189
+ modelConfig: cfg.modelConfig || frag.modelConfig,
190
+ files: frag.files || {},
191
+ canvasLayers: cfg.canvasLayers || frag.canvasLayers,
192
+ summary: cfg.summary || frag.summary,
193
+ title: frag.title || cfg.title,
194
+ isError: frag.isError,
195
+ };
196
+ fragmentSource = 'propsConfiguration.fragment';
197
+ }
198
+ } catch (error) {
199
+ console.error('Error extracting response from message:', error);
200
+ }
201
+
202
+ // console.log('Extracted response fragment source:', fragmentSource);
203
+ // console.log('Extracted response:', extracted);
204
+
205
+ if (extracted && (extracted.sandboxUrl || extracted.url)) {
206
+ console.log('✅ Processing response update:', extracted);
207
+
208
+ // Update subscription data snapshot
209
+ setSubscriptionData(extracted);
210
+
211
+ // Build active fragment
212
+ const fragment = {
213
+ id: message.id,
214
+ sandboxUrl: extracted.sandboxUrl || extracted.url,
215
+ title: extracted.title || 'Generated Code',
216
+ files: extracted.files || {},
217
+ projectId: extracted.projectId,
218
+ modelConfig: extracted.modelConfig,
219
+ canvasLayers: extracted.canvasLayers,
220
+ summary: extracted.summary,
221
+ isError: extracted.isError,
222
+ };
223
+
224
+ // If canvasLayers missing but present in summary, attempt to extract like use-ai-messages
225
+ if ((!fragment.canvasLayers || !Array.isArray(fragment.canvasLayers)) && fragment.summary) {
226
+ try {
227
+ const match = (fragment.summary as string).match(/<canvas_layers>([\s\S]*?)<\/canvas_layers>/);
228
+ if (match) {
229
+ const parsed = JSON.parse(match[1]);
230
+ if (Array.isArray(parsed)) {
231
+ fragment.canvasLayers = parsed;
232
+ }
233
+ }
234
+ } catch (e) {
235
+ console.warn('Failed to parse canvas layers from summary:', e);
236
+ }
237
+ }
238
+
239
+ console.log('✅ Setting active fragment:', fragment);
240
+ setActiveFragment(fragment);
241
+
242
+ // Update files into local state for editor
243
+ if (fragment.files) {
244
+ console.log('✅ Setting current files:', Object.keys(fragment.files));
245
+ setCurrentFiles(fragment.files);
246
+ }
247
+
248
+ // Update canvas layers if available
249
+ if (fragment.canvasLayers && Array.isArray(fragment.canvasLayers)) {
250
+ console.log('Received canvas layers from AI:', fragment.canvasLayers);
251
+ setCanvasLayers(fragment.canvasLayers);
252
+ } else {
253
+ console.log('No canvas layers found in response');
254
+ }
255
+
256
+ // setIsLoading(false);
257
+ } else {
258
+ console.log('❌ No valid response found in message');
259
+ // setIsLoading(false);
260
+ }
261
+ }
262
+ }, [chatMessageAddedData, selectedPost]);
263
+
264
+ // When switching tabs or when sandbox changes, show loader until ready
265
+ // React.useEffect(() => {
266
+ // if (isPreviewMode) {
267
+ // if (activeFragment?.sandboxUrl) {
268
+ // // setIsLoading(true);
269
+ // }
270
+ // } else {
271
+ // // In code view, briefly show loader while editor reacts to new files
272
+ // // setIsLoading(true);
273
+ // const timeoutId = setTimeout(() => setIsLoading(false), 400);
274
+ // return () => clearTimeout(timeoutId);
275
+ // }
276
+ // }, [isPreviewMode, activeFragment?.sandboxUrl, completeFileContext]);
277
+
278
+ // Cleanup iframe resources on unmount to prevent renderer leaks in Chrome
279
+ React.useEffect(() => {
280
+ return () => {
281
+ try {
282
+ if (previewIframeRef.current) {
283
+ previewIframeRef.current.src = 'about:blank';
284
+ }
285
+ } catch (e) {
286
+ // no-op
287
+ }
288
+ };
289
+ }, []);
290
+
291
+ return (
292
+ <div className="right-sidebar-content h-full flex flex-col">
293
+ <div className="flex-1 overflow-hidden" style={{ height: 'calc(100vh - 140px)' }}>
294
+ {isPreviewMode ? (
295
+ // Preview Mode - Show sandbox iframe or fallback
296
+ (() => {
297
+ if (activeFragment?.sandboxUrl) {
298
+ return (
299
+ <div
300
+ className="w-full h-full relative"
301
+ style={{ minHeight: '400px', backgroundColor: '#f0f0f0' }}
302
+ >
303
+ <iframe
304
+ key={activeFragment.sandboxUrl}
305
+ ref={previewIframeRef}
306
+ src={activeFragment.sandboxUrl}
307
+ className="w-full h-full border border-gray-200 rounded-md bg-white shadow-sm"
308
+ title="Live Preview"
309
+ sandbox="allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-orientation-lock allow-pointer-lock allow-presentation allow-storage-access-by-user-activation allow-top-navigation-by-user-activation"
310
+ loading="lazy"
311
+ onLoad={() => {
312
+ console.log('🎯 Iframe loaded successfully');
313
+ setIsLoading(false);
314
+ }}
315
+ onError={(e) => {
316
+ console.error('❌ Iframe error:', e);
317
+ setIsLoading(false);
318
+ }}
319
+ style={{ minHeight: '400px' }}
320
+ />
321
+ <div className="absolute top-2 right-2 bg-green-100 text-green-800 px-2 py-1 rounded text-xs z-10">
322
+ Live Preview
323
+ </div>
324
+ {isLoading && (
325
+ <>
326
+ <div className="absolute inset-0 bg-white/60 flex items-center justify-center z-20">
327
+ <div className="animate-spin rounded-full h-12 w-12 border-4 border-blue-500 border-t-transparent"></div>
328
+ </div>
329
+ <div className="absolute top-2 left-2 bg-blue-100 text-blue-800 px-2 py-1 rounded text-xs z-30">
330
+ Loading...
331
+ </div>
332
+ </>
333
+ )}
334
+ </div>
335
+ );
336
+ } else {
337
+ return (
338
+ <div className="h-full flex items-center justify-center text-gray-500 border border-gray-200 rounded-md bg-gray-50">
339
+ <div className="text-center space-y-3">
340
+ <p className="font-medium">No preview available</p>
341
+ <div className="flex flex-col items-center justify-center space-y-3">
342
+ {isLoading ? (
343
+ <div className="animate-spin rounded-full h-8 w-8 border-b-2 border-blue-500"></div>
344
+ ) : (
345
+ <div className="w-8 h-8 bg-gray-300 rounded-full"></div>
346
+ )}
347
+ <p className="text-sm text-gray-400">
348
+ {isLoading ? 'Generating code...' : 'Waiting for code generation...'}
349
+ </p>
350
+ </div>
351
+ </div>
352
+ </div>
353
+ );
354
+ }
355
+ })()
356
+ ) : (
357
+ // Code Editor Mode - Show files from subscription or fallback
358
+ <div className="h-full w-full relative" style={{ height: '100%', minHeight: '500px' }}>
359
+ <HybridLiveEditor
360
+ ref={hybridLiveEditorRef}
361
+ projectId={activeFragment?.projectId || channelId}
362
+ fragmentId={activeFragment?.id || activeTab || 'default'}
363
+ files={Object.keys(completeFileContext).length > 0 ? completeFileContext : {}}
364
+ sandboxUrl={activeFragment?.sandboxUrl}
365
+ onCopyToClipboard={handleCopyToClipboard}
366
+ onFileUpdate={handleFileUpdate}
367
+ readOnly={!activeFragment?.id}
368
+ autoSave={false}
369
+ debounceMs={500}
370
+ className="h-full w-full"
371
+ />
372
+ {isLoading && (
373
+ <>
374
+ <div className="absolute inset-0 bg-white/60 flex items-center justify-center z-20">
375
+ <div className="animate-spin rounded-full h-12 w-12 border-4 border-blue-500 border-t-transparent"></div>
376
+ </div>
377
+ <div className="absolute top-4 right-4 bg-blue-100 border border-blue-400 text-blue-700 px-3 py-2 rounded text-sm z-30">
378
+ <div className="flex items-center gap-2">
379
+ <div className="animate-spin rounded-full h-4 w-4 border-b-2 border-blue-500"></div>
380
+ Processing...
381
+ </div>
382
+ </div>
383
+ </>
384
+ )}
385
+ </div>
386
+ )}
387
+ </div>
388
+
389
+ <div className="p-2 border-t bg-gray-50 text-xs text-gray-500">
390
+ <div className="flex justify-between">
391
+ <span>Mobile: {detailSidebarOptions.isMobileView ? 'Yes' : 'No'}</span>
392
+ <span>Desktop: {detailSidebarOptions.isDesktopView ? 'Yes' : 'No'}</span>
393
+ {activeFragment && (
394
+ <span className="text-green-600">{activeFragment.isError ? 'Error' : 'Ready'}</span>
395
+ )}
396
+ </div>
397
+ {activeFragment && (
398
+ <div className="mt-1 text-xs">
399
+ <span className="text-gray-400">Files: {Object.keys(completeFileContext).length}</span>
400
+ {canvasLayers.length > 0 && (
401
+ <span className="ml-2 text-gray-400">Layers: {canvasLayers.length}</span>
402
+ )}
403
+ </div>
404
+ )}
405
+ </div>
406
+ </div>
407
+ );
408
+ };
@@ -0,0 +1,89 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import { useFileUrlQuery } from 'common/graphql';
3
+
4
+ interface FilesListProps {
5
+ files: any[];
6
+ uploaded?: boolean;
7
+ FileElementProps?: Omit<FileElementProps, 'file' | 'uploaded' | 'onRemove'>;
8
+ onRemove?: () => Promise<void>;
9
+ }
10
+
11
+ interface FileElementProps {
12
+ file: any;
13
+ uploaded: boolean;
14
+ width?: number;
15
+ height?: number;
16
+ onRemove?: () => Promise<void>;
17
+ }
18
+
19
+ export function FilesList({ files, uploaded = false }: FilesListProps) {
20
+ return (
21
+ <div className="flex flex-row">
22
+ {files.map((file, index) => (
23
+ <FilesList.FileElement key={`${index}`} uploaded={uploaded} file={file} />
24
+ ))}
25
+ </div>
26
+ );
27
+ }
28
+
29
+ FilesList.FileElement = ({ file, uploaded, width = 120, height = 120 }: FileElementProps) => {
30
+ const [isOpen, setIsOpen] = useState(false);
31
+ const src = useMemo(() => (uploaded ? file.url : URL.createObjectURL(file)), [file, uploaded]);
32
+ const { data } = useFileUrlQuery({
33
+ variables: {
34
+ id: file?.id,
35
+ },
36
+ skip: !file?.id,
37
+ });
38
+
39
+ const onOpen = () => setIsOpen(true);
40
+ const onClose = () => setIsOpen(false);
41
+
42
+ return (
43
+ <>
44
+ <img
45
+ className="cursor-pointer m-2 object-cover rounded"
46
+ style={{ height: `${height}px`, width: `${width}px` }}
47
+ src={src}
48
+ onClick={onOpen}
49
+ alt="File preview"
50
+ />
51
+
52
+ {/* Modal */}
53
+ {isOpen && (
54
+ <div className="fixed inset-0 z-50 flex items-center justify-center p-4">
55
+ {/* Overlay */}
56
+ <div className="fixed inset-0 bg-black bg-opacity-75" onClick={onClose} />
57
+
58
+ {/* Modal Content */}
59
+ <div className="relative bg-white rounded-lg shadow-xl max-w-4xl max-h-[90vh] overflow-hidden">
60
+ {/* Close Button */}
61
+ <button
62
+ onClick={onClose}
63
+ className="absolute top-4 right-4 z-10 p-2 rounded-full bg-black bg-opacity-50 hover:bg-opacity-70 transition-all duration-200"
64
+ >
65
+ <svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
66
+ <path
67
+ strokeLinecap="round"
68
+ strokeLinejoin="round"
69
+ strokeWidth={2}
70
+ d="M6 18L18 6M6 6l12 12"
71
+ />
72
+ </svg>
73
+ </button>
74
+
75
+ {/* Image Container */}
76
+ <div className="p-4 flex items-center justify-center">
77
+ <img
78
+ src={data?.fileInfo?.url || src}
79
+ alt="File full view"
80
+ className="max-w-full max-h-[80vh] object-contain cursor-pointer"
81
+ onClick={onClose}
82
+ />
83
+ </div>
84
+ </div>
85
+ </div>
86
+ )}
87
+ </>
88
+ );
89
+ };
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import { format } from 'date-fns';
3
+ import { BsFlag } from '@react-icons/all-files/bs/BsFlag.js';
4
+
5
+ export function MessageItem({ message }: { message: any }) {}
6
+
7
+ MessageItem.Plain = function PlainMessageItem({ message, index }) {
8
+ return (
9
+ <div className="w-full flex justify-center mb-7" key={`msgList_${index}`}>
10
+ <p className="text-sm text-gray-600 font-bold">{message}</p>
11
+ </div>
12
+ );
13
+ };
14
+
15
+ MessageItem.Dialog = function DialogMessageItem({ message, currentUser, index, onOpen }) {
16
+ return (
17
+ <div className="w-full flex justify-start mb-7" key={`msgList_${index}`}>
18
+ <div className="flex-grow flex">
19
+ <div
20
+ className="w-8 h-8 bg-gray-400 rounded-full mr-4 cursor-pointer overflow-hidden flex-shrink-0"
21
+ onClick={onOpen}
22
+ >
23
+ {message?.imageUrl ? (
24
+ <img src={message.imageUrl} alt="User avatar" className="w-full h-full object-cover" />
25
+ ) : (
26
+ <div className="w-full h-full bg-gray-400"></div>
27
+ )}
28
+ </div>
29
+ <div className="flex-grow">
30
+ <div className="flex flex-grow mt-1.5">
31
+ <p className="text-sm text-gray-600 font-bold">
32
+ {message?.author?.familyName && message?.author?.givenName
33
+ ? message?.author?.givenName + ' ' + message?.author?.familyName
34
+ : message?.author?.username}
35
+ </p>
36
+ <p className="text-sm text-gray-500 ml-2.5">
37
+ {format(new Date(message?.createdAt), 'MMM dd, yyyy hh:mm aaa')}
38
+ </p>
39
+ </div>
40
+ <p className="text-sm mt-1.5 text-gray-600 whitespace-pre-line">{message?.message}</p>
41
+ </div>
42
+ </div>
43
+ {currentUser?.id !== message?.author?.id && (
44
+ <div className="ml-2">
45
+ <BsFlag className="text-gray-600 w-6 h-6" />
46
+ </div>
47
+ )}
48
+ </div>
49
+ );
50
+ };