airdcpp-webui 2.12.1-beta.4 → 2.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/js/{236.c033545917799459b3a4.chunk.js → 236.6b4fd58c10a23138b7d8.chunk.js} +2 -2
  3. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.gz +0 -0
  4. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.map +1 -0
  5. package/dist/js/{hubs.51fd0b03ed33f0a82f58.chunk.js → hubs.c21b941c411425d4852f.chunk.js} +2 -2
  6. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.gz +0 -0
  7. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.map +1 -0
  8. package/dist/js/main.7a746a54efc4bf96cd20.entry.js +3 -0
  9. package/dist/js/{main.0f999b49d5abcf2b50b2.entry.js.LICENSE.txt → main.7a746a54efc4bf96cd20.entry.js.LICENSE.txt} +3 -3
  10. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.gz +0 -0
  11. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.map +1 -0
  12. package/dist/js/{messages.3cd02d9105ea80abf5df.chunk.js → messages.6ed02d7d7ec7e06a93f2.chunk.js} +2 -2
  13. package/dist/js/messages.6ed02d7d7ec7e06a93f2.chunk.js.gz +0 -0
  14. package/dist/js/{messages.3cd02d9105ea80abf5df.chunk.js.map → messages.6ed02d7d7ec7e06a93f2.chunk.js.map} +1 -1
  15. package/dist/js/settings.a509b3c48b03452b6783.chunk.js +2 -0
  16. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.gz +0 -0
  17. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.map +1 -0
  18. package/dist/sw.js +1 -1
  19. package/dist/sw.js.gz +0 -0
  20. package/package.json +1 -1
  21. package/dist/js/236.c033545917799459b3a4.chunk.js.gz +0 -0
  22. package/dist/js/236.c033545917799459b3a4.chunk.js.map +0 -1
  23. package/dist/js/hubs.51fd0b03ed33f0a82f58.chunk.js.gz +0 -0
  24. package/dist/js/hubs.51fd0b03ed33f0a82f58.chunk.js.map +0 -1
  25. package/dist/js/main.0f999b49d5abcf2b50b2.entry.js +0 -3
  26. package/dist/js/main.0f999b49d5abcf2b50b2.entry.js.gz +0 -0
  27. package/dist/js/main.0f999b49d5abcf2b50b2.entry.js.map +0 -1
  28. package/dist/js/messages.3cd02d9105ea80abf5df.chunk.js.gz +0 -0
  29. package/dist/js/settings.10689d2c4c40b7e4b769.chunk.js +0 -2
  30. package/dist/js/settings.10689d2c4c40b7e4b769.chunk.js.gz +0 -0
  31. package/dist/js/settings.10689d2c4c40b7e4b769.chunk.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[959],{32194:(e,s,t)=>{t.d(s,{A:()=>a});var n=t(71354),o=t.n(n),i=t(76314),r=t.n(i)()(o());r.push([e.id,".hub-action-prompt {\n flex-direction: column;\n align-items: flex-start !important;\n}\n\n.hub-action-prompt .header {\n margin: 0 0 1rem !important;\n}\n\n.hub-action-prompt .password.prompt .help {\n margin-top: 10px;\n}\n\n.hub-action-prompt .redirect.prompt {\n max-width: 100%;\n overflow: hidden;\n}\n\n.hub.session .virtual-table,\n.hub.session .offline-message,\n.hub.session .loader-wrapper {\n flex: 1;\n margin-top: 5px;\n}\n\n.hub.session .cell-wrapper.tag,\n.hub.session .cell-wrapper.nick,\n.hub.session .cell-wrapper.description,\n.hub.session .cell-wrapper.share_size {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.hub.session .cell-wrapper.nick.op {\n color: steelblue;\n}\n.hub.session .session-footer .actions-wrapper > a,\n.hub.session .session-footer .actions-wrapper > div {\n /* Don't cut the shadow */\n padding-left: 1px;\n padding-bottom: 1px;\n}\n\n.hub.session .session-footer .userlist-button label {\n color: grey;\n font-size: small;\n}\n\n.hub.session .session-footer .actions-wrapper .dropdown {\n margin-left: 10px;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Hubs/style.css"],names:[],mappings:"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB",sourcesContent:[".hub-action-prompt {\n flex-direction: column;\n align-items: flex-start !important;\n}\n\n.hub-action-prompt .header {\n margin: 0 0 1rem !important;\n}\n\n.hub-action-prompt .password.prompt .help {\n margin-top: 10px;\n}\n\n.hub-action-prompt .redirect.prompt {\n max-width: 100%;\n overflow: hidden;\n}\n\n.hub.session .virtual-table,\n.hub.session .offline-message,\n.hub.session .loader-wrapper {\n flex: 1;\n margin-top: 5px;\n}\n\n.hub.session .cell-wrapper.tag,\n.hub.session .cell-wrapper.nick,\n.hub.session .cell-wrapper.description,\n.hub.session .cell-wrapper.share_size {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.hub.session .cell-wrapper.nick.op {\n color: steelblue;\n}\n.hub.session .session-footer .actions-wrapper > a,\n.hub.session .session-footer .actions-wrapper > div {\n /* Don't cut the shadow */\n padding-left: 1px;\n padding-bottom: 1px;\n}\n\n.hub.session .session-footer .userlist-button label {\n color: grey;\n font-size: small;\n}\n\n.hub.session .session-footer .actions-wrapper .dropdown {\n margin-left: 10px;\n}\n"],sourceRoot:""}]);const a=r},48916:(e,s,t)=>{t.d(s,{A:()=>r});var n=t(74848),o=(t(96540),t(83994)),i=t(77856);const r=e=>{var{hub:s}=e,t=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["hub"]);return(0,n.jsx)(o.A,Object.assign({},t,{icon:(0,i.D8)(s.connect_state.id)+" sitemap"}))}},55663:(e,s,t)=>{t.r(s),t.d(s,{default:()=>$e});var n=t(74848),o=t(96540),i=t(62048),r=t(91950),a=t(85258),c=t(90680),l=t(77856),p=t(22005),h=t.n(p),d=t(20311),u=t.n(d),A=t(44511),m=t(14038),S=t(97744),b=t(19618);const g=h().createStore({scroll:(0,b.z)(),onSocketConnected(e){u()(!this.hasMessages(),"No existing hub messages should exist on socket connect"),u()(!this.hasInitializedSessions(),"No initialized hub sessions should exist on socket connect"),e(A.A.MODULE_URL,A.A.HUB_MESSAGE,this._onChatMessage),e(A.A.MODULE_URL,A.A.HUB_STATUS_MESSAGE,this._onStatusMessage),e(A.A.MODULE_URL,A.A.SESSION_UPDATED,this._onSessionUpdated),e(A.A.MODULE_URL,A.A.SESSION_REMOVED,this._onSessionRemoved)}}),w=(0,m.A)(g,c.A,S.A.HUBS_VIEW);var x=t(8098),E=t(73616),f=t(99104),_=t(5556),y=t.n(_),j=t(52267);const U=h().createStore({_viewName:"hub_user_view",_apiUrl:A.A.SESSIONS_URL,_sessionStore:a.A,mixins:[(0,j.A)("nick")]});var C=t(68465),N=t(22373),v=t(44247),I=t(71352),B=t(32728),O=t(99347),T=t(86038),D=t(67749),R=t(4425),L=t(39115);const H=({cellData:e,rowDataGetter:s,session:t})=>(0,n.jsx)(I.F$,{text:e,user:s(),userIcon:!0,remoteMenuId:L.Ay.HUB_USER,entity:t});class k extends o.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>e.flags.join(" "),this.emptyRowsNodeGetter=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;if(t===T.gU.DISCONNECTED||t===T.gU.REDIRECT)return(0,n.jsx)("div",{className:"offline-message",children:(0,n.jsx)(B.A,{className:"offline",title:s.translate("Not connected to the hub"),icon:R.A.OFFLINE})});const o=s.translate(t!==T.gU.CONNECTED?"Connecting":"Loading userlist");return(0,n.jsx)("div",{className:"loader-wrapper",children:(0,n.jsx)(O.A,{text:o})})}}render(){const{session:e}=this.props;return(0,n.jsxs)(N.A,{store:U,entityId:e.id,sessionStore:a.A,rowClassNameGetter:this.rowClassNameGetter,emptyRowsNodeGetter:this.emptyRowsNodeGetter,moduleId:D.KV.HUBS,children:[(0,n.jsx)(C.VP,{name:"Nick",width:170,columnKey:"nick",flexGrow:8,cell:(0,n.jsx)(H,{session:e})}),(0,n.jsx)(C.VP,{name:"Share size",width:85,columnKey:"share_size",cell:(0,n.jsx)(v.us,{}),flexGrow:1}),(0,n.jsx)(C.VP,{name:"Description",width:100,columnKey:"description",flexGrow:1}),(0,n.jsx)(C.VP,{name:"Tag",width:150,columnKey:"tag",flexGrow:2}),(0,n.jsx)(C.VP,{name:"Upload speed",width:80,columnKey:"upload_speed",cell:(0,n.jsx)(v.Jy,{}),flexGrow:2}),(0,n.jsx)(C.VP,{name:"Download speed",width:80,columnKey:"download_speed",cell:(0,n.jsx)(v.Jy,{}),flexGrow:2}),(0,n.jsx)(C.VP,{name:"IP (v4)",width:120,columnKey:"ip4",flexGrow:3,cell:(0,n.jsx)(v.In,{})}),(0,n.jsx)(C.VP,{name:"IP (v6)",width:120,columnKey:"ip6",flexGrow:3,cell:(0,n.jsx)(v.In,{})}),(0,n.jsx)(C.VP,{name:"Files",width:70,columnKey:"file_count",flexGrow:3})]})}}k.propTypes={session:y().object};const P=k;var G=t(32811),V=t(98573),K=t(38453),$=t(85208),M=t(98147),z=t(18220);const F={toggleChatNotify:{id:"toggleChatNotify",displayName:"Use chat notification",access:T.US.HUBS_EDIT,handler:({itemData:e})=>G.A.patch(`${A.A.SESSIONS_URL}/${e.id}`,{use_main_chat_notify:!e.settings.use_main_chat_notify}),checked:e=>e.settings.use_main_chat_notify},toggleShowJoins:{id:"toggleShowJoins",displayName:"Show joins/parts",access:T.US.HUBS_EDIT,handler:({itemData:e})=>G.A.patch(`${A.A.SESSIONS_URL}/${e.id}`,{show_joins:!e.settings.show_joins}),checked:e=>e.settings.show_joins}},q={moduleData:{moduleId:D.KV.HUBS},actions:F},J=(0,M.k)((e=>{const[s,t]=(0,o.useState)({share_size:0,user_count:0});(0,o.useEffect)((()=>{G.A.get(`${A.A.SESSIONS_URL}/${e.session.id}/counts`).then(t).catch((e=>console.error("Failed to fetch hub counts",e.message)));const s=A.A.SESSIONS_URL;return e.addSocketListener(s,A.A.SESSION_COUNTS_UPDATED,(e=>t(e)),e.session.id),()=>e.removeSocketListeners(e)}),[e.session]);const i=(0,z.y)(),{userlistToggle:r,session:a,sessionT:c}=e,{user_count:l,share_size:p}=s,h=(0,V.Xq)(l>0?p/l:0,c.plainT);return(0,n.jsxs)(K.q,{children:[(0,n.jsx)(K.J,{text:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)($.A,{encryption:a.encryption}),c.t("xUsers",{defaultValue:"{{count}} user",defaultValue_plural:"{{count}} users",count:l,replace:{count:l}})]})}),!(0,x.mY)(i)&&(0,n.jsx)(K.J,{text:c.t("sharePerUser",{defaultValue:"{{total}} ({{average}}/user)",replace:{total:(0,V.Xq)(p,c.plainT),average:h}})}),(0,n.jsx)("div",{className:"actions-wrapper",children:(0,n.jsxs)("div",{className:"actions",children:[r,(0,n.jsx)(I.Wy,{className:"top left pointing",actions:q,header:c.translate("Notification settings"),itemData:a,triggerIcon:a.settings.use_main_chat_notify||a.settings.show_joins?"yellow bell":"bell"})]})})]})}),(({session:e})=>!!a.A.getSession(e.id)));var W=t(21479),X=t(96529),Y=t(41860),Z=t(83994),Q=t(32389),ee=t(8418);(0,ee.Bc)(A.A.SESSIONS_URL),(0,ee.$2)(A.A.SESSIONS_URL),(0,ee.q_)(A.A.SESSIONS_URL),(0,ee.cr)(A.A.SESSIONS_URL);var se=t(36076);const te=({icon:e,title:s,content:t})=>Y.A.hasAccess(T.US.HUBS_EDIT)?(0,n.jsxs)("div",{className:"ui icon message hub-action-prompt",children:[(0,n.jsxs)("h3",{className:"ui header",children:[(0,n.jsx)(Z.A,{icon:e}),(0,n.jsx)("div",{className:"content",children:s})]}),t]}):null,ne=({hub:e,sessionT:s})=>(0,n.jsxs)("div",{className:"password prompt",children:[(0,n.jsx)(W.A,{placeholder:s.translate("Password"),caption:s.translate("Submit"),icon:R.A.CONNECT,handleAction:t=>(0,se.bd)((()=>((e,s)=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/password`,{password:s}))(e,t)),s.plainT)}),(0,n.jsx)("div",{className:"help",children:(0,n.jsx)(Q.x6,{i18nKey:s.toI18nKey("passwordPromptHelp"),children:"This usually means that there's a registered account associated with your nick. If you don't remember having a registered account in this hub, there may be someone else using the same nick."})})]}),oe=({hub:e,sessionT:s})=>(0,n.jsx)(X.A,{className:"redirect prompt",icon:R.A.CONNECT,onClick:t=>(0,se.bd)((()=>(e=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/redirect`))(e)),s.plainT),caption:s.t("acceptRedirect",{defaultValue:"Accept redirect to {{url}}",replace:{url:e.connect_state.data.hub_url}})});var ie=t(85072),re=t.n(ie),ae=t(97825),ce=t.n(ae),le=t(77659),pe=t.n(le),he=t(55056),de=t.n(he),ue=t(10540),Ae=t.n(ue),me=t(41113),Se=t.n(me),be=t(32194),ge={};ge.styleTagTransform=Se(),ge.setAttributes=de(),ge.insert=pe().bind(null,"head"),ge.domAPI=ce(),ge.insertStyleElement=Ae(),re()(be.A,ge),be.A&&be.A.locals&&be.A.locals;var we=t(59548);const xe=e=>`view_userlist_${e.session.id}`,Ee=e=>(0,x.wO)(xe(e),!1);class fe extends o.Component{constructor(){super(...arguments),this.state={showList:Ee(this.props)},this.toggleListState=()=>{this.setState({showList:!this.state.showList})},this.getMessage=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;return t===T.gU.PASSWORD?(0,n.jsx)(te,{title:s.translate("Password required"),icon:R.A.LOCK,content:(0,n.jsx)(ne,{hub:e,sessionT:s})}):t===T.gU.REDIRECT?(0,n.jsx)(te,{title:s.translate("Redirect requested"),icon:R.A.REDIRECT,content:(0,n.jsx)(oe,{hub:e,sessionT:s})}):null},this.onClickUsers=()=>{this.toggleListState(),(0,x.xu)(xe(this.props),this.state.showList)},this.handleFileUpload=e=>{const{hub_url:s}=this.props.session;return(0,we.eo)(e,s,void 0)}}componentDidUpdate(e){e.session.id!==this.props.session.id&&this.state.showList!==Ee(this.props)&&this.toggleListState()}render(){const{session:e,sessionApi:s,sessionT:t,uiActions:o}=this.props,{showList:i}=this.state,r=(0,n.jsx)(E.A,{className:"userlist-button",type:"toggle",caption:t.translate("User list"),onChange:this.onClickUsers,checked:i});return(0,n.jsxs)("div",{className:"hub chat session",children:[this.getMessage(),i?(0,n.jsx)(P,{session:e,sessionT:t}):(0,n.jsx)(f.A,{messageStore:w,chatApi:c.A,sessionApi:s,chatActions:o,chatAccess:T.US.HUBS_SEND,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:L.Ay.HUB_MESSAGE_HIGHLIGHT,hubUrl:e.hub_url}),(0,n.jsx)(J,{userlistToggle:r,session:e,sessionT:t})]})}}fe.displayName="HubSession";const _e=fe;var ye=t(68614),je=t(62705),Ue=t(84976),Ce=t(93226);class Ne extends o.Component{constructor(){super(...arguments),this.handleConnect=e=>{const{location:s,navigate:t}=this.props;c.A.createSession(e,{sessionStore:a.A,location:s,navigate:t})},this.hasSession=e=>a.A.getSessionByUrl(e.hub_url),this.recentHubRender=e=>(0,n.jsx)("a",{onClick:s=>this.handleConnect(e.hub_url),children:e.name})}render(){const{sessionT:e}=this.props;return(0,n.jsxs)("div",{className:"hub session new",children:[(0,n.jsx)(ye.A,{submitHandler:this.handleConnect,button:(0,n.jsx)(X.A,{icon:R.A.CONNECT,caption:e.translate("Connect")})}),(0,n.jsx)(B.A,{description:(0,n.jsx)(Q.x6,{i18nKey:e.toI18nKey("favoriteHubsHint"),defaults:"Tip: visit the <url>Favorite hubs</url> page to connect using custom settings",components:{url:(0,n.jsx)(Ue.N_,{to:"/favorite-hubs"})}})}),(0,n.jsx)(je.A,{entryType:Ce.iM.HUB,hasSession:this.hasSession,entryTitleRenderer:this.recentHubRender,entryIcon:"sitemap"})]})}}const ve=Ne;var Ie=t(48916),Be=t(78046),Oe=t(69858),Te=t(4112),De=t(48844);const Re={id:"reconnect",displayName:"Reconnect",access:T.US.HUBS_EDIT,icon:R.A.REFRESH_COLORED,handler:({itemData:e})=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/reconnect`)},Le={id:"favorite",displayName:"Add to favorites",access:T.US.HUBS_EDIT,icon:R.A.FAVORITE,filter:({itemData:e})=>!e.favorite_hub,handler:({itemData:e})=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/favorite`),notifications:{onSuccess:"The hub {{item.identity.name}} was added in favorites"}},He=(0,Oe.G)(A.A.SESSIONS_URL,T.US.HUBS_EDIT),ke=(0,Te.R)(A.A.SESSIONS_URL,T.US.HUBS_EDIT),Pe={reconnect:Re,favorite:Le,clearChat:He,divider:De.o,remove:ke},Ge={moduleData:{moduleId:D.KV.HUBS},actions:Pe};const Ve={itemNameGetter:e=>e.identity.name,itemStatusGetter:e=>(0,l.D8)(e.connect_state.id),itemHeaderDescriptionGetter:e=>(0,n.jsx)(i.PW,{text:e.identity.description,emojify:!0}),itemHeaderIconGetter:e=>(0,n.jsx)(Ie.A,{hub:e})},Ke=e=>{if(e.id)return parseInt(e.id)},$e=(0,Be.Z)((e=>{const{params:s,sessionT:t}=e,o=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["params","sessionT"]);return(0,n.jsx)(r.A,Object.assign({activeId:Ke(s),baseUrl:"hubs",newCaption:t.t("new","Connect"),newDescription:t.t("newDesc","Connect to a new hub"),newIcon:R.A.HUBS_PLAIN,editAccess:T.US.HUBS_EDIT,uiActions:Ge,actionIds:["reconnect","clear","favorite"],sessionApi:c.A,sessionItemLayout:_e,newLayout:ve,sessionT:t,unreadInfoStore:a.A},Ve,o))}),a.A,D.KV.HUBS)}}]);
