solid-ui 5.0.2-4 → 5.0.2-6

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 (282) hide show
  1. package/dist/acl/access-controller.cjs.js +1 -1
  2. package/dist/acl/access-controller.cjs.js.map +1 -1
  3. package/dist/acl/access-controller.esm.js +37 -37
  4. package/dist/acl/access-groups.cjs.js +2 -2
  5. package/dist/acl/access-groups.cjs.js.map +1 -1
  6. package/dist/acl/access-groups.esm.js +78 -78
  7. package/dist/acl/acl-control.cjs.js +1 -1
  8. package/dist/acl/acl-control.cjs.js.map +1 -1
  9. package/dist/acl/acl-control.esm.js +19 -19
  10. package/dist/acl/add-agent-buttons.cjs.js +1 -1
  11. package/dist/acl/add-agent-buttons.cjs.js.map +1 -1
  12. package/dist/acl/add-agent-buttons.esm.js +51 -51
  13. package/dist/chat/bookmarks.cjs.js +1 -1
  14. package/dist/chat/bookmarks.cjs.js.map +1 -1
  15. package/dist/chat/bookmarks.esm.js +44 -44
  16. package/dist/chat/bookmarks.esm.js.map +1 -1
  17. package/dist/chat/chatLogic.cjs.js +2 -2
  18. package/dist/chat/chatLogic.cjs.js.map +1 -1
  19. package/dist/chat/chatLogic.esm.js +54 -54
  20. package/dist/chat/dateFolder.cjs.js +1 -1
  21. package/dist/chat/dateFolder.cjs.js.map +1 -1
  22. package/dist/chat/dateFolder.esm.js +30 -30
  23. package/dist/chat/infinite.cjs.js +1 -1
  24. package/dist/chat/infinite.cjs.js.map +1 -1
  25. package/dist/chat/infinite.esm.js +49 -49
  26. package/dist/chat/keys.cjs.js +2 -2
  27. package/dist/chat/keys.cjs.js.map +1 -1
  28. package/dist/chat/keys.esm.js +17 -17
  29. package/dist/chat/message.cjs.js +4 -4
  30. package/dist/chat/message.cjs.js.map +1 -1
  31. package/dist/chat/message.esm.js +114 -114
  32. package/dist/chat/message.esm.js.map +1 -1
  33. package/dist/chat/messageTools.cjs.js +1 -1
  34. package/dist/chat/messageTools.cjs.js.map +1 -1
  35. package/dist/chat/messageTools.esm.js +51 -51
  36. package/dist/chunks/{ResourceActionsMenu-Bllpr4M5.js → ResourceActionsMenu-KFMLta44.js} +78 -69
  37. package/dist/chunks/ResourceActionsMenu-KFMLta44.js.map +1 -0
  38. package/dist/chunks/{access-control-modal-CwmY_Dod.js → access-control-modal-BZdBv6VD.js} +165 -165
  39. package/dist/chunks/{access-control-modal-CwmY_Dod.js.map → access-control-modal-BZdBv6VD.js.map} +1 -1
  40. package/dist/chunks/{account-CoHPKKDu.js → account-DWmMJre6.js} +22 -22
  41. package/dist/chunks/{account-CoHPKKDu.js.map → account-DWmMJre6.js.map} +1 -1
  42. package/dist/chunks/{auth-CocCqS1p.js → auth-EK-iYNYZ.js} +37 -37
  43. package/dist/chunks/{auth-CocCqS1p.js.map → auth-EK-iYNYZ.js.map} +1 -1
  44. package/dist/chunks/{avatar-sNdKdWVO.js → avatar-BBgvMlqv.js} +13 -13
  45. package/dist/chunks/{avatar-sNdKdWVO.js.map → avatar-BBgvMlqv.js.map} +1 -1
  46. package/dist/chunks/{combobox-fSTp9qoT.js → combobox-DS6byaf1.js} +3 -3
  47. package/dist/chunks/{combobox-fSTp9qoT.js.map → combobox-DS6byaf1.js.map} +1 -1
  48. package/dist/chunks/{error-state-BD4_Wrkz.js → error-state-jV9dlFX2.js} +2 -2
  49. package/dist/chunks/{error-state-BD4_Wrkz.js.map → error-state-jV9dlFX2.js.map} +1 -1
  50. package/dist/chunks/{file-explorer-header-D0TebSYR.js → file-explorer-header-BJzo6xDU.js} +50 -50
  51. package/dist/chunks/{file-explorer-header-D0TebSYR.js.map → file-explorer-header-BJzo6xDU.js.map} +1 -1
  52. package/dist/chunks/{guard-BOicu9dt.js → guard-SxVT1xr4.js} +13 -13
  53. package/dist/chunks/{guard-BOicu9dt.js.map → guard-SxVT1xr4.js.map} +1 -1
  54. package/dist/chunks/{index.esm-C9oV3H3X.js → index.esm-BQrkxchZ.js} +2 -2
  55. package/dist/chunks/{index.esm-C9oV3H3X.js.map → index.esm-BQrkxchZ.js.map} +1 -1
  56. package/dist/chunks/{jsonld-D-TE94B0.js → jsonld-C6IOQ1Tg.js} +2 -2
  57. package/dist/chunks/{jsonld-D-TE94B0.js.map → jsonld-C6IOQ1Tg.js.map} +1 -1
  58. package/dist/chunks/{login-button-clTw_9tX.js → login-button-Dd0rwZJk.js} +11 -11
  59. package/dist/chunks/{login-button-clTw_9tX.js.map → login-button-Dd0rwZJk.js.map} +1 -1
  60. package/dist/chunks/{logout-button-CP-Pz70O.js → logout-button-Da34Lrnq.js} +11 -11
  61. package/dist/chunks/{logout-button-CP-Pz70O.js.map → logout-button-Da34Lrnq.js.map} +1 -1
  62. package/dist/chunks/{menu-D0k2fkiE.js → menu-BNJU654v.js} +2 -2
  63. package/dist/chunks/{menu-D0k2fkiE.js.map → menu-BNJU654v.js.map} +1 -1
  64. package/dist/chunks/{provider-Cuv3Kp6G.js → provider-B3FoP2qW.js} +11 -11
  65. package/dist/chunks/{provider-Cuv3Kp6G.js.map → provider-B3FoP2qW.js.map} +1 -1
  66. package/dist/chunks/{rdf-form-DVmTw3RG.js → rdf-form-BkKDmFPD.js} +36 -36
  67. package/dist/chunks/{rdf-form-DVmTw3RG.js.map → rdf-form-BkKDmFPD.js.map} +1 -1
  68. package/dist/chunks/{rdf-input-CRYLK-27.js → rdf-input-BPePtqfS.js} +61 -61
  69. package/dist/chunks/{rdf-input-CRYLK-27.js.map → rdf-input-BPePtqfS.js.map} +1 -1
  70. package/dist/chunks/{signup-button-CexdMWj6.js → signup-button-DOInssOu.js} +11 -11
  71. package/dist/chunks/{signup-button-CexdMWj6.js.map → signup-button-DOInssOu.js.map} +1 -1
  72. package/dist/chunks/{solidLogicSingleton.esm-BXyHD7mn.js → solidLogicSingleton.esm-Bvt7E7Vl.js} +50 -29
  73. package/dist/chunks/solidLogicSingleton.esm-Bvt7E7Vl.js.map +1 -0
  74. package/dist/chunks/square-arrow-out-up-right-DaALlpHo.js +9 -0
  75. package/dist/chunks/square-arrow-out-up-right-DaALlpHo.js.map +1 -0
  76. package/dist/chunks/{src-DQgHAH3d.js → src-Cv9Lm1V-.js} +3009 -2980
  77. package/dist/chunks/src-Cv9Lm1V-.js.map +1 -0
  78. package/dist/chunks/{style-CXaw5EYi.js → style-Dlw9-wPn.js} +3 -3
  79. package/dist/chunks/{style-CXaw5EYi.js.map → style-Dlw9-wPn.js.map} +1 -1
  80. package/dist/chunks/{widgets-BBEQu0CS.js → widgets-C92ihtlF.js} +733 -737
  81. package/dist/chunks/widgets-C92ihtlF.js.map +1 -0
  82. package/dist/components/access-control-modal/AccessControlAddAccess.cjs.js +1 -1
  83. package/dist/components/access-control-modal/AccessControlAddAccess.esm.js +5 -5
  84. package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js +2 -2
  85. package/dist/components/access-control-modal/AccessControlGeneralAccess.cjs.js.map +1 -1
  86. package/dist/components/access-control-modal/AccessControlGeneralAccess.esm.js +12 -12
  87. package/dist/components/access-control-modal/AccessControlModal.cjs.js +2 -2
  88. package/dist/components/access-control-modal/AccessControlModal.cjs.js.map +1 -1
  89. package/dist/components/access-control-modal/AccessControlModal.esm.js +35 -35
  90. package/dist/components/access-control-modal/AccessControlModal.esm.js.map +1 -1
  91. package/dist/components/access-control-modal/AccessControlSharedAccess.cjs.js +1 -1
  92. package/dist/components/access-control-modal/AccessControlSharedAccess.esm.js +2 -2
  93. package/dist/components/access-control-modal/accessTargetResolver.cjs.js +1 -1
  94. package/dist/components/access-control-modal/accessTargetResolver.cjs.js.map +1 -1
  95. package/dist/components/access-control-modal/accessTargetResolver.esm.js +21 -21
  96. package/dist/components/access-control-modal.js +1 -1
  97. package/dist/components/account/Account.cjs.js +1 -1
  98. package/dist/components/account/Account.esm.js +3 -3
  99. package/dist/components/account.js +1 -1
  100. package/dist/components/all.cjs.js +1 -1
  101. package/dist/components/all.esm.js +16 -16
  102. package/dist/components/avatar.js +1 -1
  103. package/dist/components/combobox/Combobox.cjs.js +1 -1
  104. package/dist/components/combobox/Combobox.esm.js +1 -1
  105. package/dist/components/combobox.js +1 -1
  106. package/dist/components/dialog/Dialog.cjs.js +2 -2
  107. package/dist/components/dialog/Dialog.cjs.js.map +1 -1
  108. package/dist/components/dialog/Dialog.esm.js +9 -9
  109. package/dist/components/dialog/Dialog.esm.js.map +1 -1
  110. package/dist/components/dialog-provider/DialogProvider.cjs.js +1 -1
  111. package/dist/components/dialog-provider/DialogProvider.cjs.js.map +1 -1
  112. package/dist/components/dialog-provider/DialogProvider.esm.js +6 -6
  113. package/dist/components/dialogs-root/DialogsRoot.cjs.js +2 -2
  114. package/dist/components/dialogs-root/DialogsRoot.cjs.js.map +1 -1
  115. package/dist/components/dialogs-root/DialogsRoot.esm.js +7 -7
  116. package/dist/components/error-state/ErrorState.cjs.js +1 -1
  117. package/dist/components/error-state/ErrorState.esm.js +1 -1
  118. package/dist/components/error-state.js +1 -1
  119. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js +2 -2
  120. package/dist/components/file-explorer-header/FileExplorerHeaderControls.cjs.js.map +1 -1
  121. package/dist/components/file-explorer-header/FileExplorerHeaderControls.esm.js +10 -10
  122. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.cjs.js +1 -1
  123. package/dist/components/file-explorer-header/FileExplorerHeaderSummary.esm.js +5 -5
  124. package/dist/components/file-explorer-header.js +1 -1
  125. package/dist/components/guard.js +1 -1
  126. package/dist/components/login-button/LoginButton.cjs.js +1 -1
  127. package/dist/components/login-button/LoginButton.esm.js +1 -1
  128. package/dist/components/login-button.js +1 -1
  129. package/dist/components/login-modal/LoginModal.cjs.js +1 -1
  130. package/dist/components/login-modal/LoginModal.esm.js +2 -2
  131. package/dist/components/login-modal.js +1 -1
  132. package/dist/components/logout-button/LogoutButton.cjs.js +1 -1
  133. package/dist/components/logout-button/LogoutButton.esm.js +1 -1
  134. package/dist/components/logout-button.js +1 -1
  135. package/dist/components/menu/Menu.cjs.js +1 -1
  136. package/dist/components/menu/Menu.cjs.js.map +1 -1
  137. package/dist/components/menu/Menu.esm.js +1 -1
  138. package/dist/components/menu/Menu.esm.js.map +1 -1
  139. package/dist/components/menu.js +1 -1
  140. package/dist/components/provider.js +1 -1
  141. package/dist/components/rdf-form/RDFForm.cjs.js +3 -3
  142. package/dist/components/rdf-form/RDFForm.cjs.js.map +1 -1
  143. package/dist/components/rdf-form/RDFForm.esm.js +13 -13
  144. package/dist/components/rdf-form/RDFForm.esm.js.map +1 -1
  145. package/dist/components/rdf-form.js +1 -1
  146. package/dist/components/rdf-input/RDFInput.cjs.js +2 -2
  147. package/dist/components/rdf-input/RDFInput.cjs.js.map +1 -1
  148. package/dist/components/rdf-input/RDFInput.esm.js +4 -4
  149. package/dist/components/rdf-input/RDFInput.esm.js.map +1 -1
  150. package/dist/components/rdf-input.js +1 -1
  151. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js +9 -3
  152. package/dist/components/resource-actions-menu/ResourceActionsMenu.cjs.js.map +1 -1
  153. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts +1 -0
  154. package/dist/components/resource-actions-menu/ResourceActionsMenu.d.ts.map +1 -1
  155. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js +18 -9
  156. package/dist/components/resource-actions-menu/ResourceActionsMenu.esm.js.map +1 -1
  157. package/dist/components/resource-actions-menu.js +1 -1
  158. package/dist/components/select/Select.cjs.js +1 -1
  159. package/dist/components/select/Select.cjs.js.map +1 -1
  160. package/dist/components/select/Select.esm.js +1 -1
  161. package/dist/components/signup-button/SignupButton.cjs.js +1 -1
  162. package/dist/components/signup-button/SignupButton.esm.js +1 -1
  163. package/dist/components/signup-button.js +1 -1
  164. package/dist/components.js +21 -21
  165. package/dist/create/create.cjs.js +1 -1
  166. package/dist/create/create.cjs.js.map +1 -1
  167. package/dist/create/create.esm.js +23 -23
  168. package/dist/header/index.cjs.js +1 -1
  169. package/dist/header/index.cjs.js.map +1 -1
  170. package/dist/header/index.esm.js +53 -53
  171. package/dist/index.cjs.js +1 -1
  172. package/dist/index.cjs.js.map +1 -1
  173. package/dist/index.esm.js +23 -22
  174. package/dist/index.esm.js.map +1 -1
  175. package/dist/index.js +11 -11
  176. package/dist/lib/auth/SolidAuth.cjs.js +1 -1
  177. package/dist/lib/auth/SolidAuth.cjs.js.map +1 -1
  178. package/dist/lib/auth/SolidAuth.esm.js +8 -8
  179. package/dist/lib/auth/SolidAuth.esm.js.map +1 -1
  180. package/dist/lib/code-editor/CodeEditor.cjs.js +1 -1
  181. package/dist/lib/code-editor/CodeEditor.cjs.js.map +1 -1
  182. package/dist/lib/code-editor/CodeEditor.d.ts.map +1 -1
  183. package/dist/lib/code-editor/CodeEditor.esm.js +34 -30
  184. package/dist/lib/code-editor/CodeEditor.esm.js.map +1 -1
  185. package/dist/lib/components/dialog-component/DialogComponent.cjs.js +1 -1
  186. package/dist/lib/components/dialog-component/DialogComponent.cjs.js.map +1 -1
  187. package/dist/lib/components/dialog-component/DialogComponent.esm.js +4 -4
  188. package/dist/lib/components/index.cjs.js +1 -1
  189. package/dist/lib/components/index.esm.js +3 -3
  190. package/dist/lib/dialogs/helpers.cjs.js +1 -1
  191. package/dist/lib/dialogs/helpers.cjs.js.map +1 -1
  192. package/dist/lib/dialogs/helpers.esm.js +4 -4
  193. package/dist/lib/file-explorer/index.cjs.js +1 -1
  194. package/dist/lib/file-explorer/index.d.ts +1 -0
  195. package/dist/lib/file-explorer/index.d.ts.map +1 -1
  196. package/dist/lib/file-explorer/index.esm.js +2 -1
  197. package/dist/lib/file-explorer/pane-menu-items.cjs.js +2 -0
  198. package/dist/lib/file-explorer/pane-menu-items.cjs.js.map +1 -0
  199. package/dist/lib/file-explorer/pane-menu-items.d.ts +22 -0
  200. package/dist/lib/file-explorer/pane-menu-items.d.ts.map +1 -0
  201. package/dist/lib/file-explorer/pane-menu-items.esm.js +20 -0
  202. package/dist/lib/file-explorer/pane-menu-items.esm.js.map +1 -0
  203. package/dist/lib/file-explorer/relevant-panes.cjs.js +1 -1
  204. package/dist/lib/file-explorer/relevant-panes.cjs.js.map +1 -1
  205. package/dist/lib/file-explorer/relevant-panes.esm.js +8 -8
  206. package/dist/lib/messageArea.cjs.js +1 -1
  207. package/dist/lib/messageArea.cjs.js.map +1 -1
  208. package/dist/lib/messageArea.esm.js +27 -27
  209. package/dist/lib/pad.cjs.js +1 -1
  210. package/dist/lib/pad.cjs.js.map +1 -1
  211. package/dist/lib/pad.esm.js +15 -15
  212. package/dist/lib/participation.cjs.js +1 -1
  213. package/dist/lib/participation.cjs.js.map +1 -1
  214. package/dist/lib/participation.esm.js +59 -59
  215. package/dist/lib/preferences.cjs.js +1 -1
  216. package/dist/lib/preferences.cjs.js.map +1 -1
  217. package/dist/lib/preferences.esm.js +28 -28
  218. package/dist/lib/table.cjs.js +3 -3
  219. package/dist/lib/table.cjs.js.map +1 -1
  220. package/dist/lib/table.esm.js +123 -123
  221. package/dist/lib/table.esm.js.map +1 -1
  222. package/dist/lib/tabs.cjs.js +1 -1
  223. package/dist/lib/tabs.cjs.js.map +1 -1
  224. package/dist/lib/tabs.esm.js +16 -16
  225. package/dist/loader.js +11 -11
  226. package/dist/login/login.cjs.js +6 -6
  227. package/dist/login/login.cjs.js.map +1 -1
  228. package/dist/login/login.esm.js +142 -142
  229. package/dist/media/media-capture.cjs.js +1 -1
  230. package/dist/media/media-capture.cjs.js.map +1 -1
  231. package/dist/media/media-capture.esm.js +6 -6
  232. package/dist/solid-ui.js +34 -28
  233. package/dist/solid-ui.min.js +34 -28
  234. package/dist/solid-ui.min.js.map +1 -1
  235. package/dist/utils/index.cjs.js +1 -1
  236. package/dist/utils/index.cjs.js.map +1 -1
  237. package/dist/utils/index.esm.js +4 -4
  238. package/dist/utils/keyHelpers/accessData.cjs.js +1 -1
  239. package/dist/utils/keyHelpers/accessData.cjs.js.map +1 -1
  240. package/dist/utils/keyHelpers/accessData.esm.js +15 -15
  241. package/dist/utils/label.cjs.js +1 -1
  242. package/dist/utils/label.cjs.js.map +1 -1
  243. package/dist/utils/label.esm.js +4 -4
  244. package/dist/widgets/buttons.cjs.js +12 -12
  245. package/dist/widgets/buttons.cjs.js.map +1 -1
  246. package/dist/widgets/buttons.esm.js +179 -179
  247. package/dist/widgets/error.cjs.js +1 -1
  248. package/dist/widgets/error.cjs.js.map +1 -1
  249. package/dist/widgets/error.esm.js +5 -5
  250. package/dist/widgets/forms/autocomplete/autocompleteBar.cjs.js +1 -1
  251. package/dist/widgets/forms/autocomplete/autocompleteBar.cjs.js.map +1 -1
  252. package/dist/widgets/forms/autocomplete/autocompleteBar.esm.js +17 -17
  253. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js +1 -1
  254. package/dist/widgets/forms/autocomplete/autocompleteField.cjs.js.map +1 -1
  255. package/dist/widgets/forms/autocomplete/autocompleteField.esm.js +23 -23
  256. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js +1 -1
  257. package/dist/widgets/forms/autocomplete/autocompletePicker.cjs.js.map +1 -1
  258. package/dist/widgets/forms/autocomplete/autocompletePicker.esm.js +26 -26
  259. package/dist/widgets/forms/autocomplete/language.cjs.js +1 -1
  260. package/dist/widgets/forms/autocomplete/language.cjs.js.map +1 -1
  261. package/dist/widgets/forms/autocomplete/language.esm.js +9 -9
  262. package/dist/widgets/forms/autocomplete/publicData.cjs.js +5 -5
  263. package/dist/widgets/forms/autocomplete/publicData.cjs.js.map +1 -1
  264. package/dist/widgets/forms/autocomplete/publicData.esm.js +67 -67
  265. package/dist/widgets/forms/basic.cjs.js +1 -1
  266. package/dist/widgets/forms/basic.cjs.js.map +1 -1
  267. package/dist/widgets/forms/basic.esm.js +11 -11
  268. package/dist/widgets/forms.cjs.js +4 -4
  269. package/dist/widgets/forms.cjs.js.map +1 -1
  270. package/dist/widgets/forms.esm.js +561 -561
  271. package/dist/widgets/forms.esm.js.map +1 -1
  272. package/dist/widgets/index.cjs.js +1 -1
  273. package/dist/widgets/index.cjs.js.map +1 -1
  274. package/dist/widgets/index.esm.js +82 -82
  275. package/dist/widgets/peoplePicker.cjs.js +2 -2
  276. package/dist/widgets/peoplePicker.cjs.js.map +1 -1
  277. package/dist/widgets/peoplePicker.esm.js +82 -82
  278. package/package.json +3 -3
  279. package/dist/chunks/ResourceActionsMenu-Bllpr4M5.js.map +0 -1
  280. package/dist/chunks/solidLogicSingleton.esm-BXyHD7mn.js.map +0 -1
  281. package/dist/chunks/src-DQgHAH3d.js.map +0 -1
  282. package/dist/chunks/widgets-BBEQu0CS.js.map +0 -1
