@peers-app/peers-ui 0.0.14

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 (404) hide show
  1. package/.github/README.md +52 -0
  2. package/.github/workflows/publish.yml +45 -0
  3. package/babel.config.js +7 -0
  4. package/dist/app.d.ts +9 -0
  5. package/dist/app.js +54 -0
  6. package/dist/command-palette/command-palette-ui.d.ts +2 -0
  7. package/dist/command-palette/command-palette-ui.js +192 -0
  8. package/dist/command-palette/command-palette.d.ts +23 -0
  9. package/dist/command-palette/command-palette.js +371 -0
  10. package/dist/components/checkbox.d.ts +7 -0
  11. package/dist/components/checkbox.js +20 -0
  12. package/dist/components/group-switcher.d.ts +6 -0
  13. package/dist/components/group-switcher.js +301 -0
  14. package/dist/components/input-date.d.ts +7 -0
  15. package/dist/components/input-date.js +19 -0
  16. package/dist/components/input-datetime.d.ts +7 -0
  17. package/dist/components/input-datetime.js +35 -0
  18. package/dist/components/input-number.d.ts +9 -0
  19. package/dist/components/input-number.js +87 -0
  20. package/dist/components/input.d.ts +7 -0
  21. package/dist/components/input.js +20 -0
  22. package/dist/components/io-schema-values.d.ts +15 -0
  23. package/dist/components/io-schema-values.js +105 -0
  24. package/dist/components/io-schema.d.ts +13 -0
  25. package/dist/components/io-schema.js +163 -0
  26. package/dist/components/lazy-list.d.ts +13 -0
  27. package/dist/components/lazy-list.js +91 -0
  28. package/dist/components/lazy-sortable-list.d.ts +29 -0
  29. package/dist/components/lazy-sortable-list.js +12 -0
  30. package/dist/components/left-bar.d.ts +3 -0
  31. package/dist/components/left-bar.js +130 -0
  32. package/dist/components/list-screen.d.ts +16 -0
  33. package/dist/components/list-screen.js +100 -0
  34. package/dist/components/loading-indicator.d.ts +2 -0
  35. package/dist/components/loading-indicator.js +12 -0
  36. package/dist/components/main-content-container.d.ts +2 -0
  37. package/dist/components/main-content-container.js +90 -0
  38. package/dist/components/markdown-editor/autolink-plugin.d.ts +2 -0
  39. package/dist/components/markdown-editor/autolink-plugin.js +29 -0
  40. package/dist/components/markdown-editor/editor-inline.d.ts +3 -0
  41. package/dist/components/markdown-editor/editor-inline.js +13 -0
  42. package/dist/components/markdown-editor/editor.d.ts +18 -0
  43. package/dist/components/markdown-editor/editor.js +143 -0
  44. package/dist/components/markdown-editor/markdown-plugin.d.ts +9 -0
  45. package/dist/components/markdown-editor/markdown-plugin.js +194 -0
  46. package/dist/components/markdown-editor/mention-node.d.ts +21 -0
  47. package/dist/components/markdown-editor/mention-node.js +160 -0
  48. package/dist/components/markdown-editor/mentions-plugin.d.ts +7 -0
  49. package/dist/components/markdown-editor/mentions-plugin.js +268 -0
  50. package/dist/components/markdown-editor/theme.d.ts +46 -0
  51. package/dist/components/markdown-editor/theme.js +48 -0
  52. package/dist/components/markdown-editor/toolbar.d.ts +10 -0
  53. package/dist/components/markdown-editor/toolbar.js +112 -0
  54. package/dist/components/markdown-with-mentions.d.ts +4 -0
  55. package/dist/components/markdown-with-mentions.js +140 -0
  56. package/dist/components/message-logs/message-logs.d.ts +6 -0
  57. package/dist/components/message-logs/message-logs.js +307 -0
  58. package/dist/components/messages/avatar.d.ts +10 -0
  59. package/dist/components/messages/avatar.js +65 -0
  60. package/dist/components/messages/channel-message-list.d.ts +14 -0
  61. package/dist/components/messages/channel-message-list.js +158 -0
  62. package/dist/components/messages/channel-view.d.ts +6 -0
  63. package/dist/components/messages/channel-view.js +82 -0
  64. package/dist/components/messages/message-compose.d.ts +11 -0
  65. package/dist/components/messages/message-compose.js +152 -0
  66. package/dist/components/messages/message-display.d.ts +10 -0
  67. package/dist/components/messages/message-display.js +152 -0
  68. package/dist/components/messages/thread-message-list.d.ts +11 -0
  69. package/dist/components/messages/thread-message-list.js +122 -0
  70. package/dist/components/messages/thread-view.d.ts +6 -0
  71. package/dist/components/messages/thread-view.js +174 -0
  72. package/dist/components/off-canvas.d.ts +13 -0
  73. package/dist/components/off-canvas.js +89 -0
  74. package/dist/components/router.d.ts +6 -0
  75. package/dist/components/router.js +240 -0
  76. package/dist/components/save-button.d.ts +13 -0
  77. package/dist/components/save-button.js +75 -0
  78. package/dist/components/sortable-list.d.ts +36 -0
  79. package/dist/components/sortable-list.js +77 -0
  80. package/dist/components/tabs.d.ts +11 -0
  81. package/dist/components/tabs.js +69 -0
  82. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +6 -0
  83. package/dist/components/text-list-editor.tsx/text-list-editor.js +13 -0
  84. package/dist/components/tooltip.d.ts +11 -0
  85. package/dist/components/tooltip.js +20 -0
  86. package/dist/components/top-bar.d.ts +2 -0
  87. package/dist/components/top-bar.js +51 -0
  88. package/dist/components/typeahead/mentions-plugin.d.ts +7 -0
  89. package/dist/components/typeahead/mentions-plugin.js +203 -0
  90. package/dist/components/typeahead/typeahead-editor.d.ts +15 -0
  91. package/dist/components/typeahead/typeahead-editor.js +134 -0
  92. package/dist/components/typeahead/typeahead.d.ts +12 -0
  93. package/dist/components/typeahead/typeahead.js +94 -0
  94. package/dist/components/typeahead.d.ts +22 -0
  95. package/dist/components/typeahead.js +270 -0
  96. package/dist/globals.d.ts +29 -0
  97. package/dist/globals.js +148 -0
  98. package/dist/hooks.d.ts +34 -0
  99. package/dist/hooks.js +137 -0
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.js +20 -0
  102. package/dist/layout-vars.d.ts +6 -0
  103. package/dist/layout-vars.js +10 -0
  104. package/dist/mention-configs.d.ts +18 -0
  105. package/dist/mention-configs.js +149 -0
  106. package/dist/screens/assistants/assistant-config.d.ts +5 -0
  107. package/dist/screens/assistants/assistant-config.js +52 -0
  108. package/dist/screens/assistants/assistant-details.d.ts +4 -0
  109. package/dist/screens/assistants/assistant-details.js +85 -0
  110. package/dist/screens/assistants/assistant-info.d.ts +6 -0
  111. package/dist/screens/assistants/assistant-info.js +28 -0
  112. package/dist/screens/assistants/assistant-list.d.ts +2 -0
  113. package/dist/screens/assistants/assistant-list.js +114 -0
  114. package/dist/screens/assistants/assistant-tools.d.ts +5 -0
  115. package/dist/screens/assistants/assistant-tools.js +38 -0
  116. package/dist/screens/contacts/contact-details.d.ts +6 -0
  117. package/dist/screens/contacts/contact-details.js +100 -0
  118. package/dist/screens/contacts/contact-list.d.ts +2 -0
  119. package/dist/screens/contacts/contact-list.js +213 -0
  120. package/dist/screens/contacts/index.d.ts +4 -0
  121. package/dist/screens/contacts/index.js +21 -0
  122. package/dist/screens/events/cron.d.ts +3 -0
  123. package/dist/screens/events/cron.js +77 -0
  124. package/dist/screens/events/event-details.d.ts +6 -0
  125. package/dist/screens/events/event-details.js +112 -0
  126. package/dist/screens/events/event-handlers.d.ts +7 -0
  127. package/dist/screens/events/event-handlers.js +84 -0
  128. package/dist/screens/events/event-info.d.ts +5 -0
  129. package/dist/screens/events/event-info.js +19 -0
  130. package/dist/screens/events/event-list.d.ts +2 -0
  131. package/dist/screens/events/event-list.js +107 -0
  132. package/dist/screens/events/event-schedule.d.ts +5 -0
  133. package/dist/screens/events/event-schedule.js +124 -0
  134. package/dist/screens/groups/group-details.d.ts +6 -0
  135. package/dist/screens/groups/group-details.js +218 -0
  136. package/dist/screens/groups/group-list.d.ts +2 -0
  137. package/dist/screens/groups/group-list.js +275 -0
  138. package/dist/screens/groups/group-members.d.ts +8 -0
  139. package/dist/screens/groups/group-members.js +315 -0
  140. package/dist/screens/groups/index.d.ts +6 -0
  141. package/dist/screens/groups/index.js +23 -0
  142. package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +6 -0
  143. package/dist/screens/knowledge/knowledge-frame-details.bk.js +84 -0
  144. package/dist/screens/knowledge/knowledge-frame-details.d.ts +8 -0
  145. package/dist/screens/knowledge/knowledge-frame-details.js +143 -0
  146. package/dist/screens/knowledge/knowledge-frame-list.d.ts +2 -0
  147. package/dist/screens/knowledge/knowledge-frame-list.js +45 -0
  148. package/dist/screens/knowledge/knowledge-value-details.d.ts +6 -0
  149. package/dist/screens/knowledge/knowledge-value-details.js +150 -0
  150. package/dist/screens/knowledge/knowledge-value-list-item.d.ts +5 -0
  151. package/dist/screens/knowledge/knowledge-value-list-item.js +39 -0
  152. package/dist/screens/knowledge/knowledge-value-list.d.ts +3 -0
  153. package/dist/screens/knowledge/knowledge-value-list.js +123 -0
  154. package/dist/screens/packages/package-details.d.ts +6 -0
  155. package/dist/screens/packages/package-details.js +82 -0
  156. package/dist/screens/packages/package-info.d.ts +5 -0
  157. package/dist/screens/packages/package-info.js +42 -0
  158. package/dist/screens/packages/package-list.d.ts +2 -0
  159. package/dist/screens/packages/package-list.js +182 -0
  160. package/dist/screens/packages/package-new-local.d.ts +2 -0
  161. package/dist/screens/packages/package-new-local.js +82 -0
  162. package/dist/screens/peer-types/peer-type-details.d.ts +10 -0
  163. package/dist/screens/peer-types/peer-type-details.js +126 -0
  164. package/dist/screens/peer-types/peer-type-list.d.ts +2 -0
  165. package/dist/screens/peer-types/peer-type-list.js +57 -0
  166. package/dist/screens/predicates/predicate-details.d.ts +6 -0
  167. package/dist/screens/predicates/predicate-details.js +103 -0
  168. package/dist/screens/predicates/predicate-list.d.ts +2 -0
  169. package/dist/screens/predicates/predicate-list.js +46 -0
  170. package/dist/screens/profile.d.ts +2 -0
  171. package/dist/screens/profile.js +66 -0
  172. package/dist/screens/search/global-search.d.ts +2 -0
  173. package/dist/screens/search/global-search.js +186 -0
  174. package/dist/screens/settings/color-mode-dropdown.d.ts +6 -0
  175. package/dist/screens/settings/color-mode-dropdown.js +63 -0
  176. package/dist/screens/settings/settings-page.d.ts +2 -0
  177. package/dist/screens/settings/settings-page.js +49 -0
  178. package/dist/screens/setup-user.d.ts +2 -0
  179. package/dist/screens/setup-user.js +270 -0
  180. package/dist/screens/tools/tool-code.d.ts +5 -0
  181. package/dist/screens/tools/tool-code.js +32 -0
  182. package/dist/screens/tools/tool-details.d.ts +6 -0
  183. package/dist/screens/tools/tool-details.js +68 -0
  184. package/dist/screens/tools/tool-info.d.ts +5 -0
  185. package/dist/screens/tools/tool-info.js +74 -0
  186. package/dist/screens/tools/tool-list.d.ts +2 -0
  187. package/dist/screens/tools/tool-list.js +123 -0
  188. package/dist/screens/tools/tool-schema.d.ts +5 -0
  189. package/dist/screens/tools/tool-schema.js +30 -0
  190. package/dist/screens/tools/tool-test-details.d.ts +4 -0
  191. package/dist/screens/tools/tool-test-details.js +54 -0
  192. package/dist/screens/tools/tool-test-list.d.ts +4 -0
  193. package/dist/screens/tools/tool-test-list.js +82 -0
  194. package/dist/screens/variables/variable-details.d.ts +6 -0
  195. package/dist/screens/variables/variable-details.js +140 -0
  196. package/dist/screens/variables/variable-list.d.ts +2 -0
  197. package/dist/screens/variables/variable-list.js +58 -0
  198. package/dist/screens/workflows/workflow-details.d.ts +6 -0
  199. package/dist/screens/workflows/workflow-details.js +122 -0
  200. package/dist/screens/workflows/workflow-info.d.ts +5 -0
  201. package/dist/screens/workflows/workflow-info.js +18 -0
  202. package/dist/screens/workflows/workflow-instructions.d.ts +5 -0
  203. package/dist/screens/workflows/workflow-instructions.js +118 -0
  204. package/dist/screens/workflows/workflow-list.d.ts +2 -0
  205. package/dist/screens/workflows/workflow-list.js +109 -0
  206. package/dist/screens/workflows/workflow-subscriptions.d.ts +6 -0
  207. package/dist/screens/workflows/workflow-subscriptions.js +81 -0
  208. package/dist/setupTests.d.ts +1 -0
  209. package/dist/setupTests.js +31 -0
  210. package/dist/system-apps/assistants.app.d.ts +2 -0
  211. package/dist/system-apps/assistants.app.js +8 -0
  212. package/dist/system-apps/contacts.app.d.ts +2 -0
  213. package/dist/system-apps/contacts.app.js +9 -0
  214. package/dist/system-apps/events.app.d.ts +2 -0
  215. package/dist/system-apps/events.app.js +8 -0
  216. package/dist/system-apps/groups.app.d.ts +2 -0
  217. package/dist/system-apps/groups.app.js +9 -0
  218. package/dist/system-apps/index.d.ts +19 -0
  219. package/dist/system-apps/index.js +90 -0
  220. package/dist/system-apps/knowledge-frames.app.d.ts +2 -0
  221. package/dist/system-apps/knowledge-frames.app.js +9 -0
  222. package/dist/system-apps/knowledge-values.app.d.ts +2 -0
  223. package/dist/system-apps/knowledge-values.app.js +9 -0
  224. package/dist/system-apps/packages.app.d.ts +2 -0
  225. package/dist/system-apps/packages.app.js +8 -0
  226. package/dist/system-apps/predicates.app.d.ts +2 -0
  227. package/dist/system-apps/predicates.app.js +8 -0
  228. package/dist/system-apps/profile.app.d.ts +2 -0
  229. package/dist/system-apps/profile.app.js +8 -0
  230. package/dist/system-apps/search.app.d.ts +2 -0
  231. package/dist/system-apps/search.app.js +9 -0
  232. package/dist/system-apps/settings.app.d.ts +2 -0
  233. package/dist/system-apps/settings.app.js +8 -0
  234. package/dist/system-apps/threads.app.d.ts +2 -0
  235. package/dist/system-apps/threads.app.js +8 -0
  236. package/dist/system-apps/tools.app.d.ts +2 -0
  237. package/dist/system-apps/tools.app.js +8 -0
  238. package/dist/system-apps/types.app.d.ts +2 -0
  239. package/dist/system-apps/types.app.js +8 -0
  240. package/dist/system-apps/variables.app.d.ts +2 -0
  241. package/dist/system-apps/variables.app.js +8 -0
  242. package/dist/system-apps/workflows.app.d.ts +2 -0
  243. package/dist/system-apps/workflows.app.js +8 -0
  244. package/dist/tabs-layout/tabs-layout.d.ts +5 -0
  245. package/dist/tabs-layout/tabs-layout.js +374 -0
  246. package/dist/tabs-layout/tabs-state.d.ts +26 -0
  247. package/dist/tabs-layout/tabs-state.js +239 -0
  248. package/dist/three-bar-layout/left-bar-content.d.ts +7 -0
  249. package/dist/three-bar-layout/left-bar-content.js +151 -0
  250. package/dist/three-bar-layout/right-bar-content.d.ts +2 -0
  251. package/dist/three-bar-layout/right-bar-content.js +64 -0
  252. package/dist/three-bar-layout/three-bar-layout.d.ts +5 -0
  253. package/dist/three-bar-layout/three-bar-layout.js +218 -0
  254. package/dist/ui-defaults/index.d.ts +2 -0
  255. package/dist/ui-defaults/index.js +4 -0
  256. package/dist/ui-defaults/list-screen.d.ts +6 -0
  257. package/dist/ui-defaults/list-screen.js +74 -0
  258. package/dist/ui-defaults/notes-editor.d.ts +7 -0
  259. package/dist/ui-defaults/notes-editor.js +41 -0
  260. package/dist/ui-router/routes-loader.d.ts +25 -0
  261. package/dist/ui-router/routes-loader.js +97 -0
  262. package/dist/ui-router/ui-loader.d.ts +18 -0
  263. package/dist/ui-router/ui-loader.js +481 -0
  264. package/dist/utils.d.ts +9 -0
  265. package/dist/utils.js +250 -0
  266. package/docs/conversation-tab.md +201 -0
  267. package/docs/getting-started.md +284 -0
  268. package/docs/knowledge.md +187 -0
  269. package/docs/tabs-ui.md +696 -0
  270. package/docs/user-contacts-ui.md +384 -0
  271. package/jest.config.js +25 -0
  272. package/package.json +109 -0
  273. package/src/app.tsx +59 -0
  274. package/src/command-palette/command-palette-ui.tsx +264 -0
  275. package/src/command-palette/command-palette.ts +364 -0
  276. package/src/components/checkbox.tsx +22 -0
  277. package/src/components/group-switcher.tsx +469 -0
  278. package/src/components/input-date.tsx +28 -0
  279. package/src/components/input-datetime.tsx +41 -0
  280. package/src/components/input-number.tsx +67 -0
  281. package/src/components/input.tsx +22 -0
  282. package/src/components/io-schema-values.tsx +122 -0
  283. package/src/components/io-schema.tsx +234 -0
  284. package/src/components/lazy-list.tsx +98 -0
  285. package/src/components/lazy-sortable-list.tsx +51 -0
  286. package/src/components/left-bar.tsx +264 -0
  287. package/src/components/list-screen.tsx +105 -0
  288. package/src/components/loading-indicator.tsx +9 -0
  289. package/src/components/main-content-container.tsx +76 -0
  290. package/src/components/markdown-editor/autolink-plugin.tsx +36 -0
  291. package/src/components/markdown-editor/editor-inline.tsx +10 -0
  292. package/src/components/markdown-editor/editor.tsx +152 -0
  293. package/src/components/markdown-editor/markdown-plugin.tsx +224 -0
  294. package/src/components/markdown-editor/mention-node.ts +199 -0
  295. package/src/components/markdown-editor/mentions-plugin.tsx +356 -0
  296. package/src/components/markdown-editor/theme.ts +47 -0
  297. package/src/components/markdown-editor/toolbar.tsx +263 -0
  298. package/src/components/markdown-with-mentions.tsx +183 -0
  299. package/src/components/message-logs/message-logs.tsx +406 -0
  300. package/src/components/messages/avatar.tsx +95 -0
  301. package/src/components/messages/channel-message-list.tsx +177 -0
  302. package/src/components/messages/channel-view.tsx +74 -0
  303. package/src/components/messages/message-compose.tsx +162 -0
  304. package/src/components/messages/message-display.tsx +217 -0
  305. package/src/components/messages/thread-message-list.tsx +126 -0
  306. package/src/components/messages/thread-view.tsx +214 -0
  307. package/src/components/off-canvas.tsx +83 -0
  308. package/src/components/router.tsx +224 -0
  309. package/src/components/save-button.tsx +109 -0
  310. package/src/components/sortable-list.tsx +102 -0
  311. package/src/components/tabs.tsx +70 -0
  312. package/src/components/text-list-editor.tsx/text-list-editor.tsx +13 -0
  313. package/src/components/tooltip.tsx +50 -0
  314. package/src/components/top-bar.tsx +119 -0
  315. package/src/components/typeahead/mentions-plugin.tsx +265 -0
  316. package/src/components/typeahead/typeahead-editor.tsx +140 -0
  317. package/src/components/typeahead/typeahead.tsx +77 -0
  318. package/src/components/typeahead.tsx +359 -0
  319. package/src/globals.tsx +162 -0
  320. package/src/hooks.ts +144 -0
  321. package/src/index.tsx +8 -0
  322. package/src/layout-vars.ts +8 -0
  323. package/src/mention-configs.ts +166 -0
  324. package/src/screens/assistants/assistant-config.tsx +80 -0
  325. package/src/screens/assistants/assistant-details.tsx +77 -0
  326. package/src/screens/assistants/assistant-info.tsx +45 -0
  327. package/src/screens/assistants/assistant-list.tsx +115 -0
  328. package/src/screens/assistants/assistant-tools.tsx +61 -0
  329. package/src/screens/contacts/contact-details.tsx +175 -0
  330. package/src/screens/contacts/contact-list.tsx +251 -0
  331. package/src/screens/contacts/index.ts +6 -0
  332. package/src/screens/events/cron.ts +74 -0
  333. package/src/screens/events/event-details.tsx +117 -0
  334. package/src/screens/events/event-handlers.tsx +61 -0
  335. package/src/screens/events/event-info.tsx +29 -0
  336. package/src/screens/events/event-list.tsx +104 -0
  337. package/src/screens/events/event-schedule.tsx +130 -0
  338. package/src/screens/groups/group-details.tsx +306 -0
  339. package/src/screens/groups/group-list.tsx +366 -0
  340. package/src/screens/groups/group-members.tsx +455 -0
  341. package/src/screens/groups/index.ts +9 -0
  342. package/src/screens/knowledge/knowledge-frame-details.bk.tsx +160 -0
  343. package/src/screens/knowledge/knowledge-frame-details.tsx +176 -0
  344. package/src/screens/knowledge/knowledge-frame-list.tsx +49 -0
  345. package/src/screens/knowledge/knowledge-value-details.tsx +181 -0
  346. package/src/screens/knowledge/knowledge-value-list-item.tsx +48 -0
  347. package/src/screens/knowledge/knowledge-value-list.tsx +131 -0
  348. package/src/screens/packages/package-details.tsx +117 -0
  349. package/src/screens/packages/package-info.tsx +83 -0
  350. package/src/screens/packages/package-list.tsx +191 -0
  351. package/src/screens/packages/package-new-local.tsx +93 -0
  352. package/src/screens/peer-types/peer-type-details.tsx +162 -0
  353. package/src/screens/peer-types/peer-type-list.tsx +74 -0
  354. package/src/screens/predicates/predicate-details.tsx +125 -0
  355. package/src/screens/predicates/predicate-list.tsx +50 -0
  356. package/src/screens/profile.tsx +68 -0
  357. package/src/screens/search/global-search.tsx +274 -0
  358. package/src/screens/settings/color-mode-dropdown.tsx +57 -0
  359. package/src/screens/settings/settings-page.tsx +76 -0
  360. package/src/screens/setup-user.tsx +367 -0
  361. package/src/screens/tools/tool-code.tsx +35 -0
  362. package/src/screens/tools/tool-details.tsx +101 -0
  363. package/src/screens/tools/tool-info.tsx +60 -0
  364. package/src/screens/tools/tool-list.tsx +121 -0
  365. package/src/screens/tools/tool-schema.tsx +42 -0
  366. package/src/screens/tools/tool-test-details.tsx +100 -0
  367. package/src/screens/tools/tool-test-list.tsx +74 -0
  368. package/src/screens/variables/variable-details.tsx +183 -0
  369. package/src/screens/variables/variable-list.tsx +74 -0
  370. package/src/screens/workflows/workflow-details.tsx +130 -0
  371. package/src/screens/workflows/workflow-info.tsx +29 -0
  372. package/src/screens/workflows/workflow-instructions.tsx +127 -0
  373. package/src/screens/workflows/workflow-list.tsx +107 -0
  374. package/src/screens/workflows/workflow-subscriptions.tsx +58 -0
  375. package/src/setupTests.ts +32 -0
  376. package/src/system-apps/assistants.app.ts +7 -0
  377. package/src/system-apps/contacts.app.ts +8 -0
  378. package/src/system-apps/events.app.ts +7 -0
  379. package/src/system-apps/groups.app.ts +8 -0
  380. package/src/system-apps/index.ts +79 -0
  381. package/src/system-apps/knowledge-frames.app.ts +8 -0
  382. package/src/system-apps/knowledge-values.app.ts +8 -0
  383. package/src/system-apps/packages.app.ts +7 -0
  384. package/src/system-apps/predicates.app.ts +7 -0
  385. package/src/system-apps/profile.app.ts +7 -0
  386. package/src/system-apps/search.app.ts +8 -0
  387. package/src/system-apps/settings.app.ts +7 -0
  388. package/src/system-apps/threads.app.ts +7 -0
  389. package/src/system-apps/tools.app.ts +7 -0
  390. package/src/system-apps/types.app.ts +7 -0
  391. package/src/system-apps/variables.app.ts +7 -0
  392. package/src/system-apps/workflows.app.ts +7 -0
  393. package/src/tabs-layout/tabs-layout.tsx +672 -0
  394. package/src/tabs-layout/tabs-state.ts +269 -0
  395. package/src/three-bar-layout/left-bar-content.tsx +202 -0
  396. package/src/three-bar-layout/right-bar-content.tsx +67 -0
  397. package/src/three-bar-layout/three-bar-layout.tsx +297 -0
  398. package/src/ui-defaults/index.ts +3 -0
  399. package/src/ui-defaults/list-screen.tsx +92 -0
  400. package/src/ui-defaults/notes-editor.tsx +51 -0
  401. package/src/ui-router/routes-loader.ts +98 -0
  402. package/src/ui-router/ui-loader.tsx +497 -0
  403. package/src/utils.ts +266 -0
  404. package/tsconfig.json +24 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SaveButton = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const globals_1 = require("../globals");
