@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
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.GroupMembersUI = void 0;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
8
  const peers_sdk_1 = require("@peers-app/peers-sdk");
8
9
  const react_1 = __importDefault(require("react"));
9
10
  const loading_indicator_1 = require("../../components/loading-indicator");
@@ -26,23 +27,23 @@ const GroupMembersUI = (props) => {
26
27
  const membersWithUsers = await Promise.all(members.map(async (member) => {
27
28
  const user = await (0, peers_sdk_1.getUserById)(member.userId, {
28
29
  currentDataContext: groupDataContext,
29
- includeTrustLevel: true
30
+ includeTrustLevel: true,
30
31
  });
31
32
  // If user found from external source, save to current group
32
- if (user && user.source !== 'currentDataContext') {
33
+ if (user && user.source !== "currentDataContext") {
33
34
  try {
34
- const newGroupUser = { ...user };
35
- delete newGroupUser.source;
36
- delete newGroupUser.trustLevel;
37
- await groupUsersTable.save(newGroupUser);
35
+ const raw = { ...user };
36
+ delete raw.source;
37
+ delete raw.trustLevel;
38
+ await groupUsersTable.save(raw);
38
39
  // Set trust level for this user in the group context
39
40
  await (0, peers_sdk_1.setUserTrustLevel)(user.userId, peers_sdk_1.TrustLevel.NewUser, groupDataContext);
40
41
  // Update user reference to reflect it's now in current group
41
42
  user.trustLevel = peers_sdk_1.TrustLevel.NewUser;
42
- user.source = 'currentDataContext';
43
+ user.source = "currentDataContext";
43
44
  }
44
45
  catch (saveErr) {
45
- console.error('Failed to save user to group context:', saveErr);
46
+ console.error("Failed to save user to group context:", saveErr);
46
47
  }
47
48
  }
48
49
  // TODO don't do it this way!!! Use group-specific trust level fetching
@@ -63,7 +64,7 @@ const GroupMembersUI = (props) => {
63
64
  // }
64
65
  return {
65
66
  member,
66
- user: user || null
67
+ user: user || null,
67
68
  };
68
69
  }));
69
70
  return membersWithUsers;
@@ -77,24 +78,25 @@ const GroupMembersUI = (props) => {
77
78
  isMember: !!userRole,
78
79
  canEdit: userRole >= peers_sdk_1.GroupMemberRole.Admin,
79
80
  userRole: userRole,
80
- currentUserId: currentUserId
81
+ currentUserId: currentUserId,
81
82
  };
82
83
  }, undefined, [groupId]);
83
84
  // Load group and founder information
84
85
  const founderData = (0, hooks_1.usePromise)(async () => {
85
86
  const groupsTable = (0, peers_sdk_1.Groups)(groupDataContext);
86
- const group = await groupsTable.get(groupId) || await (0, peers_sdk_1.Groups)(userContext.userDataContext).get(groupId);
87
+ const group = (await groupsTable.get(groupId)) ||
88
+ (await (0, peers_sdk_1.Groups)(userContext.userDataContext).get(groupId));
87
89
  if (!group) {
88
90
  return null;
89
91
  }
90
92
  // Try to get founder user details
91
93
  const founderUser = await (0, peers_sdk_1.getUserById)(group.founderUserId, {
92
- currentDataContext: groupDataContext
94
+ currentDataContext: groupDataContext,
93
95
  });
94
96
  return {
95
97
  group,
96
98
  founderUser,
97
- founderUserId: group.founderUserId
99
+ founderUserId: group.founderUserId,
98
100
  };
99
101
  }, undefined, [groupId, refreshKey]);
100
102
  const [newMemberRole, setNewMemberRole] = react_1.default.useState(peers_sdk_1.GroupMemberRole.Reader);
@@ -112,43 +114,43 @@ const GroupMembersUI = (props) => {
112
114
  break;
113
115
  }
114
116
  // Filter out users who are already members
115
- const currentMembers = membersData?.map(m => m.member.userId) || [];
116
- const filteredResults = results.filter(contact => !currentMembers.includes(contact.userId));
117
- return filteredResults.map(contact => ({
117
+ const currentMembers = membersData?.map((m) => m.member.userId) || [];
118
+ const filteredResults = results.filter((contact) => !currentMembers.includes(contact.userId));
119
+ return filteredResults.map((contact) => ({
118
120
  ...contact,
119
- id: contact.userId
121
+ id: contact.userId,
120
122
  }));
121
123
  }
122
124
  catch (error) {
123
- console.error('Error searching contacts:', error);
125
+ console.error("Error searching contacts:", error);
124
126
  return [];
125
127
  }
126
128
  };
127
129
  // Render function for typeahead results
128
- const renderContactItem = (contact, isSelected) => (react_1.default.createElement("div", { className: "d-flex align-items-center" },
129
- react_1.default.createElement("i", { className: "bi-person-circle me-2", style: { fontSize: '20px' } }),
130
- react_1.default.createElement("div", { className: "flex-grow-1" },
131
- react_1.default.createElement("div", { className: "fw-semibold" }, contact.name),
132
- react_1.default.createElement("small", { className: "text-muted" }, contact.userId)),
133
- react_1.default.createElement("div", null,
134
- react_1.default.createElement("small", { className: "text-info" },
135
- react_1.default.createElement("i", { className: `bi-${getSourceIcon(contact.source)} me-1` }),
136
- getSourceLabel(contact.source)))));
130
+ const renderContactItem = (contact, _isSelected) => ((0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person-circle me-2", style: { fontSize: "20px" } }), (0, jsx_runtime_1.jsxs)("div", { className: "flex-grow-1", children: [(0, jsx_runtime_1.jsx)("div", { className: "fw-semibold", children: contact.name }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: contact.userId })] }), (0, jsx_runtime_1.jsx)("div", { children: (0, jsx_runtime_1.jsxs)("small", { className: "text-info", children: [(0, jsx_runtime_1.jsx)("i", { className: `bi-${getSourceIcon(contact.source)} me-1` }), getSourceLabel(contact.source)] }) })] }));
137
131
  // Helper functions for contact sources
138
132
  const getSourceLabel = (source) => {
139
133
  switch (source) {
140
- case 'userDataContext': return 'Personal';
141
- case 'currentDataContext': return 'Current';
142
- case 'otherDataContexts': return 'Groups';
143
- default: return source;
134
+ case "userDataContext":
135
+ return "Personal";
136
+ case "currentDataContext":
137
+ return "Current";
138
+ case "otherDataContexts":
139
+ return "Groups";
140
+ default:
141
+ return source;
144
142
  }
145
143
  };
146
144
  const getSourceIcon = (source) => {
147
145
  switch (source) {
148
- case 'userDataContext': return 'person-fill';
149
- case 'currentDataContext': return 'house-fill';
150
- case 'otherDataContexts': return 'people-fill';
151
- default: return 'question-circle';
146
+ case "userDataContext":
147
+ return "person-fill";
148
+ case "currentDataContext":
149
+ return "house-fill";
150
+ case "otherDataContexts":
151
+ return "people-fill";
152
+ default:
153
+ return "question-circle";
152
154
  }
153
155
  };
154
156
  const addMember = async () => {
@@ -167,7 +169,7 @@ const GroupMembersUI = (props) => {
167
169
  member = await groupMembersTable.initRecord({
168
170
  groupId: groupId,
169
171
  userId: contact.userId,
170
- role: newMemberRole
172
+ role: newMemberRole,
171
173
  });
172
174
  }
173
175
  await groupMembersTable.signAndSave(member);
@@ -176,131 +178,59 @@ const GroupMembersUI = (props) => {
176
178
  setSelectedContacts([]);
177
179
  setNewMemberRole(peers_sdk_1.GroupMemberRole.Reader);
178
180
  // Refresh the members list
179
- setRefreshKey(prev => prev + 1);
181
+ setRefreshKey((prev) => prev + 1);
180
182
  }
181
183
  catch (err) {
182
- console.error('Failed to add member:', err);
183
- alert('Failed to add member. They may already be in the group.');
184
+ console.error("Failed to add member:", err);
185
+ alert("Failed to add member. They may already be in the group.");
184
186
  }
185
187
  finally {
186
188
  setAddingMember(false);
187
189
  }
188
190
  };
189
191
  // Render function for contact badges
190
- const renderContactBadge = (contact) => (react_1.default.createElement("span", null, contact.name));
192
+ const renderContactBadge = (contact) => (0, jsx_runtime_1.jsx)("span", { children: contact.name });
191
193
  const updateRole = async (memberId, newRole) => {
192
194
  try {
193
195
  const member = await groupMembersTable.get(memberId);
194
196
  if (member) {
195
197
  member.role = newRole;
196
198
  await groupMembersTable.signAndSave(member);
197
- setRefreshKey(prev => prev + 1);
199
+ setRefreshKey((prev) => prev + 1);
198
200
  }
199
201
  }
200
202
  catch (err) {
201
- console.error('Failed to update role:', err);
202
- alert('Failed to update member role.');
203
+ console.error("Failed to update role:", err);
204
+ alert("Failed to update member role.");
203
205
  }
204
206
  };
205
207
  const removeMember = async (memberId) => {
206
- if (!confirm('Remove this member from the group?'))
208
+ if (!confirm("Remove this member from the group?"))
207
209
  return;
208
210
  try {
209
211
  await groupMembersTable.delete(memberId);
210
- setRefreshKey(prev => prev + 1);
212
+ setRefreshKey((prev) => prev + 1);
211
213
  }
212
214
  catch (err) {
213
- console.error('Failed to remove member:', err);
214
- alert('Failed to remove member.');
215
+ console.error("Failed to remove member:", err);
216
+ alert("Failed to remove member.");
215
217
  }
216
218
  };
217
219
  if (!membersData || !userPermissions || !founderData) {
218
- return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
220
+ return (0, jsx_runtime_1.jsx)(loading_indicator_1.LoadingIndicator, {});
219
221
  }
220
222
  const { canEdit, userRole, currentUserId } = userPermissions;
221
- return (react_1.default.createElement("div", null,
222
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center mb-3" },
223
- react_1.default.createElement("h6", { className: "mb-0" }, "Group Members"),
224
- react_1.default.createElement("div", { className: "d-flex align-items-center gap-2" },
225
- react_1.default.createElement("div", { className: `alert alert-${userRole ? 'primary' : 'warning'} py-2 px-3 mb-0 d-flex align-items-center` },
226
- react_1.default.createElement("i", { className: `bi ${userRole ? 'bi-person-badge' : 'bi-exclamation-triangle'} me-2` }),
227
- react_1.default.createElement("strong", null,
228
- "Your role: ",
229
- (0, peers_sdk_1.getRoleLabel)(userRole))),
230
- founderData && founderData.founderUserId !== currentUserId && (react_1.default.createElement("a", { href: `#contacts/${founderData.founderUserId}`, className: "alert alert-warning py-2 px-3 mb-0 d-flex align-items-center text-decoration-none", style: { cursor: 'pointer' } },
231
- react_1.default.createElement("i", { className: "bi bi-crown-fill me-2" }),
232
- react_1.default.createElement("strong", null,
233
- "Founder: ",
234
- founderData.founderUser?.name || founderData.founderUserId))))),
235
- canEdit && (react_1.default.createElement(group_invite_listener_1.GroupInviteListener, { groupId: groupId, userContext: userContext })),
236
- canEdit && (react_1.default.createElement("div", { className: "card mb-3" },
237
- react_1.default.createElement("div", { className: "card-body" },
238
- react_1.default.createElement("h6", { className: "card-title" }, "Add Existing Contact as Member"),
239
- react_1.default.createElement("div", { className: "row g-2" },
240
- react_1.default.createElement("div", { className: "col-md-6" },
241
- react_1.default.createElement(typeahead_1.Typeahead, { placeholder: "Search contacts to add...", searchFn: searchContacts, onSelectionChange: (items) => setSelectedContacts(items), renderItem: renderContactItem, renderBadge: renderContactBadge, selectedItems: selectedContacts.map(contact => ({ ...contact, id: contact.userId })), multiSelect: true, disabled: addingMember })),
242
- react_1.default.createElement("div", { className: "col-md-3" },
243
- react_1.default.createElement("select", { className: "form-select", value: newMemberRole, onChange: (e) => setNewMemberRole(Number(e.target.value) || 0), disabled: addingMember },
244
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.None }, "None"),
245
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Reader }, "Reader"),
246
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Writer }, "Writer"),
247
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Admin }, "Admin"),
248
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Owner }, "Owner"))),
249
- react_1.default.createElement("div", { className: "col-md-3" },
250
- react_1.default.createElement("button", { className: "btn btn-primary w-100", onClick: addMember, disabled: addingMember || selectedContacts.length === 0 }, addingMember ? 'Adding...' :
251
- selectedContacts.length === 1 ? 'Add Member' :
252
- selectedContacts.length > 1 ? `Add ${selectedContacts.length} Members` : 'Add')))))),
253
- !canEdit && userRole && (react_1.default.createElement("div", { className: "alert alert-info" },
254
- react_1.default.createElement("i", { className: "bi bi-info-circle me-2" }),
255
- "You can view group members, but only admins and owners can manage membership.")),
256
- membersData.length === 0 ? (react_1.default.createElement("div", { className: "alert alert-info" }, "No members in this group yet. Add the first member above.")) : (react_1.default.createElement("div", { className: "list-group" }, membersData.map(({ member, user }) => (react_1.default.createElement("div", { key: member.groupMemberId, className: "list-group-item" },
257
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
258
- react_1.default.createElement("div", { className: "flex-grow-1" },
259
- react_1.default.createElement("div", { className: "d-flex align-items-center" },
260
- react_1.default.createElement("i", { className: "bi bi-person-fill me-2" }),
261
- react_1.default.createElement("div", null,
262
- react_1.default.createElement("div", { className: "d-flex align-items-center" },
263
- react_1.default.createElement("strong", null,
264
- user?.name || member.userId,
265
- member.userId === currentUserId && ' (You)'),
266
- user?.source === 'userDataContext' && (react_1.default.createElement("span", { className: "badge bg-info ms-2", style: { fontSize: '0.7rem' } },
267
- react_1.default.createElement("i", { className: "bi bi-person me-1" }),
268
- "Personal")),
269
- user?.source === 'otherDataContexts' && (react_1.default.createElement("span", { className: "badge bg-secondary ms-2", style: { fontSize: '0.7rem' } },
270
- react_1.default.createElement("i", { className: "bi bi-people me-1" }),
271
- "Other Groups"))),
272
- user && user.userId !== user.name && (react_1.default.createElement("small", { className: "text-muted d-block" }, member.userId))))),
273
- react_1.default.createElement("div", { className: "d-flex align-items-center" },
274
- react_1.default.createElement("div", { className: "me-2" },
275
- react_1.default.createElement(trust_level_badge_1.TrustLevelBadge, { level: user?.trustLevel || peers_sdk_1.TrustLevel.Unknown })),
276
- react_1.default.createElement("a", { href: `#contacts/${member.userId}`, className: "btn btn-outline-primary btn-sm me-2" },
277
- react_1.default.createElement("i", { className: "bi-eye me-1" }),
278
- "View"),
279
- canEdit ? (react_1.default.createElement(react_1.default.Fragment, null,
280
- react_1.default.createElement("select", { className: "form-select form-select-sm me-2", style: { width: '120px' }, value: member.role, onChange: (e) => updateRole(member.groupMemberId, Number(e.target.value) || 0) },
281
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.None }, "None"),
282
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Reader }, "Reader"),
283
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Writer }, "Writer"),
284
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Admin }, "Admin"),
285
- react_1.default.createElement("option", { value: peers_sdk_1.GroupMemberRole.Owner }, "Owner")),
286
- react_1.default.createElement("button", { className: "btn btn-outline-danger btn-sm", onClick: () => removeMember(member.groupMemberId), title: "Remove member" },
287
- react_1.default.createElement("i", { className: "bi bi-trash" })))) : (
288
- /* Read-only role display for non-admins */
289
- react_1.default.createElement("span", { className: "badge bg-secondary text-capitalize" }, (0, peers_sdk_1.getRoleLabel)(member.role)))))))))),
290
- react_1.default.createElement("div", { className: "mt-4" },
291
- react_1.default.createElement("small", { className: "text-muted" },
292
- react_1.default.createElement("strong", null, "Roles:"),
293
- react_1.default.createElement("br", null),
294
- react_1.default.createElement("strong", null, "Reader:"),
295
- " Can view group content",
296
- react_1.default.createElement("br", null),
297
- react_1.default.createElement("strong", null, "Writer:"),
298
- " Can create and edit content",
299
- react_1.default.createElement("br", null),
300
- react_1.default.createElement("strong", null, "Admin:"),
301
- " Can manage members and settings",
302
- react_1.default.createElement("br", null),
303
- react_1.default.createElement("strong", null, "Owner:"),
304
- " Full control including group deletion"))));
223
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex justify-content-between align-items-center mb-3", children: [(0, jsx_runtime_1.jsx)("h6", { className: "mb-0", children: "Group Members" }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center gap-2", children: [(0, jsx_runtime_1.jsxs)("div", { className: `alert alert-${userRole ? "primary" : "warning"} py-2 px-3 mb-0 d-flex align-items-center`, children: [(0, jsx_runtime_1.jsx)("i", { className: `bi ${userRole ? "bi-person-badge" : "bi-exclamation-triangle"} me-2` }), (0, jsx_runtime_1.jsxs)("strong", { children: ["Your role: ", (0, peers_sdk_1.getRoleLabel)(userRole)] })] }), founderData && founderData.founderUserId !== currentUserId && ((0, jsx_runtime_1.jsxs)("a", { href: `#contacts/${founderData.founderUserId}`, className: "alert alert-warning py-2 px-3 mb-0 d-flex align-items-center text-decoration-none", style: { cursor: "pointer" }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-crown-fill me-2" }), (0, jsx_runtime_1.jsxs)("strong", { children: ["Founder: ", founderData.founderUser?.name || founderData.founderUserId] })] }))] })] }), canEdit && (0, jsx_runtime_1.jsx)(group_invite_listener_1.GroupInviteListener, { groupId: groupId, userContext: userContext }), canEdit && ((0, jsx_runtime_1.jsx)("div", { className: "card mb-3", children: (0, jsx_runtime_1.jsxs)("div", { className: "card-body", children: [(0, jsx_runtime_1.jsx)("h6", { className: "card-title", children: "Add Existing Contact as Member" }), (0, jsx_runtime_1.jsxs)("div", { className: "row g-2", children: [(0, jsx_runtime_1.jsx)("div", { className: "col-md-6", children: (0, jsx_runtime_1.jsx)(typeahead_1.Typeahead, { placeholder: "Search contacts to add...", searchFn: searchContacts, onSelectionChange: (items) => setSelectedContacts(items), renderItem: renderContactItem, renderBadge: renderContactBadge, selectedItems: selectedContacts.map((contact) => ({
224
+ ...contact,
225
+ id: contact.userId,
226
+ })), multiSelect: true, disabled: addingMember }) }), (0, jsx_runtime_1.jsx)("div", { className: "col-md-3", children: (0, jsx_runtime_1.jsxs)("select", { className: "form-select", value: newMemberRole, onChange: (e) => setNewMemberRole(Number(e.target.value) || 0), disabled: addingMember, children: [(0, jsx_runtime_1.jsx)("option", { value: peers_sdk_1.GroupMemberRole.None, children: "None" }), (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)("option", { value: peers_sdk_1.GroupMemberRole.Owner, children: "Owner" })] }) }), (0, jsx_runtime_1.jsx)("div", { className: "col-md-3", children: (0, jsx_runtime_1.jsx)("button", { className: "btn btn-primary w-100", onClick: addMember, disabled: addingMember || selectedContacts.length === 0, children: addingMember
227
+ ? "Adding..."
228
+ : selectedContacts.length === 1
229
+ ? "Add Member"
230
+ : selectedContacts.length > 1
231
+ ? `Add ${selectedContacts.length} Members`
232
+ : "Add" }) })] })] }) })), !canEdit && userRole && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-info", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-info-circle me-2" }), "You can view group members, but only admins and owners can manage membership."] })), membersData.length === 0 ? ((0, jsx_runtime_1.jsx)("div", { className: "alert alert-info", children: "No members in this group yet. Add the first member above." })) : ((0, jsx_runtime_1.jsx)("div", { className: "list-group", children: membersData.map(({ member, user }) => ((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.jsx)("div", { className: "flex-grow-1", children: (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-person-fill me-2" }), (0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center", children: [(0, jsx_runtime_1.jsxs)("strong", { children: [user?.name || member.userId, member.userId === currentUserId && " (You)"] }), user?.source === "userDataContext" && ((0, jsx_runtime_1.jsxs)("span", { className: "badge bg-info ms-2", style: { fontSize: "0.7rem" }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-person me-1" }), "Personal"] })), user?.source === "otherDataContexts" && ((0, jsx_runtime_1.jsxs)("span", { className: "badge bg-secondary ms-2", style: { fontSize: "0.7rem" }, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi bi-people me-1" }), "Other Groups"] }))] }), user && user.userId !== user.name && ((0, jsx_runtime_1.jsx)("small", { className: "text-muted d-block", children: member.userId }))] })] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "d-flex align-items-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "me-2", children: (0, jsx_runtime_1.jsx)(trust_level_badge_1.TrustLevelBadge, { level: user?.trustLevel || peers_sdk_1.TrustLevel.Unknown }) }), (0, jsx_runtime_1.jsxs)("a", { href: `#contacts/${member.userId}`, className: "btn btn-outline-primary btn-sm me-2", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-eye me-1" }), "View"] }), canEdit ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("select", { className: "form-select form-select-sm me-2", style: { width: "120px" }, value: member.role, onChange: (e) => updateRole(member.groupMemberId, Number(e.target.value) || 0), children: [(0, jsx_runtime_1.jsx)("option", { value: peers_sdk_1.GroupMemberRole.None, children: "None" }), (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)("option", { value: peers_sdk_1.GroupMemberRole.Owner, children: "Owner" })] }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-outline-danger btn-sm", onClick: () => removeMember(member.groupMemberId), title: "Remove member", children: (0, jsx_runtime_1.jsx)("i", { className: "bi bi-trash" }) })] })) : (
233
+ /* Read-only role display for non-admins */
234
+ (0, jsx_runtime_1.jsx)("span", { className: "badge bg-secondary text-capitalize", children: (0, peers_sdk_1.getRoleLabel)(member.role) }))] })] }) }, member.groupMemberId))) })), (0, jsx_runtime_1.jsx)("div", { className: "mt-4", children: (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [(0, jsx_runtime_1.jsx)("strong", { children: "Roles:" }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("strong", { children: "Reader:" }), " Can view group content", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("strong", { children: "Writer:" }), " Can create and edit content", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("strong", { children: "Admin:" }), " Can manage members and settings", (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("strong", { children: "Owner:" }), " Full control including group deletion"] }) })] }));
305
235
  };
