@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,322 +0,0 @@
1
- import { IPackage, Packages } from "@peers-app/peers-sdk";
2
- import React, { useCallback, useEffect, useRef, useState } from 'react';
3
- import { isDesktop, mainContentPath } from '../globals';
4
- import { useObservable, usePromise } from '../hooks';
5
- import { OffCanvas } from './off-canvas';
6
- // import { useObservable } from 'peers-ui';
7
-
8
- const offCanvasEffects = { hide: () => {} };
9
-
10
- const LEFT_BAR_WIDTH_KEY = 'leftBarWidth';
11
- const DEFAULT_LEFT_BAR_WIDTH = 300;
12
-
13
- function getStoredLeftBarWidth(): number {
14
- const stored = localStorage.getItem(LEFT_BAR_WIDTH_KEY);
15
- return stored ? parseInt(stored, 10) : DEFAULT_LEFT_BAR_WIDTH;
16
- }
17
-
18
- function setStoredLeftBarWidth(width: number) {
19
- localStorage.setItem(LEFT_BAR_WIDTH_KEY, String(width));
20
- document.documentElement.style.setProperty('--left-bar-width', `${width}px`);
21
- }
22
-
23
- // Set initial CSS variable on load
24
- setStoredLeftBarWidth(getStoredLeftBarWidth());
25
-
26
- export const LeftBar = () => {
27
- const [_isDesktop] = useObservable(isDesktop);
28
- const [width, setWidth] = useState(() => getStoredLeftBarWidth());
29
- const isDragging = useRef(false);
30
- const startX = useRef(0);
31
- const startWidth = useRef(0);
32
-
33
- const onMouseMove = useCallback((e: MouseEvent) => {
34
- if (!isDragging.current) return;
35
- const delta = e.clientX - startX.current;
36
- const newWidth = Math.max(150, Math.min(600, startWidth.current + delta));
37
- setWidth(newWidth);
38
- setStoredLeftBarWidth(newWidth);
39
- }, []);
40
-
41
- const onMouseUp = useCallback(() => {
42
- isDragging.current = false;
43
- document.removeEventListener('mousemove', onMouseMove);
44
- document.removeEventListener('mouseup', onMouseUp);
45
- document.body.style.cursor = '';
46
- document.body.style.userSelect = '';
47
- }, [onMouseMove]);
48
-
49
- const onMouseDown = useCallback((e: React.MouseEvent) => {
50
- e.preventDefault();
51
- isDragging.current = true;
52
- startX.current = e.clientX;
53
- startWidth.current = width;
54
- document.addEventListener('mousemove', onMouseMove);
55
- document.addEventListener('mouseup', onMouseUp);
56
- document.body.style.cursor = 'col-resize';
57
- document.body.style.userSelect = 'none';
58
- }, [width, onMouseMove, onMouseUp]);
59
-
60
- useEffect(() => {
61
- return () => {
62
- document.removeEventListener('mousemove', onMouseMove);
63
- document.removeEventListener('mouseup', onMouseUp);
64
- };
65
- }, [onMouseMove, onMouseUp]);
66
-
67
- // const [usersAndGroups, setUsersAndGroups] = useState<(IUser | IGroup)[]>([]);
68
-
69
- if (_isDesktop) {
70
- return (
71
- <div
72
- className='left-bar-desktop'
73
- style={{ position: 'fixed', top: 0, left: 0, width, display: 'flex', flexDirection: 'row' }}
74
- >
75
- <LeftBarContent width={width} />
76
- <div
77
- onMouseDown={onMouseDown}
78
- title="Drag to resize"
79
- style={{
80
- position: 'absolute',
81
- top: 0,
82
- right: '-3px',
83
- width: '6px',
84
- height: '100%',
85
- cursor: 'col-resize',
86
- zIndex: 200,
87
- backgroundColor: 'transparent',
88
- }}
89
- onMouseEnter={e => { (e.target as HTMLDivElement).style.backgroundColor = 'rgba(128,128,128,0.4)'; }}
90
- onMouseLeave={e => { (e.target as HTMLDivElement).style.backgroundColor = 'transparent'; }}
91
- />
92
- </div>
93
- )
94
- } else {
95
- return (
96
- <OffCanvas id="leftBar" position="left" keepOpen={_isDesktop} effects={offCanvasEffects}>
97
- <LeftBarContent width={DEFAULT_LEFT_BAR_WIDTH} />
98
- </OffCanvas>
99
- )
100
- }
101
- }
102
-
103
- export const LeftBarContent = ({ width }: { width?: number } = {}) => {
104
- const [_isDesktop] = useObservable(isDesktop);
105
- const barWidth = width ?? DEFAULT_LEFT_BAR_WIDTH;
106
-
107
- const packagesWithNavItems = usePromise(async () => {
108
- const packages = await Packages().list();
109
- return packages.filter(pkg => pkg.appNavs?.length);
110
- }, []);
111
-
112
- const containerClassName = `d-flex flex-column flex-shrink-0 p-2 text-white ` + (_isDesktop ? 'bg-dark-subtle' : 'bg-dark');
113
-
114
- const content = (
115
- <div className={containerClassName} style={{ width: barWidth, height: "calc(100vh - 25px)" }} >
116
- <div className="clearfix"
117
- // style={{ borderBottom: 'solid', borderColor: '#606365', borderWidth: '1px' }}
118
- >
119
- <div className="dropdown" style={{ display: 'inline-block', width: '200px' }}>
120
- <a
121
- id="dropdownUser1"
122
- data-bs-toggle="dropdown"
123
- aria-expanded="false"
124
- className="d-flex align-items-center text-white text-decoration-none"
125
- href="#"
126
- tabIndex={-1}
127
- >
128
- <span className="fs-4">Peers</span>
129
- &nbsp;&nbsp;&nbsp;
130
- <i className="bi bi-three-dots-vertical" style={{ fontSize: '12pt' }}></i>
131
- </a>
132
- <ul
133
- className="dropdown-menu dropdown-menu-end dropdown-menu-dark text-small shadow"
134
- style={{ border: '1px grey solid' }}
135
- aria-labelledby="dropdownUser1"
136
- >
137
- {/* <li><a className="dropdown-item" href="#groups/create">New Group</a></li>
138
- <li><hr className="dropdown-divider" /></li> */}
139
- <li><a className="dropdown-item" href="#settings">Profile & Settings</a></li>
140
- </ul>
141
- </div>
142
- </div>
143
-
144
- <hr className='p-0' />
145
-
146
- <MenuSection
147
- menuItems={[
148
- // { text: "Shell", icon: "bi bi-robot" },
149
- // { text: "Threads", icon: "bi bi-terminal", path: "shell" },
150
- // { text: "Journal", icon: "bi bi-journal-text" },
151
- // { text: "Journal", icon: "bi bi-journal-bookmark" },
152
- // { text: "Tasks", icon: "bi bi-list-task" },
153
- // { text: "Calendar", icon: "bi bi-calendar-week", link: "calendar" },
154
- // { text: "AI Models", icon: "bi bi-cpu" },
155
- { text: "Variables", icon: "bi bi-braces" },
156
- { text: "Types", icon: "bi bi-code-square", path: "peer-types" },
157
- { text: "Assistants", icon: "bi bi-person-fill-gear" },
158
- { text: "Tools", icon: "bi bi-tools" },
159
- { text: "Workflows", icon: "bi bi-database-fill-gear" },
160
- { text: "Events", icon: "bi bi-lightning-charge-fill" },
161
- { text: "Packages", icon: "bi bi-box-fill" },
162
- // { text: "Notes", icon: "bi bi-collection" },
163
- ]}
164
- />
165
-
166
- <hr />
167
-
168
- <MenuSection
169
- menuItems={[
170
- { text: "Threads", icon: "bi bi-cpu", path: "shell" },
171
- ]}
172
- />
173
-
174
- {(packagesWithNavItems?.length ?? 0) > 0 && packagesWithNavItems?.map(p => <PackageNavItems key={p.packageId} pkg={p} />)}
175
-
176
-
177
- {/* <hr />
178
- <label style={{ color: 'silver' }}>Feeds</label>
179
- <MenuSection
180
- menuItems={[
181
- { text: "Public", icon: "bi bi-globe" },
182
- { text: "Trusted", icon: "bi bi-person-fill-lock" },
183
- ]}
184
- /> */}
185
-
186
- {/* <hr /> */}
187
- {/* <label style={{ color: 'silver' }}>Channels & Groups</label>
188
- coming soon... */}
189
-
190
-
191
- {/* {MenuSection({
192
- menuItems: usersAndGroups.map(ug => ({
193
- text: ug.name,
194
- icon: "bi bi-people-fill",
195
- link: `/#${ug.id}`,
196
- onClick: () => offCanvasEffects.hide?.(),
197
- id: ug.id
198
- }))
199
- })} */}
200
-
201
-
202
- </div>
203
- )
204
- return content;
205
- }
206
-
207
- interface IMenuItemProps {
208
- text: string
209
- path?: string
210
- icon: string
211
- className?: string
212
- left?: number
213
- // onClick?: (...args: any[]) => any
214
- // id?: string
215
- }
216
-
217
- function MenuItem(props: IMenuItemProps) {
218
- useObservable(mainContentPath);
219
- const link = props.path ?? props.text.replace(/\s/g, '-').toLowerCase();
220
- const href = window.location.href.split('#')[1]?.trim() ?? '';
221
- // let isActive = href.endsWith(link);
222
- let isActive = href.split('/')[0] === link || href.startsWith(link);
223
- if (link === 'shell' && !href) {
224
- isActive = true;
225
- }
226
- return (
227
- <div
228
- className={`nav-link text-white ${isActive && 'active' || ''} ${props.className || ''}`}
229
- // onClick={() => window.location = (window.origin + props.link) as any}
230
- style={{ cursor: "pointer", marginLeft: `${props.left || 0}px` }}
231
- onClick={() => {
232
- offCanvasEffects.hide?.();
233
- mainContentPath(link)
234
- }}
235
- >
236
- <a
237
- className={`text-white`}
238
- style={{ textDecoration: 'none' }}
239
- // onClick={props.onClick}
240
- >
241
- <i className={props.icon}></i>
242
- &nbsp;
243
- {props.text}
244
- </a>
245
- {/*
246
- {isActive && props.id && (
247
- <span className="dropdown float-end">
248
- <span
249
- id="ddGroupSettings" data-bs-toggle="dropdown" aria-expanded="false"
250
- className="d-flex align-items-center text-white text-decoration-none"
251
- onClick={evt => evt.stopPropagation()}
252
- >
253
- <i className="bi bi-three-dots-vertical"></i>
254
- </span>
255
- <ul
256
- className="dropdown-menu dropdown-menu-dark text-small shadow"
257
- aria-labelledby="ddGroupSettings"
258
- // onClick={props.onClick}
259
- >
260
- <li>
261
- <a className="dropdown-item" href={`/#groups/${props.id}`}>
262
- Details
263
- </a>
264
- </li>
265
- </ul>
266
- </span>
267
- )} */}
268
- </div>
269
- );
270
- }
271
-
272
- interface IMenuSectionProps {
273
- menuItems: IMenuItemProps[]
274
- }
275
- function MenuSection(props: IMenuSectionProps) {
276
- return (
277
- <div className="nav flex-column nav-pills me-3" id="v-pills-tab" role="tablist" aria-orientation="vertical">
278
-
279
- {props.menuItems.map(mi => <MenuItem key={mi.text + mi.path} {...mi}></MenuItem>)}
280
-
281
- </div>
282
- );
283
- }
284
-
285
- function PackageNavItems(props: { pkg: IPackage }) {
286
- const pkg = props.pkg;
287
- if (!pkg.appNavs || pkg.appNavs.length === 0) {
288
- return null;
289
- }
290
-
291
- // if (pkg.appNavs?.length === 1 && pkg.appNavs[0].name === pkg.name) {
292
- // const iconClassName = pkg.appNavs[0].iconClassName || "bi bi-question-square";
293
- // // this package only has one nav item and it's named the same as the package so just show it as a top level item
294
- // return <MenuItem
295
- // text={pkg.name}
296
- // icon={iconClassName}
297
- // />
298
- // }
299
-
300
- return (
301
- <>
302
- {pkg.appNavs.length !== 1 || pkg.appNavs[0].name !== pkg.name && (
303
- <label style={{ color: 'silver' }}>{pkg.name}</label>
304
- )}
305
- <MenuSection
306
- menuItems={
307
- pkg.appNavs.map(ni => {
308
- let path = `package-nav/${pkg.packageId}/${(ni.navigationPath ?? ni.name).replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}`;
309
- while (path.includes('//')) {
310
- path = path.replace('//', '/');
311
- }
312
- return {
313
- text: ni.name,
314
- icon: ni.iconClassName || "bi bi-box-seam",
315
- path,
316
- }
317
- })
318
- }
319
- />
320
- </>
321
- )
322
- }
@@ -1,79 +0,0 @@
1
- import React, { useState } from 'react';
2
- import SplitPane from 'react-split-pane';
3
- import { openThreads, threadViewOpen } from '../globals';
4
- import { ThreadContainer, startNewThread } from './messages/thread-view';
5
- import { Router } from './router';
6
- import { useObservable } from '../hooks';
7
-
8
- const LEFT_BAR_WIDTH_KEY = 'leftBarWidth';
9
- const DEFAULT_LEFT_BAR_WIDTH = 300;
10
-
11
- export const MainContentContainer = () => {
12
-
13
- const splitPositionGlobalName = 'mainContentContainerSplitPos';
14
- let [splitPos, setSplitPos] = useState(localStorage.getItem(splitPositionGlobalName) || '800');
15
- useObservable(threadViewOpen);
16
-
17
- if (!threadViewOpen()) {
18
- return (
19
- <>
20
- <button
21
- className="btn small m-0 p-0 thread-view-open-button"
22
- onClick={() => {
23
- const lastThread = openThreads()[0];
24
- if (!lastThread) {
25
- startNewThread();
26
- } else {
27
- threadViewOpen(true);
28
- }
29
- }}
30
- style={{
31
- position: 'fixed',
32
- // top: '3px',
33
- // right: '16px',
34
- top: '-5px',
35
- right: '6px',
36
- zIndex: 1000,
37
- // backgroundColor: 'white',
38
- backgroundColor: 'transparent'
39
- }}
40
- >
41
- +
42
- {/* <i className="bi bi-box-arrow-down-left"></i> */}
43
- </button>
44
-
45
- <Router />
46
- </>
47
- )
48
- }
49
-
50
- return (
51
- // @ts-ignore
52
- <SplitPane
53
- split="vertical"
54
- defaultSize={parseInt(splitPos)}
55
- onChange={(size) => {
56
- localStorage.setItem(splitPositionGlobalName, String(size));
57
- setSplitPos(String(size));
58
- }}
59
- style={{
60
- position: 'unset',
61
- height: `calc(100vh - 25px)`,
62
- }}
63
- >
64
- <div>
65
- <Router />
66
- </div>
67
- <div
68
- className='thread-view'
69
- style={{
70
- height: `calc(100vh - 25px)`,
71
- overflowY: 'scroll',
72
- width: `calc(100vw - ${splitPos}px - ${parseInt(localStorage.getItem(LEFT_BAR_WIDTH_KEY) || String(DEFAULT_LEFT_BAR_WIDTH), 10)}px)`,
73
- }}
74
- >
75
- <ThreadContainer />
76
- </div>
77
- </SplitPane>
78
- )
79
- }
@@ -1,214 +0,0 @@
1
- import { Subscription } from "@peers-app/peers-sdk";
2
- import { useObservable } from "../../hooks";
3
- import React, { useEffect, useState } from 'react';
4
- import { newid, IMessage, Messages } from "@peers-app/peers-sdk";
5
- import { me, openThread, openThreads, threadViewOpen } from '../../globals';
6
- import { MessageCompose, getContentPersistenceValue } from './message-compose';
7
- import { MessageDisplay } from './message-display';
8
- import { ThreadMessageList } from './thread-message-list';
9
- import { MarkdownWithMentions } from '../markdown-with-mentions';
10
-
11
- function closeThread(thread: string | IMessage) {
12
- if (typeof thread === 'object') {
13
- // Clear the draft content - this triggers auto-delete via the pvar subscription
14
- getContentPersistenceValue(thread.channelId, thread.messageId)('');
15
- thread = thread.messageId;
16
- }
17
- openThreads(openThreads().filter(t => (typeof t === 'string' && t !== thread) || (typeof t === 'object' && t.messageId !== thread)));
18
- if (openThreads().length === 0) {
19
- startNewThread();
20
- }
21
- }
22
-
23
- export function startNewThread() {
24
- const threadParent = Messages().initRecord({
25
- messageId: newid(),
26
- userId: me.userId,
27
- channelId: me.userId,
28
- message: '',
29
- });
30
- openThread(threadParent);
31
- }
32
-
33
- export interface IThreadContainerProps {
34
- closeThreadBtn?: React.ReactNode
35
- }
36
-
37
- export const ThreadContainer = (props: IThreadContainerProps) => {
38
-
39
- const [[thread]] = useObservable(openThreads);
40
-
41
- if (!thread) {
42
- setTimeout(startNewThread, 0);
43
- return false;
44
- }
45
-
46
- return (
47
- <div className="thread-container">
48
- <div
49
- className='sticky-top container-fluid border shadow-sm thread-header'
50
- style={{ height: '50px' }}
51
- >
52
- <div className='d-flex'>
53
- <div>
54
- <button
55
- className="btn fs-4"
56
- onClick={startNewThread}
57
- >
58
- <i className="bi bi-plus-lg"></i>
59
- </button>
60
- </div>
61
- <div className='flex-grow-1'>
62
- <div className='pt-1'>
63
- <OpenThreads />
64
- </div>
65
- </div>
66
- <div>
67
- <button className="btn fs-4" onClick={() => {
68
- let currentThreadId = openThreads()[0];
69
- closeThread(currentThreadId);
70
- }}>
71
- <i className="bi bi-x-lg"></i>
72
- </button>
73
-
74
- {props.closeThreadBtn === undefined && (
75
- <button className="btn fs-4" onClick={() => threadViewOpen(false)}>
76
- <i className="bi bi-box-arrow-in-up-right"></i>
77
- </button>
78
- )}
79
- {!!props.closeThreadBtn && props.closeThreadBtn}
80
- </div>
81
- </div>
82
-
83
- </div>
84
-
85
-
86
- {thread && typeof thread === 'string' &&
87
- <ThreadMessageList
88
- threadId={thread}
89
- />
90
- }
91
-
92
- {thread && typeof thread !== 'string' &&
93
- <NewThreadView
94
- message={thread}
95
- />
96
- }
97
- </div>
98
- );
99
- };
100
-
101
- const NewThreadView = (props: { message: IMessage }) => {
102
- const message = Messages().initDoc(props.message);
103
-
104
- // TODO let the user set the channel
105
- message.channelId = me.userId;
106
-
107
- return (
108
- <div>
109
- <p className='p-2 fs-4 text-center'>
110
- New Thread
111
- </p>
112
-
113
- <div className='p-2'>
114
- <MessageCompose
115
- channelId={message.channelId}
116
- threadId={message.messageId}
117
- onMessageSubmit={async (messageData) => {
118
- message.message = messageData.message;
119
- message.createdAt = new Date();
120
- message.userId = me.userId;
121
- await message.save();
122
- const threadsWithoutDraft = openThreads().filter(t => !(typeof t === 'object' && t.messageId === message.messageId));
123
- openThreads([message.messageId, ...threadsWithoutDraft]);
124
- threadViewOpen(true);
125
- }}
126
- />
127
- </div>
128
- </div>
129
- );
130
- }
131
-
132
- const OpenThreads = () => {
133
- const [threads] = useObservable(openThreads);
134
-
135
- return (
136
- <div className="dropdown">
137
- <button className="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
138
- Open Threads
139
- </button>
140
- <ul className="dropdown-menu" style={{ maxHeight: '70vh', overflowY: 'auto', minWidth: '90%' }}>
141
- {threads.map(thread => {
142
- let threadId = '';
143
- if (typeof thread === 'object') {
144
- threadId = thread.messageId;
145
- } else {
146
- threadId = thread;
147
- }
148
- return (
149
- <OpenThreadsMenuItem key={threadId} thread={thread} />
150
- )
151
- })}
152
- </ul>
153
- </div>
154
- );
155
- }
156
-
157
- const OpenThreadsMenuItem = (props: { thread: string | IMessage }) => {
158
- const { thread } = props;
159
- const [menuText, setMenuText] = useState('loading...');
160
- const [message, setMessage] = useState<IMessage | undefined>();
161
- const isDraft = typeof thread !== 'string';
162
-
163
-
164
- useEffect(() => {
165
- let sub: Subscription | undefined = undefined;
166
- let disposed = false;
167
- (async () => {
168
- if (typeof thread === 'string') {
169
- const message = await Messages().get(thread);
170
- if (disposed) return;
171
- setMenuText(message?.message ?? `Thread ${thread} not found`);
172
- setMessage(message);
173
- } else {
174
- setMessage(thread);
175
- const pVar = getContentPersistenceValue(thread.channelId, thread.messageId);
176
- await pVar.loadingPromise;
177
- if (disposed) return;
178
- setMenuText(pVar() || 'New Thread');
179
- sub = pVar.subscribe(() => {
180
- setMenuText(pVar() || 'New Thread')
181
- });
182
- }
183
- })();
184
- return () => {
185
- sub?.dispose();
186
- }
187
- }, [thread]);
188
-
189
- function _closeThread(evt: React.MouseEvent<HTMLButtonElement, MouseEvent>) {
190
- evt.preventDefault();
191
- evt.stopPropagation();
192
- closeThread(thread);
193
- }
194
-
195
- return (
196
- <li>
197
- <div className='border rounded m-2 mb-3' onClick={() => openThread(thread)}>
198
- {!message && 'loading...'}
199
- {message && !isDraft && (
200
- <div style={{ position: 'relative' }}>
201
- <button className='btn-close' style={{ position: 'absolute', right: 8, top: -10, fontSize: '.7em' }} onClick={_closeThread} />
202
- <MessageDisplay message={message} isThreadParent />
203
- </div>
204
- )}
205
- {message && isDraft &&
206
- <div className='p-1'>
207
- <MarkdownWithMentions content={'DRAFT - ' + menuText} />
208
- </div>
209
- }
210
- </div>
211
- </li>
212
- )
213
-
214
- }
@@ -1,83 +0,0 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import { Offcanvas } from 'bootstrap';
3
-
4
- interface IProps {
5
- id: string
6
- children: any
7
- position: 'left' | 'right' | 'top' | 'bottom'
8
- keepOpen?: boolean
9
- dataBackdrop?: boolean
10
- effects?: {
11
- hide: (() => any)
12
- }
13
- }
14
-
15
- // function removeExtraFadeFromOffcanvas(canvasId: string) {
16
- // const offcanvas = document.getElementById(canvasId);
17
- // offcanvas?.addEventListener('shown.bs.offcanvas', event => {
18
- // let fade = document.getElementsByClassName('offcanvas-backdrop fade show');
19
- // for (let i = 0; i < fade.length; i++) {
20
- // if (fade.length > 1) {
21
- // fade[i].remove();
22
- // }
23
- // }
24
- // });
25
- // }
26
-
27
- // function preventMultipleOffcanvasFades(canvasId: string) {
28
- // const offcanvas = document.getElementById(canvasId);
29
- // offcanvas?.addEventListener('show.bs.offcanvas', function () {
30
- // const backdrops = document.querySelectorAll('.offcanvas-backdrop');
31
- // if (backdrops.length > 1) {
32
- // for (let i = 1; i < backdrops.length; i++) {
33
- // backdrops[i].remove();
34
- // }
35
- // }
36
- // });
37
- // }
38
-
39
- export const OffCanvas = (props: IProps) => {
40
- console.log('OffCanvas');
41
- const { id, position, keepOpen, effects } = props;
42
-
43
- const computedProps: any = {};
44
- if (keepOpen) {
45
- computedProps['data-bs-scroll'] = "true";
46
- computedProps['data-bs-backdrop'] = "false";
47
- }
48
-
49
- if (props.dataBackdrop !== undefined) {
50
- computedProps['data-bs-backdrop'] = String(props.dataBackdrop);
51
- }
52
-
53
- const offCanvasPosition = position == 'left' ? 'start'
54
- : position == 'right' ? 'end' : position;
55
-
56
- const offCanvasRef = useRef();
57
- if (effects) {
58
- effects.hide = () => {
59
- if (offCanvasRef.current) {
60
- let offCanvas = Offcanvas.getInstance(offCanvasRef.current);
61
- offCanvas?.hide();
62
- }
63
- }
64
- }
65
-
66
- useEffect(() => {
67
- // removeExtraFadeFromOffcanvas(id);
68
- // preventMultipleOffcanvasFades(id);
69
- }, [offCanvasRef, offCanvasRef.current]);
70
-
71
- return (
72
- <div
73
- id={id}
74
- ref={offCanvasRef}
75
- tabIndex={-1}
76
- className={`offcanvas offcanvas-${offCanvasPosition} ${keepOpen ? 'show' : ''}`}
77
- style={{ width: "300px", visibility: keepOpen ? 'visible': '' }}
78
- {...computedProps}
79
- >
80
- {props.children}
81
- </div>
82
- )
83
- }