2
- //# sourceMappingURL=hubs.51fd0b03ed33f0a82f58.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[959],{32194:(e,s,t)=>{t.d(s,{A:()=>r});var n=t(71354),o=t.n(n),i=t(76314),a=t.n(i)()(o());a.push([e.id,".hub-action-prompt {\n flex-direction: column;\n align-items: flex-start !important;\n}\n\n.hub-action-prompt .header {\n margin: 0 0 1rem !important;\n}\n\n.hub-action-prompt .password.prompt .help {\n margin-top: 10px;\n}\n\n.hub-action-prompt .redirect.prompt {\n max-width: 100%;\n overflow: hidden;\n}\n\n.hub.session .virtual-table,\n.hub.session .offline-message,\n.hub.session .loader-wrapper {\n flex: 1;\n margin-top: 5px;\n}\n\n.hub.session .cell-wrapper.tag,\n.hub.session .cell-wrapper.nick,\n.hub.session .cell-wrapper.description,\n.hub.session .cell-wrapper.share_size {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.hub.session .cell-wrapper.nick.op {\n color: steelblue;\n}\n.hub.session .session-footer .actions-wrapper > a,\n.hub.session .session-footer .actions-wrapper > div {\n /* Don't cut the shadow */\n padding-left: 1px;\n padding-bottom: 1px;\n}\n\n.hub.session .session-footer .userlist-button label {\n color: grey;\n font-size: small;\n}\n\n.hub.session .session-footer .actions-wrapper .dropdown {\n margin-left: 10px;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Hubs/style.css"],names:[],mappings:"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB",sourcesContent:[".hub-action-prompt {\n flex-direction: column;\n align-items: flex-start !important;\n}\n\n.hub-action-prompt .header {\n margin: 0 0 1rem !important;\n}\n\n.hub-action-prompt .password.prompt .help {\n margin-top: 10px;\n}\n\n.hub-action-prompt .redirect.prompt {\n max-width: 100%;\n overflow: hidden;\n}\n\n.hub.session .virtual-table,\n.hub.session .offline-message,\n.hub.session .loader-wrapper {\n flex: 1;\n margin-top: 5px;\n}\n\n.hub.session .cell-wrapper.tag,\n.hub.session .cell-wrapper.nick,\n.hub.session .cell-wrapper.description,\n.hub.session .cell-wrapper.share_size {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.hub.session .cell-wrapper.nick.op {\n color: steelblue;\n}\n.hub.session .session-footer .actions-wrapper > a,\n.hub.session .session-footer .actions-wrapper > div {\n /* Don't cut the shadow */\n padding-left: 1px;\n padding-bottom: 1px;\n}\n\n.hub.session .session-footer .userlist-button label {\n color: grey;\n font-size: small;\n}\n\n.hub.session .session-footer .actions-wrapper .dropdown {\n margin-left: 10px;\n}\n"],sourceRoot:""}]);const r=a},48916:(e,s,t)=>{t.d(s,{A:()=>a});var n=t(74848),o=(t(96540),t(83994)),i=t(77856);const a=e=>{var{hub:s}=e,t=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["hub"]);return(0,n.jsx)(o.A,Object.assign({},t,{icon:(0,i.D8)(s.connect_state.id)+" sitemap"}))}},55663:(e,s,t)=>{t.r(s),t.d(s,{default:()=>Me});var n=t(74848),o=t(96540),i=t(62048),a=t(91950),r=t(85258),c=t(90680),l=t(77856),p=t(22005),h=t.n(p),d=t(20311),u=t.n(d),A=t(44511),m=t(14038),S=t(97744),b=t(19618);const g=h().createStore({scroll:(0,b.z)(),onSocketConnected(e){u()(!this.hasMessages(),"No existing hub messages should exist on socket connect"),u()(!this.hasInitializedSessions(),"No initialized hub sessions should exist on socket connect"),e(A.A.MODULE_URL,A.A.HUB_MESSAGE,this._onChatMessage),e(A.A.MODULE_URL,A.A.HUB_STATUS_MESSAGE,this._onStatusMessage),e(A.A.MODULE_URL,A.A.SESSION_UPDATED,this._onSessionUpdated),e(A.A.MODULE_URL,A.A.SESSION_REMOVED,this._onSessionRemoved)}}),w=(0,m.A)(g,c.A,S.A.HUBS_VIEW);var x=t(8098),E=t(73616),f=t(99104),_=t(5556),y=t.n(_),j=t(52267);const U=h().createStore({_viewName:"hub_user_view",_apiUrl:A.A.SESSIONS_URL,_sessionStore:r.A,mixins:[(0,j.A)("nick")]});var C=t(68465),N=t(22373),v=t(44247),I=t(71352),B=t(32728),O=t(99347),T=t(86038),D=t(67749),R=t(4425),L=t(39115);const H=({cellData:e,rowDataGetter:s,session:t})=>(0,n.jsx)(I.F$,{text:e,user:s(),userIcon:!0,remoteMenuId:L.Ay.HUB_USER,entity:t});class k extends o.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>e.flags.join(" "),this.emptyRowsNodeGetter=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;if(t===T.gU.DISCONNECTED||t===T.gU.REDIRECT)return(0,n.jsx)("div",{className:"offline-message",children:(0,n.jsx)(B.A,{className:"offline",title:s.translate("Not connected to the hub"),icon:R.A.OFFLINE})});const o=s.translate(t!==T.gU.CONNECTED?"Connecting":"Loading userlist");return(0,n.jsx)("div",{className:"loader-wrapper",children:(0,n.jsx)(O.A,{text:o})})}}render(){const{session:e}=this.props;return(0,n.jsxs)(N.A,{store:U,entityId:e.id,sessionStore:r.A,rowClassNameGetter:this.rowClassNameGetter,emptyRowsNodeGetter:this.emptyRowsNodeGetter,moduleId:D.KV.HUBS,children:[(0,n.jsx)(C.VP,{name:"Nick",width:170,columnKey:"nick",flexGrow:8,cell:(0,n.jsx)(H,{session:e})}),(0,n.jsx)(C.VP,{name:"Share size",width:85,columnKey:"share_size",cell:(0,n.jsx)(v.us,{}),flexGrow:1}),(0,n.jsx)(C.VP,{name:"Description",width:100,columnKey:"description",flexGrow:1}),(0,n.jsx)(C.VP,{name:"Tag",width:150,columnKey:"tag",flexGrow:2}),(0,n.jsx)(C.VP,{name:"Upload speed",width:80,columnKey:"upload_speed",cell:(0,n.jsx)(v.Jy,{}),flexGrow:2}),(0,n.jsx)(C.VP,{name:"Download speed",width:80,columnKey:"download_speed",cell:(0,n.jsx)(v.Jy,{}),flexGrow:2}),(0,n.jsx)(C.VP,{name:"IP (v4)",width:120,columnKey:"ip4",flexGrow:3,cell:(0,n.jsx)(v.In,{})}),(0,n.jsx)(C.VP,{name:"IP (v6)",width:120,columnKey:"ip6",flexGrow:3,cell:(0,n.jsx)(v.In,{})}),(0,n.jsx)(C.VP,{name:"Files",width:70,columnKey:"file_count",flexGrow:3})]})}}k.propTypes={session:y().object};const P=k;var G=t(32811),V=t(98573),K=t(38453),$=t(85208),M=t(98147),z=t(18220);const F={toggleChatNotify:{id:"toggleChatNotify",displayName:"Use chat notification",access:T.US.HUBS_EDIT,handler:({itemData:e})=>G.A.patch(`${A.A.SESSIONS_URL}/${e.id}`,{use_main_chat_notify:!e.settings.use_main_chat_notify}),checked:e=>e.settings.use_main_chat_notify},toggleShowJoins:{id:"toggleShowJoins",displayName:"Show joins/parts",access:T.US.HUBS_EDIT,handler:({itemData:e})=>G.A.patch(`${A.A.SESSIONS_URL}/${e.id}`,{show_joins:!e.settings.show_joins}),checked:e=>e.settings.show_joins}},q={moduleData:{moduleId:D.KV.HUBS},actions:F},J=(0,M.k)((e=>{const[s,t]=(0,o.useState)({share_size:0,user_count:0});(0,o.useEffect)((()=>{G.A.get(`${A.A.SESSIONS_URL}/${e.session.id}/counts`).then(t).catch((e=>console.error("Failed to fetch hub counts",e.message)));const s=A.A.SESSIONS_URL;return e.addSocketListener(s,A.A.SESSION_COUNTS_UPDATED,(e=>t(e)),e.session.id),()=>e.removeSocketListeners(e)}),[e.session]);const i=(0,z.y)(),{userlistToggle:a,session:r,sessionT:c}=e,{user_count:l,share_size:p}=s,h=(0,V.Xq)(l>0?p/l:0,c.plainT);return(0,n.jsxs)(K.q,{children:[(0,n.jsx)(K.J,{text:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)($.A,{encryption:r.encryption}),c.t("xUsers",{defaultValue:"{{count}} user",defaultValue_plural:"{{count}} users",count:l,replace:{count:l}})]})}),!(0,x.mY)(i)&&(0,n.jsx)(K.J,{text:c.t("sharePerUser",{defaultValue:"{{total}} ({{average}}/user)",replace:{total:(0,V.Xq)(p,c.plainT),average:h}})}),(0,n.jsx)("div",{className:"actions-wrapper",children:(0,n.jsxs)("div",{className:"actions",children:[a,(0,n.jsx)(I.Wy,{className:"top left pointing",actions:q,header:c.translate("Notification settings"),itemData:r,triggerIcon:r.settings.use_main_chat_notify||r.settings.show_joins?"yellow bell":"bell"})]})})]})}),(({session:e})=>!!r.A.getSession(e.id)));var W=t(21479),X=t(96529),Y=t(41860),Z=t(83994),Q=t(32389),ee=t(8418);(0,ee.Bc)(A.A.SESSIONS_URL),(0,ee.$2)(A.A.SESSIONS_URL),(0,ee.q_)(A.A.SESSIONS_URL),(0,ee.cr)(A.A.SESSIONS_URL);var se=t(36076);const te=({icon:e,title:s,content:t})=>Y.A.hasAccess(T.US.HUBS_EDIT)?(0,n.jsxs)("div",{className:"ui icon message hub-action-prompt",children:[(0,n.jsxs)("h3",{className:"ui header",children:[(0,n.jsx)(Z.A,{icon:e}),(0,n.jsx)("div",{className:"content",children:s})]}),t]}):null,ne=({hub:e,sessionT:s})=>(0,n.jsxs)("div",{className:"password prompt",children:[(0,n.jsx)(W.A,{placeholder:s.translate("Password"),caption:s.translate("Submit"),icon:R.A.CONNECT,handleAction:t=>(0,se.bd)((()=>((e,s)=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/password`,{password:s}))(e,t)),s.plainT)}),(0,n.jsx)("div",{className:"help",children:(0,n.jsx)(Q.x6,{i18nKey:s.toI18nKey("passwordPromptHelp"),children:"This usually means that there's a registered account associated with your nick. If you don't remember having a registered account in this hub, there may be someone else using the same nick."})})]}),oe=({hub:e,sessionT:s})=>(0,n.jsx)(X.A,{className:"redirect prompt",icon:R.A.CONNECT,onClick:t=>(0,se.bd)((()=>(e=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/redirect`))(e)),s.plainT),caption:s.t("acceptRedirect",{defaultValue:"Accept redirect to {{url}}",replace:{url:e.connect_state.data.hub_url}})});var ie=t(85072),ae=t.n(ie),re=t(97825),ce=t.n(re),le=t(77659),pe=t.n(le),he=t(55056),de=t.n(he),ue=t(10540),Ae=t.n(ue),me=t(41113),Se=t.n(me),be=t(32194),ge={};ge.styleTagTransform=Se(),ge.setAttributes=de(),ge.insert=pe().bind(null,"head"),ge.domAPI=ce(),ge.insertStyleElement=Ae(),ae()(be.A,ge),be.A&&be.A.locals&&be.A.locals;var we=t(59548);const xe=e=>`view_userlist_${e.session.id}`,Ee=e=>(0,x.wO)(xe(e),!1);class fe extends o.Component{constructor(){super(...arguments),this.state={showList:Ee(this.props)},this.toggleListState=()=>{this.setState({showList:!this.state.showList})},this.getMessage=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;return t===T.gU.PASSWORD?(0,n.jsx)(te,{title:s.translate("Password required"),icon:R.A.LOCK,content:(0,n.jsx)(ne,{hub:e,sessionT:s})}):t===T.gU.REDIRECT?(0,n.jsx)(te,{title:s.translate("Redirect requested"),icon:R.A.REDIRECT,content:(0,n.jsx)(oe,{hub:e,sessionT:s})}):null},this.onClickUsers=()=>{this.toggleListState(),(0,x.xu)(xe(this.props),this.state.showList)},this.handleFileUpload=e=>{const{hub_url:s}=this.props.session;return(0,we.eo)(e,s,void 0)}}componentDidUpdate(e){e.session.id!==this.props.session.id&&this.state.showList!==Ee(this.props)&&this.toggleListState()}render(){const{session:e,sessionApi:s,sessionT:t,uiActions:o}=this.props,{showList:i}=this.state,a=(0,n.jsx)(E.A,{className:"userlist-button",type:"toggle",caption:t.translate("User list"),onChange:this.onClickUsers,checked:i});return(0,n.jsxs)("div",{className:"hub chat session",children:[this.getMessage(),i?(0,n.jsx)(P,{session:e,sessionT:t}):(0,n.jsx)(f.A,{messageStore:w,chatApi:c.A,sessionApi:s,chatActions:o,chatAccess:T.US.HUBS_SEND,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:L.Ay.HUB_MESSAGE_HIGHLIGHT,hubUrl:e.hub_url}),(0,n.jsx)(J,{userlistToggle:a,session:e,sessionT:t})]})}}fe.displayName="HubSession";const _e=fe;var ye=t(68614),je=t(62705),Ue=t(84976),Ce=t(93226);class Ne extends o.Component{constructor(){super(...arguments),this.handleConnect=e=>{const{location:s,navigate:t}=this.props;c.A.createSession(e,{sessionStore:r.A,location:s,navigate:t})},this.hasSession=e=>r.A.getSessionByUrl(e.hub_url),this.recentHubRender=e=>(0,n.jsx)("a",{onClick:s=>this.handleConnect(e.hub_url),children:e.name})}render(){const{sessionT:e}=this.props;return(0,n.jsxs)("div",{className:"hub session new",children:[(0,n.jsx)(ye.A,{submitHandler:this.handleConnect,button:(0,n.jsx)(X.A,{icon:R.A.CONNECT,caption:e.translate("Connect")})}),(0,n.jsx)(B.A,{description:(0,n.jsx)(Q.x6,{i18nKey:e.toI18nKey("favoriteHubsHint"),defaults:"Tip: visit the <url>Favorite hubs</url> page to connect using custom settings",components:{url:(0,n.jsx)(Ue.N_,{to:"/favorite-hubs"})}})}),(0,n.jsx)(je.A,{entryType:Ce.iM.HUB,hasSession:this.hasSession,entryTitleRenderer:this.recentHubRender,entryIcon:"sitemap"})]})}}const ve=Ne;var Ie=t(48916),Be=t(78046),Oe=t(69858),Te=t(4112),De=t(48844);const Re={id:"reconnect",displayName:"Reconnect",access:T.US.HUBS_EDIT,icon:R.A.REFRESH_COLORED,handler:({itemData:e})=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/reconnect`)},Le={id:"favorite",displayName:"Add to favorites",access:T.US.HUBS_EDIT,icon:R.A.FAVORITE,filter:({itemData:e})=>!e.favorite_hub,handler:({itemData:e})=>G.A.post(`${A.A.SESSIONS_URL}/${e.id}/favorite`),notifications:{onSuccess:"The hub {{item.identity.name}} was added in favorites"}},He=(0,Oe.G)(A.A.SESSIONS_URL,T.US.HUBS_EDIT),ke=(0,Te.R)(A.A.SESSIONS_URL,T.US.HUBS_EDIT),Pe={reconnect:Re,favorite:Le,clearChat:He,divider:De.o,remove:ke},Ge={moduleData:{moduleId:D.KV.HUBS},actions:Pe};const Ve={itemNameGetter:e=>e.identity.name,itemStatusGetter:e=>(0,l.D8)(e.connect_state.id),itemHeaderDescriptionGetter:e=>(0,n.jsx)(i.PW,{text:e.identity.description,emojify:!0}),itemHeaderIconGetter:e=>(0,n.jsx)(Ie.A,{hub:e})},Ke=e=>{if(e.id)return parseInt(e.id)},$e=["reconnect","clearChat","favorite"],Me=(0,Be.Z)((e=>{const{params:s,sessionT:t}=e,o=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["params","sessionT"]);return(0,n.jsx)(a.A,Object.assign({activeId:Ke(s),baseUrl:"hubs",newCaption:t.t("new","Connect"),newDescription:t.t("newDesc","Connect to a new hub"),newIcon:R.A.HUBS_PLAIN,editAccess:T.US.HUBS_EDIT,uiActions:Ge,actionIds:$e,sessionApi:c.A,sessionItemLayout:_e,newLayout:ve,sessionT:t,unreadInfoStore:r.A},Ve,o))}),r.A,D.KV.HUBS)}}]);
2
+ //# sourceMappingURL=hubs.c21b941c411425d4852f.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/hubs.c21b941c411425d4852f.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/stores/HubMessageStore.ts","webpack://airdcpp-webui/./src/stores/HubUserViewStore.js","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubUserTable.tsx","webpack://airdcpp-webui/./src/actions/ui/hub/HubSettingActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubFooter.tsx","webpack://airdcpp-webui/./src/services/api/HubApi.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubPrompt.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css?5587","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubNew.tsx","webpack://airdcpp-webui/./src/actions/ui/hub/HubActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/Hubs.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.hub-action-prompt {\n flex-direction: column;\n align-items: flex-start !important;\n}\n\n.hub-action-prompt .header {\n margin: 0 0 1rem !important;\n}\n\n.hub-action-prompt .password.prompt .help {\n margin-top: 10px;\n}\n\n.hub-action-prompt .redirect.prompt {\n max-width: 100%;\n overflow: hidden;\n}\n\n.hub.session .virtual-table,\n.hub.session .offline-message,\n.hub.session .loader-wrapper {\n flex: 1;\n margin-top: 5px;\n}\n\n.hub.session .cell-wrapper.tag,\n.hub.session .cell-wrapper.nick,\n.hub.session .cell-wrapper.description,\n.hub.session .cell-wrapper.share_size {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.hub.session .cell-wrapper.nick.op {\n color: steelblue;\n}\n.hub.session .session-footer .actions-wrapper > a,\n.hub.session .session-footer .actions-wrapper > div {\n /* Don't cut the shadow */\n padding-left: 1px;\n padding-bottom: 1px;\n}\n\n.hub.session .session-footer .userlist-button label {\n color: grey;\n font-size: small;\n}\n\n.hub.session .session-footer .actions-wrapper .dropdown {\n margin-left: 10px;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Hubs/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB\",\"sourcesContent\":[\".hub-action-prompt {\\n flex-direction: column;\\n align-items: flex-start !important;\\n}\\n\\n.hub-action-prompt .header {\\n margin: 0 0 1rem !important;\\n}\\n\\n.hub-action-prompt .password.prompt .help {\\n margin-top: 10px;\\n}\\n\\n.hub-action-prompt .redirect.prompt {\\n max-width: 100%;\\n overflow: hidden;\\n}\\n\\n.hub.session .virtual-table,\\n.hub.session .offline-message,\\n.hub.session .loader-wrapper {\\n flex: 1;\\n margin-top: 5px;\\n}\\n\\n.hub.session .cell-wrapper.tag,\\n.hub.session .cell-wrapper.nick,\\n.hub.session .cell-wrapper.description,\\n.hub.session .cell-wrapper.share_size {\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n\\n.hub.session .cell-wrapper.nick.op {\\n color: steelblue;\\n}\\n.hub.session .session-footer .actions-wrapper > a,\\n.hub.session .session-footer .actions-wrapper > div {\\n /* Don't cut the shadow */\\n padding-left: 1px;\\n padding-bottom: 1px;\\n}\\n\\n.hub.session .session-footer .userlist-button label {\\n color: grey;\\n font-size: small;\\n}\\n\\n.hub.session .session-footer .actions-wrapper .dropdown {\\n margin-left: 10px;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport Icon, { IconProps } from 'components/semantic/Icon';\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\n\nimport * as API from 'types/api';\n\ninterface HubIconProps extends IconProps {\n hub: API.Hub;\n}\n\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\n <Icon {...other} icon={hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap'} />\n);\n\n/*HubIcon.propTypes = {\n // Hub object\n hub: PropTypes.object.isRequired,\n};*/\n\nexport default HubIcon;\n","//@ts-ignore\r\nimport Reflux from 'reflux';\r\nimport invariant from 'invariant';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport HubActions from 'actions/reflux/HubActions';\r\n\r\nimport MessageStoreDecorator from './decorators/MessageStoreDecorator';\r\n\r\nimport AccessConstants from 'constants/AccessConstants';\r\nimport { SessionScrollPositionKeeper } from './helpers/SessionScrollPositionKeeper';\r\nimport { AddSocketListener } from 'decorators/SocketSubscriptionDecorator';\r\n\r\nconst HubMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(\r\n !this.hasMessages(),\r\n 'No existing hub messages should exist on socket connect',\r\n );\r\n invariant(\r\n !this.hasInitializedSessions(),\r\n 'No initialized hub sessions should exist on socket connect',\r\n );\r\n\r\n addSocketListener(\r\n HubConstants.MODULE_URL,\r\n HubConstants.HUB_MESSAGE,\r\n this._onChatMessage,\r\n );\r\n addSocketListener(\r\n HubConstants.MODULE_URL,\r\n HubConstants.HUB_STATUS_MESSAGE,\r\n this._onStatusMessage,\r\n );\r\n\r\n addSocketListener(\r\n HubConstants.MODULE_URL,\r\n HubConstants.SESSION_UPDATED,\r\n this._onSessionUpdated,\r\n );\r\n addSocketListener(\r\n HubConstants.MODULE_URL,\r\n HubConstants.SESSION_REMOVED,\r\n this._onSessionRemoved,\r\n );\r\n },\r\n});\r\n\r\nexport default MessageStoreDecorator(\r\n HubMessageStore,\r\n HubActions,\r\n AccessConstants.HUBS_VIEW,\r\n);\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\nimport Reflux from 'reflux';\nimport HubConstants from 'constants/HubConstants';\nimport HubSessionStore from './HubSessionStore';\n\nexport default Reflux.createStore({\n _viewName: 'hub_user_view',\n _apiUrl: HubConstants.SESSIONS_URL,\n _sessionStore: HubSessionStore,\n mixins: [ViewStoreMixin('nick')],\n});\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubUserViewStore from 'stores/HubUserViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, ConnectionCell, IpCell } from 'components/table/Cell';\r\n\r\nimport { TableUserMenu } from 'components/action-menu';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\ninterface NickCellProps extends RowWrapperCellChildProps<string, API.HubUser> {\r\n session: API.Hub;\r\n}\r\n\r\nconst NickCell: React.FC<NickCellProps> = ({ cellData, rowDataGetter, session }) => (\r\n <TableUserMenu\r\n text={cellData}\r\n user={rowDataGetter!()}\r\n userIcon={true}\r\n remoteMenuId={MenuConstants.HUB_USER}\r\n entity={session}\r\n />\r\n);\r\n\r\ninterface HubUserTableProps {\r\n session: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass HubUserTable extends React.Component<HubUserTableProps> {\r\n static propTypes = {\r\n session: PropTypes.object, // required\r\n };\r\n\r\n rowClassNameGetter = (user: API.HubUser) => {\r\n return user.flags.join(' ');\r\n };\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (\r\n connectState === API.HubConnectStateEnum.DISCONNECTED ||\r\n connectState === API.HubConnectStateEnum.REDIRECT\r\n ) {\r\n return (\r\n <div className=\"offline-message\">\r\n <Message\r\n className=\"offline\"\r\n title={sessionT.translate('Not connected to the hub')}\r\n icon={IconConstants.OFFLINE}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n const text = sessionT.translate(\r\n connectState !== API.HubConnectStateEnum.CONNECTED\r\n ? 'Connecting'\r\n : 'Loading userlist',\r\n );\r\n\r\n return (\r\n <div className=\"loader-wrapper\">\r\n <Loader text={text} />\r\n </div>\r\n );\r\n };\r\n\r\n render() {\r\n const { session } = this.props;\r\n return (\r\n <VirtualTable\r\n store={HubUserViewStore}\r\n entityId={session.id}\r\n sessionStore={HubSessionStore}\r\n rowClassNameGetter={this.rowClassNameGetter}\r\n emptyRowsNodeGetter={this.emptyRowsNodeGetter}\r\n moduleId={UI.Modules.HUBS}\r\n >\r\n <Column\r\n name=\"Nick\"\r\n width={170}\r\n columnKey=\"nick\"\r\n flexGrow={8}\r\n cell={<NickCell session={session} />}\r\n />\r\n <Column\r\n name=\"Share size\"\r\n width={85}\r\n columnKey=\"share_size\"\r\n cell={<SizeCell />}\r\n flexGrow={1}\r\n />\r\n <Column name=\"Description\" width={100} columnKey=\"description\" flexGrow={1} />\r\n <Column name=\"Tag\" width={150} columnKey=\"tag\" flexGrow={2} />\r\n <Column\r\n name=\"Upload speed\"\r\n width={80}\r\n columnKey=\"upload_speed\"\r\n cell={<ConnectionCell />}\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"Download speed\"\r\n width={80}\r\n columnKey=\"download_speed\"\r\n cell={<ConnectionCell />}\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"IP (v4)\"\r\n width={120}\r\n columnKey=\"ip4\"\r\n flexGrow={3}\r\n cell={<IpCell />}\r\n />\r\n <Column\r\n name=\"IP (v6)\"\r\n width={120}\r\n columnKey=\"ip6\"\r\n flexGrow={3}\r\n cell={<IpCell />}\r\n />\r\n <Column name=\"Files\" width={70} columnKey=\"file_count\" flexGrow={3} />\r\n </VirtualTable>\r\n );\r\n }\r\n}\r\n\r\nexport default HubUserTable;\r\n","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nconst handleToggleChatNotify: UI.ActionHandler<API.Hub> = ({ itemData: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n use_main_chat_notify: !hub.settings.use_main_chat_notify,\r\n });\r\n};\r\n\r\nconst handleToggleJoins: UI.ActionHandler<API.Hub> = ({ itemData: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n show_joins: !hub.settings.show_joins,\r\n });\r\n};\r\n\r\nexport const HubToggleChatNotifyAction = {\r\n id: 'toggleChatNotify',\r\n displayName: 'Use chat notification',\r\n access: API.AccessEnum.HUBS_EDIT,\r\n handler: handleToggleChatNotify,\r\n checked: (hub: API.Hub) => {\r\n return hub.settings.use_main_chat_notify;\r\n },\r\n};\r\n\r\nexport const HubToggleShowJoinsAction = {\r\n id: 'toggleShowJoins',\r\n displayName: 'Show joins/parts',\r\n access: API.AccessEnum.HUBS_EDIT,\r\n handler: handleToggleJoins,\r\n checked: (hub: API.Hub) => {\r\n return hub.settings.show_joins;\r\n },\r\n};\r\n\r\nconst HubSettingActions: UI.ActionListType<API.Hub> = {\r\n toggleChatNotify: HubToggleChatNotifyAction,\r\n toggleShowJoins: HubToggleShowJoinsAction,\r\n};\r\n\r\nexport const HubSettingActionModule = {\r\n moduleId: UI.Modules.HUBS,\r\n};\r\n\r\nexport const HubSettingActionMenu = {\r\n moduleData: HubSettingActionModule,\r\n actions: HubSettingActions,\r\n};\r\n","//import PropTypes from 'prop-types';\r\nimport { useEffect, useState } from 'react';\r\n\r\nimport * as React from 'react';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { SessionFooter, FooterItem } from 'routes/Sidebar/components/SessionFooter';\r\nimport EncryptionState from 'components/EncryptionState';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\nimport {\r\n SocketSubscriptionDecorator,\r\n SocketSubscriptionDecoratorChildProps,\r\n} from 'decorators/SocketSubscriptionDecorator';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { useLayoutWidth } from 'context/LayoutWidthContext';\r\nimport { ActionMenu } from 'components/action-menu';\r\nimport { HubSettingActionMenu } from 'actions/ui/hub/HubSettingActions';\r\n\r\ninterface HubFooterProps {\r\n session: API.Hub;\r\n userlistToggle: React.ReactNode;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\ntype DataProps = SocketSubscriptionDecoratorChildProps<HubFooterProps>;\r\nconst HubFooter: React.FC<HubFooterProps & DataProps> = (props) => {\r\n const [counts, setCounts] = useState<API.HubCounts>({\r\n share_size: 0,\r\n user_count: 0,\r\n });\r\n\r\n useEffect(() => {\r\n // Fetch initial\r\n SocketService.get<API.HubCounts>(\r\n `${HubConstants.SESSIONS_URL}/${props.session.id}/counts`,\r\n )\r\n .then(setCounts)\r\n .catch((error: ErrorResponse) =>\r\n console.error('Failed to fetch hub counts', error.message),\r\n );\r\n\r\n // Subscription\r\n const url = HubConstants.SESSIONS_URL;\r\n props.addSocketListener(\r\n url,\r\n HubConstants.SESSION_COUNTS_UPDATED,\r\n (data: API.HubCounts) => setCounts(data),\r\n props.session.id,\r\n );\r\n\r\n return () => props.removeSocketListeners(props);\r\n }, [props.session]);\r\n\r\n const layoutWidth = useLayoutWidth();\r\n\r\n const { userlistToggle, session, sessionT } = props;\r\n const { user_count: users, share_size: shared } = counts;\r\n\r\n const averageShare = formatSize(users > 0 ? shared / users : 0, sessionT.plainT);\r\n return (\r\n <SessionFooter>\r\n <FooterItem\r\n text={\r\n <>\r\n <EncryptionState encryption={session.encryption} />\r\n {sessionT.t('xUsers', {\r\n defaultValue: '{{count}} user',\r\n defaultValue_plural: '{{count}} users',\r\n count: users,\r\n replace: {\r\n count: users,\r\n },\r\n })}\r\n </>\r\n }\r\n />\r\n {!useMobileLayout(layoutWidth) && (\r\n <FooterItem\r\n text={sessionT.t('sharePerUser', {\r\n defaultValue: '{{total}} ({{average}}/user)',\r\n replace: {\r\n total: formatSize(shared, sessionT.plainT),\r\n average: averageShare,\r\n },\r\n })}\r\n />\r\n )}\r\n <div className=\"actions-wrapper\">\r\n <div className=\"actions\">\r\n {userlistToggle}\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n actions={HubSettingActionMenu}\r\n header={sessionT.translate('Notification settings')}\r\n itemData={session}\r\n triggerIcon={\r\n session.settings.use_main_chat_notify || session.settings.show_joins\r\n ? 'yellow bell'\r\n : 'bell'\r\n }\r\n />\r\n </div>\r\n </div>\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default SocketSubscriptionDecorator(\r\n HubFooter,\r\n ({ session }) => !!HubSessionStore.getSession(session.id),\r\n);\r\n","import HubConstants from 'constants/HubConstants';\nimport SocketService from 'services/SocketService';\n\nimport * as API from 'types/api';\nimport {\n sendChatMessageDecorator,\n clearMessagesDecorator,\n setReadDecorator,\n fetchMessagesDecorator,\n} from './common/ChatActions';\n//import * as UI from 'types/ui';\n\nexport const sendHubPassword = (hub: API.Hub, password: string) => {\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/password`, {\n password: password,\n });\n};\n\nexport const acceptHubRedirect = (hub: API.Hub) => {\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/redirect`);\n};\n\nexport const sendHubChatMessage = sendChatMessageDecorator(HubConstants.SESSIONS_URL);\nexport const clearHubChatMessages = clearMessagesDecorator(HubConstants.SESSIONS_URL);\nexport const fetchHubChatMessages = fetchMessagesDecorator(HubConstants.SESSIONS_URL);\n\nexport const setHubSessionRead = setReadDecorator(HubConstants.SESSIONS_URL);\n","//import PropTypes from 'prop-types';\nimport * as React from 'react';\n\nimport ActionInput from 'components/semantic/ActionInput';\nimport Button from 'components/semantic/Button';\n\nimport LoginStore from 'stores/LoginStore';\nimport Icon, { IconType } from 'components/semantic/Icon';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\nimport { Trans } from 'react-i18next';\nimport { sendHubPassword, acceptHubRedirect } from 'services/api/HubApi';\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\nimport IconConstants from 'constants/IconConstants';\n\ninterface HubActionPromptProps {\n icon: IconType;\n title: React.ReactNode;\n content: React.ReactNode;\n}\n\n// Main prompt (HUBS_EDIT permission is required for the content to be rendered)\nconst HubActionPrompt: React.FC<HubActionPromptProps> = ({ icon, title, content }) => {\n if (!LoginStore.hasAccess(API.AccessEnum.HUBS_EDIT)) {\n return null;\n }\n\n return (\n <div className=\"ui icon message hub-action-prompt\">\n <h3 className=\"ui header\">\n <Icon icon={icon} />\n <div className=\"content\">{title}</div>\n </h3>\n {content}\n </div>\n );\n};\n\n/*HubActionPrompt.propTypes = {\n // Message title\n title: PropTypes.node.isRequired,\n\n // Children\n content: PropTypes.node.isRequired,\n};*/\n\ninterface PasswordPromptProps {\n hub: API.Hub;\n sessionT: UI.ModuleTranslator;\n}\n\n// Sub prompts\nconst PasswordPrompt: React.FC<PasswordPromptProps> = ({ hub, sessionT }) => (\n <div className=\"password prompt\">\n <ActionInput\n placeholder={sessionT.translate('Password')}\n caption={sessionT.translate('Submit')}\n icon={IconConstants.CONNECT}\n handleAction={(text) =>\n runBackgroundSocketAction(() => sendHubPassword(hub, text), sessionT.plainT)\n }\n />\n <div className=\"help\">\n <Trans i18nKey={sessionT.toI18nKey('passwordPromptHelp')}>\n This usually means that there's a registered account associated with your nick. If\n you don't remember having a registered account in this hub, there may be someone\n else using the same nick.\n </Trans>\n </div>\n </div>\n);\n\ninterface RedirectPromptProps {\n hub: API.Hub;\n sessionT: UI.ModuleTranslator;\n}\n\nconst RedirectPrompt: React.FC<RedirectPromptProps> = ({ hub, sessionT }) => (\n <Button\n className=\"redirect prompt\"\n icon={IconConstants.CONNECT}\n onClick={(_) =>\n runBackgroundSocketAction(() => acceptHubRedirect(hub), sessionT.plainT)\n }\n caption={sessionT.t('acceptRedirect', {\n defaultValue: 'Accept redirect to {{url}}',\n replace: {\n url: hub.connect_state.data!.hub_url,\n },\n })}\n />\n);\n\nexport { RedirectPrompt, PasswordPrompt, HubActionPrompt };\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\noptions.insert = insertFn.bind(null, \"head\");\noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { Component } from 'react';\r\n\r\nimport HubMessageStore from 'stores/HubMessageStore';\r\n\r\nimport { loadSessionProperty, saveSessionProperty } from 'utils/BrowserUtils';\r\nimport Checkbox from 'components/semantic/Checkbox';\r\n\r\nimport ChatLayout from 'routes/Sidebar/components/chat/ChatLayout';\r\nimport HubUserTable from 'routes/Sidebar/routes/Hubs/components/HubUserTable';\r\n\r\nimport HubFooter from 'routes/Sidebar/routes/Hubs/components/HubFooter';\r\nimport {\r\n RedirectPrompt,\r\n PasswordPrompt,\r\n HubActionPrompt,\r\n} from 'routes/Sidebar/routes/Hubs/components/HubPrompt';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\nconst getStorageKey = (props: HubSessionProps) => {\r\n return `view_userlist_${props.session.id}`;\r\n};\r\n\r\nconst checkList = (props: HubSessionProps) => {\r\n return loadSessionProperty(getStorageKey(props), false);\r\n};\r\n\r\ntype HubSessionProps = SessionChildProps<API.Hub, UI.EmptyObject, UI.ChatActionList>;\r\n\r\nclass HubSession extends Component<HubSessionProps> {\r\n static displayName = 'HubSession';\r\n\r\n state = {\r\n showList: checkList(this.props),\r\n };\r\n\r\n componentDidUpdate(prevProps: HubSessionProps) {\r\n if (\r\n prevProps.session.id !== this.props.session.id &&\r\n this.state.showList !== checkList(this.props)\r\n ) {\r\n this.toggleListState();\r\n }\r\n }\r\n\r\n toggleListState = () => {\r\n this.setState({ showList: !this.state.showList });\r\n };\r\n\r\n getMessage = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (connectState === API.HubConnectStateEnum.PASSWORD) {\r\n return (\r\n <HubActionPrompt\r\n title={sessionT.translate('Password required')}\r\n icon={IconConstants.LOCK}\r\n content={<PasswordPrompt hub={session} sessionT={sessionT} />}\r\n />\r\n );\r\n }\r\n\r\n if (connectState === API.HubConnectStateEnum.REDIRECT) {\r\n return (\r\n <HubActionPrompt\r\n title={sessionT.translate('Redirect requested')}\r\n icon={IconConstants.REDIRECT}\r\n content={<RedirectPrompt hub={session} sessionT={sessionT} />}\r\n />\r\n );\r\n }\r\n\r\n return null;\r\n };\r\n\r\n onClickUsers = () => {\r\n this.toggleListState();\r\n\r\n saveSessionProperty(getStorageKey(this.props), this.state.showList);\r\n };\r\n\r\n handleFileUpload = (file: File) => {\r\n const { hub_url } = this.props.session;\r\n return shareTempFile(file, hub_url, undefined);\r\n };\r\n\r\n render() {\r\n const { session, sessionApi, sessionT, uiActions } = this.props;\r\n const { showList } = this.state;\r\n\r\n const checkbox = (\r\n <Checkbox\r\n className=\"userlist-button\"\r\n type=\"toggle\"\r\n caption={sessionT.translate('User list')}\r\n onChange={this.onClickUsers}\r\n checked={showList}\r\n />\r\n );\r\n\r\n return (\r\n <div className=\"hub chat session\">\r\n {this.getMessage()}\r\n {showList ? (\r\n <HubUserTable session={session} sessionT={sessionT} />\r\n ) : (\r\n <ChatLayout\r\n messageStore={HubMessageStore}\r\n chatApi={HubActions as UI.ChatAPI}\r\n sessionApi={sessionApi}\r\n chatActions={uiActions}\r\n chatAccess={API.AccessEnum.HUBS_SEND}\r\n session={session}\r\n handleFileUpload={this.handleFileUpload}\r\n highlightRemoteMenuId={MenuConstants.HUB_MESSAGE_HIGHLIGHT}\r\n hubUrl={session.hub_url}\r\n />\r\n )}\r\n <HubFooter userlistToggle={checkbox} session={session} sessionT={sessionT} />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubSession;\r\n","import { Component } from 'react';\r\n\r\nimport HubSearchInput from 'components/autosuggest/HubSearchInput';\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Button from 'components/semantic/Button';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/types';\r\n\r\nclass HubNew extends Component<NewSessionLayoutProps> {\r\n handleConnect = (hubUrl: string) => {\r\n const { location, navigate } = this.props;\r\n HubActions.createSession(hubUrl, {\r\n sessionStore: HubSessionStore,\r\n location,\r\n navigate,\r\n });\r\n };\r\n\r\n hasSession = (entry: API.HistoryItem) => {\r\n return HubSessionStore.getSessionByUrl(entry.hub_url);\r\n };\r\n\r\n recentHubRender = (entry: API.HistoryItem) => {\r\n return <a onClick={(_) => this.handleConnect(entry.hub_url)}>{entry.name}</a>;\r\n };\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"hub session new\">\r\n <HubSearchInput\r\n submitHandler={this.handleConnect}\r\n button={\r\n <Button\r\n icon={IconConstants.CONNECT}\r\n caption={sessionT.translate('Connect')}\r\n />\r\n }\r\n />\r\n <Message\r\n description={\r\n <Trans\r\n i18nKey={sessionT.toI18nKey('favoriteHubsHint')}\r\n defaults=\"Tip: visit the <url>Favorite hubs</url> page to connect using custom settings\"\r\n components={{\r\n url: <Link to=\"/favorite-hubs\" />,\r\n }}\r\n />\r\n }\r\n />\r\n <RecentLayout\r\n entryType={HistoryEntryEnum.HUB}\r\n hasSession={this.hasSession}\r\n entryTitleRenderer={this.recentHubRender}\r\n entryIcon=\"sitemap\"\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubNew;\r\n","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport { BuildClearChatAction } from '../decorators/ChatActionDecorator';\r\nimport { BuildRemoveSessionAction } from '../decorators/SessionActionDecorator';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { MENU_DIVIDER } from 'constants/ActionConstants';\r\n\r\ntype Filter = UI.ActionFilter<API.Hub>;\r\nconst notFavorite: Filter = ({ itemData: hub }) => !hub.favorite_hub;\r\n\r\nconst handleFavorite: UI.ActionHandler<API.Hub> = ({ itemData: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/favorite`);\r\n};\r\n\r\nconst handleReconnect: UI.ActionHandler<API.Hub> = ({ itemData: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/reconnect`);\r\n};\r\n\r\nexport const HubReconnectAction = {\r\n id: 'reconnect',\r\n displayName: 'Reconnect',\r\n access: API.AccessEnum.HUBS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n handler: handleReconnect,\r\n};\r\n\r\nexport const HubFavoriteAction = {\r\n id: 'favorite',\r\n displayName: 'Add to favorites',\r\n access: API.AccessEnum.HUBS_EDIT,\r\n icon: IconConstants.FAVORITE,\r\n filter: notFavorite,\r\n handler: handleFavorite,\r\n notifications: {\r\n onSuccess: 'The hub {{item.identity.name}} was added in favorites',\r\n },\r\n};\r\n\r\nconst HubClearChatAction = BuildClearChatAction(\r\n HubConstants.SESSIONS_URL,\r\n API.AccessEnum.HUBS_EDIT,\r\n);\r\n\r\nconst HubRemoveAction = BuildRemoveSessionAction(\r\n HubConstants.SESSIONS_URL,\r\n API.AccessEnum.HUBS_EDIT,\r\n);\r\n\r\nconst HubActions: UI.ActionListType<API.Hub> = {\r\n reconnect: HubReconnectAction,\r\n favorite: HubFavoriteAction,\r\n clearChat: HubClearChatAction,\r\n divider: MENU_DIVIDER,\r\n remove: HubRemoveAction,\r\n};\r\n\r\nexport const HubActionModule = {\r\n moduleId: UI.Modules.HUBS,\r\n};\r\n\r\nexport const HubActionMenu = {\r\n moduleData: HubActionModule,\r\n actions: HubActions,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { TextDecorator } from 'components/text';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubAPIActions from 'actions/reflux/HubActions';\r\n\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport HubSession from 'routes/Sidebar/routes/Hubs/components/HubSession';\r\nimport HubNew from 'routes/Sidebar/routes/Hubs/components/HubNew';\r\nimport HubIcon from 'components/icon/HubIcon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport {\r\n SessionProviderDecorator,\r\n SessionProviderDecoratorChildProps,\r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { Params } from 'react-router-dom';\r\nimport { HubActionMenu } from 'actions/ui/hub';\r\n\r\nconst ItemHandler: UI.SessionInfoGetter<API.Hub> = {\r\n itemNameGetter(session) {\r\n return session.identity.name;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return hubOnlineStatusToColor(session.connect_state.id);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return <TextDecorator text={session.identity.description} emojify={true} />;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <HubIcon hub={session} />;\r\n },\r\n};\r\n\r\nconst parseNumericId = (params: Readonly<Params<string>>) => {\r\n if (!params.id) {\r\n return undefined;\r\n }\r\n\r\n return parseInt(params['id']);\r\n};\r\nconst sessionActions = ['reconnect', 'clearChat', 'favorite'];\r\n\r\nconst Hubs: React.FC<SessionProviderDecoratorChildProps<API.Hub>> = (props) => {\r\n const { params, sessionT, ...other } = props;\r\n return (\r\n <SessionLayout\r\n activeId={parseNumericId(params)}\r\n baseUrl=\"hubs\"\r\n newCaption={sessionT.t('new', 'Connect')}\r\n newDescription={sessionT.t('newDesc', 'Connect to a new hub')}\r\n newIcon={IconConstants.HUBS_PLAIN}\r\n editAccess={API.AccessEnum.HUBS_EDIT}\r\n uiActions={HubActionMenu}\r\n actionIds={sessionActions}\r\n sessionApi={HubAPIActions as UI.SessionActions<API.Hub>}\r\n sessionItemLayout={HubSession}\r\n newLayout={HubNew}\r\n sessionT={sessionT}\r\n unreadInfoStore={HubSessionStore}\r\n {...ItemHandler}\r\n {...other}\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Hubs, HubSessionStore, UI.Modules.HUBS);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","hub","other","icon","connect_state","HubMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","this","hasMessages","hasInitializedSessions","HubConstants","MODULE_URL","HUB_MESSAGE","_onChatMessage","HUB_STATUS_MESSAGE","_onStatusMessage","SESSION_UPDATED","_onSessionUpdated","SESSION_REMOVED","_onSessionRemoved","MessageStoreDecorator","HubActions","AccessConstants","A","HUBS_VIEW","_viewName","_apiUrl","SESSIONS_URL","_sessionStore","HubSessionStore","mixins","ViewStoreMixin","NickCell","cellData","rowDataGetter","session","text","user","userIcon","remoteMenuId","MenuConstants","HUB_USER","entity","HubUserTable","rowClassNameGetter","flags","join","emptyRowsNodeGetter","sessionT","props","connectState","DISCONNECTED","REDIRECT","className","Message","title","translate","IconConstants","OFFLINE","CONNECTED","Loader","render","VirtualTable","store","HubUserViewStore","entityId","sessionStore","moduleId","HUBS","name","width","columnKey","flexGrow","cell","propTypes","HubSettingActions","toggleChatNotify","displayName","access","HUBS_EDIT","handler","itemData","SocketService","patch","use_main_chat_notify","settings","checked","toggleShowJoins","show_joins","HubSettingActionMenu","moduleData","actions","SocketSubscriptionDecorator","counts","setCounts","useState","share_size","user_count","useEffect","get","then","catch","error","console","message","url","SESSION_COUNTS_UPDATED","data","removeSocketListeners","layoutWidth","userlistToggle","users","shared","averageShare","plainT","SessionFooter","EncryptionState","encryption","t","defaultValue","defaultValue_plural","count","replace","total","average","header","triggerIcon","getSession","HubActionPrompt","content","LoginStore","hasAccess","Icon","PasswordPrompt","ActionInput","placeholder","caption","CONNECT","handleAction","password","post","sendHubPassword","i18nKey","toI18nKey","RedirectPrompt","Button","onClick","_","acceptHubRedirect","hub_url","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","getStorageKey","checkList","HubSession","Component","state","showList","toggleListState","setState","getMessage","PASSWORD","LOCK","onClickUsers","handleFileUpload","file","undefined","componentDidUpdate","prevProps","sessionApi","uiActions","checkbox","Checkbox","type","onChange","ChatLayout","messageStore","chatApi","chatActions","chatAccess","HUBS_SEND","highlightRemoteMenuId","HUB_MESSAGE_HIGHLIGHT","hubUrl","HubNew","handleConnect","location","navigate","createSession","hasSession","entry","getSessionByUrl","recentHubRender","HubSearchInput","submitHandler","button","description","defaults","components","to","RecentLayout","entryType","HUB","entryTitleRenderer","entryIcon","HubReconnectAction","REFRESH_COLORED","HubFavoriteAction","FAVORITE","filter","favorite_hub","notifications","onSuccess","HubClearChatAction","HubRemoveAction","reconnect","favorite","clearChat","divider","remove","HubActionMenu","ItemHandler","itemNameGetter","identity","itemStatusGetter","itemHeaderDescriptionGetter","emojify","itemHeaderIconGetter","HubIcon","parseNumericId","params","parseInt","sessionActions","SessionProviderDecorator","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","HUBS_PLAIN","editAccess","actionIds","sessionItemLayout","newLayout","unreadInfoStore"],"sourceRoot":""}