@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,5 +1,17 @@
1
- import { getIconClassName, getUserContext, Groups, IDoc, IGroup, Observable, generateGroupShare, checkQRCodeCompatibility, copyToClipboard, rpcServerCalls, sleep } from "@peers-app/peers-sdk";
2
- import React, { useState } from "react";
1
+ import {
2
+ checkQRCodeCompatibility,
3
+ copyToClipboard,
4
+ Groups,
5
+ generateGroupShare,
6
+ getIconClassName,
7
+ getUserContext,
8
+ type IDoc,
9
+ type IGroup,
10
+ type Observable,
11
+ rpcServerCalls,
12
+ sleep,
13
+ } from "@peers-app/peers-sdk";
14
+ import { useState } from "react";
3
15
  import { Checkbox } from "../../components/checkbox";
4
16
  import { Input } from "../../components/input";
5
17
  import { LoadingIndicator } from "../../components/loading-indicator";
@@ -16,36 +28,39 @@ interface IProps {
16
28
  }
17
29
 
18
30
  export const GroupDetails = (props: IProps) => {
19
-
20
- const group = usePromise(async () => {
21
- const userContext = await getUserContext();
22
- const userGroupTable = Groups(userContext.userDataContext);
23
- const group = await userGroupTable.get(props.groupId);
24
- if (!group) {
25
- throw new Error('Group not found');
26
- }
27
- updateActiveTabTitle(group.name || "Group");
28
- const groupDoc = userGroupTable.initDoc(group);
29
- // saves go to both the group and user db
30
- groupDoc.save = async () => {
31
- const groupDataContext = userContext.getDataContext(group.groupId);
32
- const groupGroupTable = Groups(groupDataContext);
33
- const groupData = groupDoc.toJS();
34
- await groupGroupTable.signAndSave(groupData);
35
- await userGroupTable.signAndSave(groupData);
36
- return groupDoc.load();
37
- }
38
- const originalDelete = groupDoc.delete;
39
- groupDoc.delete = async () => {
40
- const deleteResult = await originalDelete();
41
- userContext.defaultDataContext(userContext.userDataContext);
42
- await sleep(100);
43
- await rpcServerCalls.flushDatabases();
44
- window.location.reload();
45
- return deleteResult;
46
- }
47
- return groupDoc;
48
- }, undefined, [props.groupId]);
31
+ const group = usePromise(
32
+ async () => {
33
+ const userContext = await getUserContext();
34
+ const userGroupTable = Groups(userContext.userDataContext);
35
+ const group = await userGroupTable.get(props.groupId);
36
+ if (!group) {
37
+ throw new Error("Group not found");
38
+ }
39
+ updateActiveTabTitle(group.name || "Group");
40
+ const groupDoc = userGroupTable.initDoc(group);
41
+ // saves go to both the group and user db
42
+ groupDoc.save = async () => {
43
+ const groupDataContext = userContext.getDataContext(group.groupId);
44
+ const groupGroupTable = Groups(groupDataContext);
45
+ const groupData = groupDoc.toJS();
46
+ await groupGroupTable.signAndSave(groupData);
47
+ await userGroupTable.signAndSave(groupData);
48
+ return groupDoc.load();
49
+ };
50
+ const originalDelete = groupDoc.delete;
51
+ groupDoc.delete = async () => {
52
+ const deleteResult = await originalDelete();
53
+ userContext.defaultDataContext(userContext.userDataContext);
54
+ await sleep(100);
55
+ await rpcServerCalls.flushDatabases();
56
+ window.location.reload();
57
+ return deleteResult;
58
+ };
59
+ return groupDoc;
60
+ },
61
+ undefined,
62
+ [props.groupId],
63
+ );
49
64
 
50
65
  if (!group) {
51
66
  return <LoadingIndicator />;
@@ -53,7 +68,6 @@ export const GroupDetails = (props: IProps) => {
53
68
 
54
69
  return (
55
70
  <div className="container-fluid p-3">
56
-
57
71
  <div className="d-flex">
58
72
  <div>
59
73
  <h4>
@@ -64,18 +78,15 @@ export const GroupDetails = (props: IProps) => {
64
78
  <h4>
65
79
  <Input
66
80
  key={group.groupId}
67
- className='border border-0'
68
- style={{ width: '100%', outline: 'none', backgroundColor: 'transparent' }}
81
+ className="border border-0"
82
+ style={{ width: "100%", outline: "none", backgroundColor: "transparent" }}
69
83
  value={group.qs.name}
70
84
  />
71
85
  </h4>
72
86
  </div>
73
87
  <div className="d-flex gap-2">
74
88
  <ShareButton groupId={props.groupId} />
75
- <SaveButton
76
- key={group.groupId}
77
- doc={group}
78
- />
89
+ <SaveButton key={group.groupId} doc={group} />
79
90
  </div>
80
91
  </div>
81
92
 
@@ -83,31 +94,34 @@ export const GroupDetails = (props: IProps) => {
83
94
  key={group.groupId}
84
95
  tabs={[
85
96
  {
86
- name: 'Info', content:
97
+ name: "Info",
98
+ content: (
87
99
  <ScreenTabBody>
88
100
  <GroupInfo group={group} />
89
101
  </ScreenTabBody>
102
+ ),
90
103
  },
91
104
  {
92
- name: 'Members', content:
105
+ name: "Members",
106
+ content: (
93
107
  <ScreenTabBody>
94
108
  <GroupMembersWrapper groupId={props.groupId} />
95
109
  </ScreenTabBody>
110
+ ),
96
111
  },
97
112
  ]}
98
113
  />
99
114
  </div>
100
- )
101
- }
115
+ );
116
+ };
102
117
 
103
118
  const GroupInfo = (props: { group: IDoc<IGroup> }) => {
104
- const { group } = props
119
+ const { group } = props;
105
120
 
106
- group.description = group.description || '';
121
+ group.description = group.description || "";
107
122
 
108
123
  return (
109
124
  <div>
110
-
111
125
  <small>Name:</small>
112
126
  <Input
113
127
  value={group.qs.name}
@@ -125,73 +139,70 @@ const GroupInfo = (props: { group: IDoc<IGroup> }) => {
125
139
  />
126
140
 
127
141
  <small>Group ID:</small>
128
- <div className="form-control mb-3 p-2 bg-body-secondary text-body-secondary" style={{ fontFamily: 'monospace', fontSize: '0.9em' }}>
142
+ <div
143
+ className="form-control mb-3 p-2 bg-body-secondary text-body-secondary"
144
+ style={{ fontFamily: "monospace", fontSize: "0.9em" }}
145
+ >
129
146
  {group.groupId}
130
147
  </div>
131
148
 
132
149
  <div className="d-flex flex-row">
133
150
  <div className="ms-2">
134
151
  <label className="form-label small mt-2 me-2">Disabled:</label>
135
- <Checkbox
136
- className="form-check-input mt-2"
137
- checked={group.qs.disabled}
138
- />
152
+ <Checkbox className="form-check-input mt-2" checked={group.qs.disabled} />
139
153
  </div>
140
154
  </div>
141
155
 
142
156
  <br />
143
157
 
144
158
  <small className="mt-2">Description:</small>
145
- <MarkdownEditorInline
146
- value={group.qs.description as Observable<string>}
147
- />
148
-
159
+ <MarkdownEditorInline value={group.qs.description as Observable<string>} />
149
160
  </div>
150
- )
151
- }
161
+ );
162
+ };
152
163
 
153
164
  const ShareButton = ({ groupId }: { groupId: string }) => {
154
165
  const [isSharing, setIsSharing] = useState(false);
155
166
  const [shareResult, setShareResult] = useState<{
156
167
  success: boolean;
157
168
  message: string;
158
- qrInfo?: any;
169
+ qrInfo?: ReturnType<typeof checkQRCodeCompatibility>;
159
170
  } | null>(null);
160
171
 
161
172
  const handleShare = async () => {
162
173
  setIsSharing(true);
163
174
  setShareResult(null);
164
-
175
+
165
176
  try {
166
177
  // Generate the group share data
167
178
  const groupShare = await generateGroupShare(groupId);
168
-
179
+
169
180
  // Check QR code compatibility
170
181
  const qrInfo = checkQRCodeCompatibility(groupShare, 20);
171
-
182
+
172
183
  // Convert to JSON
173
184
  const groupShareJson = JSON.stringify(groupShare, null, 2);
174
-
185
+
175
186
  // Copy to clipboard
176
187
  const copied = await copyToClipboard(groupShareJson);
177
-
188
+
178
189
  if (copied) {
179
190
  setShareResult({
180
191
  success: true,
181
192
  message: `Group share data copied to clipboard! (${qrInfo.size} chars, ${qrInfo.memberCount} admin members)`,
182
- qrInfo
193
+ qrInfo,
183
194
  });
184
195
  } else {
185
196
  setShareResult({
186
197
  success: false,
187
- message: 'Failed to copy to clipboard. Please copy manually from the modal.',
188
- qrInfo
198
+ message: "Failed to copy to clipboard. Please copy manually from the modal.",
199
+ qrInfo,
189
200
  });
190
201
  }
191
- } catch (error: any) {
202
+ } catch (error: unknown) {
192
203
  setShareResult({
193
204
  success: false,
194
- message: `Error generating share: ${error.message}`,
205
+ message: `Error generating share: ${error instanceof Error ? error.message : String(error)}`,
195
206
  });
196
207
  } finally {
197
208
  setIsSharing(false);
@@ -200,7 +211,7 @@ const ShareButton = ({ groupId }: { groupId: string }) => {
200
211
 
201
212
  return (
202
213
  <>
203
- <button
214
+ <button
204
215
  className="btn btn-secondary btn-sm"
205
216
  onClick={handleShare}
206
217
  disabled={isSharing}
@@ -208,7 +219,11 @@ const ShareButton = ({ groupId }: { groupId: string }) => {
208
219
  >
209
220
  {isSharing ? (
210
221
  <>
211
- <span className="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true"></span>
222
+ <span
223
+ className="spinner-border spinner-border-sm me-1"
224
+ role="status"
225
+ aria-hidden="true"
226
+ ></span>
212
227
  Sharing...
213
228
  </>
214
229
  ) : (
@@ -218,64 +233,68 @@ const ShareButton = ({ groupId }: { groupId: string }) => {
218
233
  </>
219
234
  )}
220
235
  </button>
221
-
236
+
222
237
  {shareResult && (
223
- <div className="position-fixed top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center"
224
- style={{ backgroundColor: 'rgba(0,0,0,0.5)', zIndex: 1050 }}>
225
- <div className="card" style={{ maxWidth: '500px', width: '90%' }}>
238
+ <div
239
+ className="position-fixed top-0 start-0 w-100 h-100 d-flex align-items-center justify-content-center"
240
+ style={{ backgroundColor: "rgba(0,0,0,0.5)", zIndex: 1050 }}
241
+ >
242
+ <div className="card" style={{ maxWidth: "500px", width: "90%" }}>
226
243
  <div className="card-header d-flex justify-content-between align-items-center">
227
244
  <h6 className="mb-0">
228
- <i className={`bi-${shareResult.success ? 'check-circle text-success' : 'exclamation-triangle text-warning'} me-2`}></i>
229
- Group Share {shareResult.success ? 'Ready' : 'Error'}
245
+ <i
246
+ className={`bi-${shareResult.success ? "check-circle text-success" : "exclamation-triangle text-warning"} me-2`}
247
+ ></i>
248
+ Group Share {shareResult.success ? "Ready" : "Error"}
230
249
  </h6>
231
- <button
232
- className="btn-close"
250
+ <button
251
+ className="btn-close"
233
252
  onClick={() => setShareResult(null)}
234
253
  aria-label="Close"
235
254
  ></button>
236
255
  </div>
237
256
  <div className="card-body">
238
257
  <p className="mb-3">{shareResult.message}</p>
239
-
258
+
240
259
  {shareResult.qrInfo && (
241
260
  <div className="mb-3">
242
261
  <h6>QR Code Compatibility</h6>
243
262
  <div className="row g-2">
244
263
  <div className="col-6">
245
- <small className="text-muted">Size:</small><br/>
264
+ <small className="text-muted">Size:</small>
265
+ <br />
246
266
  <strong>{shareResult.qrInfo.size} chars</strong>
247
267
  </div>
248
268
  <div className="col-6">
249
- <small className="text-muted">QR Version 20:</small><br/>
250
- <span className={`badge bg-${shareResult.qrInfo.fits ? 'success' : 'warning'}`}>
251
- {shareResult.qrInfo.fits ? '✓ Fits' : '⚠ Too Large'} ({shareResult.qrInfo.usagePercent}%)
269
+ <small className="text-muted">QR Version 20:</small>
270
+ <br />
271
+ <span
272
+ className={`badge bg-${shareResult.qrInfo.fits ? "success" : "warning"}`}
273
+ >
274
+ {shareResult.qrInfo.fits ? "✓ Fits" : "⚠ Too Large"} (
275
+ {shareResult.qrInfo.usagePercent}%)
252
276
  </span>
253
277
  </div>
254
278
  </div>
255
-
279
+
256
280
  {!shareResult.qrInfo.fits && (
257
281
  <div className="alert alert-warning mt-2 mb-0">
258
282
  <small>
259
283
  <i className="bi-exclamation-triangle me-1"></i>
260
- Data may be too large for standard QR codes. Consider reducing admin members or use text sharing.
284
+ Data may be too large for standard QR codes. Consider reducing admin members
285
+ or use text sharing.
261
286
  </small>
262
287
  </div>
263
288
  )}
264
289
  </div>
265
290
  )}
266
-
291
+
267
292
  <div className="text-end">
268
- <button
269
- className="btn btn-secondary me-2"
270
- onClick={() => setShareResult(null)}
271
- >
293
+ <button className="btn btn-secondary me-2" onClick={() => setShareResult(null)}>
272
294
  Close
273
295
  </button>
274
296
  {shareResult.success && (
275
- <button
276
- className="btn btn-primary"
277
- onClick={handleShare}
278
- >
297
+ <button className="btn btn-primary" onClick={handleShare}>
279
298
  Copy Again
280
299
  </button>
281
300
  )}
@@ -293,10 +312,10 @@ const GroupMembersWrapper = (props: { groupId: string }) => {
293
312
  if (!userContext) return null;
294
313
 
295
314
  return <GroupMembersUI groupId={props.groupId} userContext={userContext} />;
296
- }
315
+ };
297
316
 
298
317
  registerInternalPeersUI({
299
- peersUIId: '00group00details00component',
318
+ peersUIId: "00group00details00component",
300
319
  component: GroupDetails,
301
320
  routes: [
302
321
  {
@@ -308,8 +327,8 @@ registerInternalPeersUI({
308
327
  }
309
328
  return false;
310
329
  },
311
- uiCategory: 'screen',
312
- priority: 2
313
- }
314
- ]
315
- })
330
+ uiCategory: "screen",
331
+ priority: 2,
332
+ },
333
+ ],
334
+ });
@@ -1,25 +1,25 @@
1
1
  /**
2
2
  * Component for admins to prepare group invitations and manage join requests.
3
- *
3
+ *
4
4
  * Shows in the group details Members tab for users with Admin role or above.
5
- *
5
+ *
6
6
  * Communicates with device layer through pvars (not direct imports).
7
7
  */
8
8
 
9
- import React, { useState, useEffect, useCallback } from "react";
10
9
  import {
10
+ copyToClipboard,
11
11
  GroupMemberRole,
12
12
  generateInvitePassword,
13
13
  groupInviteListeners,
14
+ groupInviteProcessRequest,
14
15
  groupInviteRequests,
15
- groupInviteStatus,
16
16
  groupInviteStartListening,
17
+ groupInviteStatus,
17
18
  groupInviteStopListening,
18
- groupInviteProcessRequest,
19
- IGroupJoinRequest,
20
- copyToClipboard,
21
- UserContext,
19
+ type IGroupJoinRequest,
20
+ type UserContext,
22
21
  } from "@peers-app/peers-sdk";
22
+ import { useCallback, useEffect, useState } from "react";
23
23
  import { useObservable } from "../../hooks";
24
24
 
25
25
  interface GroupInviteListenerProps {
@@ -44,7 +44,7 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
44
44
 
45
45
  // Check if we're currently listening for this group
46
46
  const currentListener = listeners?.[groupId];
47
- const pendingRequests = (requests || []).filter(r => r.groupId === groupId);
47
+ const pendingRequests = (requests || []).filter((r) => r.groupId === groupId);
48
48
 
49
49
  // Sync local state with listener state
50
50
  useEffect(() => {
@@ -89,17 +89,20 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
89
89
  }, [password]);
90
90
 
91
91
  // Approve a join request (set pvar, device layer reacts)
92
- const handleApprove = useCallback((request: IGroupJoinRequest) => {
93
- setProcessingRequestId(request.requestId);
94
- // Set the action pvar - device layer will process it
95
- groupInviteProcessRequest({
96
- requestId: request.requestId,
97
- approved: true,
98
- role: approvalRole
99
- });
100
- // Clear processing state after a short delay
101
- setTimeout(() => setProcessingRequestId(null), 1000);
102
- }, [approvalRole]);
92
+ const handleApprove = useCallback(
93
+ (request: IGroupJoinRequest) => {
94
+ setProcessingRequestId(request.requestId);
95
+ // Set the action pvar - device layer will process it
96
+ groupInviteProcessRequest({
97
+ requestId: request.requestId,
98
+ approved: true,
99
+ role: approvalRole,
100
+ });
101
+ // Clear processing state after a short delay
102
+ setTimeout(() => setProcessingRequestId(null), 1000);
103
+ },
104
+ [approvalRole],
105
+ );
103
106
 
104
107
  // Deny a join request (set pvar, device layer reacts)
105
108
  const handleDeny = useCallback((request: IGroupJoinRequest) => {
@@ -108,7 +111,7 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
108
111
  groupInviteProcessRequest({
109
112
  requestId: request.requestId,
110
113
  approved: false,
111
- role: GroupMemberRole.None
114
+ role: GroupMemberRole.None,
112
115
  });
113
116
  // Clear processing state after a short delay
114
117
  setTimeout(() => setProcessingRequestId(null), 1000);
@@ -125,9 +128,7 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
125
128
  <div className="card-body">
126
129
  {/* Password input and controls */}
127
130
  <div className="mb-3">
128
- <label className="form-label small text-muted">
129
- Invitation Password
130
- </label>
131
+ <label className="form-label small text-muted">Invitation Password</label>
131
132
  <div className="input-group">
132
133
  <input
133
134
  type="text"
@@ -155,7 +156,8 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
155
156
  </button>
156
157
  </div>
157
158
  <small className="text-muted">
158
- Share this password with people you want to invite. They can enter it in the "Join Group" screen.
159
+ Share this password with people you want to invite. They can enter it in the "Join
160
+ Group" screen.
159
161
  </small>
160
162
  </div>
161
163
 
@@ -171,10 +173,7 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
171
173
  Start Listening
172
174
  </button>
173
175
  ) : (
174
- <button
175
- className="btn btn-danger"
176
- onClick={handleStopListening}
177
- >
176
+ <button className="btn btn-danger" onClick={handleStopListening}>
178
177
  <i className="bi-stop-circle me-2" />
179
178
  Stop Listening
180
179
  </button>
@@ -190,7 +189,9 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
190
189
  <div>
191
190
  <strong>Listening for join requests</strong>
192
191
  <br />
193
- <small>Password: <code>{password}</code></small>
192
+ <small>
193
+ Password: <code>{password}</code>
194
+ </small>
194
195
  </div>
195
196
  </div>
196
197
  )}
@@ -210,12 +211,10 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
210
211
  <i className="bi-inbox-fill me-2" />
211
212
  Pending Requests ({pendingRequests.length})
212
213
  </h6>
213
-
214
+
214
215
  {/* Role selector for approvals */}
215
216
  <div className="mb-2">
216
- <label className="form-label small text-muted">
217
- Role for new members:
218
- </label>
217
+ <label className="form-label small text-muted">Role for new members:</label>
219
218
  <select
220
219
  className="form-select form-select-sm"
221
220
  value={approvalRole}
@@ -238,9 +237,7 @@ export const GroupInviteListener = (props: GroupInviteListenerProps) => {
238
237
  <div>
239
238
  <strong>{request.requester.name || request.requester.userId}</strong>
240
239
  {request.requester.name && (
241
- <small className="text-muted d-block">
242
- {request.requester.userId}
243
- </small>
240
+ <small className="text-muted d-block">{request.requester.userId}</small>
244
241
  )}
245
242
  </div>
246
243
  </div>