@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,22 +1,25 @@
1
- import React from 'react';
2
- import { useObservable } from '../hooks';
1
+ import type { Observable } from "@peers-app/peers-sdk";
2
+ import type React from "react";
3
+ import { useObservable } from "../hooks";
3
4
 
4
- interface IProps extends React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
5
- checked: any,
6
- type?: React.HTMLInputTypeAttribute
5
+ interface IProps
6
+ extends Omit<
7
+ React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement>,
8
+ "checked"
9
+ > {
10
+ checked?: boolean | Observable<boolean | undefined>;
11
+ type?: React.HTMLInputTypeAttribute;
7
12
  }
8
13
 
9
14
  export function Checkbox(props: IProps) {
10
15
  const [checked, setChecked] = useObservable(props.checked);
11
- const type = props.type ?? 'checkbox';
16
+ const type = props.type ?? "checkbox";
12
17
  function onChange(evt: React.ChangeEvent<HTMLInputElement>) {
13
- let _value: any = evt.target.checked;
14
- if (type === 'checkbox') {
18
+ let _value: boolean = evt.target.checked;
19
+ if (type === "checkbox") {
15
20
  _value = !!_value;
16
21
  }
17
22
  setChecked(_value);
18
23
  }
19
- return (
20
- <input onChange={onChange} type={type} {...props} checked={checked} />
21
- )
22
- }
24
+ return <input onChange={onChange} type={type} {...props} checked={checked} />;
25
+ }
@@ -1,6 +1,19 @@
1
- import { getMe, getUserContext, Groups, IGroup, newid, newKeys, peersCorePackageId, rpcServerCalls, setUserTrustLevel, TrustLevel, UserContext, Users } from "@peers-app/peers-sdk";
2
- import React, { useEffect, useState } from 'react';
3
- import { usePromise } from '../hooks';
1
+ import {
2
+ Groups,
3
+ getMe,
4
+ getUserContext,
5
+ type IGroup,
6
+ newid,
7
+ newKeys,
8
+ peersCorePackageId,
9
+ rpcServerCalls,
10
+ setUserTrustLevel,
11
+ TrustLevel,
12
+ type UserContext,
13
+ Users,
14
+ } from "@peers-app/peers-sdk";
15
+ import React, { useEffect, useState } from "react";
16
+ import { usePromise } from "../hooks";
4
17
 
5
18
  interface GroupSwitcherProps {
6
19
  colorMode: string;
@@ -32,13 +45,13 @@ export function GroupSwitcher({ colorMode, isMobile = false }: GroupSwitcherProp
32
45
  const currentGroupId = userContext?.currentlyActiveGroupId();
33
46
  if (!currentGroupId) return null;
34
47
  return allGroups.find((g: IGroup) => g.groupId === currentGroupId) || null;
35
- }, [allGroups, userContext?.currentlyActiveGroupId()]);
48
+ }, [allGroups, userContext?.currentlyActiveGroupId]);
36
49
 
37
50
  const handleGroupSelect = (group: IGroup | null) => {
38
51
  if (!userContext) return;
39
52
 
40
53
  // Set the active group through user context
41
- userContext.currentlyActiveGroupId(group?.groupId || '');
54
+ userContext.currentlyActiveGroupId(group?.groupId || "");
42
55
  setShowDropdown(false);
43
56
  };
44
57
 
@@ -48,67 +61,76 @@ export function GroupSwitcher({ colorMode, isMobile = false }: GroupSwitcherProp
48
61
  };
49
62
 
50
63
  const getGroupIcon = (group: IGroup | null | undefined) => {
51
- if (!group) return 'bi-person-fill'; // Personal group icon
52
- return group.iconClassName || 'bi-people-fill';
64
+ if (!group) return "bi-person-fill"; // Personal group icon
65
+ return group.iconClassName || "bi-people-fill";
53
66
  };
54
67
 