@@ -1,7 +1,7 @@
1
- import e from "../lib/ns.esm.js";
2
- import { log as t, warn as n } from "../lib/debug.esm.js";
3
- import { errorMessageBlock as r } from "../widgets/error.esm.js";
1
+ import { log as e, warn as t } from "../lib/debug.esm.js";
4
2
  import "../lib/iconBase.esm.js";
3
+ import { errorMessageBlock as n } from "../widgets/error.esm.js";
4
+ import r from "../lib/ns.esm.js";
5
5
  import { cancelButton as i, refreshTree as a, shortDate as o } from "../widgets/buttons.esm.js";
6
6
  import "../widgets/index.esm.js";
7
7
  import { ChatChannel as s, isDeleted as c } from "./chatLogic.esm.js";
@@ -12,7 +12,7 @@ import { store as f } from "solid-logic";
12
12
  function p(e) {
13
13
  "Notification" in window ? Notification.permission === "granted" ? new Notification(e) : Notification.permission !== "denied" && Notification.requestPermission().then(function(t) {
14
14
  t === "granted" && new Notification(e);
15
- }) : n("This browser does no t support desktop notification");
15
+ }) : t("This browser does no t support desktop notification");
16
16
  }
17
17
  async function m(e, t, n, r, i, a) {
18
18
  let o = await u(e, n, r, i, a);
@@ -27,22 +27,22 @@ async function m(e, t, n, r, i, a) {
27
27
  }
28
28
  s || t.appendChild(o);
29
29
  }
