@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,4 +1,7 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GroupInviteListener = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
2
5
  /**
3
6
  * Component for admins to prepare group invitations and manage join requests.
4
7
  *
@@ -6,43 +9,8 @@
6
9
  *
7
10
  * Communicates with device layer through pvars (not direct imports).
8
11
  */
9
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- var desc = Object.getOwnPropertyDescriptor(m, k);
12
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
- desc = { enumerable: true, get: function() { return m[k]; } };
14
- }
15
- Object.defineProperty(o, k2, desc);
16
- }) : (function(o, m, k, k2) {
17
- if (k2 === undefined) k2 = k;
18
- o[k2] = m[k];
19
- }));
20
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
- Object.defineProperty(o, "default", { enumerable: true, value: v });
22
- }) : function(o, v) {
23
- o["default"] = v;
24
- });
25
- var __importStar = (this && this.__importStar) || (function () {
26
- var ownKeys = function(o) {
27
- ownKeys = Object.getOwnPropertyNames || function (o) {
28
- var ar = [];
29
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
- return ar;
31
- };
32
- return ownKeys(o);
33
- };
34
- return function (mod) {
35
- if (mod && mod.__esModule) return mod;
36
- var result = {};
37
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
- __setModuleDefault(result, mod);
39
- return result;
40
- };
41
- })();
42
- Object.defineProperty(exports, "__esModule", { value: true });
43
- exports.GroupInviteListener = void 0;
44
- const react_1 = __importStar(require("react"));
45
12
  const peers_sdk_1 = require("@peers-app/peers-sdk");
13
+ const react_1 = require("react");
46
14
  const hooks_1 = require("../../hooks");