55
68
  const getGroupName = (group: IGroup | null | undefined) => {
56
- if (!group) return 'Personal';
69
+ if (!group) return "Personal";
57
70
  return group.name;
58
71
  };
59
72
 
60
- const isDark = colorMode === 'dark';
73
+ const isDark = colorMode === "dark";
61
74
 
62
75
  return (
63
76
  <>
64
77
  <div className="dropdown">
65
78
  <button
66
- className={`btn btn-sm ${isMobile ? '' : 'me-2'} d-flex align-items-center`}
79
+ className={`btn btn-sm ${isMobile ? "" : "me-2"} d-flex align-items-center`}
67
80
  onClick={() => setShowDropdown(!showDropdown)}
68
81
  title={`Current group: ${getGroupName(currentGroup)}`}
69
82
  style={{
70
- padding: isMobile ? '4px' : '4px 8px',
71
- fontSize: '12px',
72
- borderRadius: '6px',
73
- border: 'none',
74
- background: 'transparent',
75
- color: isDark ? '#adb5bd' : '#6c757d',
76
- minWidth: isMobile ? '36px' : undefined
83
+ padding: isMobile ? "4px" : "4px 8px",
84
+ fontSize: "12px",
85
+ borderRadius: "6px",
86
+ border: "none",
87
+ background: "transparent",
88
+ color: isDark ? "#adb5bd" : "#6c757d",
89
+ minWidth: isMobile ? "36px" : undefined,
77
90
  }}
78
91
  onMouseEnter={(e) => {
79
- e.currentTarget.style.backgroundColor = isDark ? '#495057' : '#f8f9fa';
80
- e.currentTarget.style.color = isDark ? '#ffffff' : '#0d6efd';
92
+ e.currentTarget.style.backgroundColor = isDark ? "#495057" : "#f8f9fa";
93
+ e.currentTarget.style.color = isDark ? "#ffffff" : "#0d6efd";
81
94
  }}
82
95
  onMouseLeave={(e) => {
83
- e.currentTarget.style.backgroundColor = 'transparent';
84
- e.currentTarget.style.color = isDark ? '#adb5bd' : '#6c757d';
96
+ e.currentTarget.style.backgroundColor = "transparent";
97
+ e.currentTarget.style.color = isDark ? "#adb5bd" : "#6c757d";
85
98
  }}
86
99
  >
87
- <i className={`${getGroupIcon(currentGroup)} ${isMobile ? '' : 'me-1'}`} style={{ fontSize: '14px' }} />
100
+ <i
101
+ className={`${getGroupIcon(currentGroup)} ${isMobile ? "" : "me-1"}`}
102
+ style={{ fontSize: "14px" }}
103
+ />
88
104
  {!isMobile && (
89
- <span className="text-truncate" style={{ maxWidth: '80px' }}>
105
+ <span className="text-truncate" style={{ maxWidth: "80px" }}>
90
106
  {getGroupName(currentGroup)}
91
107
  </span>
92
108
  )}
93
- <i className="bi-chevron-down ms-1" style={{ fontSize: '10px' }} />
109
+ <i className="bi-chevron-down ms-1" style={{ fontSize: "10px" }} />
94
110
  </button>
95
111
 
96
112
  {showDropdown && (
97
113
  <div
98
- className={`dropdown-menu show position-absolute ${isDark ? 'dropdown-menu-dark' : ''}`}
114
+ className={`dropdown-menu show position-absolute ${isDark ? "dropdown-menu-dark" : ""}`}
99
115
  style={{
100
116
  left: 0,
101
- top: '100%',
117
+ top: "100%",
102
118
  zIndex: 1000,
103
- minWidth: '200px',
104
- maxHeight: '300px',
105
- overflowY: 'auto'
119
+ minWidth: "200px",
120
+ maxHeight: "300px",
121
+ overflowY: "auto",
106
122
  }}
107
123
  >
108
124
  {/* Personal Group */}
109
125
  <button
110
- className={`dropdown-item d-flex align-items-center ${!currentGroup ? 'active' : ''}`}
111
- style={{ cursor: 'pointer', border: 'none', background: 'none', width: '100%', textAlign: 'left' }}
126
+ className={`dropdown-item d-flex align-items-center ${!currentGroup ? "active" : ""}`}
127
+ style={{
128
+ cursor: "pointer",
129
+ border: "none",
130
+ background: "none",
131
+ width: "100%",
132
+ textAlign: "left",
133
+ }}
112
134
  onClick={() => handleGroupSelect(null)}
113
135
  >
114
136
  <i className="bi-person-fill me-2" />
@@ -116,9 +138,7 @@ export function GroupSwitcher({ colorMode, isMobile = false }: GroupSwitcherProp
116
138
  </button>
117
139
 
118
140
  {/* Divider */}
119
- {allGroups.length > 0 && (
120
- <div className="dropdown-divider" />
121
- )}
141
+ {allGroups.length > 0 && <div className="dropdown-divider" />}
122
142
 
123
143
  {/* Group List */}
124
144
  {allGroups
@@ -126,8 +146,14 @@ export function GroupSwitcher({ colorMode, isMobile = false }: GroupSwitcherProp
126
146
  .map((group: IGroup) => (
127
147
  <button
128
148
  key={group.groupId}
129
- className={`dropdown-item d-flex align-items-center ${currentGroup?.groupId === group.groupId ? 'active' : ''}`}
130
- style={{ cursor: 'pointer', border: 'none', background: 'none', width: '100%', textAlign: 'left' }}
149
+ className={`dropdown-item d-flex align-items-center ${currentGroup?.groupId === group.groupId ? "active" : ""}`}
150
+ style={{
151
+ cursor: "pointer",
152
+ border: "none",
153
+ background: "none",
154
+ width: "100%",
155
+ textAlign: "left",
156
+ }}
131
157
  onClick={() => handleGroupSelect(group)}
132
158
  >
133
159
  <i className={`${getGroupIcon(group)} me-2`} />
@@ -139,7 +165,13 @@ export function GroupSwitcher({ colorMode, isMobile = false }: GroupSwitcherProp
139
165
  <div className="dropdown-divider" />
140
166
  <button
141
167
  className="dropdown-item d-flex align-items-center"
142
- style={{ cursor: 'pointer', border: 'none', background: 'none', width: '100%', textAlign: 'left' }}
168
+ style={{
169
+ cursor: "pointer",
170
+ border: "none",
171
+ background: "none",
172
+ width: "100%",
173
+ textAlign: "left",
174
+ }}
143
175
  onClick={handleCreateClick}
144
176
  >
145
177
  <i className="bi-plus-circle me-2" />
@@ -187,25 +219,30 @@ interface CreateGroupModalProps {
187
219
  onGroupCreated: (groupId: string) => void;
188
220
  }
189
221
 
190
- function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: CreateGroupModalProps) {
191
- const [groupName, setGroupName] = useState('');
192
- const [iconClassName, setIconClassName] = useState('bi-people-fill');
193
- const [description, setDescription] = useState('');
222
+ function CreateGroupModal({
223
+ colorMode,
224
+ userContext,
225
+ onClose,
226
+ onGroupCreated,
227
+ }: CreateGroupModalProps) {
228
+ const [groupName, setGroupName] = useState("");
229
+ const [iconClassName, setIconClassName] = useState("bi-people-fill");
230
+ const [description, setDescription] = useState("");
194
231
  const [isCreating, setIsCreating] = useState(false);
195
232
  const [error, setError] = useState<string | null>(null);
196
233
 
197
- const isDark = colorMode === 'dark';
234
+ const isDark = colorMode === "dark";
198
235
 
199
236
  const handleCreate = async () => {
200
237
  // Validate
201
238
  const trimmedName = groupName.trim();
202
239
  if (!trimmedName) {
203
- setError('Group name is required');
240
+ setError("Group name is required");
204
241
  return;
205
242
  }
206
243
 
207
244
  if (trimmedName.length > 100) {
208
- setError('Group name must be 100 characters or less');
245
+ setError("Group name must be 100 characters or less");
209
246
  return;
210
247
  }
211
248
 
@@ -223,16 +260,17 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
223
260
  const groupDataContext = userContext.getDataContext(groupId);
224
261
 
225
262
  // Store groupKeys.secretKey securely for this group
226
- const persistentVarsTable = userContext.userDataContext.tableContainer.getTableByName('PersistentVars');
227
- const groupSecretKeyVarName = 'groupSecretKey_' + groupDataContext.dataContextId;
263
+ const persistentVarsTable =
264
+ userContext.userDataContext.tableContainer.getTableByName("PersistentVars");
265
+ const groupSecretKeyVarName = `groupSecretKey_${groupDataContext.dataContextId}`;
228
266
  await persistentVarsTable.save({
229
267
  persistentVarId: newid(),
230
268
  name: groupSecretKeyVarName,
231
- scope: 'groupUser',
269
+ scope: "groupUser",
232
270
  isSecret: true,
233
271
  value: { value: groupKeys.secretKey },
234
272
  });
235
-
273
+
236
274
  // Add current user to the group's users table
237
275
  await Users(groupDataContext).save(me);
238
276
 
@@ -245,35 +283,37 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
245
283
  groupId,
246
284
  name: trimmedName,
247
285
  description: description.trim(),
248
- iconClassName: iconClassName.trim() || 'bi-people-fill',
286
+ iconClassName: iconClassName.trim() || "bi-people-fill",
249
287
  founderUserId: me.userId,
250
288
  disabled: false,
251
289
  publicKey: groupKeys.publicKey,
252
290
  publicBoxKey: groupKeys.publicBoxKey,
253
- signature: '', // Will be set by signAndSave()
291
+ signature: "", // Will be set by signAndSave()
254
292
  });
255
293
 
256
294
  await Groups(groupDataContext).signAndSave(newGroup);
257
295
 
258
296
  // Auto-install peers-core for the new group
259
- await rpcServerCalls.addOrUpdatePackage(peersCorePackageId, { dataContextId: groupId }).catch((err: any) => {
260
- console.error('Error auto-installing peers-core for group:', err);
261
- });
262
-
297
+ await rpcServerCalls
298
+ .addOrUpdatePackage(peersCorePackageId, { dataContextId: groupId })
299
+ .catch((err: unknown) => {
300
+ console.error("Error auto-installing peers-core for group:", err);
301
+ });
302
+
263
303
  // Notify parent
264
304
  onGroupCreated(newGroup.groupId);
265
- } catch (err: any) {
266
- console.error('Failed to create group:', err);
267
- setError(err.message || 'Failed to create group. Please try again.');
305
+ } catch (err: unknown) {
306
+ console.error("Failed to create group:", err);
307
+ setError(err instanceof Error ? err.message : "Failed to create group. Please try again.");
268
308
  setIsCreating(false);
269
309
  }
270
310
  };
271
311
 
272
312
  const handleKeyDown = (e: React.KeyboardEvent) => {
273
- if (e.key === 'Enter' && !e.shiftKey && groupName.trim()) {
313
+ if (e.key === "Enter" && !e.shiftKey && groupName.trim()) {
274
314
  e.preventDefault();
275
315
  handleCreate();
276
- } else if (e.key === 'Escape') {
316
+ } else if (e.key === "Escape") {
277
317
  onClose();
278
318
  }
279
319
  };
@@ -285,9 +325,9 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
285
325
  top: 0,
286
326
  left: 0,
287
327
  zIndex: 1050,
288
- backgroundColor: 'rgba(0, 0, 0, 0.5)',
289
- backdropFilter: 'blur(4px)',
290
- paddingTop: '10vh'
328
+ backgroundColor: "rgba(0, 0, 0, 0.5)",
329
+ backdropFilter: "blur(4px)",
330
+ paddingTop: "10vh",
291
331
  }}
292
332
  onClick={(e) => {
293
333
  if (e.target === e.currentTarget) {
@@ -296,42 +336,44 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
296
336
  }}
297
337
  >
298
338
  <div
299
- className={`${isDark ? 'bg-dark text-light' : 'bg-white text-dark'}`}
339
+ className={`${isDark ? "bg-dark text-light" : "bg-white text-dark"}`}
300
340
  style={{
301
- width: '90%',
302
- maxWidth: '500px',
303
- borderRadius: '12px',
304
- boxShadow: isDark
305
- ? '0 20px 40px rgba(0, 0, 0, 0.5)'
306
- : '0 20px 40px rgba(0, 0, 0, 0.1)',
307
- border: isDark ? '1px solid #495057' : '1px solid #dee2e6',
308
- overflow: 'hidden'
341
+ width: "90%",
342
+ maxWidth: "500px",
343
+ borderRadius: "12px",
344
+ boxShadow: isDark ? "0 20px 40px rgba(0, 0, 0, 0.5)" : "0 20px 40px rgba(0, 0, 0, 0.1)",
345
+ border: isDark ? "1px solid #495057" : "1px solid #dee2e6",
346
+ overflow: "hidden",
309
347
  }}
310
348
  >
311
349
  {/* Header */}
312
350
  <div
313
351
  className="p-3 border-bottom d-flex align-items-center justify-content-between"
314
352
  style={{
315
- borderBottomColor: isDark ? '#495057' : '#dee2e6'
353
+ borderBottomColor: isDark ? "#495057" : "#dee2e6",
316
354
  }}
317
355
  >
318
356
  <div className="d-flex align-items-center">
319
- <i className="bi-people-fill me-2" style={{ fontSize: '20px' }} />
357
+ <i className="bi-people-fill me-2" style={{ fontSize: "20px" }} />
320
358
  <h6 className="mb-0">Create New Group</h6>
321
359
  </div>
322
360
  <button
323
361
  className="btn btn-sm p-0"
324
362
  style={{
325
- border: 'none',
326
- background: 'none',
327
- fontSize: '24px',
328
- lineHeight: '1',
329
- opacity: 0.6
363
+ border: "none",
364
+ background: "none",
365
+ fontSize: "24px",
366
+ lineHeight: "1",
367
+ opacity: 0.6,
330
368
  }}
331
369
  onClick={onClose}
332
370
  disabled={isCreating}
333
- onMouseEnter={(e) => e.currentTarget.style.opacity = '1'}
334
- onMouseLeave={(e) => e.currentTarget.style.opacity = '0.6'}
371
+ onMouseEnter={(e) => {
372
+ e.currentTarget.style.opacity = "1";
373
+ }}
374
+ onMouseLeave={(e) => {
375
+ e.currentTarget.style.opacity = "0.6";
376
+ }}
335
377
  >
336
378
  <i className="bi-x" />
337
379
  </button>
@@ -341,7 +383,7 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
341
383
  <div className="p-3">
342
384
  {/* Error Alert */}
343
385
  {error && (
344
- <div className="alert alert-danger py-2 px-3 mb-3" style={{ fontSize: '14px' }}>
386
+ <div className="alert alert-danger py-2 px-3 mb-3" style={{ fontSize: "14px" }}>
345
387
  <i className="bi-exclamation-triangle me-2" />
346
388
  {error}
347
389
  </div>
@@ -354,7 +396,7 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
354
396
  </label>
355
397
  <input
356
398
  type="text"
357
- className={`form-control ${isDark ? 'bg-dark text-light border-secondary' : ''}`}
399
+ className={`form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`}
358
400
  placeholder="Enter group name"
359
401
  value={groupName}
360
402
  onChange={(e) => {
@@ -362,15 +404,14 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
362
404
  setError(null);
363
405
  }}
364
406
  onKeyDown={handleKeyDown}
365
- autoFocus
366
407
  disabled={isCreating}
367
408
  maxLength={100}
368
409
  style={{
369
- fontSize: '14px',
370
- backgroundColor: isDark ? '#343a40' : '#ffffff'
410
+ fontSize: "14px",
411
+ backgroundColor: isDark ? "#343a40" : "#ffffff",
371
412
  }}
372
413
  />
373
- <small className="text-muted" style={{ fontSize: '11px' }}>
414
+ <small className="text-muted" style={{ fontSize: "11px" }}>
374
415
  {groupName.length}/100 characters
375
416
  </small>
376
417
  </div>
@@ -380,26 +421,26 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
380
421
  <label className="form-label small mb-1">Icon</label>
381
422
  <div className="input-group">
382
423
  <span
383
- className={`input-group-text ${isDark ? 'bg-dark text-light border-secondary' : ''}`}
384
- style={{ backgroundColor: isDark ? '#343a40' : undefined }}
424
+ className={`input-group-text ${isDark ? "bg-dark text-light border-secondary" : ""}`}
425
+ style={{ backgroundColor: isDark ? "#343a40" : undefined }}
385
426
  >
386
- <i className={iconClassName || 'bi-people-fill'} />
427
+ <i className={iconClassName || "bi-people-fill"} />
387
428
  </span>
388
429
  <input
389
430
  type="text"
390
- className={`form-control ${isDark ? 'bg-dark text-light border-secondary' : ''}`}
431
+ className={`form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`}
391
432
  placeholder="bi-people-fill"
392
433
  value={iconClassName}
393
434
  onChange={(e) => setIconClassName(e.target.value)}
394
435
  onKeyDown={handleKeyDown}
395
436
  disabled={isCreating}
396
437
  style={{
397
- fontSize: '14px',
398
- backgroundColor: isDark ? '#343a40' : '#ffffff'
438
+ fontSize: "14px",
439
+ backgroundColor: isDark ? "#343a40" : "#ffffff",
399
440
  }}
400
441
  />
401
442
  </div>
402
- <small className="text-muted" style={{ fontSize: '11px' }}>
443
+ <small className="text-muted" style={{ fontSize: "11px" }}>
403
444
  Bootstrap icon class name (e.g., bi-star-fill, bi-house-fill)
404
445
  </small>
405
446
  </div>
@@ -408,7 +449,7 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
408
449
  <div className="mb-3">
409
450
  <label className="form-label small mb-1">Description (optional)</label>
410
451
  <textarea
411
- className={`form-control ${isDark ? 'bg-dark text-light border-secondary' : ''}`}
452
+ className={`form-control ${isDark ? "bg-dark text-light border-secondary" : ""}`}
412
453
  placeholder="Enter group description"
413
454
  value={description}
414
455
  onChange={(e) => setDescription(e.target.value)}
@@ -416,12 +457,12 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
416
457
  rows={3}
417
458
  maxLength={500}
418
459
  style={{
419
- fontSize: '14px',
420
- backgroundColor: isDark ? '#343a40' : '#ffffff',
421
- resize: 'none'
460
+ fontSize: "14px",
461
+ backgroundColor: isDark ? "#343a40" : "#ffffff",
462
+ resize: "none",
422
463
  }}
423
464
  />
424
- <small className="text-muted" style={{ fontSize: '11px' }}>
465
+ <small className="text-muted" style={{ fontSize: "11px" }}>
425
466
  {description.length}/500 characters
426
467
  </small>
427
468
  </div>
@@ -431,14 +472,14 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
431
472
  <div
432
473
  className="p-3 border-top d-flex justify-content-end gap-2"
433
474
  style={{
434
- borderTopColor: isDark ? '#495057' : '#dee2e6'
475
+ borderTopColor: isDark ? "#495057" : "#dee2e6",
435
476
  }}
436
477
  >
437
478
  <button
438
- className={`btn btn-sm ${isDark ? 'btn-outline-light' : 'btn-outline-secondary'}`}
479
+ className={`btn btn-sm ${isDark ? "btn-outline-light" : "btn-outline-secondary"}`}
439
480
  onClick={onClose}
440
481
  disabled={isCreating}
441
- style={{ minWidth: '80px' }}
482
+ style={{ minWidth: "80px" }}
442
483
  >
443
484
  Cancel
444
485
  </button>
@@ -446,11 +487,15 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
446
487
  className="btn btn-sm btn-primary"
447
488
  onClick={handleCreate}
448
489
  disabled={isCreating || !groupName.trim()}
449
- style={{ minWidth: '80px' }}
490
+ style={{ minWidth: "80px" }}
450
491
  >
451
492
  {isCreating ? (
452
493
  <>
453
- <span className="spinner-border spinner-border-sm me-1" role="status" aria-hidden="true" />
494
+ <span
495
+ className="spinner-border spinner-border-sm me-1"
496
+ role="status"
497
+ aria-hidden="true"
498
+ />
454
499
  Creating...
455
500
  </>
456
501
  ) : (
@@ -466,8 +511,8 @@ function CreateGroupModal({ colorMode, userContext, onClose, onGroupCreated }: C
466
511
  <div
467
512
  className={`px-3 py-2 small text-muted border-top`}
468
513
  style={{
469
- borderTopColor: isDark ? '#495057' : '#dee2e6',
470
- fontSize: '11px'
514
+ borderTopColor: isDark ? "#495057" : "#dee2e6",
515
+ fontSize: "11px",
471
516
  }}
472
517
  >
473
518
  <kbd className="small">↵</kbd> to create • <kbd className="small">esc</kbd> to cancel
@@ -1,28 +1,29 @@
1
- import React from "react";
1
+ import type { Observable } from "@peers-app/peers-sdk";
2
2
  import moment from "moment-timezone";
3
- import { Observable } from "@peers-app/peers-sdk";
3
+ import type React from "react";
4
4
  import { useObservable } from "../hooks";
5
5
 
6
-
7
- interface IProps extends React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
8
- date: Observable<Date | undefined> | Date | undefined
6
+ interface IProps
7
+ extends React.DetailedHTMLProps<React.InputHTMLAttributes<HTMLInputElement>, HTMLInputElement> {
8
+ date: Observable<Date | undefined> | Date | undefined;
9
9
  }
10
10
  export const InputDate = (props: IProps) => {
11
-
12
11
  const [date, setDate] = useObservable<Date | undefined>(props.date);
13
12
 
14
- const inputProps = { ...props };
15
- // @ts-ignore
16
- delete inputProps.date;
13
+ const { date: _omitDate, ...inputProps } = props;
17
14
 
18
15
  return (
19
16
  <input
20
17
  {...inputProps}
21
- type='date'
22
- value={date?.toISOString?.().substring(0, 10) ?? ''}
23
- onChange={evt => {
24
- setDate(evt.currentTarget.value ? moment(new Date(evt.currentTarget.value)).startOf('day').add(1, 'day').toDate() : undefined)
25
- }}
18
+ type="date"
19
+ value={date?.toISOString?.().substring(0, 10) ?? ""}
20
+ onChange={(evt) => {
21
+ setDate(
22
+ evt.currentTarget.value
23
+ ? moment(new Date(evt.currentTarget.value)).startOf("day").add(1, "day").toDate()
24
+ : undefined,
25
+ );
26
+ }}
26
27
  />
27
- )
28
- }
28
+ );
29
+ };