@peers-app/peers-ui 0.14.0 → 0.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 (438) hide show
  1. package/.github/workflows/publish.yml +8 -5
  2. package/babel.config.js +4 -4
  3. package/biome.json +191 -0
  4. package/dist/command-palette/command-palette-ui.d.ts +1 -2
  5. package/dist/command-palette/command-palette-ui.js +175 -244
  6. package/dist/command-palette/command-palette.js +65 -64
  7. package/dist/components/chat-overlay.d.ts +2 -2
  8. package/dist/components/chat-overlay.js +160 -217
  9. package/dist/components/checkbox.d.ts +5 -4
  10. package/dist/components/checkbox.js +4 -7
  11. package/dist/components/group-switcher.d.ts +1 -2
  12. package/dist/components/group-switcher.js +119 -159
  13. package/dist/components/input-date.d.ts +3 -3
  14. package/dist/components/input-date.js +6 -6
  15. package/dist/components/input-number.d.ts +7 -6
  16. package/dist/components/input-number.js +25 -20
  17. package/dist/components/input.d.ts +5 -4
  18. package/dist/components/input.js +4 -7
  19. package/dist/components/inverse-lazy-list.d.ts +3 -3
  20. package/dist/components/inverse-lazy-list.js +13 -47
  21. package/dist/components/io-schema-values.d.ts +5 -6
  22. package/dist/components/io-schema-values.js +28 -65
  23. package/dist/components/io-schema.d.ts +4 -5
  24. package/dist/components/io-schema.js +42 -79
  25. package/dist/components/lazy-list.d.ts +3 -3
  26. package/dist/components/lazy-list.js +38 -58
  27. package/dist/components/list-screen.d.ts +3 -8
  28. package/dist/components/list-screen.js +28 -23
  29. package/dist/components/loading-indicator.d.ts +1 -2
  30. package/dist/components/loading-indicator.js +2 -6
  31. package/dist/components/markdown-editor/autolink-plugin.js +5 -8
  32. package/dist/components/markdown-editor/editor-inline.d.ts +2 -3
  33. package/dist/components/markdown-editor/editor-inline.js +2 -6
  34. package/dist/components/markdown-editor/editor.d.ts +6 -6
  35. package/dist/components/markdown-editor/editor.js +9 -19
  36. package/dist/components/markdown-editor/markdown-plugin.d.ts +1 -1
  37. package/dist/components/markdown-editor/markdown-plugin.js +20 -21
  38. package/dist/components/markdown-editor/mention-node.d.ts +2 -2
  39. package/dist/components/markdown-editor/mention-node.js +24 -24
  40. package/dist/components/markdown-editor/mentions-plugin.d.ts +2 -2
  41. package/dist/components/markdown-editor/mentions-plugin.js +61 -62
  42. package/dist/components/markdown-editor/theme.js +28 -28
  43. package/dist/components/markdown-editor/toolbar.d.ts +2 -3
  44. package/dist/components/markdown-editor/toolbar.js +32 -49
  45. package/dist/components/markdown-with-mentions.d.ts +1 -1
  46. package/dist/components/markdown-with-mentions.js +43 -43
  47. package/dist/components/message-logs/message-logs.d.ts +1 -2
  48. package/dist/components/message-logs/message-logs.js +91 -116
  49. package/dist/components/messages/avatar.d.ts +3 -4
  50. package/dist/components/messages/avatar.js +37 -46
  51. package/dist/components/messages/channel-message-list.d.ts +5 -6
  52. package/dist/components/messages/channel-message-list.js +34 -34
  53. package/dist/components/messages/channel-view.d.ts +1 -2
  54. package/dist/components/messages/channel-view.js +23 -57
  55. package/dist/components/messages/message-compose.d.ts +3 -4
  56. package/dist/components/messages/message-compose.js +27 -38
  57. package/dist/components/messages/message-display.d.ts +2 -3
  58. package/dist/components/messages/message-display.js +42 -95
  59. package/dist/components/messages/thread-message-list.d.ts +4 -5
  60. package/dist/components/messages/thread-message-list.js +29 -29
  61. package/dist/components/router.d.ts +1 -2
  62. package/dist/components/router.js +58 -66
  63. package/dist/components/save-button.d.ts +3 -3
  64. package/dist/components/save-button.js +23 -33
  65. package/dist/components/sortable-list.d.ts +11 -12
  66. package/dist/components/sortable-list.js +42 -22
  67. package/dist/components/tabs.d.ts +3 -3
  68. package/dist/components/tabs.js +16 -47
  69. package/dist/components/tooltip.d.ts +4 -4
  70. package/dist/components/tooltip.js +4 -9
  71. package/dist/components/trust-level-badge.d.ts +2 -3
  72. package/dist/components/trust-level-badge.js +16 -16
  73. package/dist/components/trust-level-dropdown.d.ts +3 -4
  74. package/dist/components/trust-level-dropdown.js +32 -55
  75. package/dist/components/typeahead.d.ts +3 -3
  76. package/dist/components/typeahead.js +48 -89
  77. package/dist/components/voice-indicator.d.ts +2 -2
  78. package/dist/components/voice-indicator.js +93 -106
  79. package/dist/components/voice-subscribe-events.d.ts +32 -0
  80. package/dist/components/voice-subscribe-events.js +2 -0
  81. package/dist/globals.d.ts +3 -5
  82. package/dist/globals.js +22 -33
  83. package/dist/hooks.d.ts +5 -5
  84. package/dist/hooks.js +22 -12
  85. package/dist/hooks.test.js +129 -145
  86. package/dist/index.d.ts +9 -8
  87. package/dist/index.js +13 -12
  88. package/dist/mention-configs.d.ts +2 -2
  89. package/dist/mention-configs.js +55 -42
  90. package/dist/screens/assistants/assistant-config.d.ts +2 -3
  91. package/dist/screens/assistants/assistant-config.js +9 -22
  92. package/dist/screens/assistants/assistant-details.d.ts +1 -2
  93. package/dist/screens/assistants/assistant-details.js +13 -28
  94. package/dist/screens/assistants/assistant-info.d.ts +2 -3
  95. package/dist/screens/assistants/assistant-info.js +3 -17
  96. package/dist/screens/assistants/assistant-list.d.ts +1 -2
  97. package/dist/screens/assistants/assistant-list.js +15 -56
  98. package/dist/screens/assistants/assistant-tools.d.ts +2 -3
  99. package/dist/screens/assistants/assistant-tools.js +10 -24
  100. package/dist/screens/console-logs/console-logs-list.d.ts +1 -2
  101. package/dist/screens/console-logs/console-logs-list.js +130 -134
  102. package/dist/screens/console-logs/log-display.d.ts +2 -3
  103. package/dist/screens/console-logs/log-display.js +40 -42
  104. package/dist/screens/console-logs/log-filters.d.ts +1 -2
  105. package/dist/screens/console-logs/log-filters.js +2 -24
  106. package/dist/screens/console-logs/mobile-log-card.d.ts +2 -3
  107. package/dist/screens/console-logs/mobile-log-card.js +64 -67
  108. package/dist/screens/console-logs/resizable-table-header.d.ts +1 -2
  109. package/dist/screens/console-logs/resizable-table-header.js +31 -67
  110. package/dist/screens/contacts/contact-details.d.ts +1 -2
  111. package/dist/screens/contacts/contact-details.js +16 -46
  112. package/dist/screens/contacts/contact-list.d.ts +1 -2
  113. package/dist/screens/contacts/contact-list.js +44 -103
  114. package/dist/screens/contacts/index.d.ts +4 -4
  115. package/dist/screens/contacts/index.js +1 -1
  116. package/dist/screens/contacts/user-connect.d.ts +1 -2
  117. package/dist/screens/contacts/user-connect.js +85 -186
  118. package/dist/screens/data-explorer/data-explorer.d.ts +1 -2
  119. package/dist/screens/data-explorer/data-explorer.js +61 -181
  120. package/dist/screens/data-explorer/index.d.ts +2 -2
  121. package/dist/screens/data-explorer/query-executor.d.ts +1 -2
  122. package/dist/screens/data-explorer/query-executor.js +56 -166
  123. package/dist/screens/groups/group-details.d.ts +1 -2
  124. package/dist/screens/groups/group-details.js +27 -122
  125. package/dist/screens/groups/group-invite-listener.d.ts +2 -3
  126. package/dist/screens/groups/group-invite-listener.js +8 -104
  127. package/dist/screens/groups/group-list.d.ts +1 -2
  128. package/dist/screens/groups/group-list.js +56 -133
  129. package/dist/screens/groups/group-members.d.ts +2 -3
  130. package/dist/screens/groups/group-members.js +62 -132
  131. package/dist/screens/groups/index.d.ts +4 -4
  132. package/dist/screens/groups/index.js +1 -1
  133. package/dist/screens/join-group/index.d.ts +2 -2
  134. package/dist/screens/join-group/join-group.d.ts +1 -2
  135. package/dist/screens/join-group/join-group.js +9 -109
  136. package/dist/screens/network-viewer/connection-troubleshooter.d.ts +2 -3
  137. package/dist/screens/network-viewer/connection-troubleshooter.js +89 -193
  138. package/dist/screens/network-viewer/cpu-usage-graph.d.ts +1 -2
  139. package/dist/screens/network-viewer/cpu-usage-graph.js +60 -99
  140. package/dist/screens/network-viewer/device-details-modal.d.ts +1 -2
  141. package/dist/screens/network-viewer/device-details-modal.js +25 -177
  142. package/dist/screens/network-viewer/group-details-modal.d.ts +1 -2
  143. package/dist/screens/network-viewer/group-details-modal.js +31 -142
  144. package/dist/screens/network-viewer/index.d.ts +4 -4
  145. package/dist/screens/network-viewer/index.js +3 -3
  146. package/dist/screens/network-viewer/network-viewer-ipc.d.ts +22 -0
  147. package/dist/screens/network-viewer/network-viewer-ipc.js +6 -0
  148. package/dist/screens/network-viewer/network-viewer.d.ts +1 -2
  149. package/dist/screens/network-viewer/network-viewer.js +91 -296
  150. package/dist/screens/network-viewer/usage-graph.d.ts +1 -2
  151. package/dist/screens/network-viewer/usage-graph.js +78 -110
  152. package/dist/screens/packages/package-details.d.ts +1 -2
  153. package/dist/screens/packages/package-details.js +35 -41
  154. package/dist/screens/packages/package-info.d.ts +2 -2
  155. package/dist/screens/packages/package-info.js +33 -86
  156. package/dist/screens/packages/package-list.d.ts +1 -2
  157. package/dist/screens/packages/package-list.js +42 -106
  158. package/dist/screens/packages/package-new-local.d.ts +1 -2
  159. package/dist/screens/packages/package-new-local.js +13 -19
  160. package/dist/screens/packages/package-versions.d.ts +2 -3
  161. package/dist/screens/packages/package-versions.js +29 -96
  162. package/dist/screens/peer-types/peer-type-details.d.ts +3 -4
  163. package/dist/screens/peer-types/peer-type-details.js +26 -78
  164. package/dist/screens/peer-types/peer-type-list.d.ts +1 -2
  165. package/dist/screens/peer-types/peer-type-list.js +13 -24
  166. package/dist/screens/search/global-search.d.ts +1 -2
  167. package/dist/screens/search/global-search.js +104 -182
  168. package/dist/screens/settings/color-mode-dropdown.d.ts +3 -4
  169. package/dist/screens/settings/color-mode-dropdown.js +18 -37
  170. package/dist/screens/settings/settings-page.d.ts +1 -1
  171. package/dist/screens/settings/settings-page.js +86 -213
  172. package/dist/screens/settings/voice-settings-agent.d.ts +1 -1
  173. package/dist/screens/settings/voice-settings-agent.js +7 -44
  174. package/dist/screens/settings/voice-settings-api-keys.d.ts +2 -2
  175. package/dist/screens/settings/voice-settings-api-keys.js +2 -29
  176. package/dist/screens/settings/voice-settings-output.d.ts +2 -2
  177. package/dist/screens/settings/voice-settings-output.js +2 -40
  178. package/dist/screens/settings/voice-settings-providers.d.ts +2 -2
  179. package/dist/screens/settings/voice-settings-providers.js +2 -19
  180. package/dist/screens/settings/voice-settings-types.d.ts +4 -4
  181. package/dist/screens/settings/voice-settings-types.js +31 -31
  182. package/dist/screens/settings/voice-settings-wake-word.d.ts +2 -2
  183. package/dist/screens/settings/voice-settings-wake-word.js +2 -33
  184. package/dist/screens/settings/voice-settings.d.ts +1 -1
  185. package/dist/screens/settings/voice-settings.js +35 -112
  186. package/dist/screens/setup-user.d.ts +1 -2
  187. package/dist/screens/setup-user.js +38 -116
  188. package/dist/screens/tools/tool-code.d.ts +2 -3
  189. package/dist/screens/tools/tool-code.js +9 -13
  190. package/dist/screens/tools/tool-details.d.ts +1 -2
  191. package/dist/screens/tools/tool-details.js +26 -39
  192. package/dist/screens/tools/tool-info.d.ts +2 -3
  193. package/dist/screens/tools/tool-info.js +9 -48
  194. package/dist/screens/tools/tool-list.d.ts +1 -2
  195. package/dist/screens/tools/tool-list.js +33 -65
  196. package/dist/screens/tools/tool-schema.d.ts +2 -3
  197. package/dist/screens/tools/tool-schema.js +2 -13
  198. package/dist/screens/tools/tool-test-details.d.ts +1 -2
  199. package/dist/screens/tools/tool-test-details.js +12 -28
  200. package/dist/screens/tools/tool-test-list.d.ts +1 -2
  201. package/dist/screens/tools/tool-test-list.js +17 -56
  202. package/dist/screens/variables/variable-details.d.ts +1 -2
  203. package/dist/screens/variables/variable-details.js +19 -86
  204. package/dist/screens/variables/variable-list.d.ts +1 -2
  205. package/dist/screens/variables/variable-list.js +16 -27
  206. package/dist/screens/welcome-modal.d.ts +1 -2
  207. package/dist/screens/welcome-modal.js +44 -111
  208. package/dist/screens/workflows/workflow-details.d.ts +1 -2
  209. package/dist/screens/workflows/workflow-details.js +17 -31
  210. package/dist/screens/workflows/workflow-info.d.ts +2 -3
  211. package/dist/screens/workflows/workflow-info.js +2 -9
  212. package/dist/screens/workflows/workflow-instructions.d.ts +2 -3
  213. package/dist/screens/workflows/workflow-instructions.js +23 -55
  214. package/dist/screens/workflows/workflow-list.d.ts +1 -2
  215. package/dist/screens/workflows/workflow-list.js +23 -62
  216. package/dist/setupTests.d.ts +1 -1
  217. package/dist/setupTests.js +10 -11
  218. package/dist/system-apps/assistants.app.d.ts +1 -1
  219. package/dist/system-apps/assistants.app.js +3 -3
  220. package/dist/system-apps/console-logs.app.d.ts +1 -1
  221. package/dist/system-apps/console-logs.app.js +3 -3
  222. package/dist/system-apps/contacts.app.d.ts +1 -1
  223. package/dist/system-apps/contacts.app.js +4 -4
  224. package/dist/system-apps/data-explorer.app.d.ts +1 -1
  225. package/dist/system-apps/data-explorer.app.js +4 -4
  226. package/dist/system-apps/groups.app.d.ts +1 -1
  227. package/dist/system-apps/groups.app.js +4 -4
  228. package/dist/system-apps/index.d.ts +17 -17
  229. package/dist/system-apps/index.js +52 -52
  230. package/dist/system-apps/join-group.app.d.ts +1 -1
  231. package/dist/system-apps/join-group.app.js +4 -4
  232. package/dist/system-apps/mobile-settings.app.d.ts +1 -1
  233. package/dist/system-apps/mobile-settings.app.js +3 -3
  234. package/dist/system-apps/network-viewer.app.d.ts +1 -1
  235. package/dist/system-apps/network-viewer.app.js +4 -4
  236. package/dist/system-apps/packages.app.d.ts +1 -1
  237. package/dist/system-apps/packages.app.js +3 -3
  238. package/dist/system-apps/search.app.d.ts +1 -1
  239. package/dist/system-apps/search.app.js +4 -4
  240. package/dist/system-apps/settings.app.d.ts +1 -1
  241. package/dist/system-apps/settings.app.js +3 -3
  242. package/dist/system-apps/threads.app.d.ts +1 -1
  243. package/dist/system-apps/threads.app.js +3 -3
  244. package/dist/system-apps/tools.app.d.ts +1 -1
  245. package/dist/system-apps/tools.app.js +3 -3
  246. package/dist/system-apps/types.app.d.ts +1 -1
  247. package/dist/system-apps/types.app.js +3 -3
  248. package/dist/system-apps/variables.app.d.ts +1 -1
  249. package/dist/system-apps/variables.app.js +3 -3
  250. package/dist/system-apps/workflows.app.d.ts +1 -1
  251. package/dist/system-apps/workflows.app.js +3 -3
  252. package/dist/tabs-layout/tabs-layout.d.ts +2 -3
  253. package/dist/tabs-layout/tabs-layout.js +215 -246
  254. package/dist/tabs-layout/tabs-state.d.ts +2 -2
  255. package/dist/tabs-layout/tabs-state.js +73 -61
  256. package/dist/ui-defaults/index.d.ts +2 -2
  257. package/dist/ui-defaults/list-screen.d.ts +2 -3
  258. package/dist/ui-defaults/list-screen.js +33 -37
  259. package/dist/ui-defaults/markdown-field.js +24 -56
  260. package/dist/ui-router/routes-loader.d.ts +1 -1
  261. package/dist/ui-router/routes-loader.js +17 -13
  262. package/dist/ui-router/ui-loader.d.ts +6 -6
  263. package/dist/ui-router/ui-loader.js +172 -268
  264. package/dist/utils.js +49 -39
  265. package/jest.config.js +16 -16
  266. package/package.json +16 -14
  267. package/src/command-palette/command-palette-ui.tsx +261 -237
  268. package/src/command-palette/command-palette.ts +81 -78
  269. package/src/components/chat-overlay.tsx +366 -261
  270. package/src/components/checkbox.tsx +15 -12
  271. package/src/components/group-switcher.tsx +150 -105
  272. package/src/components/input-date.tsx +17 -16
  273. package/src/components/input-number.tsx +47 -31
  274. package/src/components/input.tsx +15 -12
  275. package/src/components/inverse-lazy-list.tsx +14 -13
  276. package/src/components/io-schema-values.tsx +51 -69
  277. package/src/components/io-schema.tsx +94 -69
  278. package/src/components/lazy-list.tsx +51 -34
  279. package/src/components/list-screen.tsx +51 -35
  280. package/src/components/loading-indicator.tsx +2 -4
  281. package/src/components/markdown-editor/autolink-plugin.tsx +4 -11
  282. package/src/components/markdown-editor/editor-inline.tsx +3 -4
  283. package/src/components/markdown-editor/editor.tsx +53 -51
  284. package/src/components/markdown-editor/markdown-plugin.tsx +48 -40
  285. package/src/components/markdown-editor/mention-node.ts +39 -38
  286. package/src/components/markdown-editor/mentions-plugin.tsx +99 -101
  287. package/src/components/markdown-editor/theme.ts +28 -29
  288. package/src/components/markdown-editor/toolbar.tsx +53 -47
  289. package/src/components/markdown-with-mentions.tsx +56 -46
  290. package/src/components/message-logs/message-logs.tsx +225 -165
  291. package/src/components/messages/avatar.tsx +70 -52
  292. package/src/components/messages/channel-message-list.tsx +80 -68
  293. package/src/components/messages/channel-view.tsx +34 -33
  294. package/src/components/messages/message-compose.tsx +84 -67
  295. package/src/components/messages/message-display.tsx +103 -89
  296. package/src/components/messages/thread-message-list.tsx +53 -44
  297. package/src/components/router.tsx +42 -43
  298. package/src/components/save-button.tsx +43 -39
  299. package/src/components/sortable-list.tsx +77 -49
  300. package/src/components/tabs.tsx +31 -31
  301. package/src/components/tooltip.tsx +21 -28
  302. package/src/components/trust-level-badge.tsx +15 -11
  303. package/src/components/trust-level-dropdown.tsx +49 -19
  304. package/src/components/typeahead.tsx +57 -59
  305. package/src/components/voice-indicator.tsx +158 -141
  306. package/src/components/voice-subscribe-events.ts +20 -0
  307. package/src/globals.tsx +42 -40
  308. package/src/hooks.test.tsx +141 -134
  309. package/src/hooks.ts +80 -48
  310. package/src/index.tsx +17 -10
  311. package/src/mention-configs.ts +122 -68
  312. package/src/screens/assistants/assistant-config.tsx +28 -18
  313. package/src/screens/assistants/assistant-details.tsx +35 -36
  314. package/src/screens/assistants/assistant-info.tsx +16 -11
  315. package/src/screens/assistants/assistant-list.tsx +37 -34
  316. package/src/screens/assistants/assistant-tools.tsx +41 -20
  317. package/src/screens/console-logs/console-logs-list.tsx +173 -140
  318. package/src/screens/console-logs/log-display.tsx +65 -38
  319. package/src/screens/console-logs/log-filters.tsx +4 -3
  320. package/src/screens/console-logs/mobile-log-card.tsx +78 -71
  321. package/src/screens/console-logs/resizable-table-header.tsx +29 -21
  322. package/src/screens/contacts/contact-details.tsx +29 -30
  323. package/src/screens/contacts/contact-list.tsx +71 -60
  324. package/src/screens/contacts/index.ts +5 -5
  325. package/src/screens/contacts/user-connect.tsx +177 -171
  326. package/src/screens/data-explorer/data-explorer.tsx +134 -98
  327. package/src/screens/data-explorer/index.ts +2 -3
  328. package/src/screens/data-explorer/query-executor.tsx +90 -80
  329. package/src/screens/groups/group-details.tsx +120 -101
  330. package/src/screens/groups/group-invite-listener.tsx +34 -37
  331. package/src/screens/groups/group-list.tsx +119 -103
  332. package/src/screens/groups/group-members.tsx +225 -164
  333. package/src/screens/groups/index.ts +5 -6
  334. package/src/screens/join-group/index.ts +2 -2
  335. package/src/screens/join-group/join-group.tsx +41 -39
  336. package/src/screens/network-viewer/connection-troubleshooter.tsx +145 -104
  337. package/src/screens/network-viewer/cpu-usage-graph.tsx +39 -43
  338. package/src/screens/network-viewer/device-details-modal.tsx +46 -59
  339. package/src/screens/network-viewer/group-details-modal.tsx +68 -49
  340. package/src/screens/network-viewer/index.ts +4 -5
  341. package/src/screens/network-viewer/network-viewer-ipc.ts +23 -0
  342. package/src/screens/network-viewer/network-viewer.tsx +261 -236
  343. package/src/screens/network-viewer/usage-graph.tsx +57 -49
  344. package/src/screens/packages/package-details.tsx +43 -35
  345. package/src/screens/packages/package-info.tsx +107 -66
  346. package/src/screens/packages/package-list.tsx +175 -98
  347. package/src/screens/packages/package-new-local.tsx +28 -26
  348. package/src/screens/packages/package-versions.tsx +102 -77
  349. package/src/screens/peer-types/peer-type-details.tsx +60 -50
  350. package/src/screens/peer-types/peer-type-list.tsx +20 -30
  351. package/src/screens/search/global-search.tsx +153 -137
  352. package/src/screens/settings/color-mode-dropdown.tsx +52 -35
  353. package/src/screens/settings/settings-page.tsx +215 -141
  354. package/src/screens/settings/voice-settings-agent.tsx +13 -12
  355. package/src/screens/settings/voice-settings-api-keys.tsx +14 -12
  356. package/src/screens/settings/voice-settings-output.tsx +12 -11
  357. package/src/screens/settings/voice-settings-providers.tsx +7 -3
  358. package/src/screens/settings/voice-settings-types.ts +52 -49
  359. package/src/screens/settings/voice-settings-wake-word.tsx +25 -9
  360. package/src/screens/settings/voice-settings.tsx +66 -43
  361. package/src/screens/setup-user.tsx +88 -41
  362. package/src/screens/tools/tool-code.tsx +12 -17
  363. package/src/screens/tools/tool-details.tsx +28 -28
  364. package/src/screens/tools/tool-info.tsx +14 -19
  365. package/src/screens/tools/tool-list.tsx +58 -40
  366. package/src/screens/tools/tool-schema.tsx +16 -9
  367. package/src/screens/tools/tool-test-details.tsx +11 -22
  368. package/src/screens/tools/tool-test-list.tsx +29 -30
  369. package/src/screens/variables/variable-details.tsx +63 -51
  370. package/src/screens/variables/variable-list.tsx +29 -30
  371. package/src/screens/welcome-modal.tsx +68 -48
  372. package/src/screens/workflows/workflow-details.tsx +40 -30
  373. package/src/screens/workflows/workflow-info.tsx +4 -11
  374. package/src/screens/workflows/workflow-instructions.tsx +35 -28
  375. package/src/screens/workflows/workflow-list.tsx +50 -40
  376. package/src/setupTests.ts +14 -13
  377. package/src/system-apps/assistants.app.ts +5 -5
  378. package/src/system-apps/console-logs.app.ts +4 -4
  379. package/src/system-apps/contacts.app.ts +6 -6
  380. package/src/system-apps/data-explorer.app.ts +5 -5
  381. package/src/system-apps/groups.app.ts +6 -6
  382. package/src/system-apps/index.ts +49 -49
  383. package/src/system-apps/join-group.app.ts +5 -5
  384. package/src/system-apps/mobile-settings.app.ts +4 -5
  385. package/src/system-apps/network-viewer.app.ts +5 -5
  386. package/src/system-apps/packages.app.ts +5 -5
  387. package/src/system-apps/search.app.ts +6 -6
  388. package/src/system-apps/settings.app.ts +5 -5
  389. package/src/system-apps/threads.app.ts +5 -5
  390. package/src/system-apps/tools.app.ts +5 -5
  391. package/src/system-apps/types.app.ts +5 -5
  392. package/src/system-apps/variables.app.ts +5 -5
  393. package/src/system-apps/workflows.app.ts +5 -5
  394. package/src/tabs-layout/tabs-layout.tsx +345 -254
  395. package/src/tabs-layout/tabs-state.ts +100 -81
  396. package/src/ui-defaults/index.ts +2 -3
  397. package/src/ui-defaults/list-screen.tsx +45 -40
  398. package/src/ui-defaults/markdown-field.tsx +22 -26
  399. package/src/ui-router/routes-loader.ts +40 -24
  400. package/src/ui-router/ui-loader.tsx +312 -214
  401. package/src/utils.ts +68 -81
  402. package/tsconfig.json +5 -10
  403. package/dist/components/input-datetime.d.ts +0 -7
  404. package/dist/components/input-datetime.js +0 -35
  405. package/dist/components/lazy-sortable-list.d.ts +0 -29
  406. package/dist/components/lazy-sortable-list.js +0 -12
  407. package/dist/components/left-bar.d.ts +0 -5
  408. package/dist/components/left-bar.js +0 -207
  409. package/dist/components/main-content-container.d.ts +0 -2
  410. package/dist/components/main-content-container.js +0 -92
  411. package/dist/components/messages/thread-view.d.ts +0 -6
  412. package/dist/components/messages/thread-view.js +0 -174
  413. package/dist/components/off-canvas.d.ts +0 -13
  414. package/dist/components/off-canvas.js +0 -89
  415. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +0 -6
  416. package/dist/components/text-list-editor.tsx/text-list-editor.js +0 -13
  417. package/dist/components/top-bar.d.ts +0 -2
  418. package/dist/components/top-bar.js +0 -51
  419. package/dist/components/typeahead/mentions-plugin.d.ts +0 -7
  420. package/dist/components/typeahead/mentions-plugin.js +0 -203
  421. package/dist/components/typeahead/typeahead-editor.d.ts +0 -15
  422. package/dist/components/typeahead/typeahead-editor.js +0 -134
  423. package/dist/components/typeahead/typeahead.d.ts +0 -12
  424. package/dist/components/typeahead/typeahead.js +0 -94
  425. package/dist/screens/profile.d.ts +0 -2
  426. package/dist/screens/profile.js +0 -76
  427. package/src/components/input-datetime.tsx +0 -41
  428. package/src/components/lazy-sortable-list.tsx +0 -51
  429. package/src/components/left-bar.tsx +0 -322
  430. package/src/components/main-content-container.tsx +0 -79
  431. package/src/components/messages/thread-view.tsx +0 -214
  432. package/src/components/off-canvas.tsx +0 -83
  433. package/src/components/text-list-editor.tsx/text-list-editor.tsx +0 -13
  434. package/src/components/top-bar.tsx +0 -119
  435. package/src/components/typeahead/mentions-plugin.tsx +0 -265
  436. package/src/components/typeahead/typeahead-editor.tsx +0 -140
  437. package/src/components/typeahead/typeahead.tsx +0 -77
  438. package/src/screens/profile.tsx +0 -75