47
15
  const GroupInviteListener = (props) => {
48
16
  const { groupId } = props;
@@ -58,7 +26,7 @@ const GroupInviteListener = (props) => {
58
26
  const [status] = (0, hooks_1.useObservable)(peers_sdk_1.groupInviteStatus);
59
27
  // Check if we're currently listening for this group
60
28
  const currentListener = listeners?.[groupId];
61
- const pendingRequests = (requests || []).filter(r => r.groupId === groupId);
29
+ const pendingRequests = (requests || []).filter((r) => r.groupId === groupId);
62
30
  // Sync local state with listener state
63
31
  (0, react_1.useEffect)(() => {
64
32
  if (currentListener) {
@@ -103,7 +71,7 @@ const GroupInviteListener = (props) => {
103
71
  (0, peers_sdk_1.groupInviteProcessRequest)({
104
72
  requestId: request.requestId,
105
73
  approved: true,
106
- role: approvalRole
74
+ role: approvalRole,
107
75
  });
108
76
  // Clear processing state after a short delay
109
77
  setTimeout(() => setProcessingRequestId(null), 1000);
@@ -115,75 +83,11 @@ const GroupInviteListener = (props) => {
115
83
  (0, peers_sdk_1.groupInviteProcessRequest)({
116
84
  requestId: request.requestId,
117
85
  approved: false,
118
- role: peers_sdk_1.GroupMemberRole.None
86
+ role: peers_sdk_1.GroupMemberRole.None,
119
87
  });
120
88
  // Clear processing state after a short delay
121
89
  setTimeout(() => setProcessingRequestId(null), 1000);
122
90
  }, []);
123
- return (react_1.default.createElement("div", { className: "card mb-3" },
124
- react_1.default.createElement("div", { className: "card-header" },
125
- react_1.default.createElement("h6", { className: "mb-0" },
126
- react_1.default.createElement("i", { className: "bi-person-plus-fill me-2" }),
127
- "Invite New Members")),
128
- react_1.default.createElement("div", { className: "card-body" },
129
- react_1.default.createElement("div", { className: "mb-3" },
130
- react_1.default.createElement("label", { className: "form-label small text-muted" }, "Invitation Password"),
131
- react_1.default.createElement("div", { className: "input-group" },
132
- react_1.default.createElement("input", { type: "text", className: "form-control font-monospace", value: password, onChange: (e) => setPassword(e.target.value), placeholder: "Enter or generate a password...", disabled: isListening }),
133
- react_1.default.createElement("button", { className: "btn btn-outline-secondary", onClick: handleGeneratePassword, disabled: isListening, title: "Generate random password" },
134
- react_1.default.createElement("i", { className: "bi-shuffle" })),
135
- react_1.default.createElement("button", { className: "btn btn-outline-secondary", onClick: handleCopyPassword, disabled: !password, title: "Copy password" },
136
- react_1.default.createElement("i", { className: copied ? "bi-check-lg text-success" : "bi-clipboard" }))),
137
- react_1.default.createElement("small", { className: "text-muted" }, "Share this password with people you want to invite. They can enter it in the \"Join Group\" screen.")),
138
- react_1.default.createElement("div", { className: "d-flex gap-2" }, !isListening ? (react_1.default.createElement("button", { className: "btn btn-primary", onClick: handleStartListening, disabled: !password || password.length < 4 },
139
- react_1.default.createElement("i", { className: "bi-broadcast me-2" }),
140
- "Start Listening")) : (react_1.default.createElement("button", { className: "btn btn-danger", onClick: handleStopListening },
141
- react_1.default.createElement("i", { className: "bi-stop-circle me-2" }),
142
- "Stop Listening"))),
143
- isListening && (react_1.default.createElement("div", { className: "alert alert-success mt-3 mb-0 d-flex align-items-center" },
144
- react_1.default.createElement("div", { className: "spinner-border spinner-border-sm me-2", role: "status" },
145
- react_1.default.createElement("span", { className: "visually-hidden" }, "Listening...")),
146
- react_1.default.createElement("div", null,
147
- react_1.default.createElement("strong", null, "Listening for join requests"),
148
- react_1.default.createElement("br", null),
149
- react_1.default.createElement("small", null,
150
- "Password: ",
151
- react_1.default.createElement("code", null, password))))),
152
- status && (react_1.default.createElement("div", { className: "alert alert-info mt-3 mb-0" },
153
- react_1.default.createElement("i", { className: "bi-info-circle me-2" }),
154
- status)),
155
- pendingRequests.length > 0 && (react_1.default.createElement("div", { className: "mt-3" },
156
- react_1.default.createElement("h6", { className: "mb-2" },
157
- react_1.default.createElement("i", { className: "bi-inbox-fill me-2" }),
158
- "Pending Requests (",
159
- pendingRequests.length,
160
- ")"),
161
- react_1.default.createElement("div", { className: "mb-2" },
162
- react_1.default.createElement("label", { className: "form-label small text-muted" }, "Role for new members:"),
163
- react_1.default.createElement("select", { className: "form-select form-select-sm", value: approvalRole, onChange: (e) => setApprovalRole(Number(e.target.value)), style: { width: "auto" } },
164
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Reader }, "Reader"),
165
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Writer }, "Writer"),
166
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Admin }, "Admin"))),
167
- react_1.default.createElement("div", { className: "list-group" }, pendingRequests.map((request) => (react_1.default.createElement("div", { key: request.requestId, className: "list-group-item" },
168
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
169
- react_1.default.createElement("div", null,
170
- react_1.default.createElement("div", { className: "d-flex align-items-center" },
171
- react_1.default.createElement("i", { className: "bi-person-fill me-2" }),
172
- react_1.default.createElement("div", null,
173
- react_1.default.createElement("strong", null, request.requester.name || request.requester.userId),
174
- request.requester.name && (react_1.default.createElement("small", { className: "text-muted d-block" }, request.requester.userId)))),
175
- react_1.default.createElement("small", { className: "text-muted" },
176
- "Device: ",
177
- request.requester.deviceId.slice(0, 8),
178
- "...",
179
- " | ",
180
- "Received: ",
181
- new Date(request.receivedAt).toLocaleTimeString())),
182
- react_1.default.createElement("div", { className: "d-flex gap-2" },
183
- react_1.default.createElement("button", { className: "btn btn-success btn-sm", onClick: () => handleApprove(request), disabled: processingRequestId === request.requestId }, processingRequestId === request.requestId ? (react_1.default.createElement("span", { className: "spinner-border spinner-border-sm" })) : (react_1.default.createElement(react_1.default.Fragment, null,
184
- react_1.default.createElement("i", { className: "bi-check-lg me-1" }),
185
- "Approve"))),
186
- react_1.default.createElement("button", { className: "btn btn-outline-danger btn-sm", onClick: () => handleDeny(request), disabled: processingRequestId === request.requestId },
187
- react_1.default.createElement("i", { className: "bi-x-lg" })))))))))))));
91
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "card mb-3", children: [(0, jsx_runtime_1.jsx)("div", { className: "card-header", children: (0, jsx_runtime_1.jsxs)("h6", { className: "mb-0", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person-plus-fill me-2" }), "Invite New Members"] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "card-body", children: [(0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("label", { className: "form-label small text-muted", children: "Invitation Password" }), (0, jsx_runtime_1.jsxs)("div", { className: "input-group", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", className: "form-control font-monospace", value: password, onChange: (e) => setPassword(e.target.value), placeholder: "Enter or generate a password...", disabled: isListening }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-outline-secondary", onClick: handleGeneratePassword, disabled: isListening, title: "Generate random password", children: (0, jsx_runtime_1.jsx)("i", { className: "bi-shuffle" }) }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-outline-secondary", onClick: handleCopyPassword, disabled: !password, title: "Copy password", children: (0, jsx_runtime_1.jsx)("i", { className: copied ? "bi-check-lg text-success" : "bi-clipboard" }) })] }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: "Share this password with people you want to invite. They can enter it in the \"Join Group\" screen." })] }), (0, jsx_runtime_1.jsx)("div", { className: "d-flex gap-2", children: !isListening ? ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-primary", onClick: handleStartListening, disabled: !password || password.length < 4, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-broadcast me-2" }), "Start Listening"] })) : ((0, jsx_runtime_1.jsxs)("button", { className: "btn btn-danger", onClick: handleStopListening, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-stop-circle me-2" }), "Stop Listening"] })) }), isListening && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-success mt-3 mb-0 d-flex align-items-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "spinner-border spinner-border-sm me-2", role: "status", children: (0, jsx_runtime_1.jsx)("span", { className: "visually-hidden", children: "Listening..." }) }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("strong", { children: "Listening for join requests" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsxs)("small", { children: ["Password: ", (0, jsx_runtime_1.jsx)("code", { children: password })] })] })] })), status && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-info mt-3 mb-0", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-info-circle me-2" }), status] })), pendingRequests.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "mt-3", children: [(0, jsx_runtime_1.jsxs)("h6", { className: "mb-2", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-inbox-fill me-2" }), "Pending Requests (", pendingRequests.length, ")"] }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-2", children: [(0, jsx_runtime_1.jsx)("label", { className: "form-label small text-muted", children: "Role for new members:" }), (0, jsx_runtime_1.jsxs)("select", { className: "form-select form-select-sm", value: approvalRole, onChange: (e) => setApprovalRole(Number(e.target.value)), style: { width: "auto" }, children: [(0, jsx_runtime_1.jsx)("option", { value: peers_sdk_1.GroupMemberRole.Reader, children: "Reader" }), (0, jsx_runtime_1.jsx)("option", { value: peers_sdk_1.GroupMemberRole.Writer, children: "Writer" }), (0, jsx_runtime_1.jsx)("option", { value: peers_sdk_1.GroupMemberRole.Admin, children: "Admin" })] })] }), (0, jsx_runtime_1.jsx)("div", { className: "list-group", children: pendingRequests.map((request) => ((0, jsx_runtime_1.jsx)("div", { className: "list-group-item", children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between align-items-center", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person-fill me-2" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("strong", { children: request.requester.name || request.requester.userId }), request.requester.name && ((0, jsx_runtime_1.jsx)("small", { className: "text-muted d-block", children: request.requester.userId }))] })] }), (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: ["Device: ", request.requester.deviceId.slice(0, 8), "...", " | ", "Received: ", new Date(request.receivedAt).toLocaleTimeString()] })] }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex gap-2", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-success btn-sm", onClick: () => handleApprove(request), disabled: processingRequestId === request.requestId, children: processingRequestId === request.requestId ? ((0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm" })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-check-lg me-1" }), "Approve"] })) }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-outline-danger btn-sm", onClick: () => handleDeny(request), disabled: processingRequestId === request.requestId, children: (0, jsx_runtime_1.jsx)("i", { className: "bi-x-lg" }) })] })] }) }, request.requestId))) })] }))] })] }));
188
92
  };