9
+ const hooks_1 = require("../hooks");
10
+ const SaveButton = (props) => {
11
+ let { doc, addActions } = props;
12
+ (0, hooks_1.useObservable)(doc.q);
13
+ const q = doc.q;
14
+ if (!addActions) {
15
+ addActions = [];
16
+ }
17
+ const allActions = props.addActions ? [...addActions] : [];
18
+ if (!props.noBuiltInActions) {
19
+ if (q()) {
20
+ allActions.unshift({
21
+ label: 'Discard Changes',
22
+ className: 'text-bg-warning',
23
+ onClick: () => {
24
+ if (confirm('Are you sure you want to discard your changes?')) {
25
+ doc.load()
26
+ .then(() => {
27
+ setTimeout(() => doc.q(0), 100);
28
+ });
29
+ }
30
+ }
31
+ });
32
+ }
33
+ if (allActions.length) {
34
+ allActions.push(react_1.default.createElement("hr", { className: "dropdown-divider mt-3" }));
35
+ }
36
+ allActions.push({
37
+ label: 'Delete',
38
+ className: `text-bg-danger`,
39
+ onClick: async () => {
40
+ if (confirm('Are you sure you want to delete this?')) {
41
+ await doc.delete();
42
+ const pathParts = (0, globals_1.mainContentPath)().split('/');
43
+ pathParts.pop();
44
+ const path = pathParts.join('/') ?? '';
45
+ (0, globals_1.mainContentPath)(path);
46
+ }
47
+ }
48
+ });
49
+ }
50
+ let className = `btn `;
51
+ if (q()) {
52
+ className += 'btn-primary';
53
+ }
54
+ else {
55
+ className += 'disabled';
56
+ }
57
+ if (!addActions?.length && props.noBuiltInActions) {
58
+ return (react_1.default.createElement("button", { className: className, onClick: props.onClick ?? doc.save, disabled: !q() }, (0, globals_1.isDesktop)() ? 'Save Changes' : 'Save'));
59
+ }
60
+ return (react_1.default.createElement("div", { style: { display: 'inline-block' } },
61
+ react_1.default.createElement("div", { className: "input-group" },
62
+ react_1.default.createElement("button", { className: className, onClick: props.onClick ?? doc.save, disabled: !q() }, (0, globals_1.isDesktop)() ? 'Save Changes' : 'Save'),
63
+ react_1.default.createElement("button", { type: "button", "data-bs-toggle": "dropdown", "aria-expanded": "false",
64
+ // className={`btn dropdown-toggle dropdown-toggle-split ${q() ? 'btn-primary' : 'btn-secondary'}`}
65
+ className: `btn dropdown-toggle dropdown-toggle-split btn-secondary` },
66
+ react_1.default.createElement("span", { className: "visually-hidden" }, "Toggle Dropdown")),
67
+ react_1.default.createElement("ul", { className: "dropdown-menu dropdown-menu-end" }, allActions.map(action => {
68
+ if (typeof action !== 'object' || action === null || !('label' in action)) {
69
+ return (react_1.default.createElement("li", { key: Math.random() }, action));
70
+ }
71
+ return (react_1.default.createElement("li", { key: action.label },
72
+ react_1.default.createElement("button", { className: `dropdown-item rounded mt-2 ${action.className || ''}`, onClick: action.onClick }, action.label)));
73
+ })))));
74
+ };
75
+ exports.SaveButton = SaveButton;
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import { Observable } from "@peers-app/peers-sdk";
3
+ export interface ISortable {
4
+ sortOrder: number;
5
+ }
6
+ interface ISortableListProps<T extends ISortable> {
7
+ items: Observable<T[]> | T[];
8
+ renderItem: (props: {
9
+ item: T;
10
+ listId: string;
11
+ sortHandle: string;
12
+ }) => React.ReactNode;
13
+ listsGroup?: string;
14
+ onAdd?: ((itemId: string, sortOrder: number) => any);
15
+ onUpdate?: ((args: {
16
+ items: T[];
17
+ ixMoved: number[];
18
+ }) => any);
19
+ hidden?: boolean;
20
+ containerProps?: Record<string, any>;
21
+ dragHandleClassName?: string;
22
+ sortDirection?: 'asc' | 'desc';
23
+ minHeight?: string | number;
24
+ paddingBottom?: string | number;
25
+ }
26
+ export declare class SortableList<T extends ISortable> extends React.Component<ISortableListProps<T>, {}> {
27
+ constructor(props: any);
28
+ self: any;
29
+ items: any[];
30
+ listId: string;
31
+ sortHandle: string;
32
+ calculateSortOrder(index: number): number;
33
+ componentDidMount(): void;
34
+ render(): React.JSX.Element;
35
+ }
36
+ export {};
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SortableList = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const sortablejs_1 = __importDefault(require("sortablejs"));
9
+ const lodash_1 = require("lodash");
10
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
11
+ class SortableList extends react_1.default.Component {
12
+ constructor(props) {
13
+ super(props);
14
+ this.sortHandle = this.props.dragHandleClassName && `.${this.props.dragHandleClassName}` || this.sortHandle;
15
+ }
16
+ self;
17
+ items = [];
18
+ listId = `${Date.now()}_${Math.round(Math.random() * 100000)}`;
19
+ sortHandle = `.sort-handle-${this.listId}`;
20
+ calculateSortOrder(index) {
21
+ const items = this.items;
22
+ if (index === 0)
23
+ return Date.now();
24
+ if (index >= items.length)
25
+ return (0, lodash_1.last)(items).sortOrder - 10000;
26
+ const above = items[index - 1].sortOrder ?? Date.now();
27
+ const below = items[index].sortOrder ?? Number.MIN_VALUE;
28
+ if (above === below)
29
+ alert('sort order has converged to the same number in this area. Try moving items to the top or bottom of the list to fix it');
30
+ return above - ((above - below) / 2);
31
+ }
32
+ componentDidMount() {
33
+ const self = this;
34
+ const listDiv = document.getElementById(this.listId);
35
+ sortablejs_1.default.create(listDiv, {
36
+ handle: this.sortHandle,
37
+ group: { name: this.props.listsGroup || this.listId, put: !!this.props.onAdd },
38
+ animation: 100,
39
+ onUpdate: evt => {
40
+ const items = self.items;
41
+ const item = items.splice(evt.oldIndex, 1)[0];
42
+ item.sortOrder = this.calculateSortOrder(evt.newIndex);
43
+ items.splice(evt.newIndex, 0, item);
44
+ // console.log(items.map(i => i.toJS()));
45
+ if (this.props.onUpdate) {
46
+ this.props.onUpdate({ items, ixMoved: [evt.newIndex] });
47
+ }
48
+ },
49
+ onAdd: evt => {
50
+ const itemEl = evt.item; // dragged HTMLElement
51
+ if (evt.to !== evt.from) {
52
+ // first restore html hierarchy so html doesn't get out of sync with react
53
+ evt.to.removeChild(itemEl);
54
+ evt.from.appendChild(itemEl);
55
+ // now if we were given an `onAdd` function, call it
56
+ if (this.props.onAdd) {
57
+ const itemId = evt.item.id;
58
+ this.props.onAdd(itemId, this.calculateSortOrder(evt.newIndex));
59
+ }
60
+ }
61
+ },
62
+ });
63
+ }
64
+ render() {
65
+ let items = (0, peers_sdk_1.unwrapObservable)(this.props.items);
66
+ if (this.props.sortDirection === 'asc') {
67
+ items = (0, lodash_1.sortBy)(items, i => i.sortOrder ?? -Infinity);
68
+ }
69
+ else {
70
+ // @ts-ignore
71
+ items = (0, lodash_1.sortBy)(items, i => -i.sortOrder ?? Infinity);
72
+ }
73
+ this.items = items;
74
+ return (react_1.default.createElement("div", { id: this.listId, style: { minHeight: this.props.minHeight ?? "25px", paddingBottom: this.props.paddingBottom ?? "10px" }, ...this.props.containerProps }, items.map(item => this.props.renderItem({ item, listId: this.listId, sortHandle: this.sortHandle.substring(1) }))));
75
+ }
76
+ }
77
+ exports.SortableList = SortableList;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface ITabsProps {
3
+ tabs: {
4
+ name: string;
5
+ content: JSX.Element;
6
+ active?: true;
7
+ }[];
8
+ }
9
+ export declare const Tabs: (props: ITabsProps) => React.JSX.Element;
10
+ export declare const ScreenTabBody: (props: React.PropsWithChildren) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.ScreenTabBody = exports.Tabs = void 0;
37
+ const react_1 = __importStar(require("react"));
38
+ const globals_1 = require("../globals");
39
+ let lastActive = '';
40
+ const Tabs = (props) => {
41
+ const { tabs } = props;
42
+ const [activeTab, _setActiveTab] = (0, react_1.useState)(() => {
43
+ let activeTabName = tabs.find(tab => tab.active)?.name || (0, globals_1.queryParam)('tab') || lastActive;
44
+ activeTabName = activeTabName.toLowerCase();
45
+ const _activeTab = tabs.find(tab => tab.name.toLowerCase() === activeTabName) || tabs[0];
46
+ lastActive = _activeTab.name;
47
+ setTimeout(() => (0, globals_1.queryParam)('tab', lastActive.toLowerCase()));
48
+ return _activeTab;
49
+ });
50
+ function setActiveTab(tab) {
51
+ _setActiveTab(tab);
52
+ (0, globals_1.queryParam)('tab', tab.name.toLowerCase());
53
+ lastActive = tab.name;
54
+ }
55
+ return (react_1.default.createElement(react_1.default.Fragment, null,
56
+ react_1.default.createElement("ul", { className: "nav nav-tabs" }, tabs.map((tab, iTab) => {
57
+ return (react_1.default.createElement("li", { key: tab.name + iTab, className: "nav-item" },
58
+ react_1.default.createElement("a", { href: "#", className: "nav-link " + (activeTab.name === tab.name ? 'active' : ''), onClick: evt => (evt.preventDefault(), setActiveTab(tab)) }, tab.name)));
59
+ })),
60
+ react_1.default.createElement("br", null),
61
+ tabs.map((tab, iTab) => {
62
+ return (react_1.default.createElement("div", { key: tab.name + iTab, hidden: activeTab.name !== tab.name }, tab.content));
63
+ })));
64
+ };
65
+ exports.Tabs = Tabs;
66
+ const ScreenTabBody = (props) => {
67
+ return (react_1.default.createElement("div", { style: { maxHeight: 'calc(100vh - 138px)', overflowY: 'auto' } }, props.children));
68
+ };
69
+ exports.ScreenTabBody = ScreenTabBody;
@@ -0,0 +1,6 @@
1
+ import React from 'react';
2
+ import { IMarkdownEditorProps } from '../markdown-editor/editor';
3
+ interface TextListEditorProps extends IMarkdownEditorProps {
4
+ }
5
+ export declare const TextListEditor: (props: TextListEditorProps) => React.JSX.Element;
6
+ export {};
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TextListEditor = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const editor_1 = require("../markdown-editor/editor");
9
+ const TextListEditor = (props) => {
10
+ return (react_1.default.createElement("div", { className: "border rounded border-dark-subtle" },
11
+ react_1.default.createElement(editor_1.MarkdownEditor, { ...props })));
12
+ };
13
+ exports.TextListEditor = TextListEditor;
@@ -0,0 +1,11 @@
1
+ import { Observable } from "@peers-app/peers-sdk";
2
+ import React from 'react';
3
+ interface IProps {
4
+ markdownContent?: string | Observable<string> | Observable<string | undefined>;
5
+ handle?: React.ReactNode;
6
+ handleClassName?: string;
7
+ positions?: ('right' | 'bottom' | 'left' | 'top')[];
8
+ genericContent?: React.ReactNode;
9
+ }
10
+ export declare const Tooltip: (props: IProps) => React.JSX.Element;
11
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Tooltip = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const react_tiny_popover_1 = require("react-tiny-popover");
9
+ const markdown_with_mentions_1 = require("./markdown-with-mentions");
10
+ const hooks_1 = require("../hooks");
11
+ const Tooltip = (props) => {
12
+ const { handle } = props;
13
+ let [markdownContent] = (0, hooks_1.useObservable)(props.markdownContent);
14
+ markdownContent = markdownContent ?? '';
15
+ const showPopover = (0, hooks_1.useObservableState)(false);
16
+ return (react_1.default.createElement(react_tiny_popover_1.Popover, { isOpen: showPopover(), onClickOutside: () => showPopover(false), positions: props.positions ?? ['right', 'bottom', 'left', 'top'], content: () => (react_1.default.createElement("div", { className: 'card p-2 bg-light-subtle', style: { maxWidth: 500, maxHeight: 400, overflowY: 'auto', zIndex: 1000001 } }, props.genericContent ||
17
+ react_1.default.createElement(markdown_with_mentions_1.MarkdownWithMentions, { content: markdownContent }))) },
18
+ react_1.default.createElement("span", { className: props.handleClassName ?? 'p-2', onClick: () => showPopover(!showPopover()) }, handle ?? react_1.default.createElement("i", { className: "bi bi-info-circle", style: { cursor: 'pointer' } }))));
19
+ };
20
+ exports.Tooltip = Tooltip;
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const TopBar: () => React.JSX.Element;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TopBar = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ // import { visibleNotifications } from '../notifications';
9
+ const TopBar = () => {
10
+ // const [_notifications] = useObservable(visibleNotifications);
11
+ // const unreadNotifications = _notifications.filter(n => !n.status);
12
+ // const unreadNotificationCount = unreadNotifications.length;
13
+ // const [group] = useObservable(globals.activeGroup);
14
+ let connections = [1, 2, 3];
15
+ let connectionsSyncing = [1, 2];
16
+ let unreadNotificationCount = 0;
17
+ return (react_1.default.createElement("nav", { className: "navbar navbar-expand-lg navbar-dark bg-body-tertiary fixed-top peers-top-bar",
18
+ // style={{ borderLeft: 'solid', borderColor: '#606365', borderWidth: globals.isDesktop() ? '1px' : 0, }}
19
+ // style={{ borderBottom: 'solid', borderColor: '#606365', borderWidth: '1px', }}
20
+ style: { height: '50px' } },
21
+ react_1.default.createElement("div", { className: "container-fluid" },
22
+ react_1.default.createElement("div", null,
23
+ react_1.default.createElement("button", { className: "navbar-toggler collapsed", type: "button", "data-bs-toggle": "offcanvas", "data-bs-target": "#leftBar", "aria-controls": "leftBar", "aria-expanded": "false", "aria-label": "Toggle Left Bar" },
24
+ react_1.default.createElement("span", { className: "navbar-toggler-icon" }))),
25
+ react_1.default.createElement("div", null,
26
+ react_1.default.createElement("span", { className: "text-white" }, " open tabs here")),
27
+ react_1.default.createElement("div", null,
28
+ react_1.default.createElement("span", { className: "navbar-text", style: { marginRight: 8, fontSize: "12pt" } },
29
+ react_1.default.createElement("span", { style: { display: 'inline-block' } },
30
+ Boolean(connectionsSyncing.length) && [
31
+ connectionsSyncing.length + " ",
32
+ react_1.default.createElement("i", { key: "1", className: "bi bi-arrow-repeat" }),
33
+ react_1.default.createElement("span", { key: "2" }, "\u00A0\u00A0\u00A0")
34
+ ],
35
+ connections.length,
36
+ " ",
37
+ react_1.default.createElement("i", { className: "bi bi-arrow-down-up" }))),
38
+ react_1.default.createElement("button", { type: "button", className: "btn btn-dark position-relative", "data-bs-toggle": "offcanvas", "data-bs-target": "#rightBar", "aria-controls": "rightBar", "aria-expanded": "false", "aria-label": "Toggle Right Bar",
39
+ // TODO take this out once we are ready to show content in the right bar
40
+ hidden: true },
41
+ react_1.default.createElement("i", { className: `bi bi-bell${unreadNotificationCount > 0 ? '-fill' : ''}` }),
42
+ react_1.default.createElement("span", { className: "translate-middle badge rounded-pill bg-danger", style: {
43
+ display: unreadNotificationCount < 1 ? 'none' : '',
44
+ position: 'absolute',
45
+ top: unreadNotificationCount > 9 ? 4 : 7,
46
+ right: unreadNotificationCount > 9 ? -27 : -16
47
+ } },
48
+ unreadNotificationCount > 9 ? "9+" : unreadNotificationCount,
49
+ react_1.default.createElement("span", { className: "visually-hidden" }, "unread notifications")))))));
50
+ };
51
+ exports.TopBar = TopBar;
@@ -0,0 +1,7 @@
1
+ import { Observable } from "@peers-app/peers-sdk";
2
+ import { IMentionConfig } from '../../mention-configs';
3
+ export declare const MENTIONS_MAX_RESULTS = 10;
4
+ export declare function MentionsPlugin(props: {
5
+ mentionConfigs?: IMentionConfig[];
6
+ mentionsOpen?: Observable<boolean>;
7
+ }): JSX.Element | null;
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MENTIONS_MAX_RESULTS = void 0;
37
+ exports.MentionsPlugin = MentionsPlugin;
38
+ const LexicalComposerContext_1 = require("@lexical/react/LexicalComposerContext");
39
+ const LexicalTypeaheadMenuPlugin_1 = require("@lexical/react/LexicalTypeaheadMenuPlugin");
40
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
41
+ const lexical_1 = require("lexical");
42
+ const lodash_1 = require("lodash");
43
+ const React = __importStar(require("react"));
44
+ const react_1 = require("react");
45
+ const ReactDOM = __importStar(require("react-dom"));
46
+ const mention_node_1 = require("../markdown-editor/mention-node");
47
+ // At most, 5 suggestions are shown in the popup.
48
+ const SUGGESTION_LIST_LENGTH_LIMIT = 10;
49
+ exports.MENTIONS_MAX_RESULTS = 10;
50
+ function useMentionLookupService(mentionString, mentionConfigs = []) {
51
+ const [results, setResults] = (0, react_1.useState)([]);
52
+ (0, react_1.useEffect)(() => {
53
+ if (!mentionString) {
54
+ setResults([]);
55
+ return;
56
+ }
57
+ (async () => {
58
+ mentionString = mentionString || '';
59
+ const prefix = mentionString[0];
60
+ // TODO simplify how users can include completed tasks in their search
61
+ let searchCompletedTasks = prefix === '$' && mentionString.startsWith('done');
62
+ if (searchCompletedTasks) {
63
+ mentionString = mentionString.slice(4);
64
+ }
65
+ let kind = '';
66
+ if (mentionString.includes(':')) {
67
+ const parts = mentionString.split(':');
68
+ kind = parts[0];
69
+ mentionString = parts[1] || '';
70
+ }
71
+ const config = mentionConfigs?.find(c => c.kind === kind);
72
+ if (config) {
73
+ let results = await config.query(mentionString);
74
+ results = results.map(r => ({ ...r, clickable: false }));
75
+ setResults(results);
76
+ return;
77
+ }
78
+ const results = await Promise.all(mentionConfigs?.map(c => c.query(mentionString || '')));
79
+ let allResults = results.flat();
80
+ allResults = (0, lodash_1.uniqBy)(allResults, 'id');
81
+ let filteredResults = allResults;
82
+ if (prefix === '@') {
83
+ filteredResults = filteredResults.filter((result) => result.kind === 'user' || result.kind === 'assistant');
84
+ }
85
+ else {
86
+ filteredResults = filteredResults.filter((result) => result.kind !== 'user' && result.kind !== 'assistant');
87
+ }
88
+ if (kind) {
89
+ filteredResults = allResults.filter((result) => result.kind.toLowerCase() === kind.toLowerCase());
90
+ }
91
+ else if (!filteredResults.length) {
92
+ filteredResults = allResults;
93
+ }
94
+ filteredResults = (0, lodash_1.sortBy)(filteredResults, r => {
95
+ return r.name.toLowerCase().indexOf((mentionString).toLowerCase());
96
+ });
97
+ filteredResults = filteredResults.slice(0, SUGGESTION_LIST_LENGTH_LIMIT);
98
+ filteredResults = filteredResults.map(r => ({ ...r, clickable: false }));
99
+ setResults(filteredResults);
100
+ })();
101
+ }, [mentionString]);
102
+ return results;
103
+ }
104
+ class MentionTypeaheadOption extends LexicalTypeaheadMenuPlugin_1.MenuOption {
105
+ data;
106
+ name;
107
+ picture;
108
+ id;
109
+ userId;
110
+ constructor(data, picture) {
111
+ super(data.name);
112
+ this.data = data;
113
+ this.name = data.name;
114
+ this.picture = picture;
115
+ this.id = data.id;
116
+ // if (data.kind === 'assistant') {
117
+ // this.userId = data.userId;
118
+ // }
119
+ }
120
+ }
121
+ function MentionsTypeaheadMenuItem({ index, isSelected, onClick, onMouseEnter, option, }) {
122
+ let className = 'item';
123
+ if (isSelected) {
124
+ className += ' selected';
125
+ }
126
+ return (React.createElement("li", { key: option.key, tabIndex: -1, className: className, ref: option.setRefElement, role: "option", "aria-selected": isSelected, id: 'typeahead-item-' + index, onMouseEnter: onMouseEnter, onClick: onClick, "data-kind": option.data.kind, "data-id": option.id, "data-user-id": option.userId || undefined },
127
+ option.picture,
128
+ React.createElement("span", { className: "text" }, option.name)));
129
+ }
130
+ function MentionsPlugin(props) {
131
+ const [editor] = (0, LexicalComposerContext_1.useLexicalComposerContext)();
132
+ const [queryString, setQueryString] = (0, react_1.useState)(null);
133
+ const results = useMentionLookupService(queryString, props.mentionConfigs);
134
+ const [_mentionsOpen] = (0, react_1.useState)(() => (0, peers_sdk_1.observable)(false));
135
+ if (props.mentionsOpen) {
136
+ const finalMentionsOpen = _mentionsOpen() && results.length > 0;
137
+ if (props.mentionsOpen() !== finalMentionsOpen) {
138
+ props.mentionsOpen(finalMentionsOpen);
139
+ }
140
+ }
141
+ const checkForSlashTriggerMatch = (0, LexicalTypeaheadMenuPlugin_1.useBasicTypeaheadTriggerMatch)('/', {
142
+ minLength: 0,
143
+ });
144
+ const options = (0, react_1.useMemo)(() => results
145
+ .map((result) => {
146
+ let picture = React.createElement("i", { className: "bi bi-question pe-1" });
147
+ const config = props.mentionConfigs?.find(c => c.kind === result.kind);
148
+ if (config) {
149
+ if (config.picture) {
150
+ picture = config.picture(result);
151
+ }
152
+ else {
153
+ picture = React.createElement("i", { className: config.iconClass + ' pe-1' });
154
+ }
155
+ }
156
+ else {
157
+ picture = React.createElement("i", { className: 'bi bi-question pe-1' });
158
+ }
159
+ return new MentionTypeaheadOption(result, picture);
160
+ })
161
+ .slice(0, SUGGESTION_LIST_LENGTH_LIMIT), [results]);
162
+ const onSelectOption = (0, react_1.useCallback)((selectedOption, nodeToReplace, closeMenu) => {
163
+ editor.update(() => {
164
+ const mentionNode = (0, mention_node_1.$createMentionNode)(selectedOption.data);
165
+ if (nodeToReplace) {
166
+ nodeToReplace.replace(mentionNode);
167
+ }
168
+ mentionNode.selectNext(); // Move cursor to the position after the mention
169
+ const selection = (0, lexical_1.$getSelection)();
170
+ if (selection !== null) {
171
+ selection.insertText(' '); // Insert a space after the mention
172
+ }
173
+ closeMenu();
174
+ });
175
+ }, [editor]);
176
+ const checkForMentionMatch = (0, react_1.useCallback)((text) => {
177
+ const textTrimmed = text.trimStart();
178
+ return {
179
+ leadOffset: text.length - textTrimmed.length,
180
+ matchingString: text.trim(),
181
+ replaceableString: text.trim(),
182
+ };
183
+ }, [checkForSlashTriggerMatch, editor]);
184
+ return (React.createElement(LexicalTypeaheadMenuPlugin_1.LexicalTypeaheadMenuPlugin, { onQueryChange: setQueryString, onSelectOption: onSelectOption, triggerFn: checkForMentionMatch, options: options, onOpen: () => _mentionsOpen(true), onClose: () => _mentionsOpen(false), menuRenderFn: (anchorElementRef, { selectedIndex, selectOptionAndCleanUp, setHighlightedIndex }) => {
185
+ if (!(anchorElementRef.current && results.length)) {
186
+ return null;
187
+ }
188
+ // distance from the top of the viewport to the top of the anchor element
189
+ const anchorTop = anchorElementRef.current.getBoundingClientRect().top;
190
+ const viewportHeight = window.innerHeight;
191
+ let className = 'typeahead-popover mentions-menu';
192
+ if (anchorTop > (viewportHeight / 2)) {
193
+ className += ' mentions-menu-popup';
194
+ }
195
+ return ReactDOM.createPortal(React.createElement("div", { className: className },
196
+ React.createElement("ul", null, options.map((option, i) => (React.createElement(MentionsTypeaheadMenuItem, { index: i, isSelected: selectedIndex === i, onClick: () => {
197
+ setHighlightedIndex(i);
198
+ selectOptionAndCleanUp(option);
199
+ }, onMouseEnter: () => {
200
+ setHighlightedIndex(i);
201
+ }, key: option.key, option: option }))))), anchorElementRef.current);
202
+ } }));
203
+ }
@@ -0,0 +1,15 @@
1
+ import { Observable } from "@peers-app/peers-sdk";
2
+ import React from 'react';
3
+ import { IMentionConfig } from '../../mention-configs';
4
+ export interface IEditorEffects {
5
+ onKeyDown?: (e: React.KeyboardEvent) => (boolean | void);
6
+ focus?: () => void;
7
+ }
8
+ export interface ITypeaheadEditorProps {
9
+ value: Observable<string>;
10
+ effects?: IEditorEffects;
11
+ autoFocus?: boolean;
12
+ maxHeight?: string | number;
13
+ mentionConfigs?: IMentionConfig[];
14
+ }
15
+ export declare function TypeaheadEditor(props: ITypeaheadEditorProps): React.JSX.Element;