@@ -1,24 +1,31 @@
1
- import { deviceVar, Observable, observable, Subscription, userVar } from "@peers-app/peers-sdk";
2
-
3
- import { IFile, IMessage, newid, PersistentVar } from "@peers-app/peers-sdk";
4
- import React, { useEffect, useState } from 'react';
5
- import { me } from '../../globals';
1
+ import {
2
+ deviceVar,
3
+ type IFile,
4
+ type IMessage,
5
+ newid,
6
+ type Observable,
7
+ observable,
8
+ type PersistentVar,
9
+ type Subscription,
10
+ userVar,
11
+ } from "@peers-app/peers-sdk";
12
+ import React, { useCallback, useEffect, useState } from "react";
13
+ import { me } from "../../globals";
6
14
  import { useObservable } from "../../hooks";
7
- import { IEditorEffects, MarkdownEditor } from '../markdown-editor/editor';
8
-
15
+ import { type IEditorEffects, MarkdownEditor } from "../markdown-editor/editor";
9
16
 
10
17
  const pVarCache: { [key: string]: PersistentVar<string> } = {};
11
18
 
12
19
  export function getContentPersistenceValue(channelId: string, threadId?: string) {
13
- const contentPersistenceName = `messageCompose-channel-${channelId}${threadId ? '-thread-' + threadId : ''}`;
20
+ const contentPersistenceName = `messageCompose-channel-${channelId}${threadId ? `-thread-${threadId}` : ""}`;
14
21
  if (!pVarCache[contentPersistenceName]) {
15
- const pVar = userVar<string>(contentPersistenceName, { defaultValue: '' });
22
+ const pVar = userVar<string>(contentPersistenceName, { defaultValue: "" });
16
23
  pVarCache[contentPersistenceName] = pVar;
17
-
24
+
18
25
  // Auto-delete the pvar when content is cleared (message sent or editor cleared)
19
26
  // This ensures drafts don't accumulate in the database
20
27
  pVar.loadingPromise.then(() => {
21
- pVar.subscribe(value => {
28
+ pVar.subscribe((value) => {
22
29
  if (!value) {
23
30
  pVar.delete();
24
31
  }
@@ -29,31 +36,31 @@ export function getContentPersistenceValue(channelId: string, threadId?: string)
29
36
  }
30
37
 
31
38
  interface IProps {
32
- channelId: string
33
- threadId?: string
34
- onMessageSubmit: (message: IMessage, files?: IFile[]) => any
35
- initialMessage?: string
39
+ channelId: string;
40
+ threadId?: string;
41
+ onMessageSubmit: (message: IMessage, files?: IFile[]) => void | Promise<void>;
42
+ initialMessage?: string;
36
43
  }
37
44
 
38
45
  export const MessageCompose = (props: IProps) => {
39
46
  const { channelId, threadId, onMessageSubmit, initialMessage } = props;
40
47
 
41
- const [contentObs] = useState(() => observable(''));
48
+ const [contentObs] = useState(() => observable(""));
42
49
  const [mdEffects] = useState<IEditorEffects>(() => ({}));
43
50
  const composeBottomRef = React.useRef<HTMLDivElement>(null);
44
51
 
45
- function scrollToBottom() {
52
+ const scrollToBottom = useCallback(() => {
46
53
  if (composeBottomRef?.current) {
47
- composeBottomRef.current.scrollIntoView({ behavior: 'instant' });
54
+ composeBottomRef.current.scrollIntoView({ behavior: "instant" });
48
55
  }
49
- }
56
+ }, []);
50
57
 
51
58
  useEffect(() => {
52
59
  let disposed = false;
53
60
  let sub: Subscription | undefined;
54
- getContentPersistenceValue(channelId, threadId).loadingPromise.then(pVar => {
61
+ getContentPersistenceValue(channelId, threadId).loadingPromise.then((pVar) => {
55
62
  if (!disposed) {
56
- const persistedValue = pVar() ?? '';
63
+ const persistedValue = pVar() ?? "";
57
64
  contentObs(initialMessage ?? persistedValue);
58
65
  sub = contentObs.subscribe(() => pVar(contentObs()));
59
66
  setTimeout(() => scrollToBottom(), 100);
@@ -62,17 +69,17 @@ export const MessageCompose = (props: IProps) => {
62
69
  return () => {
63
70
  disposed = true;
64
71
  sub?.dispose();
65
- }
66
- }, [channelId, threadId]);
72
+ };
73
+ }, [channelId, threadId, contentObs, initialMessage, scrollToBottom]);
67
74
 
68
75
  useEffect(() => {
69
76
  const sub = contentObs.subscribe(() => scrollToBottom());
70
77
  return () => sub.dispose();
71
- }, [contentObs]);
78
+ }, [contentObs, scrollToBottom]);
72
79
 
73
80
  function submitMessage() {
74
- const markdown = contentObs() ?? '';
75
- contentObs('');
81
+ const markdown = contentObs() ?? "";
82
+ contentObs("");
76
83
  if (!markdown.trim()) {
77
84
  return;
78
85
  }
@@ -83,51 +90,48 @@ export const MessageCompose = (props: IProps) => {
83
90
  channelId,
84
91
  messageParentId: threadId,
85
92
  createdAt: new Date(),
86
- }
93
+ };
87
94
  onMessageSubmit(userMessage);
88
95
  }
89
96
 
90
97
  return (
91
- <div className="border rounded border-dark-subtle" style={{ overflowY: 'auto' }}>
98
+ <div className="border rounded border-dark-subtle" style={{ overflowY: "auto" }}>
92
99
  <MarkdownEditor
93
100
  value={contentObs}
94
101
  effects={mdEffects}
95
102
  autoFocus={!!threadId}
96
- maxHeight={'50vh'}
97
- />
98
- <BottomControls
99
- submitMessage={submitMessage}
100
- contentObs={contentObs}
101
- mdEffects={mdEffects}
103
+ maxHeight={"50vh"}
102
104
  />
105
+ <BottomControls submitMessage={submitMessage} contentObs={contentObs} mdEffects={mdEffects} />
103
106
  <div ref={composeBottomRef} />
104
107
  </div>
105
- )
106
- }
108
+ );
109
+ };
107
110
 
108
111
  const BottomControls = (props: {
109
- submitMessage: () => void,
110
- contentObs: Observable<string>,
111
- mdEffects: any,
112
+ submitMessage: () => void;
113
+ contentObs: Observable<string>;
114
+ mdEffects: IEditorEffects;
112
115
  }) => {
113
116
  const { submitMessage, contentObs } = props;
114
117
  const [content] = useObservable(contentObs, [contentObs]);
115
118
 
116
- const [submitOnEnter] = useState(() => deviceVar<boolean>(`messageCompose-submitOnEnter`, { defaultValue: true }));
119
+ const [submitOnEnter] = useState(() =>
120
+ deviceVar<boolean>(`messageCompose-submitOnEnter`, { defaultValue: true }),
121
+ );
117
122
  useObservable(submitOnEnter);
118
123
  if (isMobile()) {
119
124
  submitOnEnter(false);
120
125
  }
121
126
 
122
- function onKeyDown(evt: KeyboardEvent) {
123
- if (evt.code === 'Enter' && !evt.ctrlKey && !evt.shiftKey && !evt.altKey && !evt.metaKey) {
127
+ function onKeyDown(evt: React.KeyboardEvent) {
128
+ if (evt.code === "Enter" && !evt.ctrlKey && !evt.shiftKey && !evt.altKey && !evt.metaKey) {
124
129
  if (submitOnEnter()) {
125
130
  submitMessage();
126
131
  evt.preventDefault();
127
132
  return true;
128
133
  }
129
- }
130
- else if (evt.code === 'Enter' && (evt.ctrlKey || evt.metaKey)) {
134
+ } else if (evt.code === "Enter" && (evt.ctrlKey || evt.metaKey)) {
131
135
  if (!submitOnEnter()) {
132
136
  submitMessage();
133
137
  evt.preventDefault();
@@ -139,37 +143,50 @@ const BottomControls = (props: {
139
143
 
140
144
  return (
141
145
  <div>
142
- <div className='float-end small'>
143
- <span className='small' hidden={isMobile()}>
144
- <input type="checkbox" id="sendOnEnter" checked={!!submitOnEnter()} onChange={evt => submitOnEnter(evt.target.checked)} /> Send on Enter
146
+ <div className="float-end small">
147
+ <span className="small" hidden={isMobile()}>
148
+ <input
149
+ type="checkbox"
150
+ id="sendOnEnter"
151
+ checked={!!submitOnEnter()}
152
+ onChange={(evt) => submitOnEnter(evt.target.checked)}
153
+ />{" "}
154
+ Send on Enter
145
155
  </span>
146
156
  &nbsp;&nbsp;
147
-
148
- {content.trim()?.length === 0
149
- ? (
150
- <button className="btn btn-sm btn-outline" type="button" disabled>
151
- Send &nbsp;
152
- <i className="bi bi-send-fill"></i>
153
- </button>
154
- )
155
- : (
156
- <button className="btn btn-sm btn-success" type="button" onClick={props.submitMessage}>
157
- Send &nbsp;
158
- <i className="bi bi-send-fill"></i>
159
- </button>
160
- )
161
- }
157
+ {content.trim()?.length === 0 ? (
158
+ <button className="btn btn-sm btn-outline" type="button" disabled>
159
+ Send &nbsp;
160
+ <i className="bi bi-send-fill"></i>
161
+ </button>
162
+ ) : (
163
+ <button className="btn btn-sm btn-success" type="button" onClick={props.submitMessage}>
164
+ Send &nbsp;
165
+ <i className="bi bi-send-fill"></i>
166
+ </button>
167
+ )}
162
168
  </div>
163
169
  </div>
164
- )
165
- }
170
+ );
171
+ };
166
172
 
167
173
  export function isMobile() {
168
- if ((navigator as any)?.userAgentData?.mobile) {
174
+ const nav = navigator as Navigator & { userAgentData?: { mobile?: boolean } };
175
+ if (nav.userAgentData?.mobile) {
169
176
  return true;
170
177
  }
171
178
  let check = false;
172
- // @ts-ignore
173
- (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
179
+ const legacyWindow = window as Window & { opera?: string };
180
+ ((a: string) => {
181
+ if (
182
+ /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(
183
+ a,
184
+ ) ||
185
+ /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test(
186
+ a.substr(0, 4),
187
+ )
188
+ )
189
+ check = true;
190
+ })(navigator.userAgent || navigator.vendor || legacyWindow.opera || "");
174
191
  return check;
175
192
  }
@@ -1,19 +1,25 @@
1
- import React, { useEffect, useState } from 'react';
2
- import { Avatar } from './avatar';
3
1
  // import { FileListDisplay } from './file-list-display';
4
- import { Assistants, IMessage, IUser, Messages, Observable, observable } from "@peers-app/peers-sdk";
5
- import moment from 'moment';
6
- import { openThread, openThreads } from '../../globals';
7
- import { useObservable, usePromise, useSubscription } from '../../hooks';
8
- import { MarkdownWithMentions } from '../markdown-with-mentions';
9
- import { MessageLogs } from '../message-logs/message-logs';
10
-
2
+ import {
3
+ Assistants,
4
+ type IMessage,
5
+ type IUser,
6
+ Messages,
7
+ type Observable,
8
+ observable,
9
+ } from "@peers-app/peers-sdk";
10
+ import moment from "moment";
11
+ import { useEffect, useState } from "react";
12
+ import { openThread } from "../../globals";
13
+ import { useObservable, usePromise } from "../../hooks";
14
+ import { MarkdownWithMentions } from "../markdown-with-mentions";
15
+ import { MessageLogs } from "../message-logs/message-logs";
16
+ import { Avatar } from "./avatar";
11
17
 
12
18
  interface IProps {
13
- message: IMessage
14
- messageAbove?: IMessage
15
- isThreadParent?: boolean
16
- index?: number
19
+ message: IMessage;
20
+ messageAbove?: IMessage;
21
+ isThreadParent?: boolean;
22
+ index?: number;
17
23
  }
18
24
 
19
25
  export const MessageDisplay = (props: IProps) => {
@@ -21,19 +27,23 @@ export const MessageDisplay = (props: IProps) => {
21
27
 
22
28
  const [messageId, setMessageId] = useState(message.messageId);
23
29
 
24
- useSubscription(openThreads, () => {
25
-
26
- })
27
-
28
30
  const [user, setUser] = useState<IUser>();
29
31
  const [messageChangedTime, setMessageChangedTime] = useState(0);
30
- const assistant = usePromise(async () => {
31
- if (message.assistantId) {
32
- return Assistants().get(message.assistantId);
33
- }
34
- }, undefined, [message.assistantId]);
32
+ const assistant = usePromise(
33
+ async () => {
34
+ if (message.assistantId) {
35
+ return Assistants().get(message.assistantId);
36
+ }
37
+ },
38
+ undefined,
39
+ [message.assistantId],
40
+ );
35
41
 
36
- const countReplies = usePromise(() => Messages().count({ messageParentId: messageId }), 1, [messageId, messageChangedTime])!;
42
+ const countReplies = usePromise(() => Messages().count({ messageParentId: messageId }), 0, [
43
+ messageId,
44
+ messageChangedTime,
45
+ ]);
46
+ const replyCount = countReplies ?? 0;
37
47
 
38
48
  const [showMenu] = useState(() => observable(false));
39
49
 
@@ -47,13 +57,13 @@ export const MessageDisplay = (props: IProps) => {
47
57
  });
48
58
  return () => {
49
59
  sub.unsubscribe();
50
- }
51
- }, [message]);
60
+ };
61
+ }, [message, messageId]);
52
62
 
53
63
  // calculate short time string
54
- const messageDate = new Date(message.createdAt)
55
- let hour: any = messageDate.getHours();
56
- const minute = messageDate.getMinutes().toString().padStart(2, '0');
64
+ const messageDate = new Date(message.createdAt);
65
+ let hour = messageDate.getHours();
66
+ const minute = messageDate.getMinutes().toString().padStart(2, "0");
57
67
  let ampm = "AM";
58
68
  if (hour > 11) {
59
69
  ampm = "PM";
@@ -61,34 +71,35 @@ export const MessageDisplay = (props: IProps) => {
61
71
  if (hour > 12) {
62
72
  hour = hour - 12;
63
73
  }
64
- let timeStr = `${hour || 12}:${minute} ${ampm}`
65
-
66
- const showDateDivider = messageAbove
67
- && messageDate.toDateString() !== (new Date(messageAbove.createdAt)).toDateString();
68
- const showUserInfo = showDateDivider
69
- || !messageAbove || !message
70
- || messageAbove.userId !== message.userId
71
- || messageAbove.assistantId !== message.assistantId
72
- || messageDate.getHours() !== (new Date(messageAbove.createdAt)).getHours()
73
- || countReplies > 0;
74
-
74
+ let timeStr = `${hour || 12}:${minute} ${ampm}`;
75
+
76
+ const showDateDivider =
77
+ messageAbove && messageDate.toDateString() !== new Date(messageAbove.createdAt).toDateString();
78
+ const showUserInfo =
79
+ showDateDivider ||
80
+ !messageAbove ||
81
+ !message ||
82
+ messageAbove.userId !== message.userId ||
83
+ messageAbove.assistantId !== message.assistantId ||
84
+ messageDate.getHours() !== new Date(messageAbove.createdAt).getHours() ||
85
+ replyCount > 0;
75
86
 
76
87
  // // show time of this message if hour is different than last message
77
- // const showTime = !showUserInfo
78
- // && messageDate.getHours() !== (new Date(messageAbove.modified)).getHours();
88
+ // const showTime = !showUserInfo
89
+ // && messageDate.getHours() !== (new Date(messageAbove.modified)).getHours();
79
90
 
80
91
  const isThreadView = isThreadParent || message.messageParentId;
81
92
 
82
- const dateTimeStr = moment(message.createdAt).calendar().split(' at ')[0] + ' ' + timeStr;
93
+ const dateTimeStr = `${moment(message.createdAt).calendar().split(" at ")[0]} ${timeStr}`;
83
94
  if (isThreadParent) {
84
95
  timeStr = dateTimeStr;
85
96
  }
86
97
 
87
- let messageParsed = message.message.trim();
98
+ const messageParsed = message.message.trim();
88
99
 
89
100
  return (
90
101
  <div
91
- className={isThreadParent ? '' : `peers-message-container`}
102
+ className={isThreadParent ? "" : `peers-message-container`}
92
103
  onMouseEnter={() => showMenu(true)}
93
104
  onMouseLeave={() => showMenu(false)}
94
105
  >
@@ -99,20 +110,18 @@ export const MessageDisplay = (props: IProps) => {
99
110
  <hr />
100
111
  <div className="d-flex justify-content-center">
101
112
  <span
102
- className='message-display-list-date'
113
+ className="message-display-list-date"
103
114
  style={{
104
- position: 'relative',
105
- top: '-29px',
106
- paddingLeft: '11px',
107
- paddingRight: '11px',
108
- fontSize: '16px',
109
- borderRadius: '20px',
115
+ position: "relative",
116
+ top: "-29px",
117
+ paddingLeft: "11px",
118
+ paddingRight: "11px",
119
+ fontSize: "16px",
120
+ borderRadius: "20px",
110
121
  }}
111
122
  >
112
123
  <strong>
113
- {
114
- moment(message.createdAt).calendar().split(' at ')[0].replace('Last', '')
115
- }
124
+ {moment(message.createdAt).calendar().split(" at ")[0].replace("Last", "")}
116
125
  </strong>
117
126
  </span>
118
127
  </div>
@@ -120,40 +129,44 @@ export const MessageDisplay = (props: IProps) => {
120
129
  )}
121
130
 
122
131
  {/* new block so add some padding */}
123
- {showUserInfo && (
124
- <div style={{ marginTop: '15px' }}></div>
125
- )}
132
+ {showUserInfo && <div style={{ marginTop: "15px" }}></div>}
126
133
 
127
134
  <div className="d-flex">
128
- <div className="p-0 flex-shrink-0 justify-content-center align-items-center"
135
+ <div
136
+ className="p-0 flex-shrink-0 justify-content-center align-items-center"
129
137
  style={{
130
- width: '46px',
131
- height: '20px',
132
- overflow: 'visible',
138
+ width: "46px",
139
+ height: "20px",
140
+ overflow: "visible",
133
141
  // zIndex: message.modified,
134
- position: 'relative',
135
- top: '4px',
136
- left: '3px',
142
+ position: "relative",
143
+ top: "4px",
144
+ left: "3px",
137
145
  }}
138
146
  >
139
- {showUserInfo && <Avatar userId={message.userId} assistantId={message.assistantId} setUser={setUser} />}
147
+ {showUserInfo && (
148
+ <Avatar userId={message.userId} assistantId={message.assistantId} setUser={setUser} />
149
+ )}
140
150
  </div>
141
- <div
151
+ <div
142
152
  className="p-1 flex-grow-1 justify-content-start text-break"
143
153
  style={{
144
- maxWidth: 'calc(100% - 50px)',
154
+ maxWidth: "calc(100% - 50px)",
145
155
  }}
146
156
  >
147
-
148
157
  {showUserInfo && (
149
158
  <div className="peers-message">
150
- <span style={{ fontSize: '9pt' }}>
151
- <b>
152
- {assistant?.name || message?.assistantId || user?.name || message.userId}
153
- </b>
159
+ <span style={{ fontSize: "9pt" }}>
160
+ <b>{assistant?.name || message?.assistantId || user?.name || message.userId}</b>
154
161
  </span>
155
162
  {/* TODO show status */}
156
- <span className="text-muted sub-sup-font-size" style={{ fontSize: '8pt' }} title={dateTimeStr}>&nbsp;&nbsp;{timeStr}</span>
163
+ <span
164
+ className="text-muted sub-sup-font-size"
165
+ style={{ fontSize: "8pt" }}
166
+ title={dateTimeStr}
167
+ >
168
+ &nbsp;&nbsp;{timeStr}
169
+ </span>
157
170
  </div>
158
171
  )}
159
172
 
@@ -166,7 +179,7 @@ export const MessageDisplay = (props: IProps) => {
166
179
  <MessageLogs key={messageId} messageId={messageId} />
167
180
 
168
181
  {/* replies info and link */}
169
- {!isThreadView && countReplies > 0 && (
182
+ {!isThreadView && replyCount > 0 && (
170
183
  <div className="d-inline">
171
184
  {/* this space prevents the logs and replies indicator from being included when selecting and copying a message text */}
172
185
  &nbsp;
@@ -175,27 +188,28 @@ export const MessageDisplay = (props: IProps) => {
175
188
  onClick={() => openThread(message.messageParentId || messageId)}
176
189
  tabIndex={props.index}
177
190
  >
178
- {countReplies === 1 ? '1 reply' : countReplies + ' replies'}
191
+ {replyCount === 1 ? "1 reply" : `${replyCount} replies`}
179
192
  </button>
180
193
  </div>
181
- )}
182
-
194
+ )}
183
195
  </div>
184
196
  </div>
185
197
 
186
- {message?.fileIds?.length && (
187
- <div style={{ marginLeft: '46px' }}>
198
+ {(message?.fileIds?.length && (
199
+ <div style={{ marginLeft: "46px" }}>
188
200
  {/* <FileListDisplay files={message.fileIds} /> */}
189
201
  </div>
190
- ) || undefined}
191
-
192
-
202
+ )) ||
203
+ undefined}
193
204
  </div>
194
- )
195
- }
196
-
197
- const MessageMenu = (props: { message: IMessage, showMenu: Observable<boolean>, isThreadView: boolean }) => {
198
-
205
+ );
206
+ };
207
+
208
+ const MessageMenu = (props: {
209
+ message: IMessage;
210
+ showMenu: Observable<boolean>;
211
+ isThreadView: boolean;
212
+ }) => {
199
213
  const { message, isThreadView, showMenu } = props;
200
214
  useObservable(showMenu);
201
215
 
@@ -213,5 +227,5 @@ const MessageMenu = (props: { message: IMessage, showMenu: Observable<boolean>,
213
227
  </div>
214
228
  )}
215
229
  </>
216
- )
217
- }
230
+ );
231
+ };