189
93
  exports.GroupInviteListener = GroupInviteListener;
@@ -1,2 +1 @@
1
- import React from 'react';
2
- export declare function GroupList(): React.JSX.Element;
1
+ export declare function GroupList(): import("react/jsx-runtime").JSX.Element;
@@ -1,41 +1,9 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.GroupList = GroupList;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
37
5
  const peers_sdk_1 = require("@peers-app/peers-sdk");
38
- const react_1 = __importStar(require("react"));
6
+ const react_1 = require("react");
39
7
  const input_1 = require("../../components/input");
40
8
  const lazy_list_1 = require("../../components/lazy-list");
41
9
  const loading_indicator_1 = require("../../components/loading-indicator");
@@ -45,46 +13,45 @@ const hooks_1 = require("../../hooks");
45
13
  const ui_loader_1 = require("../../ui-router/ui-loader");
46
14
  function GroupList() {
47
15
  const userContext = (0, hooks_1.usePromise)(peers_sdk_1.getUserContext);
48
- const [searchTextObs] = (0, react_1.useState)(() => (0, peers_sdk_1.observable)(''));
16
+ const [searchTextObs] = (0, react_1.useState)(() => (0, peers_sdk_1.observable)(""));
49
17
  const [searchText] = (0, hooks_1.useObservable)(searchTextObs);
50
18
  const [cursorObs] = (0, react_1.useState)(() => (0, peers_sdk_1.observable)());
51
19
  // All hooks must be called before any conditional returns
52
20
  const groupsTable = userContext ? (0, peers_sdk_1.Groups)(userContext.userDataContext) : null;
53
- async function newCursor() {
21
+ const newCursor = (0, react_1.useCallback)(async () => {
54
22
  if (!groupsTable)
55
23
  return;
56
24
  const filter = {
57
- $or: [
58
- { name: { $matchWords: searchText } },
59
- { description: { $matchWords: searchText } },
60
- ],
61
- disabled: { $ne: true }
25
+ $or: [{ name: { $matchWords: searchText } }, { description: { $matchWords: searchText } }],
26
+ disabled: { $ne: true },
62
27
  };
63
28
  const cursor = await groupsTable.cursor(searchText ? filter : { disabled: { $ne: true } }, {
64
- sortBy: ['name'],
65
- ...(searchText ? {} : { textSearch: searchText })
29
+ sortBy: ["name"],
30
+ ...(searchText ? {} : { textSearch: searchText }),
66
31
  });
67
32
  cursorObs(cursor);
68
33
  return cursor;
69
- }
34
+ }, [groupsTable, searchText, cursorObs]);
70
35
  (0, react_1.useEffect)(() => {
71
36
  if (groupsTable) {
72
- newCursor();
37
+ void newCursor();
73
38
  }
74
- }, [searchText, groupsTable]);
39
+ }, [groupsTable, newCursor]);
75
40
  // Early return after all hooks