306
236
  exports.GroupMembersUI = GroupMembersUI;
@@ -1,6 +1,6 @@
1
- import './group-list';
2
- import './group-details';
3
- import './group-members';
4
- export * from "./group-list";
1
+ import "./group-list";
2
+ import "./group-details";
3
+ import "./group-members";
5
4
  export * from "./group-details";
5
+ export * from "./group-list";
6
6
  export * from "./group-members";
@@ -18,6 +18,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
18
18
  require("./group-list");
19
19
  require("./group-details");
20
20
  require("./group-members");
21
- __exportStar(require("./group-list"), exports);
22
21
  __exportStar(require("./group-details"), exports);
22
+ __exportStar(require("./group-list"), exports);
23
23
  __exportStar(require("./group-members"), exports);
@@ -1,2 +1,2 @@
1
- import './join-group';
2
- export * from './join-group';
1
+ import "./join-group";
2
+ export * from "./join-group";
@@ -9,5 +9,4 @@
9
9
  *
10
10
  * Communicates with device layer through pvars (not direct imports).
11
11
  */
12
- import React from "react";
13
- export declare const JoinGroup: () => React.JSX.Element;
12
+ export declare const JoinGroup: () => import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JoinGroup = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
2
5
  /**
3
6
  * Join Group screen - allows users to join a group by entering an invitation password.
4
7
  *
@@ -10,47 +13,12 @@
10
13
  *
11
14
  * Communicates with device layer through pvars (not direct imports).
12
15
  */
