airdcpp-webui 2.12.1-beta.3 → 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 (78) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/js/{223.d8381390628f8a92159f.chunk.js → 223.92cf614c9d87cf67385e.chunk.js} +2 -2
  3. package/dist/js/223.92cf614c9d87cf67385e.chunk.js.gz +0 -0
  4. package/dist/js/{223.d8381390628f8a92159f.chunk.js.map → 223.92cf614c9d87cf67385e.chunk.js.map} +1 -1
  5. package/dist/js/{236.a5df8c51dbebe95cc268.chunk.js → 236.6b4fd58c10a23138b7d8.chunk.js} +2 -2
  6. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.gz +0 -0
  7. package/dist/js/236.6b4fd58c10a23138b7d8.chunk.js.map +1 -0
  8. package/dist/js/{544.58de40c388788ce8d588.chunk.js → 544.826a806e4535f09cf100.chunk.js} +2 -2
  9. package/dist/js/{544.58de40c388788ce8d588.chunk.js.gz → 544.826a806e4535f09cf100.chunk.js.gz} +0 -0
  10. package/dist/js/{544.58de40c388788ce8d588.chunk.js.map → 544.826a806e4535f09cf100.chunk.js.map} +1 -1
  11. package/dist/js/{616.6af0b2487703c8da4b2c.chunk.js → 616.57a60c241582d79fa280.chunk.js} +2 -2
  12. package/dist/js/616.57a60c241582d79fa280.chunk.js.gz +0 -0
  13. package/dist/js/{616.6af0b2487703c8da4b2c.chunk.js.map → 616.57a60c241582d79fa280.chunk.js.map} +1 -1
  14. package/dist/js/{favorite-hubs.5d14015c002fab9d6e93.chunk.js → favorite-hubs.f1ced66aa7691eeee525.chunk.js} +2 -2
  15. package/dist/js/favorite-hubs.f1ced66aa7691eeee525.chunk.js.gz +0 -0
  16. package/dist/js/{favorite-hubs.5d14015c002fab9d6e93.chunk.js.map → favorite-hubs.f1ced66aa7691eeee525.chunk.js.map} +1 -1
  17. package/dist/js/{filelists.69f099cbc0bb5b67d1b8.chunk.js → filelists.852a6a879bab1f93854e.chunk.js} +2 -2
  18. package/dist/js/filelists.852a6a879bab1f93854e.chunk.js.gz +0 -0
  19. package/dist/js/{filelists.69f099cbc0bb5b67d1b8.chunk.js.map → filelists.852a6a879bab1f93854e.chunk.js.map} +1 -1
  20. package/dist/js/{home.ccd57551ac01ff4fc4ba.chunk.js → home.9a37f3a3c78cb9b3f45c.chunk.js} +3 -3
  21. package/dist/js/home.9a37f3a3c78cb9b3f45c.chunk.js.gz +0 -0
  22. package/dist/js/home.9a37f3a3c78cb9b3f45c.chunk.js.map +1 -0
  23. package/dist/js/{hubs.c2b8880d6d8ccfc9eb3a.chunk.js → hubs.c21b941c411425d4852f.chunk.js} +2 -2
  24. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.gz +0 -0
  25. package/dist/js/hubs.c21b941c411425d4852f.chunk.js.map +1 -0
  26. package/dist/js/main.7a746a54efc4bf96cd20.entry.js +3 -0
  27. package/dist/js/{main.a7216efbb2c5cd34c7e5.entry.js.LICENSE.txt → main.7a746a54efc4bf96cd20.entry.js.LICENSE.txt} +3 -3
  28. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.gz +0 -0
  29. package/dist/js/main.7a746a54efc4bf96cd20.entry.js.map +1 -0
  30. package/dist/js/{messages.980fd246050252a227cd.chunk.js → messages.6ed02d7d7ec7e06a93f2.chunk.js} +2 -2
  31. package/dist/js/messages.6ed02d7d7ec7e06a93f2.chunk.js.gz +0 -0
  32. package/dist/js/{messages.980fd246050252a227cd.chunk.js.map → messages.6ed02d7d7ec7e06a93f2.chunk.js.map} +1 -1
  33. package/dist/js/{queue.31409106566ce8e19fc3.chunk.js → queue.c73112a5c40baeee7c54.chunk.js} +2 -2
  34. package/dist/js/queue.c73112a5c40baeee7c54.chunk.js.gz +0 -0
  35. package/dist/js/{queue.31409106566ce8e19fc3.chunk.js.map → queue.c73112a5c40baeee7c54.chunk.js.map} +1 -1
  36. package/dist/js/{search.d724d4a3b2c8f3fe2768.chunk.js → search.66bbb5aead0f68100e76.chunk.js} +2 -2
  37. package/dist/js/search.66bbb5aead0f68100e76.chunk.js.gz +0 -0
  38. package/dist/js/{search.d724d4a3b2c8f3fe2768.chunk.js.map → search.66bbb5aead0f68100e76.chunk.js.map} +1 -1
  39. package/dist/js/settings.a509b3c48b03452b6783.chunk.js +2 -0
  40. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.gz +0 -0
  41. package/dist/js/settings.a509b3c48b03452b6783.chunk.js.map +1 -0
  42. package/dist/js/{share.a35d32796acde4fc3d59.chunk.js → share.6efce937acbd036d089d.chunk.js} +2 -2
  43. package/dist/js/share.6efce937acbd036d089d.chunk.js.gz +0 -0
  44. package/dist/js/{share.a35d32796acde4fc3d59.chunk.js.map → share.6efce937acbd036d089d.chunk.js.map} +1 -1
  45. package/dist/js/{system-log.2d9af5f3372752909d83.chunk.js → system-log.3efd872fbf4a90cde8d5.chunk.js} +2 -2
  46. package/dist/js/system-log.3efd872fbf4a90cde8d5.chunk.js.gz +0 -0
  47. package/dist/js/{system-log.2d9af5f3372752909d83.chunk.js.map → system-log.3efd872fbf4a90cde8d5.chunk.js.map} +1 -1
  48. package/dist/js/{transfers.22bad3799f0455da946b.chunk.js → transfers.326119d8de6e6f8176b5.chunk.js} +2 -2
  49. package/dist/js/transfers.326119d8de6e6f8176b5.chunk.js.gz +0 -0
  50. package/dist/js/{transfers.22bad3799f0455da946b.chunk.js.map → transfers.326119d8de6e6f8176b5.chunk.js.map} +1 -1
  51. package/dist/sw.js +1 -1
  52. package/dist/sw.js.gz +0 -0
  53. package/jest.config.js +1 -1
  54. package/package.json +2 -2
  55. package/tsconfig.json +1 -1
  56. package/dist/js/223.d8381390628f8a92159f.chunk.js.gz +0 -0
  57. package/dist/js/236.a5df8c51dbebe95cc268.chunk.js.gz +0 -0
  58. package/dist/js/236.a5df8c51dbebe95cc268.chunk.js.map +0 -1
  59. package/dist/js/616.6af0b2487703c8da4b2c.chunk.js.gz +0 -0
  60. package/dist/js/favorite-hubs.5d14015c002fab9d6e93.chunk.js.gz +0 -0
  61. package/dist/js/filelists.69f099cbc0bb5b67d1b8.chunk.js.gz +0 -0
  62. package/dist/js/home.ccd57551ac01ff4fc4ba.chunk.js.gz +0 -0
  63. package/dist/js/home.ccd57551ac01ff4fc4ba.chunk.js.map +0 -1
  64. package/dist/js/hubs.c2b8880d6d8ccfc9eb3a.chunk.js.gz +0 -0
  65. package/dist/js/hubs.c2b8880d6d8ccfc9eb3a.chunk.js.map +0 -1
  66. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js +0 -3
  67. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js.gz +0 -0
  68. package/dist/js/main.a7216efbb2c5cd34c7e5.entry.js.map +0 -1
  69. package/dist/js/messages.980fd246050252a227cd.chunk.js.gz +0 -0
  70. package/dist/js/queue.31409106566ce8e19fc3.chunk.js.gz +0 -0
  71. package/dist/js/search.d724d4a3b2c8f3fe2768.chunk.js.gz +0 -0
  72. package/dist/js/settings.4087d834170e87ff1c53.chunk.js +0 -2
  73. package/dist/js/settings.4087d834170e87ff1c53.chunk.js.gz +0 -0
  74. package/dist/js/settings.4087d834170e87ff1c53.chunk.js.map +0 -1
  75. package/dist/js/share.a35d32796acde4fc3d59.chunk.js.gz +0 -0
  76. package/dist/js/system-log.2d9af5f3372752909d83.chunk.js.gz +0 -0
  77. package/dist/js/transfers.22bad3799f0455da946b.chunk.js.gz +0 -0
  78. /package/dist/js/{home.ccd57551ac01ff4fc4ba.chunk.js.LICENSE.txt → home.9a37f3a3c78cb9b3f45c.chunk.js.LICENSE.txt} +0 -0
@@ -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(26817),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.c2b8880d6d8ccfc9eb3a.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":""}