30
- async function h(n, u, h, g) {
31
- async function _(t, n) {
32
- let r = {}, i, o;
33
- for (i = n.firstChild; i; i = i.nextSibling) i.AJAR_subject && (r[i.AJAR_subject.uri] = !0);
34
- let s = f.each(t, e.wf("message"), null, n.chatDocument), c = {};
35
- for (let e of s) c[e.uri] = !0, r[e.uri] || await v(e, n);
36
- for (i = n.firstChild; i;) o = i.nextSibling, i.AJAR_subject && !c[i.AJAR_subject.uri] && n.removeChild(i), i = o;
37
- for (i = n.firstChild; i; i = i.nextSibling) i.AJAR_subject && a(i);
30
+ async function h(t, u, h, g) {
31
+ async function _(e, t) {
32
+ let n = {}, i, o;
33
+ for (i = t.firstChild; i; i = i.nextSibling) i.AJAR_subject && (n[i.AJAR_subject.uri] = !0);
34
+ let s = f.each(e, r.wf("message"), null, t.chatDocument), c = {};
35
+ for (let e of s) c[e.uri] = !0, n[e.uri] || await v(e, t);
36
+ for (i = t.firstChild; i;) o = i.nextSibling, i.AJAR_subject && !c[i.AJAR_subject.uri] && t.removeChild(i), i = o;
37
+ for (i = t.firstChild; i; i = i.nextSibling) i.AJAR_subject && a(i);
38
38
  }
39
- async function v(t, n) {
40
- if (c(t) && !g.showDeletedMessages) return;
41
- let r = f.any(null, e.sioc("has_member"), t, t.doc()), i = f.any(t, e.sioc("id"), null, t.doc());
42
- if (i && !r && (r = f.any(null, e.sioc("has_member"), i, t.doc())), g.thread) {
43
- if (!f.holds(t, e.sioc("has_reply"), g.thread) && !(r && r.sameTerm(g.thread))) return;
44
- } else if (r) return;
45
- n.fresh || await m(D, n, t, n.fresh, g, j);
39
+ async function v(e, t) {
40
+ if (c(e) && !g.showDeletedMessages) return;
41
+ let n = f.any(null, r.sioc("has_member"), e, e.doc()), i = f.any(e, r.sioc("id"), null, e.doc());
42
+ if (i && !n && (n = f.any(null, r.sioc("has_member"), i, e.doc())), g.thread) {
43
+ if (!f.holds(e, r.sioc("has_reply"), g.thread) && !(n && n.sameTerm(g.thread))) return;
44
+ } else if (n) return;
45
+ t.fresh || await m(D, t, e, t.fresh, g, j);
46
46
  }
47
47
  async function y(e) {
48
48
  let t = e ? P : F, n = t.messageTable.date;
@@ -56,17 +56,17 @@ async function h(n, u, h, g) {
56
56
  let i = await b(n, r);
57
57
  return t.messageTable = i, (e ? E : !E) ? k.appendChild(i) : k.insertBefore(i, k.firstChild), r;
58
58
  }
59
- async function b(e, i) {
60
- let a = O.leafDocumentFromDate(e);
59
+ async function b(r, i) {
60
+ let a = O.leafDocumentFromDate(r);
61
61
  try {
62
62
  await f.fetcher.createIfNotExists(a);
63
63
  } catch (o) {
64
- let s = n.createElement("table").appendChild(n.createElement("tr"));
65
- return o.response && o.response.status && o.response.status === 404 ? await x(e, i) : (t("*** Error NON 404 for chat file " + a), s.appendChild(r(n, o, "pink")), s);
64
+ let s = t.createElement("table").appendChild(t.createElement("tr"));
65
+ return o.response && o.response.status && o.response.status === 404 ? await x(r, i) : (e("*** Error NON 404 for chat file " + a), s.appendChild(n(t, o, "pink")), s);
66
66
  }
67
- return await x(e, i);
67
+ return await x(r, i);
68
68
  }
69
- async function x(t, r) {
69
+ async function x(e, n) {
70
70
  async function a() {
71
71
  let e = await y(!0);
72
72
  return e ? c.initial = !0 : c.extendedBack = !0, e;
@@ -74,36 +74,36 @@ async function h(n, u, h, g) {
74
74
  async function s() {
75
75
  return await y(!1);
76
76
  }
77
- let c = n.createElement("table");
78
- c.style.width = "100%", c.extendBackwards = a, c.extendForwards = s, c.date = t;
79
- let u = O.leafDocumentFromDate(t);
80
- if (c.chatDocument = u, c.fresh = !1, c.setAttribute("style", "width: 100%;"), r) {
77
+ let c = t.createElement("table");
78
+ c.style.width = "100%", c.extendBackwards = a, c.extendForwards = s, c.date = e;
79
+ let u = O.leafDocumentFromDate(e);
80
+ if (c.chatDocument = u, c.fresh = !1, c.setAttribute("style", "width: 100%;"), n) {
81
81
  c.final = !0, M = c, F.messageTable = c;
82
82
  let e = l(D, c, j, g);
83
83
  E ? c.insertBefore(e, c.firstChild) : c.appendChild(e), c.inputRow = e;
84
84
  }
85
85
  {
86
- let e = n.createElement("tr"), r = e.appendChild(n.createElement("td"));
87
- r.style = "text-align: center; vertical-align: middle; color: #888; font-style: italic;", r.textContent = o(t.toISOString(), !0);
88
- let a = e.appendChild(n.createElement("td"));
89
- g.includeRemoveButton && a.appendChild(i(n, (e) => {
86
+ let n = t.createElement("tr"), r = n.appendChild(t.createElement("td"));
87
+ r.style = "text-align: center; vertical-align: middle; color: #888; font-style: italic;", r.textContent = o(e.toISOString(), !0);
88
+ let a = n.appendChild(t.createElement("td"));
89
+ g.includeRemoveButton && a.appendChild(i(t, (e) => {
90
90
  k.parentNode.removeChild(k);
91
- })), c.extendedForwards = !1, E ? c.appendChild(e) : c.insertBefore(e, c.firstChild);
91
+ })), c.extendedForwards = !1, E ? c.appendChild(n) : c.insertBefore(n, c.firstChild);
92
92
  }
93
- let d = f.statementsMatching(null, e.wf("message"), null, u);
94
- !r && d.length;
93
+ let d = f.statementsMatching(null, r.wf("message"), null, u);
94
+ !n && d.length;
95
95
  for (let e of d) await v(e.object, c);
96
96
  return c.fresh = !0, c;
97
97
  }
98
98
  async function S() {
99
- let t = O.leafDocumentFromDate(/* @__PURE__ */ new Date());
100
- if (!t.sameTerm(F.messageTable.chatDocument)) {
99
+ let e = O.leafDocumentFromDate(/* @__PURE__ */ new Date());
100
+ if (!e.sameTerm(F.messageTable.chatDocument)) {
101
101
  M.inputRow && (M.removeChild(M.inputRow), delete M.inputRow);
102
- let n = F.messageTable.chatDocument;
103
- if (await C(), !f.holds(n, e.rdfs("seeAlso"), t, n)) {
104
- let r = [d.st(n, e.rdfs("seeAlso"), t, n)];
102
+ let t = F.messageTable.chatDocument;
103
+ if (await C(), !f.holds(t, r.rdfs("seeAlso"), e, t)) {
104
+ let n = [d.st(t, r.rdfs("seeAlso"), e, t)];
105
105
  try {
106
- f.updater.update([], r);
106
+ f.updater.update([], n);
107
107
  } catch (e) {
108
108
  alert("Unable to link old chat file to new one:" + e);
109
109
  }
@@ -152,18 +152,18 @@ async function h(n, u, h, g) {
152
152
  a && !n ? (o = await b(O.dateFromLeafDocument(a), n), k.appendChild(o), P.messageTable = o, F.messageTable = o, e(), setTimeout(e, 1e3)) : (await C(), P.messageTable = M, F.messageTable = M), await w(null, t), k.addEventListener("scroll", w), g.solo && document.body.addEventListener("scroll", w);
153
153
  }
154
154
  g ||= {}, g.authorDateOnLeft = !1;
155
- let E = g.newestFirst === "1" || g.newestFirst === !0, D = new s(h, g), O = D.dateFolder, k = n.createElement("div");
155
+ let E = g.newestFirst === "1" || g.newestFirst === !0, D = new s(h, g), O = D.dateFolder, k = t.createElement("div");
156
156
  D.div = k;
157
- let A = k.appendChild(n.createElement("div")), j = {
158
- dom: n,
157
+ let A = k.appendChild(t.createElement("div")), j = {
158
+ dom: t,
159
159
  statusArea: A,
160
160
  div: A
161
161
  }, M, N, P = { messageTable: null }, F = { messageTable: null };
162
162
  if (g.thread) {
163
- let t = g.thread;
164
- if (N = f.any(null, e.sioc("has_reply"), t, t.doc()), N) {
165
- let t = f.any(N, e.dct("created"), null, N.doc());
166
- t && (P.limit = new Date(t.value));
163
+ let e = g.thread;
164
+ if (N = f.any(null, r.sioc("has_reply"), e, e.doc()), N) {
165
+ let e = f.any(N, r.dct("created"), null, N.doc());
166
+ e && (P.limit = new Date(e.value));
167
167
  }
168
168
  }
169
169
  let I = !1;
@@ -1,3 +1,3 @@
1
- const e=require("../_virtual/_rolldown/runtime.cjs.js"),t=require("../lib/ns.cjs.js"),n=require("../lib/debug.cjs.js"),r=require("../utils/keyHelpers/accessData.cjs.js"),i=require("../utils/keyHelpers/acl.cjs.js");let a=require("rdflib");a=e.__toESM(a);let o=require("solid-logic"),s=require("@noble/curves/secp256k1.js"),c=require("@noble/hashes/utils.js");function l(){return(0,c.bytesToHex)(s.schnorr.utils.randomSecretKey())}function u(e){return(0,c.bytesToHex)(s.schnorr.getPublicKey((0,c.hexToBytes)(e)))}async function d(e){await o.store.fetcher.load(e);let n=await r.pubKeyUrl(e);try{return await o.store.fetcher.load(n),o.store.any(e,t.default.solid(`publicKey`))?.value}catch{return}}async function f(e){await o.store.fetcher.load(e);let s=await r.pubKeyUrl(e),c=await r.privKeyUrl(e),d=await r.getExistingPublicKey(e,s),f=await r.getExistingPrivateKey(e,c),p=!0;if(f&&d!==u(f)&&confirm(`This is strange the publicKey is not valid for
2
- `+e?.uri+`'shall we repair keeping the private key ?`)&&(p=!1),!f||!d||!p){let r=[],h=[];if(f||(f=l(),h=[a.st(e,t.default.solid(`privateKey`),a.literal(f),o.store.sym(c))],await m(c,[],h,e.uri)),!d||!p){r=[],d&&(r=[a.st(e,t.default.solid(`publicKey`),a.lit(d),o.store.sym(s))],n.log(`delete invalid publicKey `+r));let i=u(f);h=[a.st(e,t.default.solid(`publicKey`),a.literal(i),o.store.sym(s))],await m(s,r,h)}let g=c.substring(0,c.lastIndexOf(`/`)+1);await i.setAcl(g,i.keyContainerAclBody(e.uri))}return f}var p=async e=>{await o.store.fetcher.load(e);let t=o.store.any(o.store.sym(e),o.store.sym(`http://www.iana.org/assignments/link-relations/acl`));if(t)try{let e=await o.store.fetcher.webOperation(`DELETE`,t.value);n.log(`delete keyAcl`+t.value+` `+e.status)}catch(e){if(e.response.status!==404)throw Error(e);n.log(`delete keyAcl`+t.value+` `+e.response.status)}};async function m(e,t,n,r=``){await p(e),await o.store.updater.updateMany(t,n);let a=i.keyAclBody(e,r);await i.setAcl(e,a)}exports.generatePrivateKey=l,exports.generatePublicKey=u,exports.getPrivateKey=f,exports.getPublicKey=d;
1
+ const e=require("../_virtual/_rolldown/runtime.cjs.js"),t=require("../lib/debug.cjs.js"),n=require("../lib/ns.cjs.js"),r=require("../utils/keyHelpers/accessData.cjs.js"),i=require("../utils/keyHelpers/acl.cjs.js");let a=require("rdflib");a=e.__toESM(a);let o=require("solid-logic"),s=require("@noble/curves/secp256k1.js"),c=require("@noble/hashes/utils.js");function l(){return(0,c.bytesToHex)(s.schnorr.utils.randomSecretKey())}function u(e){return(0,c.bytesToHex)(s.schnorr.getPublicKey((0,c.hexToBytes)(e)))}async function d(e){await o.store.fetcher.load(e);let t=await r.pubKeyUrl(e);try{return await o.store.fetcher.load(t),o.store.any(e,n.default.solid(`publicKey`))?.value}catch{return}}async function f(e){await o.store.fetcher.load(e);let s=await r.pubKeyUrl(e),c=await r.privKeyUrl(e),d=await r.getExistingPublicKey(e,s),f=await r.getExistingPrivateKey(e,c),p=!0;if(f&&d!==u(f)&&confirm(`This is strange the publicKey is not valid for
2
+ `+e?.uri+`'shall we repair keeping the private key ?`)&&(p=!1),!f||!d||!p){let r=[],h=[];if(f||(f=l(),h=[a.st(e,n.default.solid(`privateKey`),a.literal(f),o.store.sym(c))],await m(c,[],h,e.uri)),!d||!p){r=[],d&&(r=[a.st(e,n.default.solid(`publicKey`),a.lit(d),o.store.sym(s))],t.log(`delete invalid publicKey `+r));let i=u(f);h=[a.st(e,n.default.solid(`publicKey`),a.literal(i),o.store.sym(s))],await m(s,r,h)}let g=c.substring(0,c.lastIndexOf(`/`)+1);await i.setAcl(g,i.keyContainerAclBody(e.uri))}return f}var p=async e=>{await o.store.fetcher.load(e);let n=o.store.any(o.store.sym(e),o.store.sym(`http://www.iana.org/assignments/link-relations/acl`));if(n)try{let e=await o.store.fetcher.webOperation(`DELETE`,n.value);t.log(`delete keyAcl`+n.value+` `+e.status)}catch(e){if(e.response.status!==404)throw Error(e);t.log(`delete keyAcl`+n.value+` `+e.response.status)}};async function m(e,t,n,r=``){await p(e),await o.store.updater.updateMany(t,n);let a=i.keyAclBody(e,r);await i.setAcl(e,a)}exports.generatePrivateKey=l,exports.generatePublicKey=u,exports.getPrivateKey=f,exports.getPublicKey=d;
3
3
  //# sourceMappingURL=keys.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keys.cjs.js","names":["bytesToHex","schnorr","hexToBytes","store","pubKeyUrl","ns","privKeyUrl","getExistingPublicKey","getExistingPrivateKey","$rdf","setAcl","keyContainerAclBody","keyAclBody","require_runtime","require_ns","require_debug","require_accessData","require_acl","rdflib","solid_logic","_noble_curves_secp256k1_js","_noble_hashes_utils_js","generatePrivateKey","generatePublicKey","privateKey","getPublicKey","webId","publicKeyDoc","getPrivateKey","privateKeyDoc","publicKey","validPublicKey","del","add","saveKey","newPublicKey","keyContainer","deleteKeyAcl","keyDoc","keyAclDoc","response","err","aclBody","me"],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"keys.cjs.js","names":["bytesToHex","schnorr","hexToBytes","store","pubKeyUrl","ns","privKeyUrl","getExistingPublicKey","getExistingPrivateKey","$rdf","setAcl","keyContainerAclBody","keyAclBody","require_runtime","require_debug","require_ns","require_accessData","require_acl","rdflib","solid_logic","_noble_curves_secp256k1_js","_noble_hashes_utils_js","generatePrivateKey","generatePublicKey","privateKey","getPublicKey","webId","publicKeyDoc","getPrivateKey","privateKeyDoc","publicKey","validPublicKey","del","add","saveKey","newPublicKey","keyContainer","deleteKeyAcl","keyDoc","keyAclDoc","response","err","aclBody","me"],"sources":["../../src/chat/keys.ts"],"sourcesContent":["import * as debug from '../lib/debug'\r\nimport { schnorr } from '@noble/curves/secp256k1.js'\r\nimport { bytesToHex, hexToBytes } from '@noble/hashes/utils.js'\r\nimport ns from '../lib/ns'\r\nimport { store } from 'solid-logic'\r\nimport { NamedNode } from 'rdflib'\r\nimport * as $rdf from 'rdflib'\r\nimport { getExistingPublicKey, pubKeyUrl, privKeyUrl, getExistingPrivateKey } from '../utils/keyHelpers/accessData'\r\nimport { setAcl, keyContainerAclBody, keyAclBody } from '../utils/keyHelpers/acl'\r\n\r\nexport function generatePrivateKey (): string {\r\n return bytesToHex(schnorr.utils.randomSecretKey())\r\n}\r\n\r\nexport function generatePublicKey (privateKey: string): string {\r\n return bytesToHex(schnorr.getPublicKey(hexToBytes(privateKey)))\r\n}\r\n\r\n/**\r\n * getPublicKey\r\n * used for displaying messages in chat, therefore does not\r\n * create a new key if not found\r\n * @param webId\r\n * @returns string | undefined\r\n */\r\nexport async function getPublicKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n try {\r\n await store.fetcher.load(publicKeyDoc) // url.href)\r\n const key = store.any(webId, ns.solid('publicKey'))\r\n return key?.value // as NamedNode\r\n } catch (_err) {\r\n return undefined\r\n }\r\n}\r\n\r\nexport async function getPrivateKey (webId: NamedNode) {\r\n await store.fetcher.load(webId)\r\n // find keys url's\r\n const publicKeyDoc = await pubKeyUrl(webId)\r\n const privateKeyDoc = await privKeyUrl(webId)\r\n\r\n // find key pair\r\n const publicKey = await getExistingPublicKey(webId, publicKeyDoc)\r\n let privateKey = await getExistingPrivateKey(webId, privateKeyDoc)\r\n\r\n // is publicKey valid ?\r\n let validPublicKey = true\r\n if (privateKey && (publicKey !== generatePublicKey(privateKey as string))) {\r\n if (confirm('This is strange the publicKey is not valid for\\n' + webId?.uri +\r\n '\\'shall we repair keeping the private key ?')) validPublicKey = false\r\n }\r\n\r\n // create key pair or repair publicKey\r\n if (!privateKey || !publicKey || !validPublicKey) {\r\n let del: any[] = []\r\n let add: any[] = []\r\n\r\n if (!privateKey) {\r\n // add = []\r\n privateKey = generatePrivateKey()\r\n add = [$rdf.st(webId, ns.solid('privateKey'), $rdf.literal(privateKey), store.sym(privateKeyDoc))]\r\n await saveKey(privateKeyDoc, [], add, webId.uri)\r\n }\r\n if (!publicKey || !validPublicKey) {\r\n del = []\r\n // delete invalid public key\r\n if (publicKey) {\r\n del = [$rdf.st(webId, ns.solid('publicKey'), $rdf.lit(publicKey), store.sym(publicKeyDoc))]\r\n debug.log('delete invalid publicKey ' + del)\r\n }\r\n // update new valid key\r\n const newPublicKey = generatePublicKey(privateKey)\r\n add = [$rdf.st(webId, ns.solid('publicKey'), $rdf.literal(newPublicKey), store.sym(publicKeyDoc))]\r\n await saveKey(publicKeyDoc, del, add)\r\n }\r\n const keyContainer = privateKeyDoc.substring(0, privateKeyDoc.lastIndexOf('/') + 1)\r\n await setAcl(keyContainer, keyContainerAclBody(webId.uri)) // includes DELETE and PUT\r\n }\r\n return privateKey as string\r\n}\r\n\r\nconst deleteKeyAcl = async (keyDoc: string) => {\r\n await store.fetcher.load(keyDoc)\r\n\r\n const keyAclDoc = store.any(store.sym(keyDoc), store.sym('http://www.iana.org/assignments/link-relations/acl'))\r\n if (keyAclDoc) {\r\n // delete READ only keyAclDoc. This is possible if the webId is an owner\r\n try {\r\n const response = await store.fetcher.webOperation('DELETE', keyAclDoc.value) // this may fail if webId is not an owner\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + response.status) // should test 404 and 2xx\r\n } catch (err) {\r\n if (err.response.status !== 404) { throw new Error(err) }\r\n debug.log('delete keyAcl' + keyAclDoc.value + ' ' + err.response.status) // should test 404 and 2xx\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * delete acl if keydoc exists\r\n * create/edit keyDoc\r\n * set keyDoc acl\r\n */\r\nasync function saveKey (keyDoc: string, del, add, me: string = '') {\r\n await deleteKeyAcl(keyDoc)\r\n // save key\r\n await store.updater.updateMany(del, add) // or a promise store.updater.update ?\r\n\r\n // create READ only ACL\r\n const aclBody = keyAclBody(keyDoc, me)\r\n await setAcl(keyDoc, aclBody)\r\n}\r\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import e from "../lib/ns.esm.js";
2
- import { log as t } from "../lib/debug.esm.js";
1
+ import { log as e } from "../lib/debug.esm.js";
2
+ import t from "../lib/ns.esm.js";
3
3
  import { getExistingPrivateKey as n, getExistingPublicKey as r, privKeyUrl as i, pubKeyUrl as a } from "../utils/keyHelpers/accessData.esm.js";
4
4
  import { keyAclBody as o, keyContainerAclBody as s, setAcl as c } from "../utils/keyHelpers/acl.esm.js";
5
5
  import * as l from "rdflib";
@@ -13,11 +13,11 @@ function m() {
13
13
  function h(e) {
14
14
  return f(d.getPublicKey(p(e)));
15
15
  }
16
- async function g(t) {
17
- await u.fetcher.load(t);
18
- let n = await a(t);
16
+ async function g(e) {
17
+ await u.fetcher.load(e);
18
+ let n = await a(e);
19
19
  try {
20
- return await u.fetcher.load(n), u.any(t, e.solid("publicKey"))?.value;
20
+ return await u.fetcher.load(n), u.any(e, t.solid("publicKey"))?.value;
21
21
  } catch {
22
22
  return;
23
23
  }
@@ -27,25 +27,25 @@ async function _(o) {
27
27
  let d = await a(o), f = await i(o), p = await r(o, d), g = await n(o, f), _ = !0;
28
28
  if (g && p !== h(g) && confirm("This is strange the publicKey is not valid for\n" + o?.uri + "'shall we repair keeping the private key ?") && (_ = !1), !g || !p || !_) {
29
29
  let n = [], r = [];
30
- if (g || (g = m(), r = [l.st(o, e.solid("privateKey"), l.literal(g), u.sym(f))], await y(f, [], r, o.uri)), !p || !_) {
31
- n = [], p && (n = [l.st(o, e.solid("publicKey"), l.lit(p), u.sym(d))], t("delete invalid publicKey " + n));
30
+ if (g || (g = m(), r = [l.st(o, t.solid("privateKey"), l.literal(g), u.sym(f))], await y(f, [], r, o.uri)), !p || !_) {
31
+ n = [], p && (n = [l.st(o, t.solid("publicKey"), l.lit(p), u.sym(d))], e("delete invalid publicKey " + n));
32
32
  let i = h(g);
33
- r = [l.st(o, e.solid("publicKey"), l.literal(i), u.sym(d))], await y(d, n, r);
33
+ r = [l.st(o, t.solid("publicKey"), l.literal(i), u.sym(d))], await y(d, n, r);
34
34
  }
35
35
  let i = f.substring(0, f.lastIndexOf("/") + 1);
36
36
  await c(i, s(o.uri));
37
37
  }
38
38
  return g;
39
39
  }
40
- var v = async (e) => {
41
- await u.fetcher.load(e);
42
- let n = u.any(u.sym(e), u.sym("http://www.iana.org/assignments/link-relations/acl"));
40
+ var v = async (t) => {
41
+ await u.fetcher.load(t);
42
+ let n = u.any(u.sym(t), u.sym("http://www.iana.org/assignments/link-relations/acl"));
43
43
  if (n) try {
44
- let e = await u.fetcher.webOperation("DELETE", n.value);
45
- t("delete keyAcl" + n.value + " " + e.status);
46
- } catch (e) {
47
- if (e.response.status !== 404) throw Error(e);
48
- t("delete keyAcl" + n.value + " " + e.response.status);
44
+ let t = await u.fetcher.webOperation("DELETE", n.value);
45
+ e("delete keyAcl" + n.value + " " + t.status);
46
+ } catch (t) {
47
+ if (t.response.status !== 404) throw Error(t);
48
+ e("delete keyAcl" + n.value + " " + t.response.status);
49
49
  }
50
50
  };
51
51
  async function y(e, t, n, r = "") {
@@ -1,5 +1,5 @@
1
- const e=require("../lib/ns.cjs.js"),t=require("../utils/label.cjs.js");require("../utils/index.cjs.js");const n=require("../lib/debug.cjs.js"),r=require("../lib/style.cjs.js"),i=require("../widgets/dragAndDrop.cjs.js"),a=require("../widgets/error.cjs.js"),o=require("../lib/iconBase.cjs.js"),s=require("../widgets/buttons.cjs.js");require("../widgets/index.cjs.js");const c=require("../login/login.cjs.js"),l=require("../media/index.cjs.js"),u=require("./signature.cjs.js"),d=require("./keys.cjs.js"),f=require("./chatLogic.cjs.js"),p=require("../lib/participation.cjs.js"),m=require("../lib/pad.cjs.js"),h=require("./bookmarks.cjs.js"),g=require("./messageTools.cjs.js"),_=require("./infinite.cjs.js");let v=require("solid-logic");var y=window.document,b=r.style.messageBodyStyle,x=t.label;function S(e,t){let n=y.createElement(`img`),r=`10`;t.inlineImageHeightEms&&(r=(``+t.inlineImageHeightEms).trim()),n.setAttribute(`style`,`max-height: `+r+`em; border-radius: 1em; margin: 0.7em;`),e&&n.setAttribute(`src`,e);let a=y.createElement(`a`);return a.setAttribute(`href`,e),a.setAttribute(`target`,`images`),a.appendChild(n),i.makeDraggable(n,$rdf.sym(e)),a}var C=function(e,t){let n=y.createElement(`a`);return t&&t.uri&&(n.setAttribute(`href`,t.uri),n.addEventListener(`click`,s.openHrefInOutlineMode,!0),n.setAttribute(`style`,`color: #3B5998; text-decoration: none; `)),n.textContent=e,n};function w(t){let n=v.store.any(t,e.default.foaf(`nick`));return n?``+n.value:``+x(t)}function T(e,t,n,r){let i=e.appendChild(C(w(t),t));t.uri&&v.store.fetcher.nowOrWhenFetched(t.doc(),void 0,function(e,n){i.textContent=w(t)}),e.appendChild(y.createElement(`br`)),e.appendChild(C(n,r))}function E(e,t,n,r){let i=e.appendChild(C(x(t),t));t.uri&&v.store.fetcher.nowOrWhenFetched(t.doc(),void 0,function(e,n){i.textContent=w(t)});let a=e.appendChild(C(n,r));a.style.fontSize=`80%`,a.style.marginLeft=`1em`,e.appendChild(y.createElement(`br`))}async function D(t,r,i,a,c){let l=!1,p=a.colorizeByAuthor===`1`||a.colorizeByAuthor===!0,h=v.store.any(r,e.default.foaf(`maker`)),_=v.store.any(r,e.default.dct(`created`)),x=await f.mostRecentVersion(r),C=v.store.any(x,e.default.foaf(`maker`)),w=h.uri===C?.uri?x:r,D=v.store.any(w,e.default.sioc(`content`)),O=await f.allVersions(w);O.length>1&&n.log(`renderMessageRow versions: `,O.join(`, `));let k=O.map(t=>v.store.each(t,e.default.sioc(`has_reply`))).flat(),A=null,j=[];for(let t of k)v.store.holds(t,e.default.rdf(`type`),e.default.sioc(`Thread`))?(A=t,n.log(`renderMessageRow: found thread: `+A)):j.push(t);j.length>1&&n.log(`renderMessageRow: found normal replies: `,j),A||=v.store.any(null,e.default.sioc(`has_member`),r);let M=v.store.any(w,$rdf.sym(`${u.SEC}proofValue`)),N=u.getBlankMsg();N.id=w.uri,N.created=v.store.any(w,e.default.dct(`created`)).value,N.content=D.value,N.maker=h.uri,M?.value?d.getPublicKey(h).then(e=>{e||n.warn(`message is signed but `+h.uri+` is missing publicKey`),e?.match(/[0-9A-Fa-f]{6}/g)?M?.value&&!u.verifySignature(M?.value,N,e)&&n.warn(`invalid signature
2
- `+N.id):n.warn(`invalid publicKey hex string
3
- `+h.uri+`
4
- `+e)}):(l=!0,n.warn(w.uri+` is unsigned`));let P=await f.originalVersion(r),F=!r.sameTerm(P),I=v.store.the(P,e.default.dct(`created`),null,P.doc())||v.store.the(r,e.default.dct(`created`),null,r.doc()),L=y.createElement(`tr`);l&&L.setAttribute(`style`,`background-color: red`),L.AJAR_date=I.value,L.AJAR_subject=r;let R=y.createElement(`td`);if(L.appendChild(R),a.authorDateOnLeft)T(R,h,s.shortDate(I.value),r);else{let e=y.createElement(`img`);e.setAttribute(`style`,`max-height: 2.5em; max-width: 2.5em; border-radius: 0.5em; margin: auto;`),s.setImage(e,h),R.appendChild(e)}let z=s.shortDate(I.value);F&&(z+=` ... `+s.shortDate(_.value));let B=L.appendChild(y.createElement(`td`));a.authorDateOnLeft||E(B,h,z,r);let V=D?D.value.trim():`??? no content?`,H=/^https?:\/[^ <>]*$/i.test(V),U=null;if(H){if(/\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(V)&&a.expandImagesInline){let e=S(V,a);B.appendChild(e)}else{let e=B.appendChild(y.createElement(`a`));U=e.appendChild(y.createElement(`p`)),e.href=V,U.textContent=V,B.appendChild(e)}}else U=y.createElement(`p`),B.appendChild(U),U.textContent=V;if(U){let e=p?m.lightColorHash(h):W(i);U.setAttribute(`style`,b+`background-color: `+e+`;`)}function W(e){return e?`#e8ffe8`:`white`}let G=await g.sentimentStripLinked(r,r.doc());G.children.length&&(B.appendChild(y.createElement(`br`)),B.appendChild(G));let K=y.createElement(`td`);L.appendChild(K);let q=s.button(y,o.icons.iconBase+`noun_243787.svg`,`...`);return K.appendChild(q),q.addEventListener(`click`,async function(e){if(L.toolTR){L.parentNode.removeChild(L.toolTR),delete L.toolTR;return}let n=y.createElement(`tr`),i=await g.messageToolbar(r,L,{...c,chatOptions:a},t);i.style=`border: 0.05em solid #888; border-radius: 0 0 0.7em 0.7em; border-top: 0; height:3.5em; background-color: #fff;`,L.nextSibling?L.parentElement.insertBefore(n,L.nextSibling):L.parentElement.appendChild(n),L.toolTR=n,n.appendChild(y.createElement(`td`));let o=n.appendChild(y.createElement(`td`));n.appendChild(y.createElement(`td`)),o.appendChild(i)}),A&&a.showThread&&K.appendChild(s.button(y,o.icons.iconBase+`noun_1180164.svg`,`see thread`,e=>{a.showThread(A,a)})),L}async function O(e,t,n,r){let i=e.parentNode,a=k(n,i,r,n.options,await f.mostRecentVersion(t));i.insertBefore(a,e),a.originalRow=e,e.style.visibility=`hidden`}function k(t,u,d,f,m){function g(e){e.originalRow.style.visibility=`visible`,e.parentNode.removeChild(e)}async function x(e){await S(N.value,!0)}async function S(e,r){async function i(e,i){if(await _.insertMessageIntoTable(t,u,e,!1,f,d),m){let e=k.originalRow;e.parentNode?e.parentNode.removeChild(e):(n.warn(`No parentNode on old message `+e.textContent),e.style.backgroundColor=`#fee`,e.style.visibility=`hidden`),k.parentNode.removeChild(k)}else r&&(N.value=``,N.setAttribute(`style`,b),N.disabled=!1,N.scrollIntoView(f.newestFirst),N.focus(),N.select())}r&&(N.setAttribute(`style`,b+`color: #bbb;`),N.disabled=!0);let o;try{o=await t.updateMessage(e,m,null,f.thread)}catch(e){(d.statusArea||k).appendChild(a.errorMessageBlock(y,`Error writing message: `+e));return}await i(o,e)}function C(e){let t=u.chatDocument.dir().uri;i.uploadFiles(v.store.fetcher,e,t+`Files`,t+`Pictures`,async function(e,t){await S(t)})}let w=async function(e){for(let t of e)await S(t)};function E(){function n(){return d=$rdf.sym(u.dir().uri+`Image_`+Date.now()+`.png`),d}async function a(e){e&&await S(e.uri)}if(f.menuHandler){let e=s.button(y,o.icons.iconBase+`noun_243787.svg`,`More`);e.setAttribute(`style`,r.style.buttonStyle+`float: right;`),M.appendChild(e)}f.menuHandler;let c=v.authn.currentUser();if(T(A,c,``,null),N=y.createElement(`textarea`),j.innerHTML=``,j.appendChild(N),N.rows=3,m&&(N.value=v.store.anyValue(m,e.default.sioc(`content`),null,m.doc())),N.setAttribute(`style`,b+`background-color: #eef;`),N.addEventListener(`keydown`,async function(e){e.code===`Enter`&&(!e.shiftKey&&!f.shiftEnterSendsMessage||e.shiftKey&&f.shiftEnterSendsMessage)&&await x(e)},!1),i.makeDropTarget(N,w,C),M.innerHTML=``,P=s.button(y,O,`Send`),P.style.float=`right`,P.addEventListener(`click`,e=>x(),!1),M.appendChild(P),m){let e=M.appendChild(s.cancelButton(y));e.style.float=`left`,e.addEventListener(`click`,e=>g(k),!1),M.appendChild(e)}let u=t.dateFolder.leafDocumentFromDate(new Date),d;j.appendChild(l.media.cameraButton(y,v.store,n,a)),p.recordParticipation(t.channel,t.channel.doc())}let D,O;m?(D=v.store.anyValue(m,e.default.dct(`created`),null,m.doc()),O=o.icons.iconBase+`noun_1180158.svg`):(O=o.icons.iconBase+`noun_383448.svg`,D=`9999-01-01T00:00:00Z`);let k=y.createElement(`tr`),A=y.createElement(`td`),j=y.createElement(`td`),M=y.createElement(`td`);k.appendChild(A),k.appendChild(j),k.appendChild(M),k.AJAR_date=D;let N,P;return c.ensureLoggedIn({div:j,dom:y}).then(e=>{E(),Object.assign(e,d),h.findBookmarkDocument(e).then(e=>{})}),k}exports.creatorAndDate=T,exports.creatorAndDateHorizontal=E,exports.elementForImageURI=S,exports.renderMessageEditor=k,exports.renderMessageRow=D,exports.switchToEditor=O;
1
+ const e=require("./infinite.cjs.js"),t=require("../utils/label.cjs.js"),n=require("./messageTools.cjs.js"),r=require("./bookmarks.cjs.js"),i=require("./chatLogic.cjs.js"),a=require("../widgets/dragAndDrop.cjs.js"),o=require("../widgets/error.cjs.js"),s=require("../lib/debug.cjs.js"),c=require("../widgets/buttons.cjs.js"),l=require("../lib/iconBase.cjs.js"),u=require("../login/login.cjs.js"),d=require("../media/index.cjs.js"),f=require("../lib/ns.cjs.js"),p=require("../lib/pad.cjs.js"),m=require("../lib/style.cjs.js"),h=require("../lib/participation.cjs.js");require("../utils/index.cjs.js"),require("../widgets/index.cjs.js");const g=require("./signature.cjs.js"),_=require("./keys.cjs.js");let v=require("solid-logic");var y=window.document,b=m.style.messageBodyStyle,x=t.label;function S(e,t){let n=y.createElement(`img`),r=`10`;t.inlineImageHeightEms&&(r=(``+t.inlineImageHeightEms).trim()),n.setAttribute(`style`,`max-height: `+r+`em; border-radius: 1em; margin: 0.7em;`),e&&n.setAttribute(`src`,e);let i=y.createElement(`a`);return i.setAttribute(`href`,e),i.setAttribute(`target`,`images`),i.appendChild(n),a.makeDraggable(n,$rdf.sym(e)),i}var C=function(e,t){let n=y.createElement(`a`);return t&&t.uri&&(n.setAttribute(`href`,t.uri),n.addEventListener(`click`,c.openHrefInOutlineMode,!0),n.setAttribute(`style`,`color: #3B5998; text-decoration: none; `)),n.textContent=e,n};function w(e){let t=v.store.any(e,f.default.foaf(`nick`));return t?``+t.value:``+x(e)}function T(e,t,n,r){let i=e.appendChild(C(w(t),t));t.uri&&v.store.fetcher.nowOrWhenFetched(t.doc(),void 0,function(e,n){i.textContent=w(t)}),e.appendChild(y.createElement(`br`)),e.appendChild(C(n,r))}function E(e,t,n,r){let i=e.appendChild(C(x(t),t));t.uri&&v.store.fetcher.nowOrWhenFetched(t.doc(),void 0,function(e,n){i.textContent=w(t)});let a=e.appendChild(C(n,r));a.style.fontSize=`80%`,a.style.marginLeft=`1em`,e.appendChild(y.createElement(`br`))}async function D(e,t,r,a,o){let u=!1,d=a.colorizeByAuthor===`1`||a.colorizeByAuthor===!0,m=v.store.any(t,f.default.foaf(`maker`)),h=v.store.any(t,f.default.dct(`created`)),x=await i.mostRecentVersion(t),C=v.store.any(x,f.default.foaf(`maker`)),w=m.uri===C?.uri?x:t,D=v.store.any(w,f.default.sioc(`content`)),O=await i.allVersions(w);O.length>1&&s.log(`renderMessageRow versions: `,O.join(`, `));let k=O.map(e=>v.store.each(e,f.default.sioc(`has_reply`))).flat(),A=null,j=[];for(let e of k)v.store.holds(e,f.default.rdf(`type`),f.default.sioc(`Thread`))?(A=e,s.log(`renderMessageRow: found thread: `+A)):j.push(e);j.length>1&&s.log(`renderMessageRow: found normal replies: `,j),A||=v.store.any(null,f.default.sioc(`has_member`),t);let M=v.store.any(w,$rdf.sym(`${g.SEC}proofValue`)),N=g.getBlankMsg();N.id=w.uri,N.created=v.store.any(w,f.default.dct(`created`)).value,N.content=D.value,N.maker=m.uri,M?.value?_.getPublicKey(m).then(e=>{e||s.warn(`message is signed but `+m.uri+` is missing publicKey`),e?.match(/[0-9A-Fa-f]{6}/g)?M?.value&&!g.verifySignature(M?.value,N,e)&&s.warn(`invalid signature
2
+ `+N.id):s.warn(`invalid publicKey hex string
3
+ `+m.uri+`
4
+ `+e)}):(u=!0,s.warn(w.uri+` is unsigned`));let P=await i.originalVersion(t),F=!t.sameTerm(P),I=v.store.the(P,f.default.dct(`created`),null,P.doc())||v.store.the(t,f.default.dct(`created`),null,t.doc()),L=y.createElement(`tr`);u&&L.setAttribute(`style`,`background-color: red`),L.AJAR_date=I.value,L.AJAR_subject=t;let R=y.createElement(`td`);if(L.appendChild(R),a.authorDateOnLeft)T(R,m,c.shortDate(I.value),t);else{let e=y.createElement(`img`);e.setAttribute(`style`,`max-height: 2.5em; max-width: 2.5em; border-radius: 0.5em; margin: auto;`),c.setImage(e,m),R.appendChild(e)}let z=c.shortDate(I.value);F&&(z+=` ... `+c.shortDate(h.value));let B=L.appendChild(y.createElement(`td`));a.authorDateOnLeft||E(B,m,z,t);let V=D?D.value.trim():`??? no content?`,H=/^https?:\/[^ <>]*$/i.test(V),U=null;if(H){if(/\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(V)&&a.expandImagesInline){let e=S(V,a);B.appendChild(e)}else{let e=B.appendChild(y.createElement(`a`));U=e.appendChild(y.createElement(`p`)),e.href=V,U.textContent=V,B.appendChild(e)}}else U=y.createElement(`p`),B.appendChild(U),U.textContent=V;if(U){let e=d?p.lightColorHash(m):W(r);U.setAttribute(`style`,b+`background-color: `+e+`;`)}function W(e){return e?`#e8ffe8`:`white`}let G=await n.sentimentStripLinked(t,t.doc());G.children.length&&(B.appendChild(y.createElement(`br`)),B.appendChild(G));let K=y.createElement(`td`);L.appendChild(K);let q=c.button(y,l.icons.iconBase+`noun_243787.svg`,`...`);return K.appendChild(q),q.addEventListener(`click`,async function(r){if(L.toolTR){L.parentNode.removeChild(L.toolTR),delete L.toolTR;return}let i=y.createElement(`tr`),s=await n.messageToolbar(t,L,{...o,chatOptions:a},e);s.style=`border: 0.05em solid #888; border-radius: 0 0 0.7em 0.7em; border-top: 0; height:3.5em; background-color: #fff;`,L.nextSibling?L.parentElement.insertBefore(i,L.nextSibling):L.parentElement.appendChild(i),L.toolTR=i,i.appendChild(y.createElement(`td`));let c=i.appendChild(y.createElement(`td`));i.appendChild(y.createElement(`td`)),c.appendChild(s)}),A&&a.showThread&&K.appendChild(c.button(y,l.icons.iconBase+`noun_1180164.svg`,`see thread`,e=>{a.showThread(A,a)})),L}async function O(e,t,n,r){let a=e.parentNode,o=k(n,a,r,n.options,await i.mostRecentVersion(t));a.insertBefore(o,e),o.originalRow=e,e.style.visibility=`hidden`}function k(t,n,i,p,g){function _(e){e.originalRow.style.visibility=`visible`,e.parentNode.removeChild(e)}async function x(e){await S(N.value,!0)}async function S(r,a){async function c(r,o){if(await e.insertMessageIntoTable(t,n,r,!1,p,i),g){let e=k.originalRow;e.parentNode?e.parentNode.removeChild(e):(s.warn(`No parentNode on old message `+e.textContent),e.style.backgroundColor=`#fee`,e.style.visibility=`hidden`),k.parentNode.removeChild(k)}else a&&(N.value=``,N.setAttribute(`style`,b),N.disabled=!1,N.scrollIntoView(p.newestFirst),N.focus(),N.select())}a&&(N.setAttribute(`style`,b+`color: #bbb;`),N.disabled=!0);let l;try{l=await t.updateMessage(r,g,null,p.thread)}catch(e){(i.statusArea||k).appendChild(o.errorMessageBlock(y,`Error writing message: `+e));return}await c(l,r)}function C(e){let t=n.chatDocument.dir().uri;a.uploadFiles(v.store.fetcher,e,t+`Files`,t+`Pictures`,async function(e,t){await S(t)})}let w=async function(e){for(let t of e)await S(t)};function E(){function e(){return o=$rdf.sym(i.dir().uri+`Image_`+Date.now()+`.png`),o}async function n(e){e&&await S(e.uri)}if(p.menuHandler){let e=c.button(y,l.icons.iconBase+`noun_243787.svg`,`More`);e.setAttribute(`style`,m.style.buttonStyle+`float: right;`),M.appendChild(e)}p.menuHandler;let r=v.authn.currentUser();if(T(A,r,``,null),N=y.createElement(`textarea`),j.innerHTML=``,j.appendChild(N),N.rows=3,g&&(N.value=v.store.anyValue(g,f.default.sioc(`content`),null,g.doc())),N.setAttribute(`style`,b+`background-color: #eef;`),N.addEventListener(`keydown`,async function(e){e.code===`Enter`&&(!e.shiftKey&&!p.shiftEnterSendsMessage||e.shiftKey&&p.shiftEnterSendsMessage)&&await x(e)},!1),a.makeDropTarget(N,w,C),M.innerHTML=``,P=c.button(y,O,`Send`),P.style.float=`right`,P.addEventListener(`click`,e=>x(),!1),M.appendChild(P),g){let e=M.appendChild(c.cancelButton(y));e.style.float=`left`,e.addEventListener(`click`,e=>_(k),!1),M.appendChild(e)}let i=t.dateFolder.leafDocumentFromDate(new Date),o;j.appendChild(d.media.cameraButton(y,v.store,e,n)),h.recordParticipation(t.channel,t.channel.doc())}let D,O;g?(D=v.store.anyValue(g,f.default.dct(`created`),null,g.doc()),O=l.icons.iconBase+`noun_1180158.svg`):(O=l.icons.iconBase+`noun_383448.svg`,D=`9999-01-01T00:00:00Z`);let k=y.createElement(`tr`),A=y.createElement(`td`),j=y.createElement(`td`),M=y.createElement(`td`);k.appendChild(A),k.appendChild(j),k.appendChild(M),k.AJAR_date=D;let N,P;return u.ensureLoggedIn({div:j,dom:y}).then(e=>{E(),Object.assign(e,i),r.findBookmarkDocument(e).then(e=>{})}),k}exports.creatorAndDate=T,exports.creatorAndDateHorizontal=E,exports.elementForImageURI=S,exports.renderMessageEditor=k,exports.renderMessageRow=D,exports.switchToEditor=O;
5
5
  //# sourceMappingURL=message.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"message.cjs.js","names":["style","store","ns","mostRecentVersion","allVersions","SEC","getBlankMsg","verifySignature","originalVersion","sentimentStripLinked","icons","messageToolbar","insertMessageIntoTable","authn","cancelButton","media","require_ns","require_label","require_debug","require_style","require_dragAndDrop","require_error","require_iconBase","require_buttons","require_login","require_index$2","require_signature","require_keys","require_chatLogic","require_participation","require_pad","require_bookmarks","require_messageTools","require_infinite","solid_logic","dom","messageBodyStyle","label","elementForImageURI","img","height","options","imageUri","anchor","a","term","text","nickname","s","person","creatorAndDate","nickAnchor","td1","creator","date","message","creatorAndDateHorizontal","dateBit","renderMessageRow","unsignedMessage","colorizeByAuthor","latestVersion","latestVersionCreator","msgId","content","versions","replies","version","thread","straightReplies","reply","signature","msg","publicKey","originalMessage","edited","sortDate","messageRow","bothDates","td2","isURI","para","anc","bgcolor","getBgColor","fresh","strip","td3","toolsButton","toolsTR","tools","userContext","channelObject","toolsTD","switchToEditor","messageTable","editRow","renderMessageEditor","revertEditing","messageEditor","handleFieldInput","sendMessage","field","sendComplete","oldRow","fromMainField","err","droppedFileHandler","base","files","destURI","droppedURIHandler","uri","uris","turnOnInput","getImageDoc","chatDocument","imageDoc","tookPicture","menuButton","rhs","me","lhs","middle","sendIcon","sendButton","cancelButton$1","context"],"sources":["../../src/chat/message.js"],"sourcesContent":["/** UI code for individual messages: display them, edit them\n *\n * @packageDocumentation\n */\n\n/* global $rdf */\nimport { insertMessageIntoTable } from './infinite'\nimport { messageToolbar, sentimentStripLinked } from './messageTools'\nimport { findBookmarkDocument } from './bookmarks'\nimport { mostRecentVersion, originalVersion, allVersions } from './chatLogic'\nimport * as debug from '../lib/debug'\nimport { icons } from '../lib/iconBase'\nimport { store, authn } from 'solid-logic'\nimport { ensureLoggedIn } from '../login/login'\nimport { media } from '../media/index'\nimport ns from '../lib/ns'\nimport * as pad from '../lib/pad'\nimport { style } from '../lib/style'\nimport * as utils from '../utils'\nimport * as widgets from '../widgets'\nimport { getBlankMsg, verifySignature, SEC } from './signature'\nimport { getPublicKey } from './keys'\n\nconst dom = window.document\nconst messageBodyStyle = style.messageBodyStyle\n\nconst label = utils.label\n\n/**\n * elementForImageURI\n * HTML component for an image\n * @param imageUri\n * @param options { inlineImageHeightEms }\n * @returns HTMLAnchorElement For Image\n */\nexport function elementForImageURI (imageUri, options) {\n const img = dom.createElement('img')\n let height = '10'\n if (options.inlineImageHeightEms) {\n height = ('' + options.inlineImageHeightEms).trim()\n }\n img.setAttribute(\n 'style',\n 'max-height: ' + height + 'em; border-radius: 1em; margin: 0.7em;'\n )\n // widgets.makeDropTarget(img, handleURIsDroppedOnMugshot, droppedFileHandler)\n if (imageUri) img.setAttribute('src', imageUri)\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', imageUri)\n anchor.setAttribute('target', 'images')\n anchor.appendChild(img)\n widgets.makeDraggable(img, $rdf.sym(imageUri))\n return anchor\n}\n\nconst anchor = function (text, term) {\n // If there is no link return an element anyway\n const a = dom.createElement('a')\n if (term && term.uri) {\n a.setAttribute('href', term.uri)\n a.addEventListener('click', widgets.openHrefInOutlineMode, true)\n a.setAttribute('style', 'color: #3B5998; text-decoration: none; ') // font-weight: bold\n }\n a.textContent = text\n return a\n}\n\nfunction nickname (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + label(person)\n}\n\n/**\n * creatorAndDate\n * Displays creator and date for a chat message\n * inside the `td1` element\n * @param td1\n * @param creator\n * @param date\n * @param message\n * @returns HTMLAnchorElement For Image\n */\nexport function creatorAndDate (td1, creator, date, message) {\n const nickAnchor = td1.appendChild(anchor(nickname(creator), creator))\n if (creator.uri) {\n store.fetcher.nowOrWhenFetched(creator.doc(), undefined, function (\n _ok,\n _body\n ) {\n nickAnchor.textContent = nickname(creator)\n })\n }\n td1.appendChild(dom.createElement('br'))\n td1.appendChild(anchor(date, message))\n}\n\n/**\n * creatorAndDateHorizontal\n * Horizontally displays creator and date for a chat message\n * inside the `td1` element\n * @param td1\n * @param creator\n * @param date\n * @param message\n * @returns HTMLAnchorElement For Image\n */\nexport function creatorAndDateHorizontal (td1, creator, date, message) {\n const nickAnchor = td1.appendChild(anchor(label(creator), creator))\n if (creator.uri) {\n store.fetcher.nowOrWhenFetched(creator.doc(), undefined, function (\n _ok,\n _body\n ) {\n nickAnchor.textContent = nickname(creator)\n })\n }\n const dateBit = td1.appendChild(anchor(date, message))\n dateBit.style.fontSize = '80%'\n dateBit.style.marginLeft = '1em'\n td1.appendChild(dom.createElement('br'))\n}\n\n/**\n * renderMessageRow\n * Renders a chat message, read-only mode\n * @param channelObject\n * @param message\n * @param fresh\n * @param options\n * @param userContext\n * @returns Message Row HTML Table Element\n */\nexport async function renderMessageRow (channelObject, message, fresh, options, userContext) {\n let unsignedMessage = false\n const colorizeByAuthor =\n options.colorizeByAuthor === '1' || options.colorizeByAuthor === true\n\n // const id = store.any(latestVersion, ns.sioc('id'))\n // const replies = store.each(latestVersion, ns.sioc('has_reply'))\n\n const creator = store.any(message, ns.foaf('maker'))\n const date = store.any(message, ns.dct('created'))\n const latestVersion = await mostRecentVersion(message)\n const latestVersionCreator = store.any(latestVersion, ns.foaf('maker'))\n\n // use latest content if same owner, else use original\n // this is may be too strict. Should we find latest valid version if any ?\n const msgId = creator.uri === latestVersionCreator?.uri ? latestVersion : message\n const content = store.any(msgId, ns.sioc('content'))\n\n const versions = await allVersions(msgId)\n if (versions.length > 1) {\n debug.log('renderMessageRow versions: ', versions.join(', '))\n }\n // be tolerant in accepting replies on any version of a message\n const replies = versions.map(version => store.each(version, ns.sioc('has_reply'))).flat()\n\n let thread = null\n const straightReplies = []\n for (const reply of replies) {\n if (store.holds(reply, ns.rdf('type'), ns.sioc('Thread'))) {\n thread = reply\n debug.log('renderMessageRow: found thread: ' + thread)\n } else {\n straightReplies.push(reply)\n }\n }\n if (straightReplies.length > 1) {\n debug.log('renderMessageRow: found normal replies: ', straightReplies)\n }\n if (!thread) {\n // thread = store.any(message, ns.sioc('has_reply'))\n thread = store.any(null, ns.sioc('has_member'), message)\n }\n // debug.log('@@@@ is thread' + thread)\n\n // get signature\n const signature = store.any(msgId, $rdf.sym(`${SEC}proofValue`))\n\n // set proof message object\n const msg = getBlankMsg()\n msg.id = msgId.uri\n msg.created = store.any(msgId, ns.dct('created')).value\n msg.content = content.value\n msg.maker = creator.uri\n\n // verify signature\n if (!signature?.value) { // unsigned message\n unsignedMessage = true\n debug.warn(msgId.uri + ' is unsigned') // TODO replace with UI (colored message ?)\n } else { // signed message, get public key and check signature\n getPublicKey(creator).then(publicKey => {\n // debug.log(creator.uri + '\\n' + msg.created + '\\n' + msg.id + '\\n' + publicKey)\n if (!publicKey) {\n debug.warn('message is signed but ' + creator.uri + ' is missing publicKey')\n }\n // check that publicKey is a valid hex string\n const regex = /[0-9A-Fa-f]{6}/g\n if (!publicKey?.match(regex)) debug.warn('invalid publicKey hex string\\n' + creator.uri + '\\n' + publicKey)\n // verify signature\n else if (signature?.value && !verifySignature(signature?.value, msg, publicKey)) debug.warn('invalid signature\\n' + msg.id)\n })\n }\n\n const originalMessage = await originalVersion(message)\n const edited = !message.sameTerm(originalMessage)\n // @@ load it first @@ Or display the new data at the old date.\n // @@@ kludge!\n const sortDate = store.the(originalMessage, ns.dct('created'), null, originalMessage.doc()) || store.the(message, ns.dct('created'), null, message.doc())\n // In message\n\n const messageRow = dom.createElement('tr')\n if (unsignedMessage) messageRow.setAttribute('style', 'background-color: red')\n messageRow.AJAR_date = sortDate.value\n messageRow.AJAR_subject = message\n\n const td1 = dom.createElement('td')\n messageRow.appendChild(td1)\n if (!options.authorDateOnLeft) {\n const img = dom.createElement('img')\n img.setAttribute(\n 'style',\n 'max-height: 2.5em; max-width: 2.5em; border-radius: 0.5em; margin: auto;'\n )\n widgets.setImage(img, creator)\n td1.appendChild(img)\n } else {\n creatorAndDate(td1, creator, widgets.shortDate(sortDate.value), message)\n }\n let bothDates = widgets.shortDate(sortDate.value)\n if (edited) {\n bothDates += ' ... ' + widgets.shortDate(date.value)\n }\n\n // Render the content ot the message itself\n const td2 = messageRow.appendChild(dom.createElement('td'))\n\n if (!options.authorDateOnLeft) {\n creatorAndDateHorizontal(\n td2,\n creator,\n bothDates, // widgets.shortDate(dateString)\n message\n )\n }\n const text = content ? content.value.trim() : '??? no content?'\n const isURI = /^https?:\\/[^ <>]*$/i.test(text)\n let para = null\n if (isURI) {\n const isImage = /\\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(text) // @@ Should use content-type not URI\n if (isImage && options.expandImagesInline) {\n const img = elementForImageURI(text, options)\n td2.appendChild(img)\n } else {\n // Link but not Image\n const anc = td2.appendChild(dom.createElement('a'))\n para = anc.appendChild(dom.createElement('p'))\n anc.href = text\n para.textContent = text\n td2.appendChild(anc)\n }\n } else {\n // text\n para = dom.createElement('p')\n td2.appendChild(para)\n para.textContent = text\n }\n if (para) {\n const bgcolor = colorizeByAuthor\n ? pad.lightColorHash(creator)\n : getBgColor(fresh)\n para.setAttribute(\n 'style',\n messageBodyStyle + 'background-color: ' + bgcolor + ';'\n )\n }\n\n function getBgColor (fresh) {\n return fresh ? '#e8ffe8' : 'white'\n }\n\n // Sentiment strip\n const strip = await sentimentStripLinked(message, message.doc())\n if (strip.children.length) {\n td2.appendChild(dom.createElement('br'))\n td2.appendChild(strip)\n }\n\n // Message tool bar button\n const td3 = dom.createElement('td')\n messageRow.appendChild(td3)\n const toolsButton = widgets.button(\n dom,\n icons.iconBase + 'noun_243787.svg',\n '...'\n )\n td3.appendChild(toolsButton)\n toolsButton.addEventListener('click', async function (_event) {\n if (messageRow.toolTR) {\n // already got a toolbar? Toogle\n messageRow.parentNode.removeChild(messageRow.toolTR)\n delete messageRow.toolTR\n return\n }\n const toolsTR = dom.createElement('tr')\n const tools = await messageToolbar(message, messageRow, { ...userContext, chatOptions: options }, channelObject)\n tools.style =\n 'border: 0.05em solid #888; border-radius: 0 0 0.7em 0.7em; border-top: 0; height:3.5em; background-color: #fff;' // @@ fix\n if (messageRow.nextSibling) {\n messageRow.parentElement.insertBefore(toolsTR, messageRow.nextSibling)\n } else {\n messageRow.parentElement.appendChild(toolsTR)\n }\n messageRow.toolTR = toolsTR\n toolsTR.appendChild(dom.createElement('td')) // left\n const toolsTD = toolsTR.appendChild(dom.createElement('td'))\n toolsTR.appendChild(dom.createElement('td')) // right\n toolsTD.appendChild(tools)\n })\n if (thread && options.showThread) {\n // debug.log(' message has thread ' + thread)\n td3.appendChild(widgets.button(\n dom,\n icons.iconBase + 'noun_1180164.svg', // right arrow .. @@ think of stg better\n 'see thread',\n _e => {\n // debug.log('@@@@ Calling showThread thread ' + thread)\n options.showThread(thread, options)\n }\n ))\n }\n return messageRow\n} // END OF RENDERMESSAGE\n\nexport async function switchToEditor (messageRow, message, channelObject, userContext) {\n const messageTable = messageRow.parentNode\n const editRow = renderMessageEditor(channelObject, messageTable, userContext,\n channelObject.options, await mostRecentVersion(message))\n messageTable.insertBefore(editRow, messageRow)\n editRow.originalRow = messageRow\n messageRow.style.visibility = 'hidden' // Hide the original message. unhide if user cancels edit\n}\n/* Control for a new message -- or editing an old message ***************\n *\n */\nexport function renderMessageEditor (channelObject, messageTable, userContext, options, originalMessage) {\n function revertEditing (messageEditor) {\n messageEditor.originalRow.style.visibility = 'visible' // restore read-only version\n messageEditor.parentNode.removeChild(messageEditor)\n }\n\n async function handleFieldInput (_event) {\n await sendMessage(field.value, true)\n }\n\n async function sendMessage (text, fromMainField) {\n async function sendComplete (message, _text2) {\n // const dateStamp = store.any(message, ns.dct('created'), null, message.doc())\n // const content = $rdf.literal(text2)\n await insertMessageIntoTable(channelObject, messageTable, message, false, options, userContext) // not green\n\n if (originalMessage) { // editing another message\n const oldRow = messageEditor.originalRow\n // oldRow.style.display = '' // restore read-only version, re-attack\n if (oldRow.parentNode) {\n oldRow.parentNode.removeChild(oldRow) // No longer needed old version\n } else {\n debug.warn('No parentNode on old message ' + oldRow.textContent)\n oldRow.style.backgroundColor = '#fee'\n oldRow.style.visibility = 'hidden' // @@ FIX THIS AND REMOVE FROM DOM INSTEAD\n }\n messageEditor.parentNode.removeChild(messageEditor) // no longer need editor\n } else {\n if (fromMainField) {\n field.value = '' // clear from out for reuse\n field.setAttribute('style', messageBodyStyle)\n field.disabled = false\n field.scrollIntoView(options.newestFirst) // allign bottom (top)\n field.focus() // Start typing next line immediately\n field.select()\n }\n }\n // await channelObject.div.refresh() // Add new day if nec @@ add back\n }\n\n // const me = authn.currentUser() // Must be logged on or wuld have got login button\n if (fromMainField) {\n field.setAttribute('style', messageBodyStyle + 'color: #bbb;') // pendingedit\n field.disabled = true\n }\n\n let message\n try {\n message = await channelObject.updateMessage(text, originalMessage, null, options.thread)\n } catch (err) {\n const statusArea = userContext.statusArea || messageEditor\n statusArea.appendChild(\n widgets.errorMessageBlock(dom, 'Error writing message: ' + err)\n )\n return\n }\n await sendComplete(message, text)\n } // sendMessage\n\n // DRAG AND DROP\n function droppedFileHandler (files) {\n const base = messageTable.chatDocument.dir().uri\n widgets.uploadFiles(\n store.fetcher,\n files,\n base + 'Files',\n base + 'Pictures',\n async function (theFile, destURI) {\n // @@@@@@ Wait for each if several\n await sendMessage(destURI)\n }\n )\n }\n\n // When a set of URIs are dropped on the field\n const droppedURIHandler = async function (uris) {\n for (const uri of uris) {\n await sendMessage(uri)\n }\n }\n\n // When we are actually logged on\n function turnOnInput () {\n function getImageDoc () {\n imageDoc = $rdf.sym(\n chatDocument.dir().uri + 'Image_' + Date.now() + '.png'\n )\n return imageDoc\n }\n\n async function tookPicture (imageDoc) {\n if (imageDoc) {\n await sendMessage(imageDoc.uri)\n }\n }\n\n // Body of turnOnInput\n\n let menuButton\n if (options.menuHandler) {\n const menuButton = widgets.button(\n dom, icons.iconBase + 'noun_243787.svg', 'More')\n menuButton.setAttribute('style', style.buttonStyle + 'float: right;')\n // menuButton.addEventListener('click', _event => sendMessage(), false) (done in turnoninput)\n rhs.appendChild(menuButton)\n }\n\n if (options.menuHandler && menuButton) {\n const me = authn.currentUser()\n const menuOptions = {\n me,\n dom,\n div: null, // @@ was: div\n newBase: messageTable.chatDocument.dir().uri\n }\n menuButton.addEventListener(\n 'click',\n event => {\n options.menuHandler(event, channelObject.chatChannel, menuOptions)\n },\n false\n )\n }\n\n const me = authn.currentUser() // If already logged on\n creatorAndDate(lhs, me, '', null)\n\n field = dom.createElement('textarea')\n middle.innerHTML = ''\n middle.appendChild(field)\n field.rows = 3\n if (originalMessage) {\n field.value = store.anyValue(originalMessage, ns.sioc('content'), null, originalMessage.doc())\n }\n // field.cols = 40\n field.setAttribute('style', messageBodyStyle + 'background-color: #eef;')\n\n // Trap the Enter BEFORE it is used ti make a newline\n\n field.addEventListener(\n 'keydown',\n async function (e) {\n // User preference?\n if (e.code === 'Enter') {\n // if (e.keyCode === 13) { // deprocated https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\n if ((!e.shiftKey && !options.shiftEnterSendsMessage) || (e.shiftKey && options.shiftEnterSendsMessage)) {\n // Shift-Enter just adds a new line\n // (note alt-enter doesn't add newline anyway on my setup - so have to use shift.\n await handleFieldInput(e)\n }\n }\n },\n false\n )\n\n widgets.makeDropTarget(field, droppedURIHandler, droppedFileHandler)\n\n rhs.innerHTML = ''\n\n sendButton = widgets.button(dom, sendIcon, 'Send')\n sendButton.style.float = 'right'\n sendButton.addEventListener('click', _event => handleFieldInput(), false)\n rhs.appendChild(sendButton)\n\n if (originalMessage) { // Are we editing another message?\n const cancelButton = rhs.appendChild(widgets.cancelButton(dom))\n cancelButton.style.float = 'left'\n // cancelButton.firstChild.style.opacity = '0.3' // moved to buttons\n cancelButton.addEventListener('click', _event => revertEditing(messageEditor), false)\n rhs.appendChild(cancelButton)\n }\n\n const chatDocument = channelObject.dateFolder.leafDocumentFromDate(new Date())\n let imageDoc\n\n middle.appendChild(\n media.cameraButton(dom, store, getImageDoc, tookPicture)\n )\n\n pad.recordParticipation(channelObject.channel, channelObject.channel.doc()) // participation =\n } // turn on inpuut\n\n // Body of renderMessageEditor\n\n let sortDate, sendIcon\n if (originalMessage) {\n sortDate = store.anyValue(originalMessage, ns.dct('created'), null, originalMessage.doc())\n // text = store.anyValue(originalMessage, ns.sioc('content'), null, originalMessage.doc())\n sendIcon = icons.iconBase + 'noun_1180158.svg' // Green check\n // cancelIcon = icons.iconBase + 'noun_1180156.svg' // Black cross\n } else {\n sendIcon = icons.iconBase + 'noun_383448.svg'\n sortDate = '9999-01-01T00:00:00Z' // ISO format for field sort\n // text = ''\n }\n const messageEditor = dom.createElement('tr')\n const lhs = dom.createElement('td')\n const middle = dom.createElement('td')\n const rhs = dom.createElement('td')\n messageEditor.appendChild(lhs)\n messageEditor.appendChild(middle)\n messageEditor.appendChild(rhs)\n messageEditor.AJAR_date = sortDate\n // messageEditor.appendChild(dom.createElement('br'))\n\n let field, sendButton\n const context = { div: middle, dom }\n\n ensureLoggedIn(context).then(context => {\n // me = context.me\n turnOnInput()\n Object.assign(context, userContext)\n findBookmarkDocument(context).then(_context => {\n // debug.log('Bookmark file: ' + context.bookmarkDocument)\n })\n })\n\n return messageEditor\n} // renderMessageEditor\n"],"mappings":"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"}
1
+ {"version":3,"file":"message.cjs.js","names":["style","store","ns","mostRecentVersion","allVersions","SEC","getBlankMsg","verifySignature","originalVersion","sentimentStripLinked","icons","messageToolbar","insertMessageIntoTable","authn","cancelButton","media","require_infinite","require_label","require_messageTools","require_bookmarks","require_chatLogic","require_dragAndDrop","require_error","require_debug","require_buttons","require_iconBase","require_login","require_index","require_ns","require_pad","require_style","require_participation","require_signature","require_keys","solid_logic","dom","messageBodyStyle","label","elementForImageURI","img","height","options","imageUri","anchor","a","term","text","nickname","s","person","creatorAndDate","nickAnchor","td1","creator","date","message","creatorAndDateHorizontal","dateBit","renderMessageRow","unsignedMessage","colorizeByAuthor","latestVersion","latestVersionCreator","msgId","content","versions","replies","version","thread","straightReplies","reply","signature","msg","publicKey","originalMessage","edited","sortDate","messageRow","bothDates","td2","isURI","para","anc","bgcolor","getBgColor","fresh","strip","td3","toolsButton","toolsTR","tools","userContext","channelObject","toolsTD","switchToEditor","messageTable","editRow","renderMessageEditor","revertEditing","messageEditor","handleFieldInput","sendMessage","field","sendComplete","oldRow","fromMainField","err","droppedFileHandler","base","files","destURI","droppedURIHandler","uri","uris","turnOnInput","getImageDoc","chatDocument","imageDoc","tookPicture","menuButton","rhs","me","lhs","middle","sendIcon","sendButton","cancelButton$1","context"],"sources":["../../src/chat/message.js"],"sourcesContent":["/** UI code for individual messages: display them, edit them\n *\n * @packageDocumentation\n */\n\n/* global $rdf */\nimport { insertMessageIntoTable } from './infinite'\nimport { messageToolbar, sentimentStripLinked } from './messageTools'\nimport { findBookmarkDocument } from './bookmarks'\nimport { mostRecentVersion, originalVersion, allVersions } from './chatLogic'\nimport * as debug from '../lib/debug'\nimport { icons } from '../lib/iconBase'\nimport { store, authn } from 'solid-logic'\nimport { ensureLoggedIn } from '../login/login'\nimport { media } from '../media/index'\nimport ns from '../lib/ns'\nimport * as pad from '../lib/pad'\nimport { style } from '../lib/style'\nimport * as utils from '../utils'\nimport * as widgets from '../widgets'\nimport { getBlankMsg, verifySignature, SEC } from './signature'\nimport { getPublicKey } from './keys'\n\nconst dom = window.document\nconst messageBodyStyle = style.messageBodyStyle\n\nconst label = utils.label\n\n/**\n * elementForImageURI\n * HTML component for an image\n * @param imageUri\n * @param options { inlineImageHeightEms }\n * @returns HTMLAnchorElement For Image\n */\nexport function elementForImageURI (imageUri, options) {\n const img = dom.createElement('img')\n let height = '10'\n if (options.inlineImageHeightEms) {\n height = ('' + options.inlineImageHeightEms).trim()\n }\n img.setAttribute(\n 'style',\n 'max-height: ' + height + 'em; border-radius: 1em; margin: 0.7em;'\n )\n // widgets.makeDropTarget(img, handleURIsDroppedOnMugshot, droppedFileHandler)\n if (imageUri) img.setAttribute('src', imageUri)\n const anchor = dom.createElement('a')\n anchor.setAttribute('href', imageUri)\n anchor.setAttribute('target', 'images')\n anchor.appendChild(img)\n widgets.makeDraggable(img, $rdf.sym(imageUri))\n return anchor\n}\n\nconst anchor = function (text, term) {\n // If there is no link return an element anyway\n const a = dom.createElement('a')\n if (term && term.uri) {\n a.setAttribute('href', term.uri)\n a.addEventListener('click', widgets.openHrefInOutlineMode, true)\n a.setAttribute('style', 'color: #3B5998; text-decoration: none; ') // font-weight: bold\n }\n a.textContent = text\n return a\n}\n\nfunction nickname (person) {\n const s = store.any(person, ns.foaf('nick'))\n if (s) return '' + s.value\n return '' + label(person)\n}\n\n/**\n * creatorAndDate\n * Displays creator and date for a chat message\n * inside the `td1` element\n * @param td1\n * @param creator\n * @param date\n * @param message\n * @returns HTMLAnchorElement For Image\n */\nexport function creatorAndDate (td1, creator, date, message) {\n const nickAnchor = td1.appendChild(anchor(nickname(creator), creator))\n if (creator.uri) {\n store.fetcher.nowOrWhenFetched(creator.doc(), undefined, function (\n _ok,\n _body\n ) {\n nickAnchor.textContent = nickname(creator)\n })\n }\n td1.appendChild(dom.createElement('br'))\n td1.appendChild(anchor(date, message))\n}\n\n/**\n * creatorAndDateHorizontal\n * Horizontally displays creator and date for a chat message\n * inside the `td1` element\n * @param td1\n * @param creator\n * @param date\n * @param message\n * @returns HTMLAnchorElement For Image\n */\nexport function creatorAndDateHorizontal (td1, creator, date, message) {\n const nickAnchor = td1.appendChild(anchor(label(creator), creator))\n if (creator.uri) {\n store.fetcher.nowOrWhenFetched(creator.doc(), undefined, function (\n _ok,\n _body\n ) {\n nickAnchor.textContent = nickname(creator)\n })\n }\n const dateBit = td1.appendChild(anchor(date, message))\n dateBit.style.fontSize = '80%'\n dateBit.style.marginLeft = '1em'\n td1.appendChild(dom.createElement('br'))\n}\n\n/**\n * renderMessageRow\n * Renders a chat message, read-only mode\n * @param channelObject\n * @param message\n * @param fresh\n * @param options\n * @param userContext\n * @returns Message Row HTML Table Element\n */\nexport async function renderMessageRow (channelObject, message, fresh, options, userContext) {\n let unsignedMessage = false\n const colorizeByAuthor =\n options.colorizeByAuthor === '1' || options.colorizeByAuthor === true\n\n // const id = store.any(latestVersion, ns.sioc('id'))\n // const replies = store.each(latestVersion, ns.sioc('has_reply'))\n\n const creator = store.any(message, ns.foaf('maker'))\n const date = store.any(message, ns.dct('created'))\n const latestVersion = await mostRecentVersion(message)\n const latestVersionCreator = store.any(latestVersion, ns.foaf('maker'))\n\n // use latest content if same owner, else use original\n // this is may be too strict. Should we find latest valid version if any ?\n const msgId = creator.uri === latestVersionCreator?.uri ? latestVersion : message\n const content = store.any(msgId, ns.sioc('content'))\n\n const versions = await allVersions(msgId)\n if (versions.length > 1) {\n debug.log('renderMessageRow versions: ', versions.join(', '))\n }\n // be tolerant in accepting replies on any version of a message\n const replies = versions.map(version => store.each(version, ns.sioc('has_reply'))).flat()\n\n let thread = null\n const straightReplies = []\n for (const reply of replies) {\n if (store.holds(reply, ns.rdf('type'), ns.sioc('Thread'))) {\n thread = reply\n debug.log('renderMessageRow: found thread: ' + thread)\n } else {\n straightReplies.push(reply)\n }\n }\n if (straightReplies.length > 1) {\n debug.log('renderMessageRow: found normal replies: ', straightReplies)\n }\n if (!thread) {\n // thread = store.any(message, ns.sioc('has_reply'))\n thread = store.any(null, ns.sioc('has_member'), message)\n }\n // debug.log('@@@@ is thread' + thread)\n\n // get signature\n const signature = store.any(msgId, $rdf.sym(`${SEC}proofValue`))\n\n // set proof message object\n const msg = getBlankMsg()\n msg.id = msgId.uri\n msg.created = store.any(msgId, ns.dct('created')).value\n msg.content = content.value\n msg.maker = creator.uri\n\n // verify signature\n if (!signature?.value) { // unsigned message\n unsignedMessage = true\n debug.warn(msgId.uri + ' is unsigned') // TODO replace with UI (colored message ?)\n } else { // signed message, get public key and check signature\n getPublicKey(creator).then(publicKey => {\n // debug.log(creator.uri + '\\n' + msg.created + '\\n' + msg.id + '\\n' + publicKey)\n if (!publicKey) {\n debug.warn('message is signed but ' + creator.uri + ' is missing publicKey')\n }\n // check that publicKey is a valid hex string\n const regex = /[0-9A-Fa-f]{6}/g\n if (!publicKey?.match(regex)) debug.warn('invalid publicKey hex string\\n' + creator.uri + '\\n' + publicKey)\n // verify signature\n else if (signature?.value && !verifySignature(signature?.value, msg, publicKey)) debug.warn('invalid signature\\n' + msg.id)\n })\n }\n\n const originalMessage = await originalVersion(message)\n const edited = !message.sameTerm(originalMessage)\n // @@ load it first @@ Or display the new data at the old date.\n // @@@ kludge!\n const sortDate = store.the(originalMessage, ns.dct('created'), null, originalMessage.doc()) || store.the(message, ns.dct('created'), null, message.doc())\n // In message\n\n const messageRow = dom.createElement('tr')\n if (unsignedMessage) messageRow.setAttribute('style', 'background-color: red')\n messageRow.AJAR_date = sortDate.value\n messageRow.AJAR_subject = message\n\n const td1 = dom.createElement('td')\n messageRow.appendChild(td1)\n if (!options.authorDateOnLeft) {\n const img = dom.createElement('img')\n img.setAttribute(\n 'style',\n 'max-height: 2.5em; max-width: 2.5em; border-radius: 0.5em; margin: auto;'\n )\n widgets.setImage(img, creator)\n td1.appendChild(img)\n } else {\n creatorAndDate(td1, creator, widgets.shortDate(sortDate.value), message)\n }\n let bothDates = widgets.shortDate(sortDate.value)\n if (edited) {\n bothDates += ' ... ' + widgets.shortDate(date.value)\n }\n\n // Render the content ot the message itself\n const td2 = messageRow.appendChild(dom.createElement('td'))\n\n if (!options.authorDateOnLeft) {\n creatorAndDateHorizontal(\n td2,\n creator,\n bothDates, // widgets.shortDate(dateString)\n message\n )\n }\n const text = content ? content.value.trim() : '??? no content?'\n const isURI = /^https?:\\/[^ <>]*$/i.test(text)\n let para = null\n if (isURI) {\n const isImage = /\\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(text) // @@ Should use content-type not URI\n if (isImage && options.expandImagesInline) {\n const img = elementForImageURI(text, options)\n td2.appendChild(img)\n } else {\n // Link but not Image\n const anc = td2.appendChild(dom.createElement('a'))\n para = anc.appendChild(dom.createElement('p'))\n anc.href = text\n para.textContent = text\n td2.appendChild(anc)\n }\n } else {\n // text\n para = dom.createElement('p')\n td2.appendChild(para)\n para.textContent = text\n }\n if (para) {\n const bgcolor = colorizeByAuthor\n ? pad.lightColorHash(creator)\n : getBgColor(fresh)\n para.setAttribute(\n 'style',\n messageBodyStyle + 'background-color: ' + bgcolor + ';'\n )\n }\n\n function getBgColor (fresh) {\n return fresh ? '#e8ffe8' : 'white'\n }\n\n // Sentiment strip\n const strip = await sentimentStripLinked(message, message.doc())\n if (strip.children.length) {\n td2.appendChild(dom.createElement('br'))\n td2.appendChild(strip)\n }\n\n // Message tool bar button\n const td3 = dom.createElement('td')\n messageRow.appendChild(td3)\n const toolsButton = widgets.button(\n dom,\n icons.iconBase + 'noun_243787.svg',\n '...'\n )\n td3.appendChild(toolsButton)\n toolsButton.addEventListener('click', async function (_event) {\n if (messageRow.toolTR) {\n // already got a toolbar? Toogle\n messageRow.parentNode.removeChild(messageRow.toolTR)\n delete messageRow.toolTR\n return\n }\n const toolsTR = dom.createElement('tr')\n const tools = await messageToolbar(message, messageRow, { ...userContext, chatOptions: options }, channelObject)\n tools.style =\n 'border: 0.05em solid #888; border-radius: 0 0 0.7em 0.7em; border-top: 0; height:3.5em; background-color: #fff;' // @@ fix\n if (messageRow.nextSibling) {\n messageRow.parentElement.insertBefore(toolsTR, messageRow.nextSibling)\n } else {\n messageRow.parentElement.appendChild(toolsTR)\n }\n messageRow.toolTR = toolsTR\n toolsTR.appendChild(dom.createElement('td')) // left\n const toolsTD = toolsTR.appendChild(dom.createElement('td'))\n toolsTR.appendChild(dom.createElement('td')) // right\n toolsTD.appendChild(tools)\n })\n if (thread && options.showThread) {\n // debug.log(' message has thread ' + thread)\n td3.appendChild(widgets.button(\n dom,\n icons.iconBase + 'noun_1180164.svg', // right arrow .. @@ think of stg better\n 'see thread',\n _e => {\n // debug.log('@@@@ Calling showThread thread ' + thread)\n options.showThread(thread, options)\n }\n ))\n }\n return messageRow\n} // END OF RENDERMESSAGE\n\nexport async function switchToEditor (messageRow, message, channelObject, userContext) {\n const messageTable = messageRow.parentNode\n const editRow = renderMessageEditor(channelObject, messageTable, userContext,\n channelObject.options, await mostRecentVersion(message))\n messageTable.insertBefore(editRow, messageRow)\n editRow.originalRow = messageRow\n messageRow.style.visibility = 'hidden' // Hide the original message. unhide if user cancels edit\n}\n/* Control for a new message -- or editing an old message ***************\n *\n */\nexport function renderMessageEditor (channelObject, messageTable, userContext, options, originalMessage) {\n function revertEditing (messageEditor) {\n messageEditor.originalRow.style.visibility = 'visible' // restore read-only version\n messageEditor.parentNode.removeChild(messageEditor)\n }\n\n async function handleFieldInput (_event) {\n await sendMessage(field.value, true)\n }\n\n async function sendMessage (text, fromMainField) {\n async function sendComplete (message, _text2) {\n // const dateStamp = store.any(message, ns.dct('created'), null, message.doc())\n // const content = $rdf.literal(text2)\n await insertMessageIntoTable(channelObject, messageTable, message, false, options, userContext) // not green\n\n if (originalMessage) { // editing another message\n const oldRow = messageEditor.originalRow\n // oldRow.style.display = '' // restore read-only version, re-attack\n if (oldRow.parentNode) {\n oldRow.parentNode.removeChild(oldRow) // No longer needed old version\n } else {\n debug.warn('No parentNode on old message ' + oldRow.textContent)\n oldRow.style.backgroundColor = '#fee'\n oldRow.style.visibility = 'hidden' // @@ FIX THIS AND REMOVE FROM DOM INSTEAD\n }\n messageEditor.parentNode.removeChild(messageEditor) // no longer need editor\n } else {\n if (fromMainField) {\n field.value = '' // clear from out for reuse\n field.setAttribute('style', messageBodyStyle)\n field.disabled = false\n field.scrollIntoView(options.newestFirst) // allign bottom (top)\n field.focus() // Start typing next line immediately\n field.select()\n }\n }\n // await channelObject.div.refresh() // Add new day if nec @@ add back\n }\n\n // const me = authn.currentUser() // Must be logged on or wuld have got login button\n if (fromMainField) {\n field.setAttribute('style', messageBodyStyle + 'color: #bbb;') // pendingedit\n field.disabled = true\n }\n\n let message\n try {\n message = await channelObject.updateMessage(text, originalMessage, null, options.thread)\n } catch (err) {\n const statusArea = userContext.statusArea || messageEditor\n statusArea.appendChild(\n widgets.errorMessageBlock(dom, 'Error writing message: ' + err)\n )\n return\n }\n await sendComplete(message, text)\n } // sendMessage\n\n // DRAG AND DROP\n function droppedFileHandler (files) {\n const base = messageTable.chatDocument.dir().uri\n widgets.uploadFiles(\n store.fetcher,\n files,\n base + 'Files',\n base + 'Pictures',\n async function (theFile, destURI) {\n // @@@@@@ Wait for each if several\n await sendMessage(destURI)\n }\n )\n }\n\n // When a set of URIs are dropped on the field\n const droppedURIHandler = async function (uris) {\n for (const uri of uris) {\n await sendMessage(uri)\n }\n }\n\n // When we are actually logged on\n function turnOnInput () {\n function getImageDoc () {\n imageDoc = $rdf.sym(\n chatDocument.dir().uri + 'Image_' + Date.now() + '.png'\n )\n return imageDoc\n }\n\n async function tookPicture (imageDoc) {\n if (imageDoc) {\n await sendMessage(imageDoc.uri)\n }\n }\n\n // Body of turnOnInput\n\n let menuButton\n if (options.menuHandler) {\n const menuButton = widgets.button(\n dom, icons.iconBase + 'noun_243787.svg', 'More')\n menuButton.setAttribute('style', style.buttonStyle + 'float: right;')\n // menuButton.addEventListener('click', _event => sendMessage(), false) (done in turnoninput)\n rhs.appendChild(menuButton)\n }\n\n if (options.menuHandler && menuButton) {\n const me = authn.currentUser()\n const menuOptions = {\n me,\n dom,\n div: null, // @@ was: div\n newBase: messageTable.chatDocument.dir().uri\n }\n menuButton.addEventListener(\n 'click',\n event => {\n options.menuHandler(event, channelObject.chatChannel, menuOptions)\n },\n false\n )\n }\n\n const me = authn.currentUser() // If already logged on\n creatorAndDate(lhs, me, '', null)\n\n field = dom.createElement('textarea')\n middle.innerHTML = ''\n middle.appendChild(field)\n field.rows = 3\n if (originalMessage) {\n field.value = store.anyValue(originalMessage, ns.sioc('content'), null, originalMessage.doc())\n }\n // field.cols = 40\n field.setAttribute('style', messageBodyStyle + 'background-color: #eef;')\n\n // Trap the Enter BEFORE it is used ti make a newline\n\n field.addEventListener(\n 'keydown',\n async function (e) {\n // User preference?\n if (e.code === 'Enter') {\n // if (e.keyCode === 13) { // deprocated https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode\n if ((!e.shiftKey && !options.shiftEnterSendsMessage) || (e.shiftKey && options.shiftEnterSendsMessage)) {\n // Shift-Enter just adds a new line\n // (note alt-enter doesn't add newline anyway on my setup - so have to use shift.\n await handleFieldInput(e)\n }\n }\n },\n false\n )\n\n widgets.makeDropTarget(field, droppedURIHandler, droppedFileHandler)\n\n rhs.innerHTML = ''\n\n sendButton = widgets.button(dom, sendIcon, 'Send')\n sendButton.style.float = 'right'\n sendButton.addEventListener('click', _event => handleFieldInput(), false)\n rhs.appendChild(sendButton)\n\n if (originalMessage) { // Are we editing another message?\n const cancelButton = rhs.appendChild(widgets.cancelButton(dom))\n cancelButton.style.float = 'left'\n // cancelButton.firstChild.style.opacity = '0.3' // moved to buttons\n cancelButton.addEventListener('click', _event => revertEditing(messageEditor), false)\n rhs.appendChild(cancelButton)\n }\n\n const chatDocument = channelObject.dateFolder.leafDocumentFromDate(new Date())\n let imageDoc\n\n middle.appendChild(\n media.cameraButton(dom, store, getImageDoc, tookPicture)\n )\n\n pad.recordParticipation(channelObject.channel, channelObject.channel.doc()) // participation =\n } // turn on inpuut\n\n // Body of renderMessageEditor\n\n let sortDate, sendIcon\n if (originalMessage) {\n sortDate = store.anyValue(originalMessage, ns.dct('created'), null, originalMessage.doc())\n // text = store.anyValue(originalMessage, ns.sioc('content'), null, originalMessage.doc())\n sendIcon = icons.iconBase + 'noun_1180158.svg' // Green check\n // cancelIcon = icons.iconBase + 'noun_1180156.svg' // Black cross\n } else {\n sendIcon = icons.iconBase + 'noun_383448.svg'\n sortDate = '9999-01-01T00:00:00Z' // ISO format for field sort\n // text = ''\n }\n const messageEditor = dom.createElement('tr')\n const lhs = dom.createElement('td')\n const middle = dom.createElement('td')\n const rhs = dom.createElement('td')\n messageEditor.appendChild(lhs)\n messageEditor.appendChild(middle)\n messageEditor.appendChild(rhs)\n messageEditor.AJAR_date = sortDate\n // messageEditor.appendChild(dom.createElement('br'))\n\n let field, sendButton\n const context = { div: middle, dom }\n\n ensureLoggedIn(context).then(context => {\n // me = context.me\n turnOnInput()\n Object.assign(context, userContext)\n findBookmarkDocument(context).then(_context => {\n // debug.log('Bookmark file: ' + context.bookmarkDocument)\n })\n })\n\n return messageEditor\n} // renderMessageEditor\n"],"mappings":"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"}