13
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
- if (k2 === undefined) k2 = k;
15
- var desc = Object.getOwnPropertyDescriptor(m, k);
16
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
- desc = { enumerable: true, get: function() { return m[k]; } };
18
- }
19
- Object.defineProperty(o, k2, desc);
20
- }) : (function(o, m, k, k2) {
21
- if (k2 === undefined) k2 = k;
22
- o[k2] = m[k];
23
- }));
24
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
- Object.defineProperty(o, "default", { enumerable: true, value: v });
26
- }) : function(o, v) {
27
- o["default"] = v;
28
- });
29
- var __importStar = (this && this.__importStar) || (function () {
30
- var ownKeys = function(o) {
31
- ownKeys = Object.getOwnPropertyNames || function (o) {
32
- var ar = [];
33
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
- return ar;
35
- };
36
- return ownKeys(o);
37
- };
38
- return function (mod) {
39
- if (mod && mod.__esModule) return mod;
40
- var result = {};
41
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
- __setModuleDefault(result, mod);
43
- return result;
44
- };
45
- })();
46
- Object.defineProperty(exports, "__esModule", { value: true });
47
- exports.JoinGroup = void 0;
48
- const react_1 = __importStar(require("react"));
49
16
  const peers_sdk_1 = require("@peers-app/peers-sdk");