76
41
  if (!userContext) {
77
- return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
42
+ return (0, jsx_runtime_1.jsx)(loading_indicator_1.LoadingIndicator, {});
78
43
  }
79
44
  async function loadMore(existing) {
80
45
  if (!groupsTable)
81
46
  return [];
82
- let moreMatches = [];
83
- let cursor = cursorObs() || await newCursor();
47
+ const moreMatches = [];
48
+ const cursor = cursorObs() || (await newCursor());
84
49
  if (!cursor)
85
50
  return [];
86
51
  for await (const nextRecord of cursor) {
87
- if (existing.find(e => e.groupId === nextRecord.groupId))
52
+ if (existing.some((e) => e.groupId === nextRecord.groupId))
53
+ continue;
54
+ if (moreMatches.some((e) => e.groupId === nextRecord.groupId))
88
55
  continue;
89
56
  moreMatches.push(nextRecord);
90
57
  if (searchText.length && moreMatches.length > 5)
@@ -103,7 +70,7 @@ function GroupList() {
103
70
  const name = searchText.trim();
104
71
  if (!name)
105
72
  return;
106
- searchTextObs('');
73
+ searchTextObs("");
107
74
  await newRecord(name);
108
75
  }
109
76
  async function newRecord(name) {
@@ -116,12 +83,12 @@ function GroupList() {
116
83
  // at time of writing, this is supported but is probably unintuitive behavior so we need to watch for this changing in the future
117
84
  const groupDataContext = userContext.getDataContext(groupId);
118
85
  // Store groupKeys.secretKey securely for this group
119
- const persistentVarsTable = userContext.userDataContext.tableContainer.getTableByName('PersistentVars');
120
- const groupSecretKeyVarName = 'groupSecretKey_' + groupDataContext.dataContextId;
86
+ const persistentVarsTable = userContext.userDataContext.tableContainer.getTableByName("PersistentVars");
87
+ const groupSecretKeyVarName = `groupSecretKey_${groupDataContext.dataContextId}`;
121
88
  await persistentVarsTable.save({
122
89
  persistentVarId: (0, peers_sdk_1.newid)(),
123
90
  name: groupSecretKeyVarName,
124
- scope: 'groupUser',
91
+ scope: "groupUser",
125
92
  isSecret: true,
126
93
  value: { value: groupKeys.secretKey },
127
94
  });
@@ -134,51 +101,42 @@ function GroupList() {
134
101
  const group = await (0, peers_sdk_1.Groups)(userContext.userDataContext).signAndSave({
135
102
  groupId,
136
103
  name: groupName,
137
- description: '',
138
- iconClassName: 'bi-people-fill', // Default icon
104
+ description: "",
105
+ iconClassName: "bi-people-fill", // Default icon
139
106
  founderUserId: me.userId,
140
107
  disabled: false,
141
108
  publicKey: groupKeys.publicKey,
142
109
  publicBoxKey: groupKeys.publicBoxKey,
143
- signature: '', // will be set via signAndSave
110
+ signature: "", // will be set via signAndSave
144
111
  });
145
112
  await (0, peers_sdk_1.Groups)(groupDataContext).signAndSave(group);
146
113
  // Auto-install peers-core for the new group
147
- await peers_sdk_1.rpcServerCalls.addOrUpdatePackage(peers_sdk_1.peersCorePackageId, { dataContextId: groupId }).catch((err) => {
148
- console.error('Error auto-installing peers-core for group:', err);
114
+ await peers_sdk_1.rpcServerCalls
115
+ .addOrUpdatePackage(peers_sdk_1.peersCorePackageId, { dataContextId: groupId })
116
+ .catch((err) => {
117
+ console.error("Error auto-installing peers-core for group:", err);
149
118
  });
150
119
  (0, globals_1.mainContentPath)(`groups/${group.groupId}`);
151
120
  return group;
152
121
  }
153
122
  function renderItem(group) {
154
- const groupIcon = group.iconClassName || 'bi-people-fill';
155
- return (react_1.default.createElement("div", { key: group.groupId, className: 'container-fluid pb-4' },
156
- react_1.default.createElement("i", { className: groupIcon }),
157
- "\u00A0",
158
- react_1.default.createElement("a", { href: `#groups/${group.groupId}` }, group.name || '<unnamed-group>'),
159
- react_1.default.createElement("div", { style: { paddingLeft: '20px' } },
160
- react_1.default.createElement(markdown_with_mentions_1.MarkdownWithMentions, { content: group.description || '' }))));
123
+ const groupIcon = group.iconClassName || "bi-people-fill";
124
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "container-fluid pb-4", children: [(0, jsx_runtime_1.jsx)("i", { className: groupIcon }), "\u00A0", (0, jsx_runtime_1.jsx)("a", { href: `#groups/${group.groupId}`, children: group.name || "<unnamed-group>" }), (0, jsx_runtime_1.jsx)("div", { style: { paddingLeft: "20px" }, children: (0, jsx_runtime_1.jsx)(markdown_with_mentions_1.MarkdownWithMentions, { content: group.description || "" }) })] }, group.groupId));
161
125
  }
162
- return (react_1.default.createElement("div", { className: 'container-fluid' },
163
- react_1.default.createElement("div", { className: "input-group mt-3 mb-3" },
164
- react_1.default.createElement(input_1.Input, { value: searchTextObs, className: "form-control", placeholder: "Search or create group", autoFocus: (0, globals_1.isDesktop)() ? true : false, onKeyUp: evt => searchSubmit(evt) }),
165
- react_1.default.createElement(ImportGroupButton, null)),
166
- react_1.default.createElement("div", { className: "peers-list-container" },
167
- react_1.default.createElement(lazy_list_1.LazyList, { resetTrigger: searchText, loadMore: loadMore, scrollThreshold: 0.6, renderItems: (groups) => {
168
- return groups.map(renderItem);
169
- }, loadingIndicator: react_1.default.createElement("div", { className: "d-flex justify-content-center", style: { height: 200 } },
170
- react_1.default.createElement(loading_indicator_1.LoadingIndicator, null)), endOfList: react_1.default.createElement("div", { className: "d-flex justify-content-center", style: { height: 200 } }) }))));
126
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "container-fluid", children: [(0, jsx_runtime_1.jsxs)("div", { className: "input-group mt-3 mb-3", children: [(0, jsx_runtime_1.jsx)(input_1.Input, { value: searchTextObs, className: "form-control", placeholder: "Search or create group", autoFocus: !!(0, globals_1.isDesktop)(), onKeyUp: (evt) => searchSubmit(evt) }), (0, jsx_runtime_1.jsx)(ImportGroupButton, {})] }), (0, jsx_runtime_1.jsx)("div", { className: "peers-list-container", children: (0, jsx_runtime_1.jsx)(lazy_list_1.LazyList, { resetTrigger: searchText, loadMore: loadMore, scrollThreshold: 0.6, renderItems: (groups) => {
127
+ return groups.map(renderItem);
128
+ }, loadingIndicator: (0, jsx_runtime_1.jsx)("div", { className: "d-flex justify-content-center", style: { height: 200 }, children: (0, jsx_runtime_1.jsx)(loading_indicator_1.LoadingIndicator, {}) }), endOfList: (0, jsx_runtime_1.jsx)("div", { className: "d-flex justify-content-center", style: { height: 200 } }) }) })] }));
171
129
  }
