solid-ui 3.1.3-15 → 3.1.3-16

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 (123) hide show
  1. package/dist/chat/message.cjs.js +1 -1
  2. package/dist/chat/message.cjs.js.map +1 -1
  3. package/dist/chat/message.esm.js +9 -8
  4. package/dist/chat/message.esm.js.map +1 -1
  5. package/dist/chunks/{DialogProvider-0HIHjONx.js → DialogProvider-BFllJFfq.js} +2 -2
  6. package/dist/chunks/{DialogProvider-0HIHjONx.js.map → DialogProvider-BFllJFfq.js.map} +1 -1
  7. package/dist/chunks/{account-Ch8h_zTv.js → account-CFAjLyt5.js} +10 -10
  8. package/dist/chunks/{account-Ch8h_zTv.js.map → account-CFAjLyt5.js.map} +1 -1
  9. package/dist/chunks/{auth-D4NUMSzc.js → auth-IpQoQHJx.js} +10 -10
  10. package/dist/chunks/{auth-D4NUMSzc.js.map → auth-IpQoQHJx.js.map} +1 -1
  11. package/dist/chunks/{avatar-BWtz4RlU.js → avatar-CJ728tvg.js} +3 -3
  12. package/dist/chunks/{avatar-BWtz4RlU.js.map → avatar-CJ728tvg.js.map} +1 -1
  13. package/dist/chunks/{button-BJyFKOKO.js → button-CnmrOsEf.js} +2 -2
  14. package/dist/chunks/{button-BJyFKOKO.js.map → button-CnmrOsEf.js.map} +1 -1
  15. package/dist/chunks/{chunk.64OG2H45-BADxAtEI.js → chunk.64OG2H45-BFgXEuP7.js} +2 -2
  16. package/dist/chunks/{chunk.64OG2H45-BADxAtEI.js.map → chunk.64OG2H45-BFgXEuP7.js.map} +1 -1
  17. package/dist/chunks/{combobox-0NWv9K3D.js → combobox-D3eGdicW.js} +3 -3
  18. package/dist/chunks/{combobox-0NWv9K3D.js.map → combobox-D3eGdicW.js.map} +1 -1
  19. package/dist/chunks/{combobox-option-B-twy1Zn.js → combobox-option-BcXpUnWu.js} +2 -2
  20. package/dist/chunks/{combobox-option-B-twy1Zn.js.map → combobox-option-BcXpUnWu.js.map} +1 -1
  21. package/dist/chunks/{components-DrP7BOrs.js → components-BHoVP7zE.js} +13 -11
  22. package/dist/chunks/{components-DrP7BOrs.js.map → components-BHoVP7zE.js.map} +1 -1
  23. package/dist/chunks/{dialog-CcMVH-Ut.js → dialog-D9Ellvjx.js} +4 -4
  24. package/dist/chunks/{dialog-CcMVH-Ut.js.map → dialog-D9Ellvjx.js.map} +1 -1
  25. package/dist/chunks/{dialog-content-DcD_s3hK.js → dialog-content-B2FmmQvH.js} +2 -2
  26. package/dist/chunks/{dialog-content-DcD_s3hK.js.map → dialog-content-B2FmmQvH.js.map} +1 -1
  27. package/dist/chunks/{dialog-footer-CHgSH7G5.js → dialog-footer-CxjoqQJF.js} +2 -2
  28. package/dist/chunks/{dialog-footer-CHgSH7G5.js.map → dialog-footer-CxjoqQJF.js.map} +1 -1
  29. package/dist/chunks/{dialog-header-BjellR7_.js → dialog-header-0dobhr5C.js} +2 -2
  30. package/dist/chunks/{dialog-header-BjellR7_.js.map → dialog-header-0dobhr5C.js.map} +1 -1
  31. package/dist/chunks/{dialogs-CeHuLUo5.js → dialogs-D2n-R0lI.js} +2 -2
  32. package/dist/chunks/{dialogs-CeHuLUo5.js.map → dialogs-D2n-R0lI.js.map} +1 -1
  33. package/dist/chunks/{dialogs-root-CvsON-m8.js → dialogs-root-ngPW2Q6K.js} +3 -3
  34. package/dist/chunks/{dialogs-root-CvsON-m8.js.map → dialogs-root-ngPW2Q6K.js.map} +1 -1
  35. package/dist/chunks/{guard-BIesxo_f.js → guard-CkfPYP4e.js} +3 -3
  36. package/dist/chunks/{guard-BIesxo_f.js.map → guard-CkfPYP4e.js.map} +1 -1
  37. package/dist/chunks/{index.esm-CyyOkz04.js → index.esm-BW2SOmt6.js} +343 -255
  38. package/dist/chunks/index.esm-BW2SOmt6.js.map +1 -0
  39. package/dist/chunks/{input-CFDN76Y5.js → input-BIhn_8nf.js} +2 -2
  40. package/dist/chunks/{input-CFDN76Y5.js.map → input-BIhn_8nf.js.map} +1 -1
  41. package/dist/chunks/{jsonld-52q5nY_t.js → jsonld-PfYSYrj9.js} +120 -99
  42. package/dist/chunks/{jsonld-52q5nY_t.js.map → jsonld-PfYSYrj9.js.map} +1 -1
  43. package/dist/chunks/{login-button-BhdKFJ-F.js → login-button-C7TABAml.js} +4 -4
  44. package/dist/chunks/{login-button-BhdKFJ-F.js.map → login-button-C7TABAml.js.map} +1 -1
  45. package/dist/chunks/{logout-button-ClbKS9ss.js → logout-button-BDpulDka.js} +4 -4
  46. package/dist/chunks/{logout-button-ClbKS9ss.js.map → logout-button-BDpulDka.js.map} +1 -1
  47. package/dist/chunks/{menu-DVgG-el5.js → menu-hMtmUkel.js} +3 -3
  48. package/dist/chunks/{menu-DVgG-el5.js.map → menu-hMtmUkel.js.map} +1 -1
  49. package/dist/chunks/{menu-item-Bj3NgLzB.js → menu-item-BdCkmJol.js} +2 -2
  50. package/dist/chunks/{menu-item-Bj3NgLzB.js.map → menu-item-BdCkmJol.js.map} +1 -1
  51. package/dist/chunks/{photo-capture-CVKE0SKx.js → photo-capture-Bvixtxsq.js} +4 -4
  52. package/dist/chunks/{photo-capture-CVKE0SKx.js.map → photo-capture-Bvixtxsq.js.map} +1 -1
  53. package/dist/chunks/{photo-capture-modal-DARmhHUH.js → photo-capture-modal-BhmL3kYD.js} +6 -6
  54. package/dist/chunks/{photo-capture-modal-DARmhHUH.js.map → photo-capture-modal-BhmL3kYD.js.map} +1 -1
  55. package/dist/chunks/{provider-CBSBzOfP.js → provider-DP9Us_Aw.js} +5 -5
  56. package/dist/chunks/{provider-CBSBzOfP.js.map → provider-DP9Us_Aw.js.map} +1 -1
  57. package/dist/chunks/{rdf-form-BeuzVBOP.js → rdf-form-CUUvMplY.js} +4 -4
  58. package/dist/chunks/{rdf-form-BeuzVBOP.js.map → rdf-form-CUUvMplY.js.map} +1 -1
  59. package/dist/chunks/{rdf-input-n73oeSkf.js → rdf-input-CH5Aah6g.js} +5 -5
  60. package/dist/chunks/{rdf-input-n73oeSkf.js.map → rdf-input-CH5Aah6g.js.map} +1 -1
  61. package/dist/chunks/{select-BuIxSm1A.js → select-BcC-ICqO.js} +2 -2
  62. package/dist/chunks/{select-BuIxSm1A.js.map → select-BcC-ICqO.js.map} +1 -1
  63. package/dist/chunks/{select-option-Z8qZsCQo.js → select-option-B0uXcj2O.js} +2 -2
  64. package/dist/chunks/{select-option-Z8qZsCQo.js.map → select-option-B0uXcj2O.js.map} +1 -1
  65. package/dist/chunks/{signup-button-B-AgjjAK.js → signup-button-06D4XyCv.js} +4 -4
  66. package/dist/chunks/{signup-button-B-AgjjAK.js.map → signup-button-06D4XyCv.js.map} +1 -1
  67. package/dist/chunks/{solid-emblem-D4ItOckU.js → solid-emblem-CcQOqRX0.js} +2 -2
  68. package/dist/chunks/{solid-emblem-D4ItOckU.js.map → solid-emblem-CcQOqRX0.js.map} +1 -1
  69. package/dist/chunks/{src-B5SL8UtS.js → src--J7RRo6J.js} +1732 -1687
  70. package/dist/chunks/src--J7RRo6J.js.map +1 -0
  71. package/dist/chunks/{style-CjYxsW7j.js → style-_Eni1Wf8.js} +12 -10
  72. package/dist/chunks/{style-CjYxsW7j.js.map → style-_Eni1Wf8.js.map} +1 -1
  73. package/dist/components/account.js +1 -1
  74. package/dist/components/avatar.js +1 -1
  75. package/dist/components/button.js +1 -1
  76. package/dist/components/combobox-option.js +1 -1
  77. package/dist/components/combobox.js +1 -1
  78. package/dist/components/dialog-content.js +1 -1
  79. package/dist/components/dialog-footer.js +1 -1
  80. package/dist/components/dialog-header.js +1 -1
  81. package/dist/components/dialog-provider.js +1 -1
  82. package/dist/components/dialog.js +1 -1
  83. package/dist/components/dialogs-root.js +1 -1
  84. package/dist/components/guard.js +1 -1
  85. package/dist/components/input.js +1 -1
  86. package/dist/components/login-button.js +1 -1
  87. package/dist/components/login-modal.js +1 -1
  88. package/dist/components/logout-button.js +1 -1
  89. package/dist/components/menu-item.js +1 -1
  90. package/dist/components/menu.js +1 -1
  91. package/dist/components/photo-capture-modal.js +1 -1
  92. package/dist/components/photo-capture.js +1 -1
  93. package/dist/components/provider.js +1 -1
  94. package/dist/components/rdf-form.js +1 -1
  95. package/dist/components/rdf-input.js +1 -1
  96. package/dist/components/select-option.js +1 -1
  97. package/dist/components/select.js +1 -1
  98. package/dist/components/signup-button.js +1 -1
  99. package/dist/components/solid-emblem.js +1 -1
  100. package/dist/components.js +26 -26
  101. package/dist/index.js +6 -6
  102. package/dist/lib/log.cjs.js +1 -1
  103. package/dist/lib/log.cjs.js.map +1 -1
  104. package/dist/lib/log.esm.js +10 -8
  105. package/dist/lib/log.esm.js.map +1 -1
  106. package/dist/lib/table.cjs.js.map +1 -1
  107. package/dist/lib/table.esm.js.map +1 -1
  108. package/dist/loader.js +6 -6
  109. package/dist/login/login.cjs.js +1 -1
  110. package/dist/login/login.cjs.js.map +1 -1
  111. package/dist/login/login.d.ts.map +1 -1
  112. package/dist/login/login.esm.js +6 -0
  113. package/dist/login/login.esm.js.map +1 -1
  114. package/dist/solid-ui.js +83 -83
  115. package/dist/solid-ui.min.js +83 -83
  116. package/dist/solid-ui.min.js.map +1 -1
  117. package/dist/widgets/forms.cjs.js +1 -1
  118. package/dist/widgets/forms.cjs.js.map +1 -1
  119. package/dist/widgets/forms.esm.js +13 -11
  120. package/dist/widgets/forms.esm.js.map +1 -1
  121. package/package.json +2 -2
  122. package/dist/chunks/index.esm-CyyOkz04.js.map +0 -1
  123. package/dist/chunks/src-B5SL8UtS.js.map +0 -1