17
+ const react_1 = require("react");
50
18
  const loading_indicator_1 = require("../../components/loading-indicator");
19
+ const globals_1 = require("../../globals");
51
20
  const hooks_1 = require("../../hooks");
52
21
  const ui_loader_1 = require("../../ui-router/ui-loader");
53
- const globals_1 = require("../../globals");
54
22
  const JoinGroup = () => {
55
23
  const userContext = (0, hooks_1.usePromise)(() => (0, peers_sdk_1.getUserContext)());
56
24
  // State
@@ -58,7 +26,7 @@ const JoinGroup = () => {
58
26
  const [isSearching, setIsSearching] = (0, react_1.useState)(false);
59
27
  const [isJoining, setIsJoining] = (0, react_1.useState)(false);
60
28
  const [error, setError] = (0, react_1.useState)(null);
61
- const [currentJoiningGroup, setCurrentJoiningGroup] = (0, react_1.useState)(null);
29
+ const [_currentJoiningGroup, setCurrentJoiningGroup] = (0, react_1.useState)(null);
62
30
  // Observable state from device layer
63
31
  const [status] = (0, hooks_1.useObservable)(peers_sdk_1.groupJoinStatus);
64
32
  const [discoveredListeners] = (0, hooks_1.useObservable)(peers_sdk_1.groupInviteDiscoveryResult);
@@ -115,77 +83,9 @@ const JoinGroup = () => {
115
83
  }
116
84
  }, [password, isSearching, handleSearch]);
