diff --git a/extensions/messages/js/dist-typings/forum/components/MessagesPage.d.ts b/extensions/messages/js/dist-typings/forum/components/MessagesPage.d.ts index 7f1cb1362..001ae31f4 100644 --- a/extensions/messages/js/dist-typings/forum/components/MessagesPage.d.ts +++ b/extensions/messages/js/dist-typings/forum/components/MessagesPage.d.ts @@ -16,6 +16,7 @@ export default class MessagesPage): void; view(): JSX.Element; hero(): Mithril.Children; + contentItems(): ItemList; /** * Build an item list for the part of the toolbar which is concerned with how * the results are displayed. By default this is just a select box to change @@ -24,7 +25,7 @@ export default class MessagesPage; /** * Build an item list for the part of the toolbar which is about taking action - * on the results. By default this is just a "mark all as read" button. + * on the results. By default, this is just a "mark all as read" button. */ actionItems(): ItemList; } diff --git a/extensions/messages/js/dist/forum/components/MessagesPage.js b/extensions/messages/js/dist/forum/components/MessagesPage.js index 03795483a..9b7b772fe 100644 --- a/extensions/messages/js/dist/forum/components/MessagesPage.js +++ b/extensions/messages/js/dist/forum/components/MessagesPage.js @@ -1,2 +1,2 @@ -"use strict";(self.webpackChunkmodule_exports=self.webpackChunkmodule_exports||[]).push([[301],{684:(e,s,t)=>{t.d(s,{A:()=>A});var a=t(488),r=t.n(a),o=t(950),i=t.n(o),n=t(336),l=t.n(n),d=t(443),c=t.n(d),u=t(88),g=t.n(u),h=t(917),f=t.n(h),p=t(521),v=t.n(p),b=t(167),_=t.n(b),N=t(906),M=t.n(N);class y extends(i()){view(e){const s=this.attrs.dialog,t=s.recipient(),a=s.lastMessage();return m("li",{className:c()("DialogListItem",{"DialogListItem--unread":s.unreadCount(),active:this.attrs.active})},m(g(),{href:r().route.dialog(s),className:c()("DialogListItem-button",{active:this.attrs.active})},m("div",{className:"DialogListItem-avatar"},m(f(),{user:t}),!!s.unreadCount()&&m("div",{className:"Bubble Bubble--primary"},s.unreadCount())),m("div",{className:"DialogListItem-content"},m("div",{className:"DialogListItem-title"},v()(t),_()(s.lastMessageAt()),this.attrs.actions&&m("div",{className:"DialogListItem-actions"},this.actionItems().toArray())),m("div",{className:"DialogListItem-lastMessage"},a?a.contentPlain()?.slice(0,80):""))))}actionItems(){const e=new(M());return e.add("markAsRead",m(l(),{className:"Notification-action Button Button--link",icon:"fas fa-check","aria-label":r().translator.trans("flarum-messages.forum.dialog_list.mark_as_read_tooltip"),onclick:e=>{e.preventDefault(),e.stopPropagation(),this.attrs.dialog.save({lastReadMessageId:(this.attrs.dialog.data.relationships?.lastMessage.data).id}).finally((()=>{0===this.attrs.dialog.unreadCount()&&r().session.user.pushAttributes({messageCount:(r().session.user.attribute("messageCount")??1)-1}),m.redraw()}))}}),100),e}}flarum.reg.add("flarum-messages","forum/components/DialogListItem",y);class A extends(i()){oninit(e){super.oninit(e)}oncreate(e){super.oncreate(e)}onupdate(e){super.onupdate(e)}view(){return m("div",{className:"DialogList"},m("ul",{className:"DialogList-list"},this.attrs.state.getAllItems().map((e=>m(y,{dialog:e,active:this.attrs.activeDialog?.id()===e.id(),actions:this.attrs.itemActions})))),this.attrs.state.hasNext()&&!this.attrs.hideMore&&m("div",{className:"DialogList-loadMore"},m(l(),{className:"Button",onclick:this.attrs.state.loadNext.bind(this.attrs.state)},r().translator.trans("flarum-messages.forum.dialog_list.load_more_button"))))}}flarum.reg.add("flarum-messages","forum/components/DialogList",A)},666:(e,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var a=t(805),r=t(488),o=t.n(r),i=t(859),n=t.n(i),l=t(314),d=t.n(l),c=t(801),u=t.n(c),g=t(684),h=t(661),f=t.n(h),p=t(821),v=t.n(p),b=t(500),_=t.n(b),N=t(402),M=t.n(N),y=t(336),A=t.n(y);class k extends(M()){static initAttrs(e){e.className="MessagesPage-nav"}items(){const e=super.items();return e.remove("newDiscussion"),e.add("newMessage",m(A(),{icon:"fas fa-edit",className:"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage",itemClassName:"App-primaryControl",onclick:()=>this.newMessageAction(),disabled:!o().session.user.canSendAnyMessage()},o().session.user.canSendAnyMessage()?o().translator.trans("flarum-messages.forum.messages_page.send_message_button"):o().translator.trans("flarum-messages.forum.messages_page.cannot_send_message_button")),10),e}newMessageAction(){return flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>(o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,onsubmit:()=>{o().dialogs.refresh()}}).then((()=>o().composer.show())),o().composer)))}}flarum.reg.add("flarum-messages","forum/components/MessagesSidebar",k),flarum.reg.addChunkModule("451","761","flarum-messages","forum/components/MessageComposer");var I=t(950),D=t.n(I),w=t(476),S=t.n(w),P=t(906),C=t.n(P),B=t(154),x=t.n(B),T=t(917),L=t.n(T),R=t(3),H=t.n(R),q=t(651),j=t.n(q),O=t(301),E=t.n(O),G=t(443),F=t.n(G),V=t(215),z=t.n(V),J=t(233),K=t.n(J);const Q={controls(e,s){const t=new(C());return Object.entries(this.sections()).forEach((a=>{let[r,o]=a;const i=o.call(this,e,s).toArray();i.length&&(i.forEach((e=>t.add(e.itemName,e))),t.add(r+"Separator",m(z(),null)))})),t},sections(){return{user:this.userControls,moderation:this.moderationControls,destructive:this.destructiveControls}},userControls:(e,s)=>new(C()),moderationControls:(e,s)=>new(C()),destructiveControls(e,s){const t=new(C());return e.canDelete()&&t.add("delete",m(A(),{icon:"far fa-trash-alt",onclick:()=>this.deleteAction(e,s)},o().translator.trans("flarum-messages.forum.message_controls.delete_button"))),t},deleteAction(e,s){if(confirm(K()(o().translator.trans("flarum-messages.forum.message_controls.delete_confirmation"))))return e.delete().then((()=>{s.attrs.state.remove(e),m.redraw()}))}},U=Q;flarum.reg.add("flarum-messages","forum/utils/MessageControls",Q);class W extends(x()){oninit(e){super.oninit(e)}user(){return this.attrs.message.user()}controls(){return U.controls(this.attrs.message,this).toArray()}freshness(){return this.attrs.message.freshness}createdByStarter(){return!1}onbeforeupdate(e){return super.onbeforeupdate(e)}onupdate(e){super.onupdate(e)}elementAttrs(){const e=this.attrs.message,s=super.elementAttrs();return s.className=F()(s.className||null,"Message",{"Post--renderFailed":e.renderFailed(),revealContent:!1,editing:!1}),s}header(){return super.header()}content(){return super.content().concat([m(H(),{headerItems:this.headerItems(),cardVisible:!1,isEditing:!1,isHidden:!1,contentHtml:this.attrs.message.contentHtml(),user:this.attrs.message.user()})])}classes(e){return super.classes(e)}actionItems(){return super.actionItems()}footerItems(){return super.footerItems()}sideItems(){return super.sideItems()}avatar(){return this.attrs.message.user()?m(L(),{user:this.attrs.message.user(),className:"Post-avatar"}):""}headerItems(){const e=new(C()),s=this.attrs.message;return e.add("user",m(j(),{post:s}),100),e.add("meta",m(E(),{post:s,permalink:()=>{const e=s.dialog();return e?o().forum.attribute("baseOrigin")+o().route.dialog(e,s.number()):null}})),e}}flarum.reg.add("flarum-messages","forum/components/Message",W);class X extends(D()){constructor(){super(...arguments),(0,a.A)(this,"replyPlaceholderComponent",v()(null)),(0,a.A)(this,"loadingPostComponent",v()(null)),(0,a.A)(this,"scrollListener",void 0),(0,a.A)(this,"initialToBottomScroll",!1),(0,a.A)(this,"lastTime",null),(0,a.A)(this,"checkedRead",!1),(0,a.A)(this,"markingAsRead",!1)}oninit(e){super.oninit(e),Promise.all([flarum.reg.asyncModuleImport("flarum/forum/components/ReplyPlaceholder"),flarum.reg.asyncModuleImport("flarum/forum/components/LoadingPost")]).then((e=>{let[s,t]=e;this.replyPlaceholderComponent(s.default),this.loadingPostComponent(t.default)}))}oncreate(e){super.oncreate(e),this.scrollListener=new(S())(this.onscroll.bind(this),this.element),setTimeout((()=>{this.scrollListener.start(),this.element.addEventListener("scrollend",this.markAsRead.bind(this))}))}onupdate(e){super.onupdate(e),this.initialToBottomScroll||this.attrs.state.isLoading()||(this.scrollToBottom(),this.initialToBottomScroll=!0),this.initialToBottomScroll&&!this.checkedRead&&(this.markAsRead(),this.checkedRead=!0)}onremove(e){super.onremove(e),this.scrollListener.stop()}view(){return m("div",{className:"MessageStream"},this.attrs.state.isLoading()?m(f(),null):this.content())}content(){const e=[],s=Array.from(new Map(this.attrs.state.getAllItems().map((e=>[e.id(),e]))).values()).sort(((e,s)=>e.number()-s.number())),a=this.replyPlaceholderComponent(),r=this.loadingPostComponent();return s[0].id()!==(this.attrs.dialog.data.relationships?.firstMessage.data).id&&(e.push(m("div",{className:"MessageStream-item",key:"loadNext"},m(A(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadNext())),type:"button",className:"Button Button--block MessageStream-loadNext"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_previous_button")))),r&&e.push(m("div",{className:"MessageStream-item",key:"loading-next"},m(r,null)))),s.forEach(((s,t)=>e.push(this.messageItem(s,t)))),s[s.length-1].id()!==(this.attrs.dialog.data.relationships?.lastMessage.data).id&&(r&&e.push(m("div",{className:"MessageStream-item",key:"loading-prev"},m(r,null))),e.push(m("div",{className:"MessageStream-item",key:"loadPrev"},m(A(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadPrev())),type:"button",className:"Button Button--block MessageStream-loadPrev"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_next_button"))))),o().session.user.canSendAnyMessage()&&a&&e.push(m("div",{className:"MessageStream-item",key:"reply"},m(a,{discussion:this.attrs.dialog,onclick:()=>{flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>{o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,replyingTo:this.attrs.dialog,onsubmit:()=>{this.attrs.state.refresh().then((()=>setTimeout((()=>this.scrollToBottom()),50)))}}).then((()=>o().composer.show()))}))},composingReply:()=>o().composer.composingMessageTo(this.attrs.dialog)}))),e}messageItem(e,s){return m("div",{className:"MessageStream-item",key:s,"data-id":e.id(),"data-number":e.number()},this.timeGap(e),m(W,{message:e,state:this.attrs.state}))}timeGap(e){if(e.id()===(this.attrs.dialog.data.relationships?.firstMessage.data).id)return this.lastTime=e.createdAt(),m("div",{class:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.start_of_the_conversation")));const s=this.lastTime,t=e.createdAt().getTime()-(s?.getTime()||0);return this.lastTime=e.createdAt(),s&&t>3456e5?m("div",{className:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.time_lapsed_text",{period:dayjs().add(t,"ms").fromNow(!0)}))):null}onscroll(){this.whileMaintainingScroll((()=>this.element.scrollTop<=80&&this.attrs.state.hasNext()?this.attrs.state.loadNext():this.element.scrollTop+this.element.clientHeight>=this.element.scrollHeight&&this.attrs.state.hasPrev()?this.attrs.state.loadPrev():null))}scrollToBottom(){const e=m.route.param("near");if(e){const s=this.element.querySelector(`.MessageStream-item[data-number="${e}"]`);s?(this.element.scrollTop=s.getBoundingClientRect().top-this.element.getBoundingClientRect().top,s.classList.add("flash"),window.history.replaceState(null,"",o().route.dialog(this.attrs.dialog))):this.element.scrollTop=this.element.scrollHeight}else this.element.scrollTop=this.element.scrollHeight}whileMaintainingScroll(e){const s=this.element.scrollTop,t=this.element.scrollHeight,a=s>(t-this.element.clientHeight)/2,r=e();r instanceof Promise&&!a&&r.then((()=>{requestAnimationFrame((()=>{this.element.scrollTop=this.element.scrollHeight-t+s}))}))}markAsRead(){const e=Number(this.$(".MessageStream-item[data-id]").filter(((e,s)=>this.element.scrollHeight<=this.element.clientHeight||this.$().offset().top+this.element.clientHeight>$(s).offset().top)).last().data("id"));e&&o().session.user&&e>(this.attrs.dialog.lastReadMessageId()||0)&&!this.markingAsRead&&(this.markingAsRead=!0,this.attrs.dialog.save({lastReadMessageId:e}).finally((()=>{this.markingAsRead=!1,0===this.attrs.dialog.unreadCount()&&o().session.user.pushAttributes({messageCount:(o().session.user.attribute("messageCount")??1)-1}),m.redraw()})))}}flarum.reg.add("flarum-messages","forum/components/MessageStream",X);var Y=t(521),Z=t.n(Y),ee=t(662),se=t.n(ee);class te extends(se()){constructor(e,s){void 0===s&&(s=1),super(e,s,null)}get type(){return"dialog-messages"}getAllItems(){return super.getAllItems()}}flarum.reg.add("flarum-messages","forum/states/MessageStreamState",te);var ae=t(88),re=t.n(ae),oe=t(741),ie=t.n(oe),ne=t(533),le=t.n(ne),me=t(653),de=t.n(me),ce=t(819),ue=t.n(ce);class ge extends(le()){className(){return"Modal--small Modal--flat DetailsModal"}title(){return o().translator.trans("flarum-messages.forum.dialog_section.details_modal.title")}content(){let e=(this.attrs.dialog.users()||[]).filter(Boolean);return m("div",{className:"Modal-body DetailsModal-infoGroups"},m("div",{className:"DetailsModal-recipients DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.recipients")),m("div",{className:"DetailsModal-recipients-list"},e?.map((e=>m("div",{className:"DetailsModal-recipient"},m(L(),{user:e}),m(re(),{href:o().route("user",{username:e.slug()})},m("span",{className:"DetailsModal-recipient-username"},Z()(e))),m("div",{className:"badges"},ue()(e.badges().toArray()))))))),this.infoItems().toArray())}infoItems(){const e=new(C());return e.add("created",m("div",{className:"DetailsModal-createdAt DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.created_at")),m("div",{className:"DetailsModal-info-content"},de()(this.attrs.dialog.createdAt())))),e}}flarum.reg.add("flarum-messages","forum/components/DetailsModal",ge);class he extends(D()){constructor(){super(...arguments),(0,a.A)(this,"loading",!1),(0,a.A)(this,"messages",void 0)}oninit(e){super.oninit(e),this.messages=new te(this.requestParams()),this.messages.refresh()}requestParams(e){void 0===e&&(e=!1);const s={filter:{dialog:this.attrs.dialog.id()},sort:"-number"},t=m.route.param("near");return t&&!e&&(s.page=s.page||{},s.page.near=parseInt(t)),s}view(){const e=this.attrs.dialog.recipient();return m("div",{className:"DialogSection"},m("div",{className:"DialogSection-header"},m(L(),{user:e}),m("div",{className:"DialogSection-header-info"},m("h2",{className:"DialogSection-header-info-title"},e&&m(re(),{href:o().route.user(e)},Z()(e))||Z()(e),e&&e.canSendAnyMessage()?null:m("span",{className:"DialogSection-header-info-helperText"},o().translator.trans("flarum-messages.forum.dialog_section.cannot_reply_text"))),m("div",{className:"badges"},ue()(e?.badges().toArray()||[]))),m("div",{className:"DialogSection-header-actions"},this.actionItems().toArray())),m(X,{dialog:this.attrs.dialog,state:this.messages}))}actionItems(){const e=new(C());return e.add("back",m(A(),{className:"Button Button--icon DialogSection-back",icon:"fas fa-arrow-left",onclick:this.attrs.onback},o().translator.trans("flarum-messages.forum.dialog_section.back_label"))),e.add("details",m(ie(),{icon:"fas fa-ellipsis-h",className:"DialogSection-controls",buttonClassName:"Button Button--icon",accessibleToggleLabel:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label"),label:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label")},this.controlItems().toArray())),e}controlItems(){const e=new(C());return e.add("details",m(A(),{icon:"fas fa-info-circle",onclick:()=>o().modal.show(ge,{dialog:this.attrs.dialog})},o().translator.trans("flarum-messages.forum.dialog_section.controls.details_button"))),e}}flarum.reg.add("flarum-messages","forum/components/DialogSection",he);class fe extends(n()){constructor(){super(...arguments),(0,a.A)(this,"selectedDialog",v()(null)),(0,a.A)(this,"currentDialogId",null)}oninit(e){super.oninit(e),o().session.user?(o().current.set("noTagsList",!0),o().dialogs.hasItems()?this.initDialog():o().dialogs.refresh().then((async()=>{o().dialogs.hasItems()&&await this.initDialog()}))):m.route.set(o().route("index"))}dialogRequestParams(){return{include:"users.groups"}}async initDialog(){const e=m.route.param("id");this.currentDialogId=e;const s=o().translator.trans("flarum-messages.forum.messages_page.title",{},!0);let t;t=e?o().store.getById("dialogs",e)||await o().store.find("dialogs",e,this.dialogRequestParams()):o().dialogs.getAllItems()[0],this.selectedDialog(t),t?(o().setTitle(t.title()),o().history.push("dialog",t.title())):(o().setTitle(s),o().history.push("messages",s)),m.redraw()}onupdate(e){super.onupdate(e);const s=this.element.querySelector(".DialogListItem.active"),t=this.element.querySelector(".DialogList");s&&$(t).offset().top+t.clientHeight<=$(s).offset().top&&s.scrollIntoView()}view(){return m(d(),{className:"MessagesPage Page--vertical",loading:!1,hero:this.hero.bind(this),sidebar:()=>m(k,null)},o().dialogs.isLoading()?m(f(),null):o().dialogs.hasItems()?m("div",{className:F()("MessagesPage-content",{"MessagesPage-content--onDialog":this.currentDialogId})},m("div",{className:"MessagesPage-sidebar",key:"sidebar"},m("div",{className:"IndexPage-toolbar",key:"toolbar"},m("ul",{className:"IndexPage-toolbar-view"},ue()(this.viewItems().toArray())),m("ul",{className:"IndexPage-toolbar-action"},ue()(this.actionItems().toArray()))),m(g.A,{key:"list",state:o().dialogs,activeDialog:this.selectedDialog()})),this.selectedDialog()?m(he,{key:"dialog",dialog:this.selectedDialog(),onback:()=>{this.currentDialogId=null}}):m(f(),{key:"loading",display:"block"})):m(_(),{icon:"far fa-envelope-open"},o().translator.trans("flarum-messages.forum.messages_page.empty_text")))}hero(){return m("header",{className:"Hero MessagesPageHero"},m("div",{className:"container"},m("div",{className:"containerNarrow"},m("h1",{className:"Hero-title"},m(u(),{name:"fas fa-envelope"})," ",o().translator.trans("flarum-messages.forum.messages_page.hero.title")),m("div",{className:"Hero-subtitle"},o().translator.trans("flarum-messages.forum.messages_page.hero.subtitle")))))}viewItems(){const e=new(C()),s=o().dialogs.sortMap(),t=Object.keys(s).reduce(((e,t)=>{const a=s[t];return e[t]="string"!=typeof a?a.label:o().translator.trans(`flarum-messages.forum.index_sort.${t}_button`),e}),{});return e.add("sort",m(ie(),{buttonClassName:"Button",label:t[o().dialogs.getParams()?.sort||0]||Object.values(t)[0],accessibleToggleLabel:o().translator.trans("core.forum.index_sort.toggle_dropdown_accessible_label")},Object.keys(t).map((e=>{const a=t[e],r=(o().dialogs.getParams().sort||Object.keys(s)[0])===e;return m(A(),{icon:!r||"fas fa-check",onclick:()=>o().dialogs.changeSort(e),active:r},a)})))),e}actionItems(){const e=new(C());return e.add("refresh",m(A(),{title:o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),icon:"fas fa-sync",className:"Button Button--icon",onclick:()=>{o().dialogs.refresh()}})),o().session.user&&e.add("markAllAsRead",m(A(),{title:o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),icon:"fas fa-check",className:"Button Button--icon",onclick:()=>o().dialogs.markAllAsRead()})),e}}flarum.reg.add("flarum-messages","forum/components/MessagesPage",fe)}}]); +"use strict";(self.webpackChunkmodule_exports=self.webpackChunkmodule_exports||[]).push([[301],{684:(e,s,t)=>{t.d(s,{A:()=>A});var a=t(488),r=t.n(a),o=t(950),i=t.n(o),n=t(336),l=t.n(n),d=t(443),c=t.n(d),u=t(88),g=t.n(u),h=t(917),f=t.n(h),p=t(521),v=t.n(p),b=t(167),_=t.n(b),N=t(906),M=t.n(N);class y extends(i()){view(e){const s=this.attrs.dialog,t=s.recipient(),a=s.lastMessage();return m("li",{className:c()("DialogListItem",{"DialogListItem--unread":s.unreadCount(),active:this.attrs.active})},m(g(),{href:r().route.dialog(s),className:c()("DialogListItem-button",{active:this.attrs.active})},m("div",{className:"DialogListItem-avatar"},m(f(),{user:t}),!!s.unreadCount()&&m("div",{className:"Bubble Bubble--primary"},s.unreadCount())),m("div",{className:"DialogListItem-content"},m("div",{className:"DialogListItem-title"},v()(t),_()(s.lastMessageAt()),this.attrs.actions&&m("div",{className:"DialogListItem-actions"},this.actionItems().toArray())),m("div",{className:"DialogListItem-lastMessage"},a?a.contentPlain()?.slice(0,80):""))))}actionItems(){const e=new(M());return e.add("markAsRead",m(l(),{className:"Notification-action Button Button--link",icon:"fas fa-check","aria-label":r().translator.trans("flarum-messages.forum.dialog_list.mark_as_read_tooltip"),onclick:e=>{e.preventDefault(),e.stopPropagation(),this.attrs.dialog.save({lastReadMessageId:(this.attrs.dialog.data.relationships?.lastMessage.data).id}).finally((()=>{0===this.attrs.dialog.unreadCount()&&r().session.user.pushAttributes({messageCount:(r().session.user.attribute("messageCount")??1)-1}),m.redraw()}))}}),100),e}}flarum.reg.add("flarum-messages","forum/components/DialogListItem",y);class A extends(i()){oninit(e){super.oninit(e)}oncreate(e){super.oncreate(e)}onupdate(e){super.onupdate(e)}view(){return m("div",{className:"DialogList"},m("ul",{className:"DialogList-list"},this.attrs.state.getAllItems().map((e=>m(y,{dialog:e,active:this.attrs.activeDialog?.id()===e.id(),actions:this.attrs.itemActions})))),this.attrs.state.hasNext()&&!this.attrs.hideMore&&m("div",{className:"DialogList-loadMore"},m(l(),{className:"Button",onclick:this.attrs.state.loadNext.bind(this.attrs.state)},r().translator.trans("flarum-messages.forum.dialog_list.load_more_button"))))}}flarum.reg.add("flarum-messages","forum/components/DialogList",A)},666:(e,s,t)=>{t.r(s),t.d(s,{default:()=>fe});var a=t(805),r=t(488),o=t.n(r),i=t(859),n=t.n(i),l=t(314),d=t.n(l),c=t(801),u=t.n(c),g=t(684),h=t(661),f=t.n(h),p=t(821),v=t.n(p),b=t(500),_=t.n(b),N=t(402),M=t.n(N),y=t(336),A=t.n(y);class I extends(M()){static initAttrs(e){e.className="MessagesPage-nav"}items(){const e=super.items();return e.remove("newDiscussion"),e.add("newMessage",m(A(),{icon:"fas fa-edit",className:"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage",itemClassName:"App-primaryControl",onclick:()=>this.newMessageAction(),disabled:!o().session.user.canSendAnyMessage()},o().session.user.canSendAnyMessage()?o().translator.trans("flarum-messages.forum.messages_page.send_message_button"):o().translator.trans("flarum-messages.forum.messages_page.cannot_send_message_button")),10),e}newMessageAction(){return flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>(o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,onsubmit:()=>{o().dialogs.refresh()}}).then((()=>o().composer.show())),o().composer)))}}flarum.reg.add("flarum-messages","forum/components/MessagesSidebar",I),flarum.reg.addChunkModule("451","761","flarum-messages","forum/components/MessageComposer");var k=t(950),D=t.n(k),w=t(476),S=t.n(w),P=t(906),C=t.n(P),B=t(154),x=t.n(B),T=t(917),L=t.n(T),R=t(3),H=t.n(R),q=t(651),j=t.n(q),O=t(301),E=t.n(O),G=t(443),F=t.n(G),V=t(215),z=t.n(V),J=t(233),K=t.n(J);const Q={controls(e,s){const t=new(C());return Object.entries(this.sections()).forEach((a=>{let[r,o]=a;const i=o.call(this,e,s).toArray();i.length&&(i.forEach((e=>t.add(e.itemName,e))),t.add(r+"Separator",m(z(),null)))})),t},sections(){return{user:this.userControls,moderation:this.moderationControls,destructive:this.destructiveControls}},userControls:(e,s)=>new(C()),moderationControls:(e,s)=>new(C()),destructiveControls(e,s){const t=new(C());return e.canDelete()&&t.add("delete",m(A(),{icon:"far fa-trash-alt",onclick:()=>this.deleteAction(e,s)},o().translator.trans("flarum-messages.forum.message_controls.delete_button"))),t},deleteAction(e,s){if(confirm(K()(o().translator.trans("flarum-messages.forum.message_controls.delete_confirmation"))))return e.delete().then((()=>{s.attrs.state.remove(e),m.redraw()}))}},U=Q;flarum.reg.add("flarum-messages","forum/utils/MessageControls",Q);class W extends(x()){oninit(e){super.oninit(e)}user(){return this.attrs.message.user()}controls(){return U.controls(this.attrs.message,this).toArray()}freshness(){return this.attrs.message.freshness}createdByStarter(){return!1}onbeforeupdate(e){return super.onbeforeupdate(e)}onupdate(e){super.onupdate(e)}elementAttrs(){const e=this.attrs.message,s=super.elementAttrs();return s.className=F()(s.className||null,"Message",{"Post--renderFailed":e.renderFailed(),revealContent:!1,editing:!1}),s}header(){return super.header()}content(){return super.content().concat([m(H(),{headerItems:this.headerItems(),cardVisible:!1,isEditing:!1,isHidden:!1,contentHtml:this.attrs.message.contentHtml(),user:this.attrs.message.user()})])}classes(e){return super.classes(e)}actionItems(){return super.actionItems()}footerItems(){return super.footerItems()}sideItems(){return super.sideItems()}avatar(){return this.attrs.message.user()?m(L(),{user:this.attrs.message.user(),className:"Post-avatar"}):""}headerItems(){const e=new(C()),s=this.attrs.message;return e.add("user",m(j(),{post:s}),100),e.add("meta",m(E(),{post:s,permalink:()=>{const e=s.dialog();return e?o().forum.attribute("baseOrigin")+o().route.dialog(e,s.number()):null}})),e}}flarum.reg.add("flarum-messages","forum/components/Message",W);class X extends(D()){constructor(){super(...arguments),(0,a.A)(this,"replyPlaceholderComponent",v()(null)),(0,a.A)(this,"loadingPostComponent",v()(null)),(0,a.A)(this,"scrollListener",void 0),(0,a.A)(this,"initialToBottomScroll",!1),(0,a.A)(this,"lastTime",null),(0,a.A)(this,"checkedRead",!1),(0,a.A)(this,"markingAsRead",!1)}oninit(e){super.oninit(e),Promise.all([flarum.reg.asyncModuleImport("flarum/forum/components/ReplyPlaceholder"),flarum.reg.asyncModuleImport("flarum/forum/components/LoadingPost")]).then((e=>{let[s,t]=e;this.replyPlaceholderComponent(s.default),this.loadingPostComponent(t.default)}))}oncreate(e){super.oncreate(e),this.scrollListener=new(S())(this.onscroll.bind(this),this.element),setTimeout((()=>{this.scrollListener.start(),this.element.addEventListener("scrollend",this.markAsRead.bind(this))}))}onupdate(e){super.onupdate(e),this.initialToBottomScroll||this.attrs.state.isLoading()||(this.scrollToBottom(),this.initialToBottomScroll=!0),this.initialToBottomScroll&&!this.checkedRead&&(this.markAsRead(),this.checkedRead=!0)}onremove(e){super.onremove(e),this.scrollListener.stop()}view(){return m("div",{className:"MessageStream"},this.attrs.state.isLoading()?m(f(),null):this.content())}content(){const e=[],s=Array.from(new Map(this.attrs.state.getAllItems().map((e=>[e.id(),e]))).values()).sort(((e,s)=>e.number()-s.number())),a=this.replyPlaceholderComponent(),r=this.loadingPostComponent();return s[0].id()!==(this.attrs.dialog.data.relationships?.firstMessage.data).id&&(e.push(m("div",{className:"MessageStream-item",key:"loadNext"},m(A(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadNext())),type:"button",className:"Button Button--block MessageStream-loadNext"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_previous_button")))),r&&e.push(m("div",{className:"MessageStream-item",key:"loading-next"},m(r,null)))),s.forEach(((s,t)=>e.push(this.messageItem(s,t)))),s[s.length-1].id()!==(this.attrs.dialog.data.relationships?.lastMessage.data).id&&(r&&e.push(m("div",{className:"MessageStream-item",key:"loading-prev"},m(r,null))),e.push(m("div",{className:"MessageStream-item",key:"loadPrev"},m(A(),{onclick:()=>this.whileMaintainingScroll((()=>this.attrs.state.loadPrev())),type:"button",className:"Button Button--block MessageStream-loadPrev"},o().translator.trans("flarum-messages.forum.messages_page.stream.load_next_button"))))),o().session.user.canSendAnyMessage()&&a&&e.push(m("div",{className:"MessageStream-item",key:"reply"},m(a,{discussion:this.attrs.dialog,onclick:()=>{flarum.reg.asyncModuleImport("flarum/forum/components/ComposerBody").then((()=>{o().composer.load((()=>t.e(451).then(t.bind(t,761))),{user:o().session.user,replyingTo:this.attrs.dialog,onsubmit:()=>{this.attrs.state.refresh().then((()=>setTimeout((()=>this.scrollToBottom()),50)))}}).then((()=>o().composer.show()))}))},composingReply:()=>o().composer.composingMessageTo(this.attrs.dialog)}))),e}messageItem(e,s){return m("div",{className:"MessageStream-item",key:s,"data-id":e.id(),"data-number":e.number()},this.timeGap(e),m(W,{message:e,state:this.attrs.state}))}timeGap(e){if(e.id()===(this.attrs.dialog.data.relationships?.firstMessage.data).id)return this.lastTime=e.createdAt(),m("div",{class:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.start_of_the_conversation")));const s=this.lastTime,t=e.createdAt().getTime()-(s?.getTime()||0);return this.lastTime=e.createdAt(),s&&t>3456e5?m("div",{className:"PostStream-timeGap"},m("span",null,o().translator.trans("flarum-messages.forum.messages_page.stream.time_lapsed_text",{period:dayjs().add(t,"ms").fromNow(!0)}))):null}onscroll(){this.whileMaintainingScroll((()=>this.element.scrollTop<=80&&this.attrs.state.hasNext()?this.attrs.state.loadNext():this.element.scrollTop+this.element.clientHeight>=this.element.scrollHeight&&this.attrs.state.hasPrev()?this.attrs.state.loadPrev():null))}scrollToBottom(){const e=m.route.param("near");if(e){const s=this.element.querySelector(`.MessageStream-item[data-number="${e}"]`);s?(this.element.scrollTop=s.getBoundingClientRect().top-this.element.getBoundingClientRect().top,s.classList.add("flash"),window.history.replaceState(null,"",o().route.dialog(this.attrs.dialog))):this.element.scrollTop=this.element.scrollHeight}else this.element.scrollTop=this.element.scrollHeight}whileMaintainingScroll(e){const s=this.element.scrollTop,t=this.element.scrollHeight,a=s>(t-this.element.clientHeight)/2,r=e();r instanceof Promise&&!a&&r.then((()=>{requestAnimationFrame((()=>{this.element.scrollTop=this.element.scrollHeight-t+s}))}))}markAsRead(){const e=Number(this.$(".MessageStream-item[data-id]").filter(((e,s)=>this.element.scrollHeight<=this.element.clientHeight||this.$().offset().top+this.element.clientHeight>$(s).offset().top)).last().data("id"));e&&o().session.user&&e>(this.attrs.dialog.lastReadMessageId()||0)&&!this.markingAsRead&&(this.markingAsRead=!0,this.attrs.dialog.save({lastReadMessageId:e}).finally((()=>{this.markingAsRead=!1,0===this.attrs.dialog.unreadCount()&&o().session.user.pushAttributes({messageCount:(o().session.user.attribute("messageCount")??1)-1}),m.redraw()})))}}flarum.reg.add("flarum-messages","forum/components/MessageStream",X);var Y=t(521),Z=t.n(Y),ee=t(662),se=t.n(ee);class te extends(se()){constructor(e,s){void 0===s&&(s=1),super(e,s,null)}get type(){return"dialog-messages"}getAllItems(){return super.getAllItems()}}flarum.reg.add("flarum-messages","forum/states/MessageStreamState",te);var ae=t(88),re=t.n(ae),oe=t(741),ie=t.n(oe),ne=t(533),le=t.n(ne),me=t(653),de=t.n(me),ce=t(819),ue=t.n(ce);class ge extends(le()){className(){return"Modal--small Modal--flat DetailsModal"}title(){return o().translator.trans("flarum-messages.forum.dialog_section.details_modal.title")}content(){let e=(this.attrs.dialog.users()||[]).filter(Boolean);return m("div",{className:"Modal-body DetailsModal-infoGroups"},m("div",{className:"DetailsModal-recipients DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.recipients")),m("div",{className:"DetailsModal-recipients-list"},e?.map((e=>m("div",{className:"DetailsModal-recipient"},m(L(),{user:e}),m(re(),{href:o().route("user",{username:e.slug()})},m("span",{className:"DetailsModal-recipient-username"},Z()(e))),m("div",{className:"badges"},ue()(e.badges().toArray()))))))),this.infoItems().toArray())}infoItems(){const e=new(C());return e.add("created",m("div",{className:"DetailsModal-createdAt DetailsModal-info"},m("div",{className:"DetailsModal-info-title"},o().translator.trans("flarum-messages.forum.dialog_section.details_modal.created_at")),m("div",{className:"DetailsModal-info-content"},de()(this.attrs.dialog.createdAt())))),e}}flarum.reg.add("flarum-messages","forum/components/DetailsModal",ge);class he extends(D()){constructor(){super(...arguments),(0,a.A)(this,"loading",!1),(0,a.A)(this,"messages",void 0)}oninit(e){super.oninit(e),this.messages=new te(this.requestParams()),this.messages.refresh()}requestParams(e){void 0===e&&(e=!1);const s={filter:{dialog:this.attrs.dialog.id()},sort:"-number"},t=m.route.param("near");return t&&!e&&(s.page=s.page||{},s.page.near=parseInt(t)),s}view(){const e=this.attrs.dialog.recipient();return m("div",{className:"DialogSection"},m("div",{className:"DialogSection-header"},m(L(),{user:e}),m("div",{className:"DialogSection-header-info"},m("h2",{className:"DialogSection-header-info-title"},e&&m(re(),{href:o().route.user(e)},Z()(e))||Z()(e),e&&e.canSendAnyMessage()?null:m("span",{className:"DialogSection-header-info-helperText"},o().translator.trans("flarum-messages.forum.dialog_section.cannot_reply_text"))),m("div",{className:"badges"},ue()(e?.badges().toArray()||[]))),m("div",{className:"DialogSection-header-actions"},this.actionItems().toArray())),m(X,{dialog:this.attrs.dialog,state:this.messages}))}actionItems(){const e=new(C());return e.add("back",m(A(),{className:"Button Button--icon DialogSection-back",icon:"fas fa-arrow-left",onclick:this.attrs.onback},o().translator.trans("flarum-messages.forum.dialog_section.back_label"))),e.add("details",m(ie(),{icon:"fas fa-ellipsis-h",className:"DialogSection-controls",buttonClassName:"Button Button--icon",accessibleToggleLabel:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label"),label:o().translator.trans("flarum-messages.forum.dialog_section.controls_toggle_label")},this.controlItems().toArray())),e}controlItems(){const e=new(C());return e.add("details",m(A(),{icon:"fas fa-info-circle",onclick:()=>o().modal.show(ge,{dialog:this.attrs.dialog})},o().translator.trans("flarum-messages.forum.dialog_section.controls.details_button"))),e}}flarum.reg.add("flarum-messages","forum/components/DialogSection",he);class fe extends(n()){constructor(){super(...arguments),(0,a.A)(this,"selectedDialog",v()(null)),(0,a.A)(this,"currentDialogId",null)}oninit(e){super.oninit(e),o().session.user?(o().current.set("noTagsList",!0),o().dialogs.hasItems()?this.initDialog():o().dialogs.refresh().then((async()=>{o().dialogs.hasItems()&&await this.initDialog()}))):m.route.set(o().route("index"))}dialogRequestParams(){return{include:"users.groups"}}async initDialog(){const e=m.route.param("id");this.currentDialogId=e;const s=o().translator.trans("flarum-messages.forum.messages_page.title",{},!0);let t;t=e?o().store.getById("dialogs",e)||await o().store.find("dialogs",e,this.dialogRequestParams()):o().dialogs.getAllItems()[0],this.selectedDialog(t),t?(o().setTitle(t.title()),o().history.push("dialog",t.title())):(o().setTitle(s),o().history.push("messages",s)),m.redraw()}onupdate(e){super.onupdate(e);const s=this.element.querySelector(".DialogListItem.active"),t=this.element.querySelector(".DialogList");s&&$(t).offset().top+t.clientHeight<=$(s).offset().top&&s.scrollIntoView()}view(){return m(d(),{className:"MessagesPage Page--vertical",loading:!1,hero:this.hero.bind(this),sidebar:()=>m(I,null)},o().dialogs.isLoading()?m(f(),null):o().dialogs.hasItems()?m("div",{className:F()("MessagesPage-content",{"MessagesPage-content--onDialog":this.currentDialogId})},this.contentItems().toArray()):m(_(),{icon:"far fa-envelope-open"},o().translator.trans("flarum-messages.forum.messages_page.empty_text")))}hero(){return m("header",{className:"Hero MessagesPageHero"},m("div",{className:"container"},m("div",{className:"containerNarrow"},m("h1",{className:"Hero-title"},m(u(),{name:"fas fa-envelope"})," ",o().translator.trans("flarum-messages.forum.messages_page.hero.title")),m("div",{className:"Hero-subtitle"},o().translator.trans("flarum-messages.forum.messages_page.hero.subtitle")))))}contentItems(){const e=new(C());return e.add("sidebar",m("div",{className:"MessagesPage-sidebar",key:"sidebar"},m("div",{className:"IndexPage-toolbar",key:"toolbar"},m("ul",{className:"IndexPage-toolbar-view"},ue()(this.viewItems().toArray())),m("ul",{className:"IndexPage-toolbar-action"},ue()(this.actionItems().toArray()))),m(g.A,{key:"list",state:o().dialogs,activeDialog:this.selectedDialog()})),100),e.add("dialog",this.selectedDialog()?m(he,{key:"dialog",dialog:this.selectedDialog(),onback:()=>{this.currentDialogId=null}}):m(f(),{key:"loading",display:"block"}),80),e}viewItems(){const e=new(C()),s=o().dialogs.sortMap(),t=Object.keys(s).reduce(((e,t)=>{const a=s[t];return e[t]="string"!=typeof a?a.label:o().translator.trans(`flarum-messages.forum.index_sort.${t}_button`),e}),{});return e.add("sort",m(ie(),{buttonClassName:"Button",label:t[o().dialogs.getParams()?.sort||0]||Object.values(t)[0],accessibleToggleLabel:o().translator.trans("core.forum.index_sort.toggle_dropdown_accessible_label")},Object.keys(t).map((e=>{const a=t[e],r=(o().dialogs.getParams().sort||Object.keys(s)[0])===e;return m(A(),{icon:!r||"fas fa-check",onclick:()=>o().dialogs.changeSort(e),active:r},a)})))),e}actionItems(){const e=new(C());return e.add("refresh",m(A(),{title:o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.refresh_tooltip"),icon:"fas fa-sync",className:"Button Button--icon",onclick:()=>{o().dialogs.refresh()}})),o().session.user&&e.add("markAllAsRead",m(A(),{title:o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),"aria-label":o().translator.trans("flarum-messages.forum.messages_page.mark_all_as_read_tooltip"),icon:"fas fa-check",className:"Button Button--icon",onclick:()=>o().dialogs.markAllAsRead()})),e}}flarum.reg.add("flarum-messages","forum/components/MessagesPage",fe)}}]); //# sourceMappingURL=MessagesPage.js.map \ No newline at end of file diff --git a/extensions/messages/js/dist/forum/components/MessagesPage.js.map b/extensions/messages/js/dist/forum/components/MessagesPage.js.map index 00668e6c1..60306a877 100644 --- a/extensions/messages/js/dist/forum/components/MessagesPage.js.map +++ b/extensions/messages/js/dist/forum/components/MessagesPage.js.map @@ -1 +1 @@ -{"version":3,"file":"forum/components/MessagesPage.js","mappings":"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","sources":["webpack://@flarum/messages/./src/forum/components/DialogListItem.tsx","webpack://@flarum/messages/./src/forum/components/DialogList.tsx","webpack://@flarum/messages/./src/forum/components/MessagesSidebar.tsx","webpack://@flarum/messages/./src/forum/utils/MessageControls.tsx","webpack://@flarum/messages/./src/forum/components/Message.tsx","webpack://@flarum/messages/./src/forum/components/MessageStream.tsx","webpack://@flarum/messages/./src/forum/states/MessageStreamState.ts","webpack://@flarum/messages/./src/forum/components/DetailsModal.tsx","webpack://@flarum/messages/./src/forum/components/DialogSection.tsx","webpack://@flarum/messages/./src/forum/components/MessagesPage.tsx"],"sourcesContent":["import Component from 'flarum/common/Component';\nimport classList from 'flarum/common/utils/classList';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nexport default class DialogListItem extends Component {\n view(vnode) {\n const dialog = this.attrs.dialog;\n const recipient = dialog.recipient();\n const lastMessage = dialog.lastMessage();\n return m(\"li\", {\n className: classList('DialogListItem', {\n 'DialogListItem--unread': dialog.unreadCount(),\n active: this.attrs.active\n })\n }, m(Link, {\n href: app.route.dialog(dialog),\n className: classList('DialogListItem-button', {\n active: this.attrs.active\n })\n }, m(\"div\", {\n className: \"DialogListItem-avatar\"\n }, m(Avatar, {\n user: recipient\n }), !!dialog.unreadCount() && m(\"div\", {\n className: \"Bubble Bubble--primary\"\n }, dialog.unreadCount())), m(\"div\", {\n className: \"DialogListItem-content\"\n }, m(\"div\", {\n className: \"DialogListItem-title\"\n }, username(recipient), humanTime(dialog.lastMessageAt()), this.attrs.actions && m(\"div\", {\n className: \"DialogListItem-actions\"\n }, this.actionItems().toArray())), m(\"div\", {\n className: \"DialogListItem-lastMessage\"\n }, lastMessage ? lastMessage.contentPlain()?.slice(0, 80) : ''))));\n }\n actionItems() {\n const items = new ItemList();\n items.add('markAsRead', m(Button, {\n className: \"Notification-action Button Button--link\",\n icon: \"fas fa-check\",\n \"aria-label\": app.translator.trans('flarum-messages.forum.dialog_list.mark_as_read_tooltip'),\n onclick: e => {\n e.preventDefault();\n e.stopPropagation();\n this.attrs.dialog.save({\n lastReadMessageId: (this.attrs.dialog.data.relationships?.lastMessage.data).id\n }).finally(() => {\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }), 100);\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogListItem', DialogListItem);","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport DialogListItem from './DialogListItem';\nexport default class DialogList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n view() {\n return m(\"div\", {\n className: \"DialogList\"\n }, m(\"ul\", {\n className: \"DialogList-list\"\n }, this.attrs.state.getAllItems().map(dialog => m(DialogListItem, {\n dialog: dialog,\n active: this.attrs.activeDialog?.id() === dialog.id(),\n actions: this.attrs.itemActions\n }))), this.attrs.state.hasNext() && !this.attrs.hideMore && m(\"div\", {\n className: \"DialogList-loadMore\"\n }, m(Button, {\n className: \"Button\",\n onclick: this.attrs.state.loadNext.bind(this.attrs.state)\n }, app.translator.trans('flarum-messages.forum.dialog_list.load_more_button'))));\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogList', DialogList);","import app from 'flarum/forum/app';\nimport IndexSidebar from 'flarum/forum/components/IndexSidebar';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesSidebar extends IndexSidebar {\n static initAttrs(attrs) {\n attrs.className = 'MessagesPage-nav';\n }\n items() {\n const items = super.items();\n items.remove('newDiscussion');\n items.add('newMessage', m(Button, {\n icon: \"fas fa-edit\",\n className: \"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage\",\n itemClassName: \"App-primaryControl\",\n onclick: () => {\n return this.newMessageAction();\n },\n disabled: !app.session.user.canSendAnyMessage()\n }, app.session.user.canSendAnyMessage() ? app.translator.trans('flarum-messages.forum.messages_page.send_message_button') : app.translator.trans('flarum-messages.forum.messages_page.cannot_send_message_button')), 10);\n return items;\n }\n\n /**\n * Open the composer for a new message.\n */\n newMessageAction() {\n return flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n onsubmit: () => {\n app.dialogs.refresh();\n }\n }).then(() => app.composer.show());\n return app.composer;\n });\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesSidebar', MessagesSidebar);flarum.reg.addChunkModule('451', '761', 'flarum-messages', 'forum/components/MessageComposer');","import ItemList from 'flarum/common/utils/ItemList';\nimport Separator from 'flarum/common/components/Separator';\nimport Button from 'flarum/common/components/Button';\nimport app from 'flarum/forum/app';\nimport extractText from 'flarum/common/utils/extractText';\nconst MessageControls = {\n controls(message, context) {\n const items = new ItemList();\n Object.entries(this.sections()).forEach(_ref => {\n let [section, method] = _ref;\n const controls = method.call(this, message, context).toArray();\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', m(Separator, null));\n }\n });\n return items;\n },\n sections() {\n return {\n user: this.userControls,\n moderation: this.moderationControls,\n destructive: this.destructiveControls\n };\n },\n userControls(message, context) {\n return new ItemList();\n },\n moderationControls(message, context) {\n return new ItemList();\n },\n destructiveControls(message, context) {\n const items = new ItemList();\n if (message.canDelete()) {\n items.add('delete', m(Button, {\n icon: \"far fa-trash-alt\",\n onclick: () => this.deleteAction(message, context)\n }, app.translator.trans('flarum-messages.forum.message_controls.delete_button')));\n }\n return items;\n },\n deleteAction(message, context) {\n if (!confirm(extractText(app.translator.trans('flarum-messages.forum.message_controls.delete_confirmation')))) return;\n return message.delete().then(() => {\n context.attrs.state.remove(message);\n m.redraw();\n });\n }\n};\nexport default MessageControls;\nflarum.reg.add('flarum-messages', 'forum/utils/MessageControls', MessageControls);","import app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport AbstractPost from 'flarum/forum/components/AbstractPost';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Comment from 'flarum/forum/components/Comment';\nimport PostUser from 'flarum/forum/components/PostUser';\nimport PostMeta from 'flarum/forum/components/PostMeta';\nimport classList from 'flarum/common/utils/classList';\nimport MessageControls from '../utils/MessageControls';\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n */\nexport default class Message extends AbstractPost {\n oninit(vnode) {\n super.oninit(vnode);\n }\n user() {\n return this.attrs.message.user();\n }\n controls() {\n return MessageControls.controls(this.attrs.message, this).toArray();\n }\n freshness() {\n return this.attrs.message.freshness;\n }\n createdByStarter() {\n return false;\n }\n onbeforeupdate(vnode) {\n return super.onbeforeupdate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n elementAttrs() {\n const message = this.attrs.message;\n const attrs = super.elementAttrs();\n attrs.className = classList(attrs.className || null, 'Message', {\n 'Post--renderFailed': message.renderFailed(),\n revealContent: false,\n editing: false\n });\n return attrs;\n }\n header() {\n return super.header();\n }\n content() {\n return super.content().concat([m(Comment, {\n headerItems: this.headerItems(),\n cardVisible: false,\n isEditing: false,\n isHidden: false,\n contentHtml: this.attrs.message.contentHtml(),\n user: this.attrs.message.user()\n })]);\n }\n classes(existing) {\n return super.classes(existing);\n }\n actionItems() {\n return super.actionItems();\n }\n footerItems() {\n return super.footerItems();\n }\n sideItems() {\n return super.sideItems();\n }\n avatar() {\n return this.attrs.message.user() ? m(Avatar, {\n user: this.attrs.message.user(),\n className: \"Post-avatar\"\n }) : '';\n }\n headerItems() {\n const items = new ItemList();\n const message = this.attrs.message;\n items.add('user', m(PostUser, {\n post: message\n }), 100);\n items.add('meta', m(PostMeta, {\n post: message,\n permalink: () => {\n const dialog = message.dialog();\n if (!dialog) {\n return null;\n }\n return app.forum.attribute('baseOrigin') + app.route.dialog(dialog, message.number());\n }\n }));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/Message', Message);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport Button from 'flarum/common/components/Button';\nimport ScrollListener from 'flarum/common/utils/ScrollListener';\nimport Message from './Message';\nexport default class MessageStream extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"replyPlaceholderComponent\", Stream(null));\n _defineProperty(this, \"loadingPostComponent\", Stream(null));\n _defineProperty(this, \"scrollListener\", void 0);\n _defineProperty(this, \"initialToBottomScroll\", false);\n _defineProperty(this, \"lastTime\", null);\n _defineProperty(this, \"checkedRead\", false);\n _defineProperty(this, \"markingAsRead\", false);\n }\n oninit(vnode) {\n super.oninit(vnode);\n\n // We need the lazy ReplyPlaceholder and LoadingPost components to be loaded.\n Promise.all([flarum.reg.asyncModuleImport('flarum/forum/components/ReplyPlaceholder'), flarum.reg.asyncModuleImport('flarum/forum/components/LoadingPost')]).then(_ref => {\n let [ReplyPlaceholder, LoadingPost] = _ref;\n this.replyPlaceholderComponent(ReplyPlaceholder.default);\n this.loadingPostComponent(LoadingPost.default);\n });\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n this.scrollListener = new ScrollListener(this.onscroll.bind(this), this.element);\n setTimeout(() => {\n this.scrollListener.start();\n this.element.addEventListener('scrollend', this.markAsRead.bind(this));\n });\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // @todo: for future versions, consider using the post stream scrubber to scroll through the messages. (big task..)\n // @todo: introduce read status, to jump to the first unread message instead.\n if (!this.initialToBottomScroll && !this.attrs.state.isLoading()) {\n this.scrollToBottom();\n this.initialToBottomScroll = true;\n }\n if (this.initialToBottomScroll && !this.checkedRead) {\n this.markAsRead();\n this.checkedRead = true;\n }\n }\n onremove(vnode) {\n super.onremove(vnode);\n this.scrollListener.stop();\n }\n view() {\n return m(\"div\", {\n className: \"MessageStream\"\n }, this.attrs.state.isLoading() ? m(LoadingIndicator, null) : this.content());\n }\n content() {\n const items = [];\n const messages = Array.from(new Map(this.attrs.state.getAllItems().map(msg => [msg.id(), msg])).values()).sort((a, b) => a.number() - b.number());\n const ReplyPlaceholder = this.replyPlaceholderComponent();\n const LoadingPost = this.loadingPostComponent();\n if (messages[0].id() !== (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadNext\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadNext()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadNext\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_previous_button'))));\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-next\"\n }, m(LoadingPost, null)));\n }\n }\n messages.forEach((message, index) => items.push(this.messageItem(message, index)));\n if (messages[messages.length - 1].id() !== (this.attrs.dialog.data.relationships?.lastMessage.data).id) {\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-prev\"\n }, m(LoadingPost, null)));\n }\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadPrev\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadPrev()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadPrev\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_next_button'))));\n }\n if (app.session.user.canSendAnyMessage() && ReplyPlaceholder) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"reply\"\n }, m(ReplyPlaceholder, {\n discussion: this.attrs.dialog,\n onclick: () => {\n flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n replyingTo: this.attrs.dialog,\n onsubmit: () => {\n this.attrs.state.refresh().then(() => setTimeout(() => this.scrollToBottom(), 50));\n }\n }).then(() => app.composer.show());\n });\n },\n composingReply: () => app.composer.composingMessageTo(this.attrs.dialog)\n })));\n }\n return items;\n }\n messageItem(message, index) {\n return m(\"div\", {\n className: \"MessageStream-item\",\n key: index,\n \"data-id\": message.id(),\n \"data-number\": message.number()\n }, this.timeGap(message), m(Message, {\n message: message,\n state: this.attrs.state\n }));\n }\n timeGap(message) {\n if (message.id() === (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n this.lastTime = message.createdAt();\n return m(\"div\", {\n class: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.start_of_the_conversation')));\n }\n const lastTime = this.lastTime;\n const dt = message.createdAt().getTime() - (lastTime?.getTime() || 0);\n this.lastTime = message.createdAt();\n if (lastTime && dt > 1000 * 60 * 60 * 24 * 4) {\n return m(\"div\", {\n className: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.time_lapsed_text', {\n period: dayjs().add(dt, 'ms').fromNow(true)\n })));\n }\n return null;\n }\n onscroll() {\n this.whileMaintainingScroll(() => {\n if (this.element.scrollTop <= 80 && this.attrs.state.hasNext()) {\n return this.attrs.state.loadNext();\n }\n if (this.element.scrollTop + this.element.clientHeight >= this.element.scrollHeight && this.attrs.state.hasPrev()) {\n return this.attrs.state.loadPrev();\n }\n return null;\n });\n }\n scrollToBottom() {\n const near = m.route.param('near');\n if (near) {\n const $message = this.element.querySelector(`.MessageStream-item[data-number=\"${near}\"]`);\n if ($message) {\n this.element.scrollTop = $message.getBoundingClientRect().top - this.element.getBoundingClientRect().top;\n $message.classList.add('flash');\n\n // forget near\n window.history.replaceState(null, '', app.route.dialog(this.attrs.dialog));\n } else {\n this.element.scrollTop = this.element.scrollHeight;\n }\n } else {\n this.element.scrollTop = this.element.scrollHeight;\n }\n }\n whileMaintainingScroll(callback) {\n const scrollTop = this.element.scrollTop;\n const scrollHeight = this.element.scrollHeight;\n const closerToBottomThanTop = scrollTop > (scrollHeight - this.element.clientHeight) / 2;\n const result = callback();\n if (result instanceof Promise && !closerToBottomThanTop) {\n result.then(() => {\n requestAnimationFrame(() => {\n this.element.scrollTop = this.element.scrollHeight - scrollHeight + scrollTop;\n });\n });\n }\n }\n markAsRead() {\n const lastVisibleId = Number(this.$('.MessageStream-item[data-id]').filter((_, $el) => {\n if (this.element.scrollHeight <= this.element.clientHeight) {\n return true;\n }\n return this.$().offset().top + this.element.clientHeight > $($el).offset().top;\n }).last().data('id'));\n if (lastVisibleId && app.session.user && lastVisibleId > (this.attrs.dialog.lastReadMessageId() || 0) && !this.markingAsRead) {\n this.markingAsRead = true;\n this.attrs.dialog.save({\n lastReadMessageId: lastVisibleId\n }).finally(() => {\n this.markingAsRead = false;\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessageStream', MessageStream);","import PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class MessageStreamState extends PaginatedListState {\n constructor(params, page) {\n if (page === void 0) {\n page = 1;\n }\n super(params, page, null);\n }\n get type() {\n return 'dialog-messages';\n }\n getAllItems() {\n return super.getAllItems();\n }\n}\nflarum.reg.add('flarum-messages', 'forum/states/MessageStreamState', MessageStreamState);","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Avatar from 'flarum/common/components/Avatar';\nimport fullTime from 'flarum/common/helpers/fullTime';\nimport username from 'flarum/common/helpers/username';\nimport Link from 'flarum/common/components/Link';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DetailsModal extends Modal {\n className() {\n return 'Modal--small Modal--flat DetailsModal';\n }\n title() {\n return app.translator.trans('flarum-messages.forum.dialog_section.details_modal.title');\n }\n content() {\n let recipients = (this.attrs.dialog.users() || []).filter(Boolean);\n return m(\"div\", {\n className: \"Modal-body DetailsModal-infoGroups\"\n }, m(\"div\", {\n className: \"DetailsModal-recipients DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.recipients')), m(\"div\", {\n className: \"DetailsModal-recipients-list\"\n }, recipients?.map(recipient => {\n return m(\"div\", {\n className: \"DetailsModal-recipient\"\n }, m(Avatar, {\n user: recipient\n }), m(Link, {\n href: app.route('user', {\n username: recipient.slug()\n })\n }, m(\"span\", {\n className: \"DetailsModal-recipient-username\"\n }, username(recipient))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient.badges().toArray())));\n }))), this.infoItems().toArray());\n }\n infoItems() {\n const items = new ItemList();\n items.add('created', m(\"div\", {\n className: \"DetailsModal-createdAt DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.created_at')), m(\"div\", {\n className: \"DetailsModal-info-content\"\n }, fullTime(this.attrs.dialog.createdAt()))));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DetailsModal', DetailsModal);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport Component from 'flarum/common/Component';\nimport MessageStream from './MessageStream';\nimport username from 'flarum/common/helpers/username';\nimport MessageStreamState from '../states/MessageStreamState';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport DetailsModal from './DetailsModal';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DialogSection extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"loading\", false);\n _defineProperty(this, \"messages\", void 0);\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.messages = new MessageStreamState(this.requestParams());\n this.messages.refresh();\n }\n requestParams(forgetNear) {\n if (forgetNear === void 0) {\n forgetNear = false;\n }\n const params = {\n filter: {\n dialog: this.attrs.dialog.id()\n },\n sort: '-number'\n };\n const near = m.route.param('near');\n if (near && !forgetNear) {\n params.page = params.page || {};\n params.page.near = parseInt(near);\n }\n return params;\n }\n view() {\n const recipient = this.attrs.dialog.recipient();\n return m(\"div\", {\n className: \"DialogSection\"\n }, m(\"div\", {\n className: \"DialogSection-header\"\n }, m(Avatar, {\n user: recipient\n }), m(\"div\", {\n className: \"DialogSection-header-info\"\n }, m(\"h2\", {\n className: \"DialogSection-header-info-title\"\n }, recipient && m(Link, {\n href: app.route.user(recipient)\n }, username(recipient)) || username(recipient), recipient && recipient.canSendAnyMessage() ? null : m(\"span\", {\n className: \"DialogSection-header-info-helperText\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.cannot_reply_text'))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient?.badges().toArray() || []))), m(\"div\", {\n className: \"DialogSection-header-actions\"\n }, this.actionItems().toArray())), m(MessageStream, {\n dialog: this.attrs.dialog,\n state: this.messages\n }));\n }\n actionItems() {\n const items = new ItemList();\n items.add('back', m(Button, {\n className: \"Button Button--icon DialogSection-back\",\n icon: \"fas fa-arrow-left\",\n onclick: this.attrs.onback\n }, app.translator.trans('flarum-messages.forum.dialog_section.back_label')));\n items.add('details', m(Dropdown, {\n icon: \"fas fa-ellipsis-h\",\n className: \"DialogSection-controls\",\n buttonClassName: \"Button Button--icon\",\n accessibleToggleLabel: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label'),\n label: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')\n }, this.controlItems().toArray()));\n return items;\n }\n controlItems() {\n const items = new ItemList();\n items.add('details', m(Button, {\n icon: \"fas fa-info-circle\",\n onclick: () => app.modal.show(DetailsModal, {\n dialog: this.attrs.dialog\n })\n }, app.translator.trans('flarum-messages.forum.dialog_section.controls.details_button')));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogSection', DialogSection);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport PageStructure from 'flarum/forum/components/PageStructure';\nimport Icon from 'flarum/common/components/Icon';\nimport DialogList from './DialogList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport InfoTile from 'flarum/common/components/InfoTile';\nimport MessagesSidebar from './MessagesSidebar';\nimport DialogSection from './DialogSection';\nimport listItems from 'flarum/common/helpers/listItems';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Button from 'flarum/common/components/Button';\nimport classList from 'flarum/common/utils/classList';\nexport default class MessagesPage extends Page {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"selectedDialog\", Stream(null));\n _defineProperty(this, \"currentDialogId\", null);\n }\n oninit(vnode) {\n super.oninit(vnode);\n if (!app.session.user) {\n m.route.set(app.route('index'));\n return;\n }\n app.current.set('noTagsList', true);\n if (!app.dialogs.hasItems()) {\n app.dialogs.refresh().then(async () => {\n if (app.dialogs.hasItems()) {\n await this.initDialog();\n }\n });\n } else {\n this.initDialog();\n }\n }\n dialogRequestParams() {\n return {\n include: 'users.groups'\n };\n }\n async initDialog() {\n const dialogId = m.route.param('id');\n this.currentDialogId = dialogId;\n const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);\n let dialog;\n if (dialogId) {\n dialog = app.store.getById('dialogs', dialogId) || (await app.store.find('dialogs', dialogId, this.dialogRequestParams()));\n } else {\n dialog = app.dialogs.getAllItems()[0];\n }\n this.selectedDialog(dialog);\n if (dialog) {\n app.setTitle(dialog.title());\n app.history.push('dialog', dialog.title());\n } else {\n app.setTitle(title);\n app.history.push('messages', title);\n }\n m.redraw();\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Scroll the dialog list to the active dialog item if present and not visible.\n const dialogElement = this.element.querySelector('.DialogListItem.active');\n const container = this.element.querySelector('.DialogList');\n if (dialogElement && $(container).offset().top + container.clientHeight <= $(dialogElement).offset().top) {\n dialogElement.scrollIntoView();\n }\n }\n view() {\n return m(PageStructure, {\n className: \"MessagesPage Page--vertical\",\n loading: false,\n hero: this.hero.bind(this),\n sidebar: () => m(MessagesSidebar, null)\n }, app.dialogs.isLoading() ? m(LoadingIndicator, null) : !app.dialogs.hasItems() ? m(InfoTile, {\n icon: \"far fa-envelope-open\"\n }, app.translator.trans('flarum-messages.forum.messages_page.empty_text')) : m(\"div\", {\n className: classList('MessagesPage-content', {\n 'MessagesPage-content--onDialog': this.currentDialogId\n })\n }, m(\"div\", {\n className: \"MessagesPage-sidebar\",\n key: \"sidebar\"\n }, m(\"div\", {\n className: \"IndexPage-toolbar\",\n key: \"toolbar\"\n }, m(\"ul\", {\n className: \"IndexPage-toolbar-view\"\n }, listItems(this.viewItems().toArray())), m(\"ul\", {\n className: \"IndexPage-toolbar-action\"\n }, listItems(this.actionItems().toArray()))), m(DialogList, {\n key: \"list\",\n state: app.dialogs,\n activeDialog: this.selectedDialog()\n })), this.selectedDialog() ? m(DialogSection, {\n key: \"dialog\",\n dialog: this.selectedDialog(),\n onback: () => {\n this.currentDialogId = null;\n }\n }) : m(LoadingIndicator, {\n key: \"loading\",\n display: \"block\"\n })));\n }\n hero() {\n return m(\"header\", {\n className: \"Hero MessagesPageHero\"\n }, m(\"div\", {\n className: \"container\"\n }, m(\"div\", {\n className: \"containerNarrow\"\n }, m(\"h1\", {\n className: \"Hero-title\"\n }, m(Icon, {\n name: \"fas fa-envelope\"\n }), \" \", app.translator.trans('flarum-messages.forum.messages_page.hero.title')), m(\"div\", {\n className: \"Hero-subtitle\"\n }, app.translator.trans('flarum-messages.forum.messages_page.hero.subtitle')))));\n }\n\n /**\n * Build an item list for the part of the toolbar which is concerned with how\n * the results are displayed. By default this is just a select box to change\n * the way discussions are sorted.\n */\n viewItems() {\n const items = new ItemList();\n const sortMap = app.dialogs.sortMap();\n const sortOptions = Object.keys(sortMap).reduce((acc, sortId) => {\n const sort = sortMap[sortId];\n acc[sortId] = typeof sort !== 'string' ? sort.label : app.translator.trans(`flarum-messages.forum.index_sort.${sortId}_button`);\n return acc;\n }, {});\n items.add('sort', m(Dropdown, {\n buttonClassName: \"Button\",\n label: sortOptions[app.dialogs.getParams()?.sort || 0] || Object.values(sortOptions)[0],\n accessibleToggleLabel: app.translator.trans('core.forum.index_sort.toggle_dropdown_accessible_label')\n }, Object.keys(sortOptions).map(value => {\n const label = sortOptions[value];\n const active = (app.dialogs.getParams().sort || Object.keys(sortMap)[0]) === value;\n return m(Button, {\n icon: active ? 'fas fa-check' : true,\n onclick: () => app.dialogs.changeSort(value),\n active: active\n }, label);\n })));\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is about taking action\n * on the results. By default this is just a \"mark all as read\" button.\n */\n actionItems() {\n const items = new ItemList();\n items.add('refresh', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n icon: \"fas fa-sync\",\n className: \"Button Button--icon\",\n onclick: () => {\n app.dialogs.refresh();\n }\n }));\n if (app.session.user) {\n items.add('markAllAsRead', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n icon: \"fas fa-check\",\n className: \"Button Button--icon\",\n onclick: () => app.dialogs.markAllAsRead()\n }));\n }\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesPage', MessagesPage);"],"names":["DialogListItem","view","vnode","dialog","this","attrs","recipient","lastMessage","m","className","unreadCount","active","href","user","lastMessageAt","actions","actionItems","toArray","contentPlain","slice","items","add","icon","trans","onclick","e","preventDefault","stopPropagation","save","lastReadMessageId","data","relationships","id","finally","pushAttributes","messageCount","attribute","redraw","flarum","reg","DialogList","oninit","super","oncreate","onupdate","state","getAllItems","map","activeDialog","itemActions","hasNext","hideMore","loadNext","bind","MessagesSidebar","initAttrs","remove","itemClassName","newMessageAction","disabled","canSendAnyMessage","asyncModuleImport","then","load","onsubmit","refresh","show","addChunkModule","MessageControls","controls","message","context","Object","entries","sections","forEach","_ref","section","method","call","length","item","itemName","userControls","moderation","moderationControls","destructive","destructiveControls","canDelete","deleteAction","confirm","delete","Message","freshness","createdByStarter","onbeforeupdate","elementAttrs","renderFailed","revealContent","editing","header","content","concat","headerItems","cardVisible","isEditing","isHidden","contentHtml","classes","existing","footerItems","sideItems","avatar","post","permalink","number","MessageStream","constructor","arguments","Promise","all","ReplyPlaceholder","LoadingPost","replyPlaceholderComponent","default","loadingPostComponent","scrollListener","onscroll","element","setTimeout","start","addEventListener","markAsRead","initialToBottomScroll","isLoading","scrollToBottom","checkedRead","onremove","stop","messages","Array","from","Map","msg","values","sort","a","b","firstMessage","push","key","whileMaintainingScroll","type","index","messageItem","loadPrev","discussion","replyingTo","composingReply","composingMessageTo","timeGap","lastTime","createdAt","class","dt","getTime","period","dayjs","fromNow","scrollTop","clientHeight","scrollHeight","hasPrev","near","route","param","$message","querySelector","getBoundingClientRect","top","classList","window","history","replaceState","callback","closerToBottomThanTop","result","requestAnimationFrame","lastVisibleId","Number","$","filter","_","$el","offset","last","markingAsRead","MessageStreamState","params","page","DetailsModal","title","recipients","users","Boolean","username","slug","badges","infoItems","DialogSection","requestParams","forgetNear","parseInt","onback","buttonClassName","accessibleToggleLabel","label","controlItems","MessagesPage","set","hasItems","initDialog","async","dialogRequestParams","include","dialogId","currentDialogId","getById","find","selectedDialog","dialogElement","container","scrollIntoView","loading","hero","sidebar","viewItems","display","name","sortMap","sortOptions","keys","reduce","acc","sortId","getParams","value","changeSort","markAllAsRead"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"forum/components/MessagesPage.js","mappings":"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","sources":["webpack://@flarum/messages/./src/forum/components/DialogListItem.tsx","webpack://@flarum/messages/./src/forum/components/DialogList.tsx","webpack://@flarum/messages/./src/forum/components/MessagesSidebar.tsx","webpack://@flarum/messages/./src/forum/utils/MessageControls.tsx","webpack://@flarum/messages/./src/forum/components/Message.tsx","webpack://@flarum/messages/./src/forum/components/MessageStream.tsx","webpack://@flarum/messages/./src/forum/states/MessageStreamState.ts","webpack://@flarum/messages/./src/forum/components/DetailsModal.tsx","webpack://@flarum/messages/./src/forum/components/DialogSection.tsx","webpack://@flarum/messages/./src/forum/components/MessagesPage.tsx"],"sourcesContent":["import Component from 'flarum/common/Component';\nimport classList from 'flarum/common/utils/classList';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport Avatar from 'flarum/common/components/Avatar';\nimport username from 'flarum/common/helpers/username';\nimport humanTime from 'flarum/common/helpers/humanTime';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nexport default class DialogListItem extends Component {\n view(vnode) {\n const dialog = this.attrs.dialog;\n const recipient = dialog.recipient();\n const lastMessage = dialog.lastMessage();\n return m(\"li\", {\n className: classList('DialogListItem', {\n 'DialogListItem--unread': dialog.unreadCount(),\n active: this.attrs.active\n })\n }, m(Link, {\n href: app.route.dialog(dialog),\n className: classList('DialogListItem-button', {\n active: this.attrs.active\n })\n }, m(\"div\", {\n className: \"DialogListItem-avatar\"\n }, m(Avatar, {\n user: recipient\n }), !!dialog.unreadCount() && m(\"div\", {\n className: \"Bubble Bubble--primary\"\n }, dialog.unreadCount())), m(\"div\", {\n className: \"DialogListItem-content\"\n }, m(\"div\", {\n className: \"DialogListItem-title\"\n }, username(recipient), humanTime(dialog.lastMessageAt()), this.attrs.actions && m(\"div\", {\n className: \"DialogListItem-actions\"\n }, this.actionItems().toArray())), m(\"div\", {\n className: \"DialogListItem-lastMessage\"\n }, lastMessage ? lastMessage.contentPlain()?.slice(0, 80) : ''))));\n }\n actionItems() {\n const items = new ItemList();\n items.add('markAsRead', m(Button, {\n className: \"Notification-action Button Button--link\",\n icon: \"fas fa-check\",\n \"aria-label\": app.translator.trans('flarum-messages.forum.dialog_list.mark_as_read_tooltip'),\n onclick: e => {\n e.preventDefault();\n e.stopPropagation();\n this.attrs.dialog.save({\n lastReadMessageId: (this.attrs.dialog.data.relationships?.lastMessage.data).id\n }).finally(() => {\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }), 100);\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogListItem', DialogListItem);","import app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport Button from 'flarum/common/components/Button';\nimport DialogListItem from './DialogListItem';\nexport default class DialogList extends Component {\n oninit(vnode) {\n super.oninit(vnode);\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n view() {\n return m(\"div\", {\n className: \"DialogList\"\n }, m(\"ul\", {\n className: \"DialogList-list\"\n }, this.attrs.state.getAllItems().map(dialog => m(DialogListItem, {\n dialog: dialog,\n active: this.attrs.activeDialog?.id() === dialog.id(),\n actions: this.attrs.itemActions\n }))), this.attrs.state.hasNext() && !this.attrs.hideMore && m(\"div\", {\n className: \"DialogList-loadMore\"\n }, m(Button, {\n className: \"Button\",\n onclick: this.attrs.state.loadNext.bind(this.attrs.state)\n }, app.translator.trans('flarum-messages.forum.dialog_list.load_more_button'))));\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogList', DialogList);","import app from 'flarum/forum/app';\nimport IndexSidebar from 'flarum/forum/components/IndexSidebar';\nimport Button from 'flarum/common/components/Button';\nexport default class MessagesSidebar extends IndexSidebar {\n static initAttrs(attrs) {\n attrs.className = 'MessagesPage-nav';\n }\n items() {\n const items = super.items();\n items.remove('newDiscussion');\n items.add('newMessage', m(Button, {\n icon: \"fas fa-edit\",\n className: \"Button Button--primary IndexPage-newDiscussion MessagesPage-newMessage\",\n itemClassName: \"App-primaryControl\",\n onclick: () => {\n return this.newMessageAction();\n },\n disabled: !app.session.user.canSendAnyMessage()\n }, app.session.user.canSendAnyMessage() ? app.translator.trans('flarum-messages.forum.messages_page.send_message_button') : app.translator.trans('flarum-messages.forum.messages_page.cannot_send_message_button')), 10);\n return items;\n }\n\n /**\n * Open the composer for a new message.\n */\n newMessageAction() {\n return flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n onsubmit: () => {\n app.dialogs.refresh();\n }\n }).then(() => app.composer.show());\n return app.composer;\n });\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesSidebar', MessagesSidebar);flarum.reg.addChunkModule('451', '761', 'flarum-messages', 'forum/components/MessageComposer');","import ItemList from 'flarum/common/utils/ItemList';\nimport Separator from 'flarum/common/components/Separator';\nimport Button from 'flarum/common/components/Button';\nimport app from 'flarum/forum/app';\nimport extractText from 'flarum/common/utils/extractText';\nconst MessageControls = {\n controls(message, context) {\n const items = new ItemList();\n Object.entries(this.sections()).forEach(_ref => {\n let [section, method] = _ref;\n const controls = method.call(this, message, context).toArray();\n if (controls.length) {\n controls.forEach(item => items.add(item.itemName, item));\n items.add(section + 'Separator', m(Separator, null));\n }\n });\n return items;\n },\n sections() {\n return {\n user: this.userControls,\n moderation: this.moderationControls,\n destructive: this.destructiveControls\n };\n },\n userControls(message, context) {\n return new ItemList();\n },\n moderationControls(message, context) {\n return new ItemList();\n },\n destructiveControls(message, context) {\n const items = new ItemList();\n if (message.canDelete()) {\n items.add('delete', m(Button, {\n icon: \"far fa-trash-alt\",\n onclick: () => this.deleteAction(message, context)\n }, app.translator.trans('flarum-messages.forum.message_controls.delete_button')));\n }\n return items;\n },\n deleteAction(message, context) {\n if (!confirm(extractText(app.translator.trans('flarum-messages.forum.message_controls.delete_confirmation')))) return;\n return message.delete().then(() => {\n context.attrs.state.remove(message);\n m.redraw();\n });\n }\n};\nexport default MessageControls;\nflarum.reg.add('flarum-messages', 'forum/utils/MessageControls', MessageControls);","import app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport AbstractPost from 'flarum/forum/components/AbstractPost';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Comment from 'flarum/forum/components/Comment';\nimport PostUser from 'flarum/forum/components/PostUser';\nimport PostMeta from 'flarum/forum/components/PostMeta';\nimport classList from 'flarum/common/utils/classList';\nimport MessageControls from '../utils/MessageControls';\n/**\n * The `Post` component displays a single post. The basic post template just\n * includes a controls dropdown; subclasses must implement `content` and `attrs`\n * methods.\n */\nexport default class Message extends AbstractPost {\n oninit(vnode) {\n super.oninit(vnode);\n }\n user() {\n return this.attrs.message.user();\n }\n controls() {\n return MessageControls.controls(this.attrs.message, this).toArray();\n }\n freshness() {\n return this.attrs.message.freshness;\n }\n createdByStarter() {\n return false;\n }\n onbeforeupdate(vnode) {\n return super.onbeforeupdate(vnode);\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n }\n elementAttrs() {\n const message = this.attrs.message;\n const attrs = super.elementAttrs();\n attrs.className = classList(attrs.className || null, 'Message', {\n 'Post--renderFailed': message.renderFailed(),\n revealContent: false,\n editing: false\n });\n return attrs;\n }\n header() {\n return super.header();\n }\n content() {\n return super.content().concat([m(Comment, {\n headerItems: this.headerItems(),\n cardVisible: false,\n isEditing: false,\n isHidden: false,\n contentHtml: this.attrs.message.contentHtml(),\n user: this.attrs.message.user()\n })]);\n }\n classes(existing) {\n return super.classes(existing);\n }\n actionItems() {\n return super.actionItems();\n }\n footerItems() {\n return super.footerItems();\n }\n sideItems() {\n return super.sideItems();\n }\n avatar() {\n return this.attrs.message.user() ? m(Avatar, {\n user: this.attrs.message.user(),\n className: \"Post-avatar\"\n }) : '';\n }\n headerItems() {\n const items = new ItemList();\n const message = this.attrs.message;\n items.add('user', m(PostUser, {\n post: message\n }), 100);\n items.add('meta', m(PostMeta, {\n post: message,\n permalink: () => {\n const dialog = message.dialog();\n if (!dialog) {\n return null;\n }\n return app.forum.attribute('baseOrigin') + app.route.dialog(dialog, message.number());\n }\n }));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/Message', Message);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Component from 'flarum/common/Component';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport Button from 'flarum/common/components/Button';\nimport ScrollListener from 'flarum/common/utils/ScrollListener';\nimport Message from './Message';\nexport default class MessageStream extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"replyPlaceholderComponent\", Stream(null));\n _defineProperty(this, \"loadingPostComponent\", Stream(null));\n _defineProperty(this, \"scrollListener\", void 0);\n _defineProperty(this, \"initialToBottomScroll\", false);\n _defineProperty(this, \"lastTime\", null);\n _defineProperty(this, \"checkedRead\", false);\n _defineProperty(this, \"markingAsRead\", false);\n }\n oninit(vnode) {\n super.oninit(vnode);\n\n // We need the lazy ReplyPlaceholder and LoadingPost components to be loaded.\n Promise.all([flarum.reg.asyncModuleImport('flarum/forum/components/ReplyPlaceholder'), flarum.reg.asyncModuleImport('flarum/forum/components/LoadingPost')]).then(_ref => {\n let [ReplyPlaceholder, LoadingPost] = _ref;\n this.replyPlaceholderComponent(ReplyPlaceholder.default);\n this.loadingPostComponent(LoadingPost.default);\n });\n }\n oncreate(vnode) {\n super.oncreate(vnode);\n this.scrollListener = new ScrollListener(this.onscroll.bind(this), this.element);\n setTimeout(() => {\n this.scrollListener.start();\n this.element.addEventListener('scrollend', this.markAsRead.bind(this));\n });\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // @todo: for future versions, consider using the post stream scrubber to scroll through the messages. (big task..)\n // @todo: introduce read status, to jump to the first unread message instead.\n if (!this.initialToBottomScroll && !this.attrs.state.isLoading()) {\n this.scrollToBottom();\n this.initialToBottomScroll = true;\n }\n if (this.initialToBottomScroll && !this.checkedRead) {\n this.markAsRead();\n this.checkedRead = true;\n }\n }\n onremove(vnode) {\n super.onremove(vnode);\n this.scrollListener.stop();\n }\n view() {\n return m(\"div\", {\n className: \"MessageStream\"\n }, this.attrs.state.isLoading() ? m(LoadingIndicator, null) : this.content());\n }\n content() {\n const items = [];\n const messages = Array.from(new Map(this.attrs.state.getAllItems().map(msg => [msg.id(), msg])).values()).sort((a, b) => a.number() - b.number());\n const ReplyPlaceholder = this.replyPlaceholderComponent();\n const LoadingPost = this.loadingPostComponent();\n if (messages[0].id() !== (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadNext\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadNext()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadNext\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_previous_button'))));\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-next\"\n }, m(LoadingPost, null)));\n }\n }\n messages.forEach((message, index) => items.push(this.messageItem(message, index)));\n if (messages[messages.length - 1].id() !== (this.attrs.dialog.data.relationships?.lastMessage.data).id) {\n if (LoadingPost) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loading-prev\"\n }, m(LoadingPost, null)));\n }\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"loadPrev\"\n }, m(Button, {\n onclick: () => this.whileMaintainingScroll(() => this.attrs.state.loadPrev()),\n type: \"button\",\n className: \"Button Button--block MessageStream-loadPrev\"\n }, app.translator.trans('flarum-messages.forum.messages_page.stream.load_next_button'))));\n }\n if (app.session.user.canSendAnyMessage() && ReplyPlaceholder) {\n items.push(m(\"div\", {\n className: \"MessageStream-item\",\n key: \"reply\"\n }, m(ReplyPlaceholder, {\n discussion: this.attrs.dialog,\n onclick: () => {\n flarum.reg.asyncModuleImport('flarum/forum/components/ComposerBody').then(() => {\n app.composer.load(() => import(/* webpackChunkName: 'forum/components/MessageComposer', webpackMode: 'lazy-once' */ './MessageComposer'), {\n user: app.session.user,\n replyingTo: this.attrs.dialog,\n onsubmit: () => {\n this.attrs.state.refresh().then(() => setTimeout(() => this.scrollToBottom(), 50));\n }\n }).then(() => app.composer.show());\n });\n },\n composingReply: () => app.composer.composingMessageTo(this.attrs.dialog)\n })));\n }\n return items;\n }\n messageItem(message, index) {\n return m(\"div\", {\n className: \"MessageStream-item\",\n key: index,\n \"data-id\": message.id(),\n \"data-number\": message.number()\n }, this.timeGap(message), m(Message, {\n message: message,\n state: this.attrs.state\n }));\n }\n timeGap(message) {\n if (message.id() === (this.attrs.dialog.data.relationships?.firstMessage.data).id) {\n this.lastTime = message.createdAt();\n return m(\"div\", {\n class: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.start_of_the_conversation')));\n }\n const lastTime = this.lastTime;\n const dt = message.createdAt().getTime() - (lastTime?.getTime() || 0);\n this.lastTime = message.createdAt();\n if (lastTime && dt > 1000 * 60 * 60 * 24 * 4) {\n return m(\"div\", {\n className: \"PostStream-timeGap\"\n }, m(\"span\", null, app.translator.trans('flarum-messages.forum.messages_page.stream.time_lapsed_text', {\n period: dayjs().add(dt, 'ms').fromNow(true)\n })));\n }\n return null;\n }\n onscroll() {\n this.whileMaintainingScroll(() => {\n if (this.element.scrollTop <= 80 && this.attrs.state.hasNext()) {\n return this.attrs.state.loadNext();\n }\n if (this.element.scrollTop + this.element.clientHeight >= this.element.scrollHeight && this.attrs.state.hasPrev()) {\n return this.attrs.state.loadPrev();\n }\n return null;\n });\n }\n scrollToBottom() {\n const near = m.route.param('near');\n if (near) {\n const $message = this.element.querySelector(`.MessageStream-item[data-number=\"${near}\"]`);\n if ($message) {\n this.element.scrollTop = $message.getBoundingClientRect().top - this.element.getBoundingClientRect().top;\n $message.classList.add('flash');\n\n // forget near\n window.history.replaceState(null, '', app.route.dialog(this.attrs.dialog));\n } else {\n this.element.scrollTop = this.element.scrollHeight;\n }\n } else {\n this.element.scrollTop = this.element.scrollHeight;\n }\n }\n whileMaintainingScroll(callback) {\n const scrollTop = this.element.scrollTop;\n const scrollHeight = this.element.scrollHeight;\n const closerToBottomThanTop = scrollTop > (scrollHeight - this.element.clientHeight) / 2;\n const result = callback();\n if (result instanceof Promise && !closerToBottomThanTop) {\n result.then(() => {\n requestAnimationFrame(() => {\n this.element.scrollTop = this.element.scrollHeight - scrollHeight + scrollTop;\n });\n });\n }\n }\n markAsRead() {\n const lastVisibleId = Number(this.$('.MessageStream-item[data-id]').filter((_, $el) => {\n if (this.element.scrollHeight <= this.element.clientHeight) {\n return true;\n }\n return this.$().offset().top + this.element.clientHeight > $($el).offset().top;\n }).last().data('id'));\n if (lastVisibleId && app.session.user && lastVisibleId > (this.attrs.dialog.lastReadMessageId() || 0) && !this.markingAsRead) {\n this.markingAsRead = true;\n this.attrs.dialog.save({\n lastReadMessageId: lastVisibleId\n }).finally(() => {\n this.markingAsRead = false;\n if (this.attrs.dialog.unreadCount() === 0) {\n app.session.user.pushAttributes({\n messageCount: (app.session.user.attribute('messageCount') ?? 1) - 1\n });\n }\n m.redraw();\n });\n }\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessageStream', MessageStream);","import PaginatedListState from 'flarum/common/states/PaginatedListState';\nexport default class MessageStreamState extends PaginatedListState {\n constructor(params, page) {\n if (page === void 0) {\n page = 1;\n }\n super(params, page, null);\n }\n get type() {\n return 'dialog-messages';\n }\n getAllItems() {\n return super.getAllItems();\n }\n}\nflarum.reg.add('flarum-messages', 'forum/states/MessageStreamState', MessageStreamState);","import app from 'flarum/forum/app';\nimport Modal from 'flarum/common/components/Modal';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Avatar from 'flarum/common/components/Avatar';\nimport fullTime from 'flarum/common/helpers/fullTime';\nimport username from 'flarum/common/helpers/username';\nimport Link from 'flarum/common/components/Link';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DetailsModal extends Modal {\n className() {\n return 'Modal--small Modal--flat DetailsModal';\n }\n title() {\n return app.translator.trans('flarum-messages.forum.dialog_section.details_modal.title');\n }\n content() {\n let recipients = (this.attrs.dialog.users() || []).filter(Boolean);\n return m(\"div\", {\n className: \"Modal-body DetailsModal-infoGroups\"\n }, m(\"div\", {\n className: \"DetailsModal-recipients DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.recipients')), m(\"div\", {\n className: \"DetailsModal-recipients-list\"\n }, recipients?.map(recipient => {\n return m(\"div\", {\n className: \"DetailsModal-recipient\"\n }, m(Avatar, {\n user: recipient\n }), m(Link, {\n href: app.route('user', {\n username: recipient.slug()\n })\n }, m(\"span\", {\n className: \"DetailsModal-recipient-username\"\n }, username(recipient))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient.badges().toArray())));\n }))), this.infoItems().toArray());\n }\n infoItems() {\n const items = new ItemList();\n items.add('created', m(\"div\", {\n className: \"DetailsModal-createdAt DetailsModal-info\"\n }, m(\"div\", {\n className: \"DetailsModal-info-title\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.details_modal.created_at')), m(\"div\", {\n className: \"DetailsModal-info-content\"\n }, fullTime(this.attrs.dialog.createdAt()))));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DetailsModal', DetailsModal);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport Component from 'flarum/common/Component';\nimport MessageStream from './MessageStream';\nimport username from 'flarum/common/helpers/username';\nimport MessageStreamState from '../states/MessageStreamState';\nimport Avatar from 'flarum/common/components/Avatar';\nimport Link from 'flarum/common/components/Link';\nimport app from 'flarum/forum/app';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Button from 'flarum/common/components/Button';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport DetailsModal from './DetailsModal';\nimport listItems from 'flarum/common/helpers/listItems';\nexport default class DialogSection extends Component {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"loading\", false);\n _defineProperty(this, \"messages\", void 0);\n }\n oninit(vnode) {\n super.oninit(vnode);\n this.messages = new MessageStreamState(this.requestParams());\n this.messages.refresh();\n }\n requestParams(forgetNear) {\n if (forgetNear === void 0) {\n forgetNear = false;\n }\n const params = {\n filter: {\n dialog: this.attrs.dialog.id()\n },\n sort: '-number'\n };\n const near = m.route.param('near');\n if (near && !forgetNear) {\n params.page = params.page || {};\n params.page.near = parseInt(near);\n }\n return params;\n }\n view() {\n const recipient = this.attrs.dialog.recipient();\n return m(\"div\", {\n className: \"DialogSection\"\n }, m(\"div\", {\n className: \"DialogSection-header\"\n }, m(Avatar, {\n user: recipient\n }), m(\"div\", {\n className: \"DialogSection-header-info\"\n }, m(\"h2\", {\n className: \"DialogSection-header-info-title\"\n }, recipient && m(Link, {\n href: app.route.user(recipient)\n }, username(recipient)) || username(recipient), recipient && recipient.canSendAnyMessage() ? null : m(\"span\", {\n className: \"DialogSection-header-info-helperText\"\n }, app.translator.trans('flarum-messages.forum.dialog_section.cannot_reply_text'))), m(\"div\", {\n className: \"badges\"\n }, listItems(recipient?.badges().toArray() || []))), m(\"div\", {\n className: \"DialogSection-header-actions\"\n }, this.actionItems().toArray())), m(MessageStream, {\n dialog: this.attrs.dialog,\n state: this.messages\n }));\n }\n actionItems() {\n const items = new ItemList();\n items.add('back', m(Button, {\n className: \"Button Button--icon DialogSection-back\",\n icon: \"fas fa-arrow-left\",\n onclick: this.attrs.onback\n }, app.translator.trans('flarum-messages.forum.dialog_section.back_label')));\n items.add('details', m(Dropdown, {\n icon: \"fas fa-ellipsis-h\",\n className: \"DialogSection-controls\",\n buttonClassName: \"Button Button--icon\",\n accessibleToggleLabel: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label'),\n label: app.translator.trans('flarum-messages.forum.dialog_section.controls_toggle_label')\n }, this.controlItems().toArray()));\n return items;\n }\n controlItems() {\n const items = new ItemList();\n items.add('details', m(Button, {\n icon: \"fas fa-info-circle\",\n onclick: () => app.modal.show(DetailsModal, {\n dialog: this.attrs.dialog\n })\n }, app.translator.trans('flarum-messages.forum.dialog_section.controls.details_button')));\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/DialogSection', DialogSection);","import _defineProperty from \"@babel/runtime/helpers/esm/defineProperty\";\nimport app from 'flarum/forum/app';\nimport Page from 'flarum/common/components/Page';\nimport PageStructure from 'flarum/forum/components/PageStructure';\nimport Icon from 'flarum/common/components/Icon';\nimport DialogList from './DialogList';\nimport LoadingIndicator from 'flarum/common/components/LoadingIndicator';\nimport Stream from 'flarum/common/utils/Stream';\nimport InfoTile from 'flarum/common/components/InfoTile';\nimport MessagesSidebar from './MessagesSidebar';\nimport DialogSection from './DialogSection';\nimport listItems from 'flarum/common/helpers/listItems';\nimport ItemList from 'flarum/common/utils/ItemList';\nimport Dropdown from 'flarum/common/components/Dropdown';\nimport Button from 'flarum/common/components/Button';\nimport classList from 'flarum/common/utils/classList';\nexport default class MessagesPage extends Page {\n constructor() {\n super(...arguments);\n _defineProperty(this, \"selectedDialog\", Stream(null));\n _defineProperty(this, \"currentDialogId\", null);\n }\n oninit(vnode) {\n super.oninit(vnode);\n if (!app.session.user) {\n m.route.set(app.route('index'));\n return;\n }\n app.current.set('noTagsList', true);\n if (!app.dialogs.hasItems()) {\n app.dialogs.refresh().then(async () => {\n if (app.dialogs.hasItems()) {\n await this.initDialog();\n }\n });\n } else {\n this.initDialog();\n }\n }\n dialogRequestParams() {\n return {\n include: 'users.groups'\n };\n }\n async initDialog() {\n const dialogId = m.route.param('id');\n this.currentDialogId = dialogId;\n const title = app.translator.trans('flarum-messages.forum.messages_page.title', {}, true);\n let dialog;\n if (dialogId) {\n dialog = app.store.getById('dialogs', dialogId) || (await app.store.find('dialogs', dialogId, this.dialogRequestParams()));\n } else {\n dialog = app.dialogs.getAllItems()[0];\n }\n this.selectedDialog(dialog);\n if (dialog) {\n app.setTitle(dialog.title());\n app.history.push('dialog', dialog.title());\n } else {\n app.setTitle(title);\n app.history.push('messages', title);\n }\n m.redraw();\n }\n onupdate(vnode) {\n super.onupdate(vnode);\n\n // Scroll the dialog list to the active dialog item if present and not visible.\n const dialogElement = this.element.querySelector('.DialogListItem.active');\n const container = this.element.querySelector('.DialogList');\n if (dialogElement && $(container).offset().top + container.clientHeight <= $(dialogElement).offset().top) {\n dialogElement.scrollIntoView();\n }\n }\n view() {\n return m(PageStructure, {\n className: \"MessagesPage Page--vertical\",\n loading: false,\n hero: this.hero.bind(this),\n sidebar: () => m(MessagesSidebar, null)\n }, app.dialogs.isLoading() ? m(LoadingIndicator, null) : !app.dialogs.hasItems() ? m(InfoTile, {\n icon: \"far fa-envelope-open\"\n }, app.translator.trans('flarum-messages.forum.messages_page.empty_text')) : m(\"div\", {\n className: classList('MessagesPage-content', {\n 'MessagesPage-content--onDialog': this.currentDialogId\n })\n }, this.contentItems().toArray()));\n }\n hero() {\n return m(\"header\", {\n className: \"Hero MessagesPageHero\"\n }, m(\"div\", {\n className: \"container\"\n }, m(\"div\", {\n className: \"containerNarrow\"\n }, m(\"h1\", {\n className: \"Hero-title\"\n }, m(Icon, {\n name: \"fas fa-envelope\"\n }), \" \", app.translator.trans('flarum-messages.forum.messages_page.hero.title')), m(\"div\", {\n className: \"Hero-subtitle\"\n }, app.translator.trans('flarum-messages.forum.messages_page.hero.subtitle')))));\n }\n contentItems() {\n const items = new ItemList();\n items.add('sidebar', m(\"div\", {\n className: \"MessagesPage-sidebar\",\n key: \"sidebar\"\n }, m(\"div\", {\n className: \"IndexPage-toolbar\",\n key: \"toolbar\"\n }, m(\"ul\", {\n className: \"IndexPage-toolbar-view\"\n }, listItems(this.viewItems().toArray())), m(\"ul\", {\n className: \"IndexPage-toolbar-action\"\n }, listItems(this.actionItems().toArray()))), m(DialogList, {\n key: \"list\",\n state: app.dialogs,\n activeDialog: this.selectedDialog()\n })), 100);\n items.add('dialog', this.selectedDialog() ? m(DialogSection, {\n key: \"dialog\",\n dialog: this.selectedDialog(),\n onback: () => {\n this.currentDialogId = null;\n }\n }) : m(LoadingIndicator, {\n key: \"loading\",\n display: \"block\"\n }), 80);\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is concerned with how\n * the results are displayed. By default this is just a select box to change\n * the way discussions are sorted.\n */\n viewItems() {\n const items = new ItemList();\n const sortMap = app.dialogs.sortMap();\n const sortOptions = Object.keys(sortMap).reduce((acc, sortId) => {\n const sort = sortMap[sortId];\n acc[sortId] = typeof sort !== 'string' ? sort.label : app.translator.trans(`flarum-messages.forum.index_sort.${sortId}_button`);\n return acc;\n }, {});\n items.add('sort', m(Dropdown, {\n buttonClassName: \"Button\",\n label: sortOptions[app.dialogs.getParams()?.sort || 0] || Object.values(sortOptions)[0],\n accessibleToggleLabel: app.translator.trans('core.forum.index_sort.toggle_dropdown_accessible_label')\n }, Object.keys(sortOptions).map(value => {\n const label = sortOptions[value];\n const active = (app.dialogs.getParams().sort || Object.keys(sortMap)[0]) === value;\n return m(Button, {\n icon: active ? 'fas fa-check' : true,\n onclick: () => app.dialogs.changeSort(value),\n active: active\n }, label);\n })));\n return items;\n }\n\n /**\n * Build an item list for the part of the toolbar which is about taking action\n * on the results. By default, this is just a \"mark all as read\" button.\n */\n actionItems() {\n const items = new ItemList();\n items.add('refresh', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.refresh_tooltip'),\n icon: \"fas fa-sync\",\n className: \"Button Button--icon\",\n onclick: () => {\n app.dialogs.refresh();\n }\n }));\n if (app.session.user) {\n items.add('markAllAsRead', m(Button, {\n title: app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n \"aria-label\": app.translator.trans('flarum-messages.forum.messages_page.mark_all_as_read_tooltip'),\n icon: \"fas fa-check\",\n className: \"Button Button--icon\",\n onclick: () => app.dialogs.markAllAsRead()\n }));\n }\n return items;\n }\n}\nflarum.reg.add('flarum-messages', 'forum/components/MessagesPage', MessagesPage);"],"names":["DialogListItem","view","vnode","dialog","this","attrs","recipient","lastMessage","m","className","unreadCount","active","href","user","lastMessageAt","actions","actionItems","toArray","contentPlain","slice","items","add","icon","trans","onclick","e","preventDefault","stopPropagation","save","lastReadMessageId","data","relationships","id","finally","pushAttributes","messageCount","attribute","redraw","flarum","reg","DialogList","oninit","super","oncreate","onupdate","state","getAllItems","map","activeDialog","itemActions","hasNext","hideMore","loadNext","bind","MessagesSidebar","initAttrs","remove","itemClassName","newMessageAction","disabled","canSendAnyMessage","asyncModuleImport","then","load","onsubmit","refresh","show","addChunkModule","MessageControls","controls","message","context","Object","entries","sections","forEach","_ref","section","method","call","length","item","itemName","userControls","moderation","moderationControls","destructive","destructiveControls","canDelete","deleteAction","confirm","delete","Message","freshness","createdByStarter","onbeforeupdate","elementAttrs","renderFailed","revealContent","editing","header","content","concat","headerItems","cardVisible","isEditing","isHidden","contentHtml","classes","existing","footerItems","sideItems","avatar","post","permalink","number","MessageStream","constructor","arguments","Promise","all","ReplyPlaceholder","LoadingPost","replyPlaceholderComponent","default","loadingPostComponent","scrollListener","onscroll","element","setTimeout","start","addEventListener","markAsRead","initialToBottomScroll","isLoading","scrollToBottom","checkedRead","onremove","stop","messages","Array","from","Map","msg","values","sort","a","b","firstMessage","push","key","whileMaintainingScroll","type","index","messageItem","loadPrev","discussion","replyingTo","composingReply","composingMessageTo","timeGap","lastTime","createdAt","class","dt","getTime","period","dayjs","fromNow","scrollTop","clientHeight","scrollHeight","hasPrev","near","route","param","$message","querySelector","getBoundingClientRect","top","classList","window","history","replaceState","callback","closerToBottomThanTop","result","requestAnimationFrame","lastVisibleId","Number","$","filter","_","$el","offset","last","markingAsRead","MessageStreamState","params","page","DetailsModal","title","recipients","users","Boolean","username","slug","badges","infoItems","DialogSection","requestParams","forgetNear","parseInt","onback","buttonClassName","accessibleToggleLabel","label","controlItems","MessagesPage","set","hasItems","initDialog","async","dialogRequestParams","include","dialogId","currentDialogId","getById","find","selectedDialog","dialogElement","container","scrollIntoView","loading","hero","sidebar","contentItems","name","viewItems","display","sortMap","sortOptions","keys","reduce","acc","sortId","getParams","value","changeSort","markAllAsRead"],"sourceRoot":""} \ No newline at end of file