@@ -1,5 +1,5 @@
1
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
2
  `+N.id):n.warn(`invalid publicKey hex string
3
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;
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;
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"],"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"],"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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"}
@@ -72,14 +72,15 @@ async function B(t, i, a, o, s) {
72
72
  let q = W.appendChild(M.createElement("td"));
73
73
  o.authorDateOnLeft || z(q, f, K, i);
74
74
  let J = k ? k.value.trim() : "??? no content?", Y = /^https?:\/[^ <>]*$/i.test(J), X = null;
75
- if (Y) if (/\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(J) && o.expandImagesInline) {
76
- let e = F(J, o);
77
- q.appendChild(e);
78
- } else {
79
- let e = q.appendChild(M.createElement("a"));
80
- X = e.appendChild(M.createElement("p")), e.href = J, X.textContent = J, q.appendChild(e);
81
- }
82
- else X = M.createElement("p"), q.appendChild(X), X.textContent = J;
75
+ if (Y) {
76
+ if (/\.(gif|jpg|jpeg|tiff|png|svg)$/i.test(J) && o.expandImagesInline) {
77
+ let e = F(J, o);
78
+ q.appendChild(e);
79
+ } else {
80
+ let e = q.appendChild(M.createElement("a"));
81
+ X = e.appendChild(M.createElement("p")), e.href = J, X.textContent = J, q.appendChild(e);
82
+ }
83
+ } else X = M.createElement("p"), q.appendChild(X), X.textContent = J;
83
84
  if (X) {
84
85
  let e = d ? T(f) : te(a);
85
86
  X.setAttribute("style", N + "background-color: " + e + ";");
@@ -1 +1 @@
1
- {"version":3,"file":"message.esm.js","names":["utils.label","widgets.openHrefInOutlineMode","ns","widgets.shortDate","pad.lightColorHash","widgets.button","widgets.errorMessageBlock","cancelButton","widgets.cancelButton"],"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":";;;;;;;;;;;;;;;;;;;;;;AAuBA,IAAM,IAAM,OAAO,UACb,IAAmB,EAAM,kBAEzB,IAAQA;AASd,SAAgB,EAAoB,GAAU,GAAS;CACrD,IAAM,IAAM,EAAI,cAAc,KAAK,GAC/B,IAAS;CASb,AARI,EAAQ,yBACV,KAAU,KAAK,EAAQ,qBAAA,CAAsB,KAAK,IAEpD,EAAI,aACF,SACA,iBAAiB,IAAS,wCAC5B,GAEI,KAAU,EAAI,aAAa,OAAO,CAAQ;CAC9C,IAAM,IAAS,EAAI,cAAc,GAAG;CAKpC,OAJA,EAAO,aAAa,QAAQ,CAAQ,GACpC,EAAO,aAAa,UAAU,QAAQ,GACtC,EAAO,YAAY,CAAG,GACtB,EAAsB,GAAK,KAAK,IAAI,CAAQ,CAAC,GACtC;AACT;AAEA,IAAM,IAAS,SAAU,GAAM,GAAM;CAEnC,IAAM,IAAI,EAAI,cAAc,GAAG;CAO/B,OANI,KAAQ,EAAK,QACf,EAAE,aAAa,QAAQ,EAAK,GAAG,GAC/B,EAAE,iBAAiB,SAASC,GAA+B,EAAI,GAC/D,EAAE,aAAa,SAAS,yCAAyC,IAEnE,EAAE,cAAc,GACT;AACT;AAEA,SAAS,EAAU,GAAQ;CACzB,IAAM,IAAI,EAAM,IAAI,GAAQC,EAAG,KAAK,MAAM,CAAC;CAE3C,OADI,IAAU,KAAK,EAAE,QACd,KAAK,EAAM,CAAM;AAC1B;AAYA,SAAgB,EAAgB,GAAK,GAAS,GAAM,GAAS;CAC3D,IAAM,IAAa,EAAI,YAAY,EAAO,EAAS,CAAO,GAAG,CAAO,CAAC;CAUrE,AATI,EAAQ,OACV,EAAM,QAAQ,iBAAiB,EAAQ,IAAI,GAAG,KAAA,GAAW,SACvD,GACA,GACA;EACA,EAAW,cAAc,EAAS,CAAO;CAC3C,CAAC,GAEH,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC,GACvC,EAAI,YAAY,EAAO,GAAM,CAAO,CAAC;AACvC;AAYA,SAAgB,EAA0B,GAAK,GAAS,GAAM,GAAS;CACrE,IAAM,IAAa,EAAI,YAAY,EAAO,EAAM,CAAO,GAAG,CAAO,CAAC;CAClE,AAAI,EAAQ,OACV,EAAM,QAAQ,iBAAiB,EAAQ,IAAI,GAAG,KAAA,GAAW,SACvD,GACA,GACA;EACA,EAAW,cAAc,EAAS,CAAO;CAC3C,CAAC;CAEH,IAAM,IAAU,EAAI,YAAY,EAAO,GAAM,CAAO,CAAC;CAGrD,AAFA,EAAQ,MAAM,WAAW,OACzB,EAAQ,MAAM,aAAa,OAC3B,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC;AACzC;AAYA,eAAsB,EAAkB,GAAe,GAAS,GAAO,GAAS,GAAa;CAC3F,IAAI,IAAkB,IAChB,IACJ,EAAQ,qBAAqB,OAAO,EAAQ,qBAAqB,IAK7D,IAAU,EAAM,IAAI,GAASA,EAAG,KAAK,OAAO,CAAC,GAC7C,IAAO,EAAM,IAAI,GAASA,EAAG,IAAI,SAAS,CAAC,GAC3C,IAAgB,MAAM,EAAkB,CAAO,GAC/C,IAAuB,EAAM,IAAI,GAAeA,EAAG,KAAK,OAAO,CAAC,GAIhE,IAAQ,EAAQ,QAAQ,GAAsB,MAAM,IAAgB,GACpE,IAAU,EAAM,IAAI,GAAOA,EAAG,KAAK,SAAS,CAAC,GAE7C,IAAW,MAAM,EAAY,CAAK;CACxC,AAAI,EAAS,SAAS,KACpB,EAAU,+BAA+B,EAAS,KAAK,KAAK,CAAC;CAG/D,IAAM,IAAU,EAAS,KAAI,MAAW,EAAM,KAAK,GAASA,EAAG,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,GAEpF,IAAS,MACP,IAAkB,CAAC;CACzB,KAAK,IAAM,KAAS,GAClB,AAAI,EAAM,MAAM,GAAOA,EAAG,IAAI,MAAM,GAAGA,EAAG,KAAK,QAAQ,CAAC,KACtD,IAAS,GACT,EAAU,qCAAqC,CAAM,KAErD,EAAgB,KAAK,CAAK;CAM9B,AAHI,EAAgB,SAAS,KAC3B,EAAU,4CAA4C,CAAe,GAEvE,AAEE,MAAS,EAAM,IAAI,MAAMA,EAAG,KAAK,YAAY,GAAG,CAAO;CAKzD,IAAM,IAAY,EAAM,IAAI,GAAO,KAAK,IAAI,GAAG,EAAI,WAAW,CAAC,GAGzD,IAAM,EAAY;CAOxB,AANA,EAAI,KAAK,EAAM,KACf,EAAI,UAAU,EAAM,IAAI,GAAOA,EAAG,IAAI,SAAS,CAAC,CAAC,CAAC,OAClD,EAAI,UAAU,EAAQ,OACtB,EAAI,QAAQ,EAAQ,KAGf,GAAW,QAId,EAAa,CAAO,CAAC,CAAC,MAAK,MAAa;EAOtC,AALK,KACH,EAAW,2BAA2B,EAAQ,MAAM,uBAAuB,GAIxE,GAAW,MAAM,iBAAK,IAElB,GAAW,SAAS,CAAC,EAAgB,GAAW,OAAO,GAAK,CAAS,KAAG,EAAW,wBAAwB,EAAI,EAAE,IAF5F,EAAW,mCAAmC,EAAQ,MAAM,OAAO,CAAS;CAG5G,CAAC,KAbD,IAAkB,IAClB,EAAW,EAAM,MAAM,cAAc;CAevC,IAAM,IAAkB,MAAM,EAAgB,CAAO,GAC/C,KAAS,CAAC,EAAQ,SAAS,CAAe,GAG1C,IAAW,EAAM,IAAI,GAAiBA,EAAG,IAAI,SAAS,GAAG,MAAM,EAAgB,IAAI,CAAC,KAAK,EAAM,IAAI,GAASA,EAAG,IAAI,SAAS,GAAG,MAAM,EAAQ,IAAI,CAAC,GAGlJ,IAAa,EAAI,cAAc,IAAI;CAGzC,AAFI,KAAiB,EAAW,aAAa,SAAS,uBAAuB,GAC7E,EAAW,YAAY,EAAS,OAChC,EAAW,eAAe;CAE1B,IAAM,IAAM,EAAI,cAAc,IAAI;CAElC,IADA,EAAW,YAAY,CAAG,GACrB,EAAQ,kBASX,EAAe,GAAK,GAASC,EAAkB,EAAS,KAAK,GAAG,CAAO;MAT1C;EAC7B,IAAM,IAAM,EAAI,cAAc,KAAK;EAMnC,AALA,EAAI,aACF,SACA,0EACF,GACA,EAAiB,GAAK,CAAO,GAC7B,EAAI,YAAY,CAAG;CACrB;CAGA,IAAI,IAAYA,EAAkB,EAAS,KAAK;CAChD,AAAI,OACF,KAAa,UAAUA,EAAkB,EAAK,KAAK;CAIrD,IAAM,IAAM,EAAW,YAAY,EAAI,cAAc,IAAI,CAAC;CAE1D,AAAK,EAAQ,oBACX,EACE,GACA,GACA,GACA,CACF;CAEF,IAAM,IAAO,IAAU,EAAQ,MAAM,KAAK,IAAI,mBACxC,IAAQ,sBAAsB,KAAK,CAAI,GACzC,IAAO;CACX,IAAI,GAEF,IADgB,kCAAkC,KAAK,CAC7C,KAAK,EAAQ,oBAAoB;EACzC,IAAM,IAAM,EAAmB,GAAM,CAAO;EAC5C,EAAI,YAAY,CAAG;CACrB,OAAO;EAEL,IAAM,IAAM,EAAI,YAAY,EAAI,cAAc,GAAG,CAAC;EAIlD,AAHA,IAAO,EAAI,YAAY,EAAI,cAAc,GAAG,CAAC,GAC7C,EAAI,OAAO,GACX,EAAK,cAAc,GACnB,EAAI,YAAY,CAAG;CACrB;MAKA,AAFA,IAAO,EAAI,cAAc,GAAG,GAC5B,EAAI,YAAY,CAAI,GACpB,EAAK,cAAc;CAErB,IAAI,GAAM;EACR,IAAM,IAAU,IACZC,EAAmB,CAAO,IAC1B,GAAW,CAAK;EACpB,EAAK,aACH,SACA,IAAmB,uBAAuB,IAAU,GACtD;CACF;CAEA,SAAS,GAAY,GAAO;EAC1B,OAAO,IAAQ,YAAY;CAC7B;CAGA,IAAM,IAAQ,MAAM,EAAqB,GAAS,EAAQ,IAAI,CAAC;CAC/D,AAAI,EAAM,SAAS,WACjB,EAAI,YAAY,EAAI,cAAc,IAAI,CAAC,GACvC,EAAI,YAAY,CAAK;CAIvB,IAAM,IAAM,EAAI,cAAc,IAAI;CAClC,EAAW,YAAY,CAAG;CAC1B,IAAM,IAAcC,EAClB,GACA,EAAM,WAAW,mBACjB,KACF;CAoCA,OAnCA,EAAI,YAAY,CAAW,GAC3B,EAAY,iBAAiB,SAAS,eAAgB,GAAQ;EAC5D,IAAI,EAAW,QAAQ;GAGrB,AADA,EAAW,WAAW,YAAY,EAAW,MAAM,GACnD,OAAO,EAAW;GAClB;EACF;EACA,IAAM,IAAU,EAAI,cAAc,IAAI,GAChC,IAAQ,MAAM,EAAe,GAAS,GAAY;GAAE,GAAG;GAAa,aAAa;EAAQ,GAAG,CAAa;EAS/G,AARA,EAAM,QACJ,oHACE,EAAW,cACb,EAAW,cAAc,aAAa,GAAS,EAAW,WAAW,IAErE,EAAW,cAAc,YAAY,CAAO,GAE9C,EAAW,SAAS,GACpB,EAAQ,YAAY,EAAI,cAAc,IAAI,CAAC;EAC3C,IAAM,IAAU,EAAQ,YAAY,EAAI,cAAc,IAAI,CAAC;EAE3D,AADA,EAAQ,YAAY,EAAI,cAAc,IAAI,CAAC,GAC3C,EAAQ,YAAY,CAAK;CAC3B,CAAC,GACG,KAAU,EAAQ,cAEpB,EAAI,YAAYA,EACd,GACA,EAAM,WAAW,oBACjB,eACA,MAAM;EAEJ,EAAQ,WAAW,GAAQ,CAAO;CACpC,CACF,CAAC,GAEI;AACT;AAEA,eAAsB,EAAgB,GAAY,GAAS,GAAe,GAAa;CACrF,IAAM,IAAe,EAAW,YAC1B,IAAU,EAAoB,GAAe,GAAc,GAC/D,EAAc,SAAS,MAAM,EAAkB,CAAO,CAAC;CAGzD,AAFA,EAAa,aAAa,GAAS,CAAU,GAC7C,EAAQ,cAAc,GACtB,EAAW,MAAM,aAAa;AAChC;AAIA,SAAgB,EAAqB,GAAe,GAAc,GAAa,GAAS,GAAiB;CACvG,SAAS,EAAe,GAAe;EAErC,AADA,EAAc,YAAY,MAAM,aAAa,WAC7C,EAAc,WAAW,YAAY,CAAa;CACpD;CAEA,eAAe,EAAkB,GAAQ;EACvC,MAAM,EAAY,EAAM,OAAO,EAAI;CACrC;CAEA,eAAe,EAAa,GAAM,GAAe;EAC/C,eAAe,EAAc,GAAS,GAAQ;GAK5C,IAFA,MAAM,EAAuB,GAAe,GAAc,GAAS,IAAO,GAAS,CAAW,GAE1F,GAAiB;IACnB,IAAM,IAAS,EAAc;IAS7B,AAPI,EAAO,aACT,EAAO,WAAW,YAAY,CAAM,KAEpC,EAAW,kCAAkC,EAAO,WAAW,GAC/D,EAAO,MAAM,kBAAkB,QAC/B,EAAO,MAAM,aAAa,WAE5B,EAAc,WAAW,YAAY,CAAa;GACpD,OACE,AAAI,MACF,EAAM,QAAQ,IACd,EAAM,aAAa,SAAS,CAAgB,GAC5C,EAAM,WAAW,IACjB,EAAM,eAAe,EAAQ,WAAW,GACxC,EAAM,MAAM,GACZ,EAAM,OAAO;EAInB;EAGA,AAAI,MACF,EAAM,aAAa,SAAS,IAAmB,cAAc,GAC7D,EAAM,WAAW;EAGnB,IAAI;EACJ,IAAI;GACF,IAAU,MAAM,EAAc,cAAc,GAAM,GAAiB,MAAM,EAAQ,MAAM;EACzF,SAAS,GAAK;GAEZ,CADmB,EAAY,cAAc,EAAA,CAClC,YACTC,EAA0B,GAAK,4BAA4B,CAAG,CAChE;GACA;EACF;EACA,MAAM,EAAa,GAAS,CAAI;CAClC;CAGA,SAAS,EAAoB,GAAO;EAClC,IAAM,IAAO,EAAa,aAAa,IAAI,CAAC,CAAC;EAC7C,EACE,EAAM,SACN,GACA,IAAO,SACP,IAAO,YACP,eAAgB,GAAS,GAAS;GAEhC,MAAM,EAAY,CAAO;EAC3B,CACF;CACF;CAGA,IAAM,IAAoB,eAAgB,GAAM;EAC9C,KAAK,IAAM,KAAO,GAChB,MAAM,EAAY,CAAG;CAEzB;CAGA,SAAS,IAAe;EACtB,SAAS,IAAe;GAItB,OAHA,IAAW,KAAK,IACd,EAAa,IAAI,CAAC,CAAC,MAAM,WAAW,KAAK,IAAI,IAAI,MACnD,GACO;EACT;EAEA,eAAe,EAAa,GAAU;GACpC,AAAI,KACF,MAAM,EAAY,EAAS,GAAG;EAElC;EAKA,IAAI,EAAQ,aAAa;GACvB,IAAM,IAAaD,EACjB,GAAK,EAAM,WAAW,mBAAmB,MAAM;GAGjD,AAFA,EAAW,aAAa,SAAS,EAAM,cAAc,eAAe,GAEpE,EAAI,YAAY,CAAU;EAC5B;EAEA,AAAI,EAAQ;EAiBZ,IAAM,IAAK,EAAM,YAAY;EAwC7B,IAvCA,EAAe,GAAK,GAAI,IAAI,IAAI,GAEhC,IAAQ,EAAI,cAAc,UAAU,GACpC,EAAO,YAAY,IACnB,EAAO,YAAY,CAAK,GACxB,EAAM,OAAO,GACT,MACF,EAAM,QAAQ,EAAM,SAAS,GAAiBH,EAAG,KAAK,SAAS,GAAG,MAAM,EAAgB,IAAI,CAAC,IAG/F,EAAM,aAAa,SAAS,IAAmB,yBAAyB,GAIxE,EAAM,iBACJ,WACA,eAAgB,GAAG;GAEjB,AAAI,EAAE,SAAS,YAER,CAAC,EAAE,YAAY,CAAC,EAAQ,0BAA4B,EAAE,YAAY,EAAQ,2BAG7E,MAAM,EAAiB,CAAC;EAG9B,GACA,EACF,GAEA,EAAuB,GAAO,GAAmB,CAAkB,GAEnE,EAAI,YAAY,IAEhB,IAAaG,EAAe,GAAK,GAAU,MAAM,GACjD,EAAW,MAAM,QAAQ,SACzB,EAAW,iBAAiB,UAAS,MAAU,EAAiB,GAAG,EAAK,GACxE,EAAI,YAAY,CAAU,GAEtB,GAAiB;GACnB,IAAME,IAAe,EAAI,YAAYC,EAAqB,CAAG,CAAC;GAI9D,AAHA,EAAa,MAAM,QAAQ,QAE3B,EAAa,iBAAiB,UAAS,MAAU,EAAc,CAAa,GAAG,EAAK,GACpF,EAAI,YAAYD,CAAY;EAC9B;EAEA,IAAM,IAAe,EAAc,WAAW,qCAAqB,IAAI,KAAK,CAAC,GACzE;EAMJ,AAJA,EAAO,YACL,EAAM,aAAa,GAAK,GAAO,GAAa,CAAW,CACzD,GAEA,EAAwB,EAAc,SAAS,EAAc,QAAQ,IAAI,CAAC;CAC5E;CAIA,IAAI,GAAU;CACd,AAAI,KACF,IAAW,EAAM,SAAS,GAAiBL,EAAG,IAAI,SAAS,GAAG,MAAM,EAAgB,IAAI,CAAC,GAEzF,IAAW,EAAM,WAAW,uBAG5B,IAAW,EAAM,WAAW,mBAC5B,IAAW;CAGb,IAAM,IAAgB,EAAI,cAAc,IAAI,GACtC,IAAM,EAAI,cAAc,IAAI,GAC5B,IAAS,EAAI,cAAc,IAAI,GAC/B,IAAM,EAAI,cAAc,IAAI;CAIlC,AAHA,EAAc,YAAY,CAAG,GAC7B,EAAc,YAAY,CAAM,GAChC,EAAc,YAAY,CAAG,GAC7B,EAAc,YAAY;CAG1B,IAAI,GAAO;CAYX,OATA,EAAe;EAFG,KAAK;EAAQ;CAEV,CAAC,CAAC,CAAC,MAAK,MAAW;EAItC,AAFA,EAAY,GACZ,OAAO,OAAO,GAAS,CAAW,GAClC,EAAqB,CAAO,CAAC,CAAC,MAAK,MAAY,CAE/C,CAAC;CACH,CAAC,GAEM;AACT"}
1
+ {"version":3,"file":"message.esm.js","names":["utils.label","widgets.openHrefInOutlineMode","ns","widgets.shortDate","pad.lightColorHash","widgets.button","widgets.errorMessageBlock","cancelButton","widgets.cancelButton"],"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,4 +1,4 @@
1
- import { S as e, g as t, i as n, o as r, v as i } from "./components-DrP7BOrs.js";
1
+ import { S as e, g as t, i as n, o as r, v as i } from "./components-BHoVP7zE.js";
2
2
  //#region node_modules/@lit/context/lib/value-notifier.js
3
3
  var a = class {
4
4
  get value() {
@@ -314,4 +314,4 @@ _ = (p = n({
314
314
  //#endregion
315
315
  export { c as n, O as t };
316
316
 
317
- //# sourceMappingURL=DialogProvider-0HIHjONx.js.map
317
+ //# sourceMappingURL=DialogProvider-BFllJFfq.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DialogProvider-0HIHjONx.js","names":["e","t","i","t","customElement","WebComponent","provide","property","dialogContext","_classDecs","_DialogProvider","_A","WeakMap","_B","_ref","_dialogIdDecs","type","String","reflect","_dialogDecs","context","DialogProvider","constructor","args","_classPrivateFieldInitSpec","_initProto","_init_dialogId","_init_dialog","id","_classPrivateFieldGet","dialogId","v","_classPrivateFieldSet","dialog","willUpdate","changedProperties","has","firstUpdated","slot","shadowRoot","querySelector","dispatchEvent","CustomEvent","bubbles","composed","detail","assignedElements","_DialogProvider2","e","c","_initClass","_applyDecs","default"],"sources":["../../node_modules/@lit/context/lib/value-notifier.js","../../node_modules/@lit/context/lib/controllers/context-provider.js","../../node_modules/@lit/context/lib/decorators/provide.js","../../src/components/dialog-provider/DialogProvider.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s{get value(){return this.o}set value(s){this.setValue(s)}setValue(s,t=!1){const i=t||!Object.is(s,this.o);this.o=s,i&&this.updateObservers()}constructor(s){this.subscriptions=new Map,this.updateObservers=()=>{for(const[s,{disposer:t}]of this.subscriptions)s(this.o,t)},void 0!==s&&(this.value=s)}addCallback(s,t,i){if(!i)return void s(this.value);this.subscriptions.has(s)||this.subscriptions.set(s,{disposer:()=>{this.subscriptions.delete(s)},consumerHost:t});const{disposer:h}=this.subscriptions.get(s);s(this.value,h)}clearCallbacks(){this.subscriptions.clear()}}export{s as ValueNotifier};\n//# sourceMappingURL=value-notifier.js.map\n","import{ContextRequestEvent as t}from\"../context-request-event.js\";import{ValueNotifier as s}from\"../value-notifier.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends Event{constructor(t,s){super(\"context-provider\",{bubbles:!0,composed:!0}),this.context=t,this.contextTarget=s}}class i extends s{constructor(s,e,i){super(void 0!==e.context?e.initialValue:i),this.onContextRequest=t=>{if(t.context!==this.context)return;const s=t.contextTarget??t.composedPath()[0];s!==this.host&&(t.stopPropagation(),this.addCallback(t.callback,s,t.subscribe))},this.onProviderRequest=s=>{if(s.context!==this.context)return;if((s.contextTarget??s.composedPath()[0])===this.host)return;const e=new Set;for(const[s,{consumerHost:i}]of this.subscriptions)e.has(s)||(e.add(s),i.dispatchEvent(new t(this.context,i,s,!0)));s.stopPropagation()},this.host=s,void 0!==e.context?this.context=e.context:this.context=e,this.attachListeners(),this.host.addController?.(this)}attachListeners(){this.host.addEventListener(\"context-request\",this.onContextRequest),this.host.addEventListener(\"context-provider\",this.onProviderRequest)}hostConnected(){this.host.dispatchEvent(new e(this.context,this.host))}}export{i as ContextProvider,e as ContextProviderEvent};\n//# sourceMappingURL=context-provider.js.map\n","import{ContextProvider as t}from\"../controllers/context-provider.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e({context:e}){return(n,i)=>{const r=new WeakMap;if(\"object\"==typeof i)return{get(){return n.get.call(this)},set(t){return r.get(this).setValue(t),n.set.call(this,t)},init(n){return r.set(this,new t(this,{context:e,initialValue:n})),n}};{n.constructor.addInitializer((n=>{r.set(n,new t(n,{context:e}))}));const o=Object.getOwnPropertyDescriptor(n,i);let s;if(void 0===o){const t=new WeakMap;s={get(){return t.get(this)},set(e){r.get(this).setValue(e),t.set(this,e)},configurable:!0,enumerable:!0}}else{const t=o.set;s={...o,set(e){r.get(this).setValue(e),t?.call(this,e)}}}return void Object.defineProperty(n,i,s)}}}export{e as provide};\n//# sourceMappingURL=provide.js.map\n","import { customElement, WebComponent } from '@/lib/components'\nimport { provide } from '@lit/context'\nimport { property } from 'lit/decorators.js'\nimport { DialogContext, dialogContext } from '@/lib/dialogs/context'\nimport type { PropertyValues } from 'lit'\n\n@customElement('solid-ui-dialog-provider')\nexport default class DialogProvider extends WebComponent {\n @property({ type: String, reflect: true })\n accessor dialogId: string | undefined\n\n @provide({ context: dialogContext })\n private accessor dialog: DialogContext = { id: '' }\n\n protected willUpdate (changedProperties: PropertyValues<this>) {\n super.willUpdate(changedProperties)\n\n if (changedProperties.has('dialogId') && this.dialogId) {\n this.dialog = { id: this.dialogId }\n }\n }\n\n protected firstUpdated () {\n const slot = this.shadowRoot?.querySelector('slot') as HTMLSlotElement | undefined\n\n this.dispatchEvent(new CustomEvent('mounted', { bubbles: true, composed: true, detail: slot?.assignedElements()[0] }))\n }\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"DialogProvider-BFllJFfq.js","names":["e","t","i","t","customElement","WebComponent","provide","property","dialogContext","_classDecs","_DialogProvider","_A","WeakMap","_B","_ref","_dialogIdDecs","type","String","reflect","_dialogDecs","context","DialogProvider","constructor","args","_classPrivateFieldInitSpec","_initProto","_init_dialogId","_init_dialog","id","_classPrivateFieldGet","dialogId","v","_classPrivateFieldSet","dialog","willUpdate","changedProperties","has","firstUpdated","slot","shadowRoot","querySelector","dispatchEvent","CustomEvent","bubbles","composed","detail","assignedElements","_DialogProvider2","e","c","_initClass","_applyDecs","default"],"sources":["../../node_modules/@lit/context/lib/value-notifier.js","../../node_modules/@lit/context/lib/controllers/context-provider.js","../../node_modules/@lit/context/lib/decorators/provide.js","../../src/components/dialog-provider/DialogProvider.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nclass s{get value(){return this.o}set value(s){this.setValue(s)}setValue(s,t=!1){const i=t||!Object.is(s,this.o);this.o=s,i&&this.updateObservers()}constructor(s){this.subscriptions=new Map,this.updateObservers=()=>{for(const[s,{disposer:t}]of this.subscriptions)s(this.o,t)},void 0!==s&&(this.value=s)}addCallback(s,t,i){if(!i)return void s(this.value);this.subscriptions.has(s)||this.subscriptions.set(s,{disposer:()=>{this.subscriptions.delete(s)},consumerHost:t});const{disposer:h}=this.subscriptions.get(s);s(this.value,h)}clearCallbacks(){this.subscriptions.clear()}}export{s as ValueNotifier};\n//# sourceMappingURL=value-notifier.js.map\n","import{ContextRequestEvent as t}from\"../context-request-event.js\";import{ValueNotifier as s}from\"../value-notifier.js\";\n/**\n * @license\n * Copyright 2021 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends Event{constructor(t,s){super(\"context-provider\",{bubbles:!0,composed:!0}),this.context=t,this.contextTarget=s}}class i extends s{constructor(s,e,i){super(void 0!==e.context?e.initialValue:i),this.onContextRequest=t=>{if(t.context!==this.context)return;const s=t.contextTarget??t.composedPath()[0];s!==this.host&&(t.stopPropagation(),this.addCallback(t.callback,s,t.subscribe))},this.onProviderRequest=s=>{if(s.context!==this.context)return;if((s.contextTarget??s.composedPath()[0])===this.host)return;const e=new Set;for(const[s,{consumerHost:i}]of this.subscriptions)e.has(s)||(e.add(s),i.dispatchEvent(new t(this.context,i,s,!0)));s.stopPropagation()},this.host=s,void 0!==e.context?this.context=e.context:this.context=e,this.attachListeners(),this.host.addController?.(this)}attachListeners(){this.host.addEventListener(\"context-request\",this.onContextRequest),this.host.addEventListener(\"context-provider\",this.onProviderRequest)}hostConnected(){this.host.dispatchEvent(new e(this.context,this.host))}}export{i as ContextProvider,e as ContextProviderEvent};\n//# sourceMappingURL=context-provider.js.map\n","import{ContextProvider as t}from\"../controllers/context-provider.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function e({context:e}){return(n,i)=>{const r=new WeakMap;if(\"object\"==typeof i)return{get(){return n.get.call(this)},set(t){return r.get(this).setValue(t),n.set.call(this,t)},init(n){return r.set(this,new t(this,{context:e,initialValue:n})),n}};{n.constructor.addInitializer((n=>{r.set(n,new t(n,{context:e}))}));const o=Object.getOwnPropertyDescriptor(n,i);let s;if(void 0===o){const t=new WeakMap;s={get(){return t.get(this)},set(e){r.get(this).setValue(e),t.set(this,e)},configurable:!0,enumerable:!0}}else{const t=o.set;s={...o,set(e){r.get(this).setValue(e),t?.call(this,e)}}}return void Object.defineProperty(n,i,s)}}}export{e as provide};\n//# sourceMappingURL=provide.js.map\n","import { customElement, WebComponent } from '@/lib/components'\nimport { provide } from '@lit/context'\nimport { property } from 'lit/decorators.js'\nimport { DialogContext, dialogContext } from '@/lib/dialogs/context'\nimport type { PropertyValues } from 'lit'\n\n@customElement('solid-ui-dialog-provider')\nexport default class DialogProvider extends WebComponent {\n @property({ type: String, reflect: true })\n accessor dialogId: string | undefined\n\n @provide({ context: dialogContext })\n private accessor dialog: DialogContext = { id: '' }\n\n protected willUpdate (changedProperties: PropertyValues<this>) {\n super.willUpdate(changedProperties)\n\n if (changedProperties.has('dialogId') && this.dialogId) {\n this.dialog = { id: this.dialogId }\n }\n }\n\n protected firstUpdated () {\n const slot = this.shadowRoot?.querySelector('slot') as HTMLSlotElement | undefined\n\n this.dispatchEvent(new CustomEvent('mounted', { bubbles: true, composed: true, detail: slot?.assignedElements()[0] }))\n }\n}\n"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -1,13 +1,13 @@
1
- import { a as e, o as t } from "./auth-D4NUMSzc.js";
2
- import { b as n, c as r, g as i, i as a, o, p as s, u as c } from "./components-DrP7BOrs.js";
1
+ import { a as e, o as t } from "./auth-IpQoQHJx.js";
2
+ import { b as n, c as r, g as i, i as a, o, p as s, u as c } from "./components-BHoVP7zE.js";
3
3
  import "./chevron-down-ujxRg3MD.js";
4
- import "./button-BJyFKOKO.js";
5
- import "./avatar-BWtz4RlU.js";
6
- import "./login-button-BhdKFJ-F.js";
7
- import "./logout-button-ClbKS9ss.js";
8
- import "./menu-item-Bj3NgLzB.js";
9
- import "./menu-DVgG-el5.js";
10
- import "./signup-button-B-AgjjAK.js";
4
+ import "./button-CnmrOsEf.js";
5
+ import "./avatar-CJ728tvg.js";
6
+ import "./login-button-C7TABAml.js";
7
+ import "./logout-button-BDpulDka.js";
8
+ import "./menu-item-BdCkmJol.js";
9
+ import "./menu-hMtmUkel.js";
10
+ import "./signup-button-06D4XyCv.js";
11
11
  //#region ~icons/lucide/log-in
12
12
  var l = class extends HTMLElement {
13
13
  constructor() {
@@ -291,4 +291,4 @@ var z = R;
291
291
  //#endregion
292
292
  export { R as n, z as t };
293
293
 
294
- //# sourceMappingURL=account-Ch8h_zTv.js.map
294
+ //# sourceMappingURL=account-CFAjLyt5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"account-Ch8h_zTv.js","names":["consume","html","nothing","property","customElement","WebComponent","authContext","DEFAULT_AUTH_CONTEXT","styles","_classDecs","_Account","_Account2","_A","WeakMap","_B","_ref","_menuItemsDecs","type","Array","_authDecs","context","subscribe","_Account3","Account","constructor","args","_classPrivateFieldInitSpec","_initProto","_init_menuItems","_init_auth","_defineProperty","_classPrivateFieldGet","menuItems","v","_classPrivateFieldSet","auth","connectedCallback","unsubscribeSessionUpdated","onSessionUpdated","requestUpdate","disconnectedCallback","render","initialized","account","map","menuItem","href","selected","onSelected","label","e","c","_initClass","_applyDecs","_Class","_identity","initializing","component","loggedIn","default","Account"],"sources":["../../src/components/account/Account.styles.css","../../src/components/account/Account.ts","../../src/components/account/index.ts"],"sourcesContent":[":host {\n --image-size: 1.875rem; /* 30px */\n\n display: inline-flex;\n flex-direction: row;\n gap: 10px;\n}\n\n:host([data-state-initializing]) {\n icon-svg-spinners-180-ring {\n width: var(--image-size);\n height: var(--image-size);\n }\n}\n\n:host([data-state-loggedIn]) {\n --padding: 4px;\n --border-width: 1px;\n\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n background-color: var(--solid-ui-color-body-grey);\n padding: var(--padding);\n border-radius: calc((var(--image-size) + 2 * var(--padding) + 2 * var(--border-width)) / 2);\n color: var(--solid-ui-color-white);\n\n solid-ui-avatar {\n width: var(--image-size);\n height: var(--image-size);\n border: var(--border-width) solid var(--solid-ui-color-white);\n border-radius: 50%;\n }\n\n icon-lucide-chevron-down {\n width: 16px;\n height: 16px;\n }\n }\n}\n","import { consume } from '@lit/context'\nimport { html, nothing, TemplateResult } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport { customElement, WebComponent } from '@/lib/components'\nimport { authContext, AuthContext, DEFAULT_AUTH_CONTEXT } from '@/lib/auth'\n\nimport '@/components/avatar'\nimport '@/components/button'\nimport '@/components/login-button'\nimport '@/components/logout-button'\nimport '@/components/menu-item'\nimport '@/components/menu'\nimport '@/components/signup-button'\nimport '~icons/lucide/chevron-down'\nimport '~icons/lucide/log-in'\nimport '~icons/lucide/log-out'\nimport '~icons/lucide/user'\nimport '~icons/svg-spinners/180-ring'\n\nimport styles from './Account.styles.css'\n\nexport interface AccountMenuItem {\n label: string | TemplateResult\n href?: string\n selected?: boolean\n onSelected?(): void\n}\n\n@customElement('solid-ui-account')\nexport default class Account extends WebComponent {\n static styles = styles\n static states = {\n initializing: (component: Account) => !component.auth.initialized,\n loggedIn: (component: Account) => !!component.auth.account,\n }\n\n @property({ type: Array })\n accessor menuItems: AccountMenuItem[] = []\n\n @consume({ context: authContext, subscribe: true })\n private accessor auth: AuthContext = DEFAULT_AUTH_CONTEXT\n\n private unsubscribeSessionUpdated?: () => void\n\n connectedCallback () {\n super.connectedCallback()\n\n this.unsubscribeSessionUpdated = this.auth.onSessionUpdated(() => this.requestUpdate())\n }\n\n disconnectedCallback () {\n super.disconnectedCallback()\n\n this.unsubscribeSessionUpdated?.()\n }\n\n protected render () {\n if (!this.auth.initialized) {\n return html`\n <icon-svg-spinners-180-ring></icon-svg-spinners-180-ring>\n `\n }\n\n if (!this.auth.account) {\n return html`\n <solid-ui-login-button>\n <solid-ui-button slot=\"trigger\">\n <icon-lucide-user slot=\"left-icon\"></icon-lucide-user>\n Log In\n </solid-ui-button>\n </solid-ui-login-button>\n <solid-ui-signup-button>\n <solid-ui-button slot=\"trigger\" variant=\"outline\">\n <icon-lucide-log-in slot=\"left-icon\"></icon-lucide-log-in>\n Sign Up\n </solid-ui-button>\n </solid-ui-signup-button>\n `\n }\n\n return html`\n <solid-ui-menu placement=\"bottom-end\">\n <button type=\"button\" slot=\"trigger\">\n <solid-ui-avatar></solid-ui-avatar>\n <icon-lucide-chevron-down slot=\"right-icon\"></icon-lucide-chevron-down>\n </button>\n\n ${this.menuItems.map(menuItem => html`\n <solid-ui-menu-item .href=${menuItem.href ?? nothing} ?selected=${menuItem.selected} @solid-ui-select=${() => menuItem.onSelected?.()}>\n ${menuItem.label}\n </solid-ui-menu-item>\n `)}\n <solid-ui-logout-button>\n <solid-ui-menu-item slot=\"trigger\">\n <icon-lucide-log-out slot=\"left-icon\"></icon-lucide-log-out>\n Sign out\n </solid-ui-menu-item>\n </solid-ui-logout-button>\n </solid-ui-menu>\n `\n }\n}\n","import Account, { type AccountMenuItem } from './Account'\n\nexport { Account, type AccountMenuItem }\nexport default Account\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACmByCS,IAAA,CASxCL,EAAc,kBAAkB,CAAC;AAAA,IAAAM;AAAA,KAAAC,KAAAC,kBAAA,IAAAC,QAAA,GAAAC,kBAAA,IAAAD,QAAA,GAAAE,KAAAC,IAQ/Bb,EAAS,EAAEc,MAAMC,MAAM,CAAC,GAACC,IAGzBnB,EAAQ;CAAEoB,SAASd;CAAae,WAAW;AAAK,CAAC,GAAC,cAAAC,IAXrD,cACqCjB,EAAa;CAAAmB,YAAA,GAAAC,GAAA;EAWSK,AAXT,MAAA,GAAAL,CAAA,GAAAC,EAAA,MAAAd,IAAAe,EAAA,IAAA,GAAAC,EAAA,MAQR,CAAA,CAAE,EAAA,GAAAF,EAAA,MAAAZ,GAAAe,EAAA,MAGLtB,CAAoB,CAAA,GAAAuB,EAAA,MAAA,6BAAA,KAAA,CAAA;CAAA;CAAA,KAAAf,KAAA;EAAA,OAAAgB,EAAAnB,GAAA,IAAA;CAAA;CAAA,IAHhDoB,UAASC,GAAA;EAAAC,EAAAtB,GAAA,MAAAqB,CAAA;CAAA;CAAA,IAGDE,OAAI;EAAA,OAAAJ,EAAAjB,GAAA,IAAA;CAAA;CAAA,IAAJqB,KAAIF,GAAA;EAAAC,EAAApB,GAAA,MAAAmB,CAAA;CAAA;CAIrBG,oBAAqB;EAGnB,AAFA,MAAMA,kBAAkB,GAExB,KAAKC,4BAA4B,KAAKF,KAAKG,uBAAuB,KAAKC,cAAc,CAAC;CACxF;CAEAC,uBAAwB;EAGtB,AAFA,MAAMA,qBAAqB,GAE3B,KAAKH,4BAA4B;CACnC;CAEUI,SAAU;EAwBlB,OAvBK,KAAKN,KAAKO,cAMV,KAAKP,KAAKQ,UAiBR1C,CAAI;;;;;;;cAOD,KAAK+B,UAAUY,KAAIC,MAAY5C,CAAI;4CACL4C,EAASC,QAAQ5C,EAAO,aAAc2C,EAASE,SAAQ,0BAA2BF,EAASG,aAAa,EAAC;sBAC/HH,EAASI,MAAK;;aAEvB,EAAC;;;;;;;;QA3BDhD,CAAI;;;;;;;;;;;;;UANJA,CAAI;;;CA0Cf;AACF,GAAC,CAAAiD,GAAA,CAAAtB,GAAAC,GAAAF,IAAAwB,GAAA,CAAAzC,GAAA0C,MAAAC,EAAA/B,GAAA,CAAA;CAAAN;CAAA;CAAA;AAAA,GAAA;CAAAG;CAAA;CAAA;AAAA,CAAA,GAAAV,GAAA,GAAA,KAAA,GAxEoCJ,CAAY,GAAAiB,IAAAgC,IAAA,cAAAC,EAAA;CAAA/B,cAAA;EAAA,MAAAd,CAAA,GAAAoB,EAAA,MAAA,UAC/BtB,CAAM,GAAAsB,EAAA,MAAA,UACN;GACd0B,eAAeC,MAAuB,CAACA,EAAUtB,KAAKO;GACtDgB,WAAWD,MAAuB,CAAC,CAACA,EAAUtB,KAAKQ;EACrD,CAAC,GAAAS,EAAA;CAAA;AAAA,GAAAtB,EAAAwB,GAAA3C,GAAA,KAAA,CAAA,GAAA2C,GAAA;;;AC/BH,IAAA,IAAeM"}
1
+ {"version":3,"file":"account-CFAjLyt5.js","names":["consume","html","nothing","property","customElement","WebComponent","authContext","DEFAULT_AUTH_CONTEXT","styles","_classDecs","_Account","_Account2","_A","WeakMap","_B","_ref","_menuItemsDecs","type","Array","_authDecs","context","subscribe","_Account3","Account","constructor","args","_classPrivateFieldInitSpec","_initProto","_init_menuItems","_init_auth","_defineProperty","_classPrivateFieldGet","menuItems","v","_classPrivateFieldSet","auth","connectedCallback","unsubscribeSessionUpdated","onSessionUpdated","requestUpdate","disconnectedCallback","render","initialized","account","map","menuItem","href","selected","onSelected","label","e","c","_initClass","_applyDecs","_Class","_identity","initializing","component","loggedIn","default","Account"],"sources":["../../src/components/account/Account.styles.css","../../src/components/account/Account.ts","../../src/components/account/index.ts"],"sourcesContent":[":host {\n --image-size: 1.875rem; /* 30px */\n\n display: inline-flex;\n flex-direction: row;\n gap: 10px;\n}\n\n:host([data-state-initializing]) {\n icon-svg-spinners-180-ring {\n width: var(--image-size);\n height: var(--image-size);\n }\n}\n\n:host([data-state-loggedIn]) {\n --padding: 4px;\n --border-width: 1px;\n\n button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 5px;\n background-color: var(--solid-ui-color-body-grey);\n padding: var(--padding);\n border-radius: calc((var(--image-size) + 2 * var(--padding) + 2 * var(--border-width)) / 2);\n color: var(--solid-ui-color-white);\n\n solid-ui-avatar {\n width: var(--image-size);\n height: var(--image-size);\n border: var(--border-width) solid var(--solid-ui-color-white);\n border-radius: 50%;\n }\n\n icon-lucide-chevron-down {\n width: 16px;\n height: 16px;\n }\n }\n}\n","import { consume } from '@lit/context'\nimport { html, nothing, TemplateResult } from 'lit'\nimport { property } from 'lit/decorators.js'\nimport { customElement, WebComponent } from '@/lib/components'\nimport { authContext, AuthContext, DEFAULT_AUTH_CONTEXT } from '@/lib/auth'\n\nimport '@/components/avatar'\nimport '@/components/button'\nimport '@/components/login-button'\nimport '@/components/logout-button'\nimport '@/components/menu-item'\nimport '@/components/menu'\nimport '@/components/signup-button'\nimport '~icons/lucide/chevron-down'\nimport '~icons/lucide/log-in'\nimport '~icons/lucide/log-out'\nimport '~icons/lucide/user'\nimport '~icons/svg-spinners/180-ring'\n\nimport styles from './Account.styles.css'\n\nexport interface AccountMenuItem {\n label: string | TemplateResult\n href?: string\n selected?: boolean\n onSelected?(): void\n}\n\n@customElement('solid-ui-account')\nexport default class Account extends WebComponent {\n static styles = styles\n static states = {\n initializing: (component: Account) => !component.auth.initialized,\n loggedIn: (component: Account) => !!component.auth.account,\n }\n\n @property({ type: Array })\n accessor menuItems: AccountMenuItem[] = []\n\n @consume({ context: authContext, subscribe: true })\n private accessor auth: AuthContext = DEFAULT_AUTH_CONTEXT\n\n private unsubscribeSessionUpdated?: () => void\n\n connectedCallback () {\n super.connectedCallback()\n\n this.unsubscribeSessionUpdated = this.auth.onSessionUpdated(() => this.requestUpdate())\n }\n\n disconnectedCallback () {\n super.disconnectedCallback()\n\n this.unsubscribeSessionUpdated?.()\n }\n\n protected render () {\n if (!this.auth.initialized) {\n return html`\n <icon-svg-spinners-180-ring></icon-svg-spinners-180-ring>\n `\n }\n\n if (!this.auth.account) {\n return html`\n <solid-ui-login-button>\n <solid-ui-button slot=\"trigger\">\n <icon-lucide-user slot=\"left-icon\"></icon-lucide-user>\n Log In\n </solid-ui-button>\n </solid-ui-login-button>\n <solid-ui-signup-button>\n <solid-ui-button slot=\"trigger\" variant=\"outline\">\n <icon-lucide-log-in slot=\"left-icon\"></icon-lucide-log-in>\n Sign Up\n </solid-ui-button>\n </solid-ui-signup-button>\n `\n }\n\n return html`\n <solid-ui-menu placement=\"bottom-end\">\n <button type=\"button\" slot=\"trigger\">\n <solid-ui-avatar></solid-ui-avatar>\n <icon-lucide-chevron-down slot=\"right-icon\"></icon-lucide-chevron-down>\n </button>\n\n ${this.menuItems.map(menuItem => html`\n <solid-ui-menu-item .href=${menuItem.href ?? nothing} ?selected=${menuItem.selected} @solid-ui-select=${() => menuItem.onSelected?.()}>\n ${menuItem.label}\n </solid-ui-menu-item>\n `)}\n <solid-ui-logout-button>\n <solid-ui-menu-item slot=\"trigger\">\n <icon-lucide-log-out slot=\"left-icon\"></icon-lucide-log-out>\n Sign out\n </solid-ui-menu-item>\n </solid-ui-logout-button>\n </solid-ui-menu>\n `\n }\n}\n","import Account, { type AccountMenuItem } from './Account'\n\nexport { Account, type AccountMenuItem }\nexport default Account\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACmByCS,IAAA,CASxCL,EAAc,kBAAkB,CAAC;AAAA,IAAAM;AAAA,KAAAC,KAAAC,kBAAA,IAAAC,QAAA,GAAAC,kBAAA,IAAAD,QAAA,GAAAE,KAAAC,IAQ/Bb,EAAS,EAAEc,MAAMC,MAAM,CAAC,GAACC,IAGzBnB,EAAQ;CAAEoB,SAASd;CAAae,WAAW;AAAK,CAAC,GAAC,cAAAC,IAXrD,cACqCjB,EAAa;CAAAmB,YAAA,GAAAC,GAAA;EAWSK,AAXT,MAAA,GAAAL,CAAA,GAAAC,EAAA,MAAAd,IAAAe,EAAA,IAAA,GAAAC,EAAA,MAQR,CAAA,CAAE,EAAA,GAAAF,EAAA,MAAAZ,GAAAe,EAAA,MAGLtB,CAAoB,CAAA,GAAAuB,EAAA,MAAA,6BAAA,KAAA,CAAA;CAAA;CAAA,KAAAf,KAAA;EAAA,OAAAgB,EAAAnB,GAAA,IAAA;CAAA;CAAA,IAHhDoB,UAASC,GAAA;EAAAC,EAAAtB,GAAA,MAAAqB,CAAA;CAAA;CAAA,IAGDE,OAAI;EAAA,OAAAJ,EAAAjB,GAAA,IAAA;CAAA;CAAA,IAAJqB,KAAIF,GAAA;EAAAC,EAAApB,GAAA,MAAAmB,CAAA;CAAA;CAIrBG,oBAAqB;EAGnB,AAFA,MAAMA,kBAAkB,GAExB,KAAKC,4BAA4B,KAAKF,KAAKG,uBAAuB,KAAKC,cAAc,CAAC;CACxF;CAEAC,uBAAwB;EAGtB,AAFA,MAAMA,qBAAqB,GAE3B,KAAKH,4BAA4B;CACnC;CAEUI,SAAU;EAwBlB,OAvBK,KAAKN,KAAKO,cAMV,KAAKP,KAAKQ,UAiBR1C,CAAI;;;;;;;cAOD,KAAK+B,UAAUY,KAAIC,MAAY5C,CAAI;4CACL4C,EAASC,QAAQ5C,EAAO,aAAc2C,EAASE,SAAQ,0BAA2BF,EAASG,aAAa,EAAC;sBAC/HH,EAASI,MAAK;;aAEvB,EAAC;;;;;;;;QA3BDhD,CAAI;;;;;;;;;;;;;UANJA,CAAI;;;CA0Cf;AACF,GAAC,CAAAiD,GAAA,CAAAtB,GAAAC,GAAAF,IAAAwB,GAAA,CAAAzC,GAAA0C,MAAAC,EAAA/B,GAAA,CAAA;CAAAN;CAAA;CAAA;AAAA,GAAA;CAAAG;CAAA;CAAA;AAAA,CAAA,GAAAV,GAAA,GAAA,KAAA,GAxEoCJ,CAAY,GAAAiB,IAAAgC,IAAA,cAAAC,EAAA;CAAA/B,cAAA;EAAA,MAAAd,CAAA,GAAAoB,EAAA,MAAA,UAC/BtB,CAAM,GAAAsB,EAAA,MAAA,UACN;GACd0B,eAAeC,MAAuB,CAACA,EAAUtB,KAAKO;GACtDgB,WAAWD,MAAuB,CAAC,CAACA,EAAUtB,KAAKQ;EACrD,CAAC,GAAAS,EAAA;CAAA;AAAA,GAAAtB,EAAAwB,GAAA3C,GAAA,KAAA,CAAA,GAAA2C,GAAA;;;AC/BH,IAAA,IAAeM"}
@@ -1,14 +1,14 @@
1
- import { i as e, m as t, n, r } from "./index.esm-CyyOkz04.js";
2
- import { b as i, c as a, g as o, i as s, o as c, p as l, r as u, u as d, x as f } from "./components-DrP7BOrs.js";
1
+ import { i as e, m as t, n, r } from "./index.esm-BW2SOmt6.js";
2
+ import { b as i, c as a, g as o, i as s, o as c, p as l, r as u, u as d, x as f } from "./components-BHoVP7zE.js";
3
3
  import { t as p } from "./query-BYu9q8lA.js";
4
- import { t as m } from "./dialogs-CeHuLUo5.js";
4
+ import { t as m } from "./dialogs-D2n-R0lI.js";
5
5
  import "./chevron-down-ujxRg3MD.js";
6
- import "./dialog-CcMVH-Ut.js";
7
- import "./button-BJyFKOKO.js";
8
- import "./dialog-content-DcD_s3hK.js";
9
- import "./dialog-footer-CHgSH7G5.js";
10
- import "./combobox-0NWv9K3D.js";
11
- import "./combobox-option-B-twy1Zn.js";
6
+ import "./dialog-D9Ellvjx.js";
7
+ import "./button-CnmrOsEf.js";
8
+ import "./dialog-content-B2FmmQvH.js";
9
+ import "./dialog-footer-CxjoqQJF.js";
10
+ import "./combobox-D3eGdicW.js";
11
+ import "./combobox-option-BcXpUnWu.js";
12
12
  //#region node_modules/solid-logic/dist/issuer/issuerLogic.esm.js
13
13
  var h = [
14
14
  {
@@ -420,4 +420,4 @@ var le = class {
420
420
  //#endregion
421
421
  export { y as a, _ as c, $ as i, g as l, le as n, b as o, oe as r, v as s, se as t };
422
422
 
423
- //# sourceMappingURL=auth-D4NUMSzc.js.map
423
+ //# sourceMappingURL=auth-IpQoQHJx.js.map