172
130
  const ImportGroupButton = () => {
173
131
  const [isImporting, setIsImporting] = (0, react_1.useState)(false);
174
132
  const [showImportDialog, setShowImportDialog] = (0, react_1.useState)(false);
175
- const [importText, setImportText] = (0, react_1.useState)('');
133
+ const [importText, setImportText] = (0, react_1.useState)("");
176
134
  const [importResult, setImportResult] = (0, react_1.useState)(null);
177
135
  const handleImport = async () => {
178
136
  if (!importText.trim()) {
179
137
  setImportResult({
180
138
  success: false,
181
- message: 'Please paste the group share JSON data'
139
+ message: "Please paste the group share JSON data",
182
140
  });
183
141
  return;
184
142
  }
@@ -189,9 +147,9 @@ const ImportGroupButton = () => {
189
147
  setImportResult({
190
148
  success: true,
191
149
  message: `Group imported successfully!`,
192
- groupId
150
+ groupId,
193
151
  });
194
- setImportText('');
152
+ setImportText("");
195
153
  // Navigate to the imported group after a brief delay
196
154
  setTimeout(() => {
197
155
  (0, globals_1.mainContentPath)(`groups/${groupId}`);
@@ -202,7 +160,7 @@ const ImportGroupButton = () => {
202
160
  catch (error) {
203
161
  setImportResult({
204
162
  success: false,
205
- message: `Import failed: ${error.message}`
163
+ message: `Import failed: ${error instanceof Error ? error.message : String(error)}`,
206
164
  });
207
165
  }
208
166
  finally {
@@ -211,68 +169,33 @@ const ImportGroupButton = () => {
211
169
  };
212
170
  const handlePasteFromClipboard = async () => {
213
171
  try {
214
- if (navigator.clipboard && navigator.clipboard.readText) {
172
+ if (navigator.clipboard?.readText) {
215
173
  const clipboardText = await navigator.clipboard.readText();
216
174
  setImportText(clipboardText);
217
175
  }
218
176
  }
219
- catch (error) {
220
- console.log('Failed to read from clipboard - user can paste manually');
177
+ catch (_error) {
178
+ console.log("Failed to read from clipboard - user can paste manually");
221
179
  }
222
180
  };
223
- return (react_1.default.createElement(react_1.default.Fragment, null,
224
- react_1.default.createElement("button", { className: "btn btn-outline-secondary dropdown-toggle", type: "button", "data-bs-toggle": "dropdown", "aria-expanded": "false" },
225
- react_1.default.createElement("i", { className: "bi-plus-lg" })),
226
- react_1.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" },
227
- react_1.default.createElement("li", null,
228
- react_1.default.createElement("button", { className: "dropdown-item", onClick: () => setShowImportDialog(true) },
229
- react_1.default.createElement("i", { className: "bi-download me-2" }),
230
- "Import Shared Group"))),
231
- showImportDialog && (react_1.default.createElement("div", { className: "position-fixed top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center", style: { backgroundColor: 'rgba(0,0,0,0.5)', zIndex: 1050 } },
232
- react_1.default.createElement("div", { className: "card", style: { maxWidth: '600px', width: '90%' } },
233
- react_1.default.createElement("div", { className: "card-header d-flex justify-content-between align-items-center" },
234
- react_1.default.createElement("h6", { className: "mb-0" },
235
- react_1.default.createElement("i", { className: "bi-download me-2" }),
236
- "Import Shared Group"),
237
- react_1.default.createElement("button", { className: "btn-close", onClick: () => {
238
- setShowImportDialog(false);
239
- setImportText('');
240
- setImportResult(null);
241
- }, "aria-label": "Close" })),
242
- react_1.default.createElement("div", { className: "card-body" },
243
- react_1.default.createElement("p", { className: "mb-3" }, "Paste the group share JSON data below to import a shared group with its admin members."),
244
- react_1.default.createElement("div", { className: "mb-3" },
245
- react_1.default.createElement("label", { className: "form-label" }, "Group Share JSON:"),
246
- react_1.default.createElement("div", { className: "d-flex gap-2 mb-2" },
247
- react_1.default.createElement("button", { className: "btn btn-secondary btn-sm", onClick: handlePasteFromClipboard, title: "Paste from clipboard" },
248
- react_1.default.createElement("i", { className: "bi-clipboard me-1" }),
249
- "Paste from Clipboard")),
250
- react_1.default.createElement("textarea", { className: "form-control font-monospace", rows: 8, value: importText, onChange: (e) => setImportText(e.target.value), placeholder: "Paste the group share JSON here...", style: { fontSize: '0.9em' } })),
251
- importResult && (react_1.default.createElement("div", { className: `alert alert-${importResult.success ? 'success' : 'danger'} mb-3` },
252
- react_1.default.createElement("i", { className: `bi-${importResult.success ? 'check-circle' : 'exclamation-triangle'} me-2` }),
253
- importResult.message,
254
- importResult.success && importResult.groupId && (react_1.default.createElement("div", { className: "mt-2" },
255
- react_1.default.createElement("small", null, "Redirecting to group in 2 seconds..."))))),
256
- react_1.default.createElement("div", { className: "text-end" },
257
- react_1.default.createElement("button", { className: "btn btn-secondary me-2", onClick: () => {
258
- setShowImportDialog(false);
259
- setImportText('');
260
- setImportResult(null);
261
- }, disabled: isImporting }, "Cancel"),
262
- react_1.default.createElement("button", { className: "btn btn-primary", onClick: handleImport, disabled: isImporting || !importText.trim() }, isImporting ? (react_1.default.createElement(react_1.default.Fragment, null,
263
- react_1.default.createElement("span", { className: "spinner-border spinner-border-sm me-1", role: "status", "aria-hidden": "true" }),
264
- "Importing...")) : (react_1.default.createElement(react_1.default.Fragment, null,
265
- react_1.default.createElement("i", { className: "bi-download me-1" }),
266
- "Import Group"))))))))));
181
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-outline-secondary dropdown-toggle", type: "button", "data-bs-toggle": "dropdown", "aria-expanded": "false", children: (0, jsx_runtime_1.jsx)("i", { className: "bi-plus-lg" }) }), (0, jsx_runtime_1.jsx)("ul", { className: "dropdown-menu dropdown-menu-end", children: (0, jsx_runtime_1.jsx)("li", { children: (0, jsx_runtime_1.jsxs)("button", { className: "dropdown-item", onClick: () => setShowImportDialog(true), children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-download me-2" }), "Import Shared Group"] }) }) }), showImportDialog && ((0, jsx_runtime_1.jsx)("div", { className: "position-fixed top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center", style: { backgroundColor: "rgba(0,0,0,0.5)", zIndex: 1050 }, children: (0, jsx_runtime_1.jsxs)("div", { className: "card", style: { maxWidth: "600px", width: "90%" }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "card-header d-flex justify-content-between align-items-center", children: [(0, jsx_runtime_1.jsxs)("h6", { className: "mb-0", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-download me-2" }), "Import Shared Group"] }), (0, jsx_runtime_1.jsx)("button", { className: "btn-close", onClick: () => {
182
+ setShowImportDialog(false);
183
+ setImportText("");
184
+ setImportResult(null);
185
+ }, "aria-label": "Close" })] }), (0, jsx_runtime_1.jsxs)("div", { className: "card-body", children: [(0, jsx_runtime_1.jsx)("p", { className: "mb-3", children: "Paste the group share JSON data below to import a shared group with its admin members." }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-3", children: [(0, jsx_runtime_1.jsx)("label", { className: "form-label", children: "Group Share JSON:" }), (0, jsx_runtime_1.jsx)("div", { className: "d-flex gap-2 mb-2", children: (0, jsx_runtime_1.jsxs)("button", { className: "btn btn-secondary btn-sm", onClick: handlePasteFromClipboard, title: "Paste from clipboard", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-clipboard me-1" }), "Paste from Clipboard"] }) }), (0, jsx_runtime_1.jsx)("textarea", { className: "form-control font-monospace", rows: 8, value: importText, onChange: (e) => setImportText(e.target.value), placeholder: "Paste the group share JSON here...", style: { fontSize: "0.9em" } })] }), importResult && ((0, jsx_runtime_1.jsxs)("div", { className: `alert alert-${importResult.success ? "success" : "danger"} mb-3`, children: [(0, jsx_runtime_1.jsx)("i", { className: `bi-${importResult.success ? "check-circle" : "exclamation-triangle"} me-2` }), importResult.message, importResult.success && importResult.groupId && ((0, jsx_runtime_1.jsx)("div", { className: "mt-2", children: (0, jsx_runtime_1.jsx)("small", { children: "Redirecting to group in 2 seconds..." }) }))] })), (0, jsx_runtime_1.jsxs)("div", { className: "text-end", children: [(0, jsx_runtime_1.jsx)("button", { className: "btn btn-secondary me-2", onClick: () => {
186
+ setShowImportDialog(false);
187
+ setImportText("");
188
+ setImportResult(null);
189
+ }, disabled: isImporting, children: "Cancel" }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-primary", onClick: handleImport, disabled: isImporting || !importText.trim(), children: isImporting ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-1", role: "status", "aria-hidden": "true" }), "Importing..."] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-download me-1" }), "Import Group"] })) })] })] })] }) }))] }));
267
190
  };
268
191
  (0, ui_loader_1.registerInternalPeersUI)({
269
- peersUIId: '00mf8qrs004w5u2wqk64d2yp6',
192
+ peersUIId: "00mf8qrs004w5u2wqk64d2yp6",
270
193
  component: GroupList,
271
194
  routes: [
272
195
  {
273
- isMatch: (props, context) => context.path === 'groups',
274
- uiCategory: 'screen',
275
- priority: 2
276
- }
277
- ]
196
+ isMatch: (_props, context) => context.path === "groups",
197
+ uiCategory: "screen",
198
+ priority: 2,
199
+ },
200
+ ],
278
201
  });
@@ -1,8 +1,7 @@
1
- import { UserContext } from "@peers-app/peers-sdk";
2
- import React from "react";
1
+ import { type UserContext } from "@peers-app/peers-sdk";
3
2
  interface GroupMembersUIProps {
4
3
  groupId: string;
5
4
  userContext: UserContext;
6
5
  }
7
- export declare const GroupMembersUI: (props: GroupMembersUIProps) => React.JSX.Element;
6
+ export declare const GroupMembersUI: (props: GroupMembersUIProps) => import("react/jsx-runtime").JSX.Element;
8
7
  export {};