117
85
  if (!userContext) {
118
- return react_1.default.createElement(loading_indicator_1.LoadingIndicator, null);
86
+ return (0, jsx_runtime_1.jsx)(loading_indicator_1.LoadingIndicator, {});
119
87
  }
120
- return (react_1.default.createElement("div", { className: "container-fluid p-4", style: { maxWidth: "600px" } },
121
- react_1.default.createElement("div", { className: "text-center mb-4" },
122
- react_1.default.createElement("h2", null,
123
- react_1.default.createElement("i", { className: "bi-box-arrow-in-right me-2" }),
124
- "Join Group"),
125
- react_1.default.createElement("p", { className: "text-muted" }, "Enter the invitation password to find and join a group")),
126
- joinResult?.success && (react_1.default.createElement("div", { className: "text-center" },
127
- react_1.default.createElement("div", { className: "mb-4" },
128
- react_1.default.createElement("i", { className: "bi-check-circle-fill text-success", style: { fontSize: "4rem" } })),
129
- react_1.default.createElement("h4", { className: "text-success mb-3" }, "Successfully Joined!"),
130
- react_1.default.createElement("p", { className: "text-muted" }, "Redirecting to the group..."),
131
- react_1.default.createElement("button", { className: "btn btn-outline-primary", onClick: handleReset },
132
- react_1.default.createElement("i", { className: "bi-plus-lg me-2" }),
133
- "Join Another Group"))),
134
- !joinResult?.success && (react_1.default.createElement(react_1.default.Fragment, null,
135
- react_1.default.createElement("div", { className: "card mb-4" },
136
- react_1.default.createElement("div", { className: "card-body" },
137
- react_1.default.createElement("label", { className: "form-label" },
138
- react_1.default.createElement("i", { className: "bi-key-fill me-2" }),
139
- "Invitation Password"),
140
- react_1.default.createElement("div", { className: "input-group" },
141
- react_1.default.createElement("input", { type: "text", className: "form-control form-control-lg font-monospace", value: password, onChange: (e) => setPassword(e.target.value), onKeyDown: handleKeyDown, placeholder: "Enter password (e.g., apple-banana-cherry-date)", disabled: isSearching || isJoining, autoFocus: true }),
142
- react_1.default.createElement("button", { className: "btn btn-primary", onClick: handleSearch, disabled: !password || isSearching || isJoining }, isSearching ? (react_1.default.createElement(react_1.default.Fragment, null,
143
- react_1.default.createElement("span", { className: "spinner-border spinner-border-sm me-2" }),
144
- "Searching...")) : (react_1.default.createElement(react_1.default.Fragment, null,
145
- react_1.default.createElement("i", { className: "bi-search me-2" }),
146
- "Search")))),
147
- react_1.default.createElement("small", { className: "text-muted" }, "Ask the group admin for the invitation password"))),
148
- error && (react_1.default.createElement("div", { className: "alert alert-danger" },
149
- react_1.default.createElement("i", { className: "bi-exclamation-triangle me-2" }),
150
- error)),
151
- status && !error && (react_1.default.createElement("div", { className: "alert alert-info" },
152
- react_1.default.createElement("i", { className: "bi-info-circle me-2" }),
153
- status)),
154
- joinResult && !joinResult.success && (react_1.default.createElement("div", { className: "alert alert-warning" },
155
- react_1.default.createElement("i", { className: "bi-exclamation-circle me-2" }),
156
- joinResult.error || "Join request was not approved")),
157
- discoveredListeners && discoveredListeners.length > 0 && (react_1.default.createElement("div", { className: "card" },
158
- react_1.default.createElement("div", { className: "card-header" },
159
- react_1.default.createElement("h6", { className: "mb-0" },
160
- react_1.default.createElement("i", { className: "bi-broadcast me-2" }),
161
- "Found Groups (",
162
- discoveredListeners.length,
163
- ")")),
164
- react_1.default.createElement("div", { className: "list-group list-group-flush" }, discoveredListeners.map((listener, index) => (react_1.default.createElement("div", { key: `${listener.deviceId}-${index}`, className: "list-group-item" },
165
- react_1.default.createElement("div", { className: "d-flex justify-content-between align-items-center" },
166
- react_1.default.createElement("div", null,
167
- react_1.default.createElement("div", { className: "d-flex align-items-center mb-1" },
168
- react_1.default.createElement("i", { className: `${listener.group.iconClassName || "bi-people-fill"} me-2` }),
169
- react_1.default.createElement("strong", null, listener.group.name)),
170
- listener.group.description && (react_1.default.createElement("p", { className: "text-muted mb-1 small" }, listener.group.description)),
171
- react_1.default.createElement("small", { className: "text-muted" },
172
- react_1.default.createElement("i", { className: "bi-person me-1" }),
173
- "Invited by: ",
174
- listener.name || listener.userId)),
175
- react_1.default.createElement("button", { className: "btn btn-success", onClick: () => handleJoin(listener), disabled: isJoining }, isJoining ? (react_1.default.createElement(react_1.default.Fragment, null,
176
- react_1.default.createElement("span", { className: "spinner-border spinner-border-sm me-2" }),
177
- "Joining...")) : (react_1.default.createElement(react_1.default.Fragment, null,
178
- react_1.default.createElement("i", { className: "bi-box-arrow-in-right me-2" }),
179
- "Join")))))))))),
180
- isSearching && (react_1.default.createElement("div", { className: "text-center py-4" },
181
- react_1.default.createElement("div", { className: "spinner-border text-primary mb-3", role: "status" },
182
- react_1.default.createElement("span", { className: "visually-hidden" }, "Searching...")),
183
- react_1.default.createElement("p", { className: "text-muted" }, "Searching for groups..."))),
184
- isJoining && (react_1.default.createElement("div", { className: "text-center py-4" },
185
- react_1.default.createElement("div", { className: "spinner-border text-success mb-3", role: "status" },
186
- react_1.default.createElement("span", { className: "visually-hidden" }, "Joining...")),
187
- react_1.default.createElement("p", { className: "text-muted" }, "Waiting for approval..."),
188
- react_1.default.createElement("small", { className: "text-muted" }, "The group admin needs to approve your request")))))));
88
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "container-fluid p-4", style: { maxWidth: "600px" }, children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-center mb-4", children: [(0, jsx_runtime_1.jsxs)("h2", { children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-box-arrow-in-right me-2" }), "Join Group"] }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted", children: "Enter the invitation password to find and join a group" })] }), joinResult?.success && ((0, jsx_runtime_1.jsxs)("div", { className: "text-center", children: [(0, jsx_runtime_1.jsx)("div", { className: "mb-4", children: (0, jsx_runtime_1.jsx)("i", { className: "bi-check-circle-fill text-success", style: { fontSize: "4rem" } }) }), (0, jsx_runtime_1.jsx)("h4", { className: "text-success mb-3", children: "Successfully Joined!" }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted", children: "Redirecting to the group..." }), (0, jsx_runtime_1.jsxs)("button", { className: "btn btn-outline-primary", onClick: handleReset, children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-plus-lg me-2" }), "Join Another Group"] })] })), !joinResult?.success && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: "card mb-4", children: (0, jsx_runtime_1.jsxs)("div", { className: "card-body", children: [(0, jsx_runtime_1.jsxs)("label", { className: "form-label", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-key-fill me-2" }), "Invitation Password"] }), (0, jsx_runtime_1.jsxs)("div", { className: "input-group", children: [(0, jsx_runtime_1.jsx)("input", { type: "text", className: "form-control form-control-lg font-monospace", value: password, onChange: (e) => setPassword(e.target.value), onKeyDown: handleKeyDown, placeholder: "Enter password (e.g., apple-banana-cherry-date)", disabled: isSearching || isJoining }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-primary", onClick: handleSearch, disabled: !password || isSearching || isJoining, children: isSearching ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-2" }), "Searching..."] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-search me-2" }), "Search"] })) })] }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: "Ask the group admin for the invitation password" })] }) }), error && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-danger", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-exclamation-triangle me-2" }), error] })), status && !error && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-info", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-info-circle me-2" }), status] })), joinResult && !joinResult.success && ((0, jsx_runtime_1.jsxs)("div", { className: "alert alert-warning", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-exclamation-circle me-2" }), joinResult.error || "Join request was not approved"] })), discoveredListeners && discoveredListeners.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "card", 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-broadcast me-2" }), "Found Groups (", discoveredListeners.length, ")"] }) }), (0, jsx_runtime_1.jsx)("div", { className: "list-group list-group-flush", children: discoveredListeners.map((listener, index) => ((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 mb-1", children: [(0, jsx_runtime_1.jsx)("i", { className: `${listener.group.iconClassName || "bi-people-fill"} me-2` }), (0, jsx_runtime_1.jsx)("strong", { children: listener.group.name })] }), listener.group.description && ((0, jsx_runtime_1.jsx)("p", { className: "text-muted mb-1 small", children: listener.group.description })), (0, jsx_runtime_1.jsxs)("small", { className: "text-muted", children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-person me-1" }), "Invited by: ", listener.name || listener.userId] })] }), (0, jsx_runtime_1.jsx)("button", { className: "btn btn-success", onClick: () => handleJoin(listener), disabled: isJoining, children: isJoining ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("span", { className: "spinner-border spinner-border-sm me-2" }), "Joining..."] })) : ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("i", { className: "bi-box-arrow-in-right me-2" }), "Join"] })) })] }) }, `${listener.deviceId}-${index}`))) })] })), isSearching && ((0, jsx_runtime_1.jsxs)("div", { className: "text-center py-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "spinner-border text-primary mb-3", role: "status", children: (0, jsx_runtime_1.jsx)("span", { className: "visually-hidden", children: "Searching..." }) }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted", children: "Searching for groups..." })] })), isJoining && ((0, jsx_runtime_1.jsxs)("div", { className: "text-center py-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "spinner-border text-success mb-3", role: "status", children: (0, jsx_runtime_1.jsx)("span", { className: "visually-hidden", children: "Joining..." }) }), (0, jsx_runtime_1.jsx)("p", { className: "text-muted", children: "Waiting for approval..." }), (0, jsx_runtime_1.jsx)("small", { className: "text-muted", children: "The group admin needs to approve your request" })] }))] }))] }));
189
89
  };
190
90
  exports.JoinGroup = JoinGroup;
191
91
  // Register the route
@@ -194,7 +94,7 @@ exports.JoinGroup = JoinGroup;
194
94
  component: exports.JoinGroup,
195
95
  routes: [
196
96
  {
197
- isMatch: (props, context) => context.path === "join-group",
97
+ isMatch: (_props, context) => context.path === "join-group",
198
98
  uiCategory: "screen",
199
99
  priority: 2,
200
100
  },
@@ -1,14 +1,13 @@
1
- import React from 'react';
2
1
  export interface IDiagnosticCheck {
3
2
  id: string;
4
3
  label: string;
5
4
  layer: string;
6
- status: 'pass' | 'fail' | 'warn' | 'skip' | 'running';
5
+ status: "pass" | "fail" | "warn" | "skip" | "running";
7
6
  detail: string;
8
7
  suggestion?: string;
9
8
  }
10
9
  interface Props {
11
10
  onBack: () => void;
12
11
  }
13
- export declare function ConnectionTroubleshooter({ onBack }: Props): React.JSX.Element;
12
+ export declare function ConnectionTroubleshooter({ onBack }: Props): import("react/jsx-runtime").JSX.Element;
14
13
  export {};