airdcpp-webui 2.13.0-beta.2 → 2.13.0-beta.3

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 (49) hide show
  1. package/dist/index.html +1 -1
  2. package/dist/js/616.5fb9e1369585863a0090.chunk.js +2 -0
  3. package/dist/js/616.5fb9e1369585863a0090.chunk.js.gz +0 -0
  4. package/dist/js/616.5fb9e1369585863a0090.chunk.js.map +1 -0
  5. package/dist/js/{filelists.9bbe06c108a8677ee055.chunk.js → filelists.36c094bb9481fe161076.chunk.js} +2 -2
  6. package/dist/js/filelists.36c094bb9481fe161076.chunk.js.gz +0 -0
  7. package/dist/js/filelists.36c094bb9481fe161076.chunk.js.map +1 -0
  8. package/dist/js/{files.c892fc18f34c0df21798.chunk.js → files.e2f20d9b781cccf39e46.chunk.js} +2 -2
  9. package/dist/js/files.e2f20d9b781cccf39e46.chunk.js.gz +0 -0
  10. package/dist/js/files.e2f20d9b781cccf39e46.chunk.js.map +1 -0
  11. package/dist/js/{home.8eb92b8f499db1f6b157.chunk.js → home.2214cdc67645b4d98bc7.chunk.js} +3 -3
  12. package/dist/js/home.2214cdc67645b4d98bc7.chunk.js.gz +0 -0
  13. package/dist/js/home.2214cdc67645b4d98bc7.chunk.js.map +1 -0
  14. package/dist/js/{hubs.0519391702abb2ab6fb9.chunk.js → hubs.da174ee10d83d315fd94.chunk.js} +2 -2
  15. package/dist/js/hubs.da174ee10d83d315fd94.chunk.js.gz +0 -0
  16. package/dist/js/hubs.da174ee10d83d315fd94.chunk.js.map +1 -0
  17. package/dist/js/locales/{en-webui-main-json.887642492b267198ad80.chunk.js → en-webui-main-json.122e159ff7cbf9279033.chunk.js} +1 -1
  18. package/dist/js/locales/en-webui-main-json.122e159ff7cbf9279033.chunk.js.gz +0 -0
  19. package/dist/js/{main.0e886fb6440bb084150f.entry.js → main.50a26bf428c35f624dad.entry.js} +3 -3
  20. package/dist/js/main.50a26bf428c35f624dad.entry.js.gz +0 -0
  21. package/dist/js/{main.0e886fb6440bb084150f.entry.js.map → main.50a26bf428c35f624dad.entry.js.map} +1 -1
  22. package/dist/js/{messages.ca2775e685980c6c933c.chunk.js → messages.805b014b2ac099b6e9cf.chunk.js} +2 -2
  23. package/dist/js/messages.805b014b2ac099b6e9cf.chunk.js.gz +0 -0
  24. package/dist/js/messages.805b014b2ac099b6e9cf.chunk.js.map +1 -0
  25. package/dist/js/{settings.a2e92d27fef99fbeba03.chunk.js → settings.612ab4ae2ccdaebb1310.chunk.js} +2 -2
  26. package/dist/js/settings.612ab4ae2ccdaebb1310.chunk.js.gz +0 -0
  27. package/dist/js/settings.612ab4ae2ccdaebb1310.chunk.js.map +1 -0
  28. package/dist/sw.js +1 -1
  29. package/dist/sw.js.gz +0 -0
  30. package/package.json +1 -1
  31. package/dist/js/616.47ea358b41bea4430f9c.chunk.js +0 -2
  32. package/dist/js/616.47ea358b41bea4430f9c.chunk.js.gz +0 -0
  33. package/dist/js/616.47ea358b41bea4430f9c.chunk.js.map +0 -1
  34. package/dist/js/filelists.9bbe06c108a8677ee055.chunk.js.gz +0 -0
  35. package/dist/js/filelists.9bbe06c108a8677ee055.chunk.js.map +0 -1
  36. package/dist/js/files.c892fc18f34c0df21798.chunk.js.gz +0 -0
  37. package/dist/js/files.c892fc18f34c0df21798.chunk.js.map +0 -1
  38. package/dist/js/home.8eb92b8f499db1f6b157.chunk.js.gz +0 -0
  39. package/dist/js/home.8eb92b8f499db1f6b157.chunk.js.map +0 -1
  40. package/dist/js/hubs.0519391702abb2ab6fb9.chunk.js.gz +0 -0
  41. package/dist/js/hubs.0519391702abb2ab6fb9.chunk.js.map +0 -1
  42. package/dist/js/locales/en-webui-main-json.887642492b267198ad80.chunk.js.gz +0 -0
  43. package/dist/js/main.0e886fb6440bb084150f.entry.js.gz +0 -0
  44. package/dist/js/messages.ca2775e685980c6c933c.chunk.js.gz +0 -0
  45. package/dist/js/messages.ca2775e685980c6c933c.chunk.js.map +0 -1
  46. package/dist/js/settings.a2e92d27fef99fbeba03.chunk.js.gz +0 -0
  47. package/dist/js/settings.a2e92d27fef99fbeba03.chunk.js.map +0 -1
  48. /package/dist/js/{home.8eb92b8f499db1f6b157.chunk.js.LICENSE.txt → home.2214cdc67645b4d98bc7.chunk.js.LICENSE.txt} +0 -0
  49. /package/dist/js/{main.0e886fb6440bb084150f.entry.js.LICENSE.txt → main.50a26bf428c35f624dad.entry.js.LICENSE.txt} +0 -0
package/dist/index.html CHANGED
@@ -16,7 +16,7 @@
16
16
  {
17
17
  // We must inject the main chunk dynamically as well because the final path is not known on compile time
18
18
  var script = document.createElement('script');
19
- script.src = getBasePath() + "js/main.0e886fb6440bb084150f.entry.js";
19
+ script.src = getBasePath() + "js/main.50a26bf428c35f624dad.entry.js";
20
20
  document.body.appendChild(script);
21
21
  }
22
22
 
@@ -0,0 +1,2 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[616],{46510:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(71354),t=s.n(i),o=s(76314),a=s.n(o)()(t());a.push([n.id,".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/sessions.css"],names:[],mappings:"AAAA;EACE,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;EAChC,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB",sourcesContent:[".session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n"],sourceRoot:""}]);const r=a},4112:(n,e,s)=>{s.d(e,{R:()=>o});var i=s(32811),t=s(4425);const o=(n,e)=>({id:"remove",displayName:"Close",access:e,icon:t.A.REMOVE,handler:({itemData:e})=>i.A.delete(`${n}/${e.id}`)})},79531:(n,e,s)=>{s.d(e,{A:()=>r});var i=s(74848),t=s(96540),o=s(1530),a=s(19718);function r(n,e=!1){class s extends t.Component{constructor(){super(...arguments),this.setRead=n=>{this.props.sessionApi.setRead(n),this.readTimeout=void 0},this.setSession=n=>{if(this.readTimeout&&(clearTimeout(this.readTimeout),this.setRead(this.props.session)),this.props.sessionApi.sessionChanged(n),!n)return;const s=e?1e3*o.A.getValue(a.xC.UNREAD_LABEL_DELAY):0;this.readTimeout=window.setTimeout((()=>this.setRead(n)),s)}}componentDidMount(){this.setSession(this.props.session)}componentWillUnmount(){this.setSession(null)}componentDidUpdate(n){this.props.session.id!==n.session.id&&this.setSession(this.props.session)}render(){return(0,i.jsx)(n,Object.assign({},this.props))}}return s}},38453:(n,e,s)=>{s.d(e,{J:()=>t,q:()=>o});var i=s(74848);s(96540);const t=({label:n,text:e})=>(0,i.jsx)("div",{className:"grid-item",children:(0,i.jsx)("div",{className:"item-inner",children:n&&"string"==typeof e?`${n}: ${e}`:e})}),o=({children:n})=>(0,i.jsxs)("div",{className:"session-footer",children:[(0,i.jsx)("div",{className:"ui footer divider"}),(0,i.jsx)("div",{className:"info-grid ui",children:n})]})},91950:(n,e,s)=>{s.d(e,{A:()=>X});var i=s(74848),t=s(96540),o=s(99347),a=s(8098),r=s(68514),A=s(31104),l=s(19247),c=s(25906),d=s(67749),m=s(42695),u=s(4425),p=s(32389);const h=({sessionMenuItems:n,newButton:e,unreadInfoStore:s,listActionMenuGetter:t})=>{const{t:o}=(0,p.Bd)();return(0,i.jsxs)(A.A,{triggerIcon:(0,i.jsx)(c.Z,{urgencies:s?s.getTotalUrgencies():null}),children:[(0,i.jsx)(l.A,{caption:(0,m.Tl)("New",o,d.KV.COMMON),children:e}),(0,i.jsx)(l.A,{caption:(0,m.Tl)("Current sessions",o,d.KV.COMMON),children:n}),(0,i.jsx)(l.A,{children:t()})]})},E=({actions:n,activeItem:e})=>{if(!e||(0,a.mY)())return null;const s=Object.values(n.actions)[Object.values(n.actions).length-1];return(0,i.jsx)(r.A,{className:"basic small item close-button",action:s,moduleData:n.moduleData,itemData:e,icon:u.A.CLOSE})},g=({itemHeaderIcon:n,itemHeaderTitle:e})=>(0,i.jsxs)("div",{className:"session-header",children:[n,e]}),B=n=>{var{children:e,onKeyDown:s}=n,t=function(n,e){var s={};for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&e.indexOf(i)<0&&(s[i]=n[i]);if(null!=n&&"function"==typeof Object.getOwnPropertySymbols){var t=0;for(i=Object.getOwnPropertySymbols(n);t<i.length;t++)e.indexOf(i[t])<0&&Object.prototype.propertyIsEnumerable.call(n,i[t])&&(s[i[t]]=n[i[t]])}return s}(n,["children","onKeyDown"]);return(0,i.jsxs)("div",{className:"session-container vertical",onKeyDown:s,tabIndex:0,children:[(0,i.jsxs)("div",{className:"ui main menu menu-bar",children:[(0,i.jsxs)("div",{className:"content-left",children:[(0,i.jsx)(h,Object.assign({},t)),(0,i.jsx)(g,Object.assign({},t))]}),(0,i.jsx)(E,Object.assign({},t))]}),(0,i.jsx)("div",{className:"session-layout",children:e})]})};var x=s(31224),f=s(73070);const C=({sessionMenuItems:n,newButton:e,itemHeaderIcon:s,itemHeaderTitle:o,children:a,itemHeaderDescription:r,onKeyDown:A})=>(e&&(e=t.cloneElement(e,{className:e.props.className+" ui fluid button"})),(0,i.jsxs)(f.xA,{className:"session-container horizontal",onKeyDown:A,tabIndex:0,children:[(0,i.jsxs)("div",{className:"four wide column menu-column",children:[e,!!n.length&&(0,i.jsx)("div",{className:"ui vertical secondary menu",children:n})]}),(0,i.jsx)("div",{className:"twelve wide stretched column content-column session",children:(0,i.jsxs)("div",{className:"ui segment session-layout",children:[(0,i.jsx)(x.A,{className:"session-header",icon:s,title:(0,i.jsx)("div",{className:"title",children:o}),subHeader:r}),(0,i.jsx)("div",{className:"ui divider",style:{margin:"5px 0px 0px 0px"}}),a]})})]}));var v=s(32728),w=s(41860),b=s(18220),y=s(47767),j=s(20311),I=s.n(j);const N=({baseUrl:n})=>{const e=(0,y.Zp)(),s=e=>(I()(!!e,"Trying to get session URL without a session"),`/${n}/session/${e}`),i=`/${n}/new`;return{newUrl:`/${n}/new`,replaceNew:()=>{e(i,{replace:!0})},getSessionUrl:s,pushSession:n=>{e(s(n))},replaceSession:(n,i)=>{e(s(n),{replace:!0,state:i})}}},O=(n,e)=>n.find((n=>n.id===e));var z=s(85072),T=s.n(z),S=s(97825),M=s.n(S),k=s(77659),D=s.n(k),H=s(55056),U=s.n(H),K=s(10540),Y=s.n(K),G=s(41113),L=s.n(G),R=s(46510),V={};V.styleTagTransform=L(),V.setAttributes=U(),V.insert=D().bind(null,"head"),V.domAPI=M(),V.insertStyleElement=Y(),T()(R.A,V),R.A&&R.A.locals&&R.A.locals;var W=s(71352),$=s(46942),P=s.n($),_=s(45325);const q=({url:n,title:e,className:s})=>(0,i.jsx)(_.A,{className:P()("new",s),icon:u.A.CREATE,url:n,children:e},"button-new"),Z=({sessionItem:n,status:e,name:s,unreadInfoStore:t,url:o})=>(0,i.jsx)(_.A,{url:o,className:"session-item",icon:e,session:n,unreadInfoStore:t,children:(0,i.jsx)("span",{className:"session-name",children:s})});var F=s(83994),J=s(27725);const X=n=>{const e=(0,b.y)(),s=(0,y.Zp)(),r=(0,y.zy)(),{activeItem:A,onKeyDown:l}=(n=>{const[e,s]=t.useState(null),i=(0,y.zy)(),{pushSession:o,replaceSession:r,newUrl:A,replaceNew:l}=N({baseUrl:n.baseUrl}),c=()=>`${n.baseUrl}_last_active`;return t.useLayoutEffect((()=>{if(i.pathname===A)return void(e&&s(null));if((()=>{const e=i,t=e.state&&e.state.pending,o=O(n.items,n.activeId);return o?t?(r(o.id,{pending:!1}),!0):(s(o),(0,a.MS)(c(),n.activeId),!0):!!t||0===n.items.length&&(l(),s(null),!0)})())return;if(!e){const e=(0,a.H5)(c());if(e&&O(n.items,e))return void r(e)}const{items:t,activeId:o}=n;let d=0;const m=O(t,o);m&&(d=t.indexOf(m),d===t.length-1&&(d-=1)),r(t[d].id)}),[i,n.items]),{onKeyDown:e=>{const{key:s,altKey:i}=e;if(!i||"ArrowUp"!==s&&"ArrowDown"!==s){if(i&&"Insert"===s)e.preventDefault(),l();else if(i&&"Delete"===s){e.preventDefault();const{items:s,activeId:i,sessionApi:t}=n,o=O(s,i);o&&t.removeSession(o)}}else{e.preventDefault();const{items:i,activeId:t}=n,a=O(i,t);if(!a)return;const r=i.indexOf(a);if(-1===r)return;const A=i["ArrowUp"===s?r-1:r+1];A&&o(A.id)}},activeItem:e}})(n),c=w.A.hasAccess(n.editAccess),{disableSideMenu:h,items:E,unreadInfoStore:g,sessionT:x,uiActions:f}=n;if(!c&&0===E.length)return(0,i.jsx)(v.A,{title:(0,m.Tl)("No items to show",x.plainT,d.KV.COMMON),description:x.plainT((0,m.j2)("noSessionEditAccess",d.KV.COMMON),"You aren't allowed to open new sessions")});const j=h||(0,a.mY)(e)?B:C,{getItemHeaderTitle:I,getItemHeaderDescription:z,getItemHeaderIcon:T,getNewButton:S,getSessionMenuItems:M,getSessionActionMenuItems:k}=(n=>{const e=(0,y.zy)(),{t:s}=(0,p.Bd)(),{newUrl:t,getSessionUrl:o}=N({baseUrl:n.baseUrl}),a=e=>{const{itemStatusGetter:s,itemHeaderIconGetter:t}=n;return s?(0,i.jsx)("div",{className:"ui session-status empty circular left mini label "+s(e)}):(0,i.jsx)(F.A,{icon:t(e)})};return{getItemHeaderDescription:()=>{const{itemHeaderDescriptionGetter:e,newDescription:s,activeItem:i}=n;return i?e(i):s},getItemHeaderIcon:()=>{const{itemHeaderIconGetter:e,newIcon:s,activeItem:t}=n;return(0,i.jsx)(F.A,{icon:t?e(t):s})},getItemHeaderTitle:()=>{const{activeItem:s,newCaption:t,remoteMenuId:o}=n;if(!s)return(0,i.jsx)("div",{children:t});const{uiActions:a,actionIds:r,itemNameGetter:A,itemHeaderTitleGetter:l}=n,c=r?[...r,"divider","remove"]:void 0,d=(0,i.jsx)(W.Wy,{caption:A(s),actions:a,itemData:s,ids:c,remoteMenuId:o});if(l){const n=l(s,e,d);if(n)return n}return d},getSessionActionMenuItems:()=>{const{items:e,hasEditAccess:t}=n;return t&&0!==e.length?(0,i.jsx)(J.A,{onClick:()=>{const{sessionApi:e,items:s}=n;s.forEach((n=>e.removeSession(n)))},icon:u.A.REMOVE,children:(0,m.Tl)("Close all",s,d.KV.COMMON)},"close"):null},getNewButton:()=>{const{newCaption:e,hasEditAccess:s}=n;return s&&e?(0,i.jsx)(q,{title:e,url:t},"new-button"):null},getSessionMenuItems:()=>n.items.map((e=>{const{itemNameGetter:s,unreadInfoStore:t}=n;return(0,i.jsx)(Z,{url:o(e.id),name:s(e),unreadInfoStore:t,status:a(e),sessionItem:e},e.id)}))}})(Object.assign(Object.assign({},n),{activeItem:A,hasEditAccess:c}));return(0,i.jsx)(j,{itemHeaderTitle:I(),itemHeaderDescription:z(),itemHeaderIcon:T(),newButton:S(),sessionMenuItems:M(),listActionMenuGetter:k,activeItem:A,unreadInfoStore:g,onKeyDown:l,actions:f,children:(()=>{const{newLayout:e,sessionT:t}=n;return!n.activeId&&e?(0,i.jsx)(e,{navigate:s,location:r,sessionT:t}):(()=>{const{activeId:e,items:t,sessionItemLayout:a,sessionApi:l,uiActions:c,sessionT:u}=n;if(!A){const{state:n}=r;return n&&n.pending?(0,i.jsx)(o.A,{text:(0,m.Tl)("Waiting for server response",u.plainT,d.KV.COMMON)}):e||0!==t.length?(0,i.jsx)(o.A,{text:(0,m.Tl)("Loading session",u.plainT,d.KV.COMMON)}):void console.error("SessionLayout route: active session missing")}return(0,i.jsx)(a,{session:A,sessionApi:l,uiActions:c,location:r,navigate:s,sessionT:u})})()})()})}},78046:(n,e,s)=>{s.d(e,{Z:()=>c});var i=s(74848),t=(s(96540),s(99347)),o=s(69640),a=s(67749),r=s(32389),A=s(42695),l=s(47767);const c=(n,e,s)=>c=>{const{t:d}=(0,r.Bd)(),m=(0,A.lw)(d,s),u=(0,l.g)(),p=(0,o.P)(e);return e.isInitialized()?(0,i.jsx)(n,{items:p,params:u,sessionT:m}):(0,i.jsx)(t.A,{text:(0,A.Tl)("Loading sessions",d,a.KV.COMMON)})}}}]);
2
+ //# sourceMappingURL=616.5fb9e1369585863a0090.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/616.5fb9e1369585863a0090.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css","webpack://airdcpp-webui/./src/actions/ui/decorators/SessionActionDecorator.ts","webpack://airdcpp-webui/./src/decorators/ActiveSessionDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/TopMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SideMenuLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/effects/useSessionHelpers.ts","webpack://airdcpp-webui/./src/routes/Sidebar/components/effects/useSessionManager.ts","webpack://airdcpp-webui/./src/routes/Sidebar/sessions.css?90b7","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionNewButton.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuItem.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionMenuComponents.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/SessionLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/SessionProviderDecorator.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, `.session-container {\n background-color: white;\n}\n\n.session-container.horizontal.ui.grid {\n margin: 0px !important;\n}\n\n.session-container.horizontal .menu-column .item.new {\n padding: 0.78571429em 1.1em !important;\n}\n\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\n margin: 0 0.35714286em 0 0 !important;\n}\n\n.session-container.horizontal .session-layout > .ui.divider {\n margin: 5px 0px 0px 0px;\n}\n\n.session-container.vertical {\n padding: 15px;\n display: flex;\n flex-direction: column;\n}\n.session-layout {\n flex: 100 100 auto;\n display: flex;\n overflow: hidden;\n}\n\n.session-container.horizontal .session-layout {\n flex-direction: column;\n}\n\n.session-container.vertical .menu-bar {\n justify-content: space-between;\n margin: 0px !important;\n}\n\n.session-container.vertical .menu-bar .content-left {\n width: 100%;\n}\n\n.session-container.vertical .menu-bar .close-button.item:before {\n background: none !important;\n}\n\n.session-container.vertical .menu-bar .close-button.item {\n box-shadow: none !important;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\n float: left;\n}\n\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\n max-height: calc(100dvh - 140px);\n overflow-y: auto;\n overflow-x: hidden;\n max-width: calc(100vw - 30px);\n}\n\n.session-container.vertical .session-item .count.label {\n margin-left: 1em !important;\n}\n\n.session-container.vertical .session-header {\n display: flex;\n align-items: center;\n height: 100%;\n}\n\n.session-container.vertical .session-header > div {\n max-width: 90%; /* Hack, auto width won't work without \"overflow: hidden\", but that would prevent viewing the menu items */\n padding: 0.82857143em 0.4285714em;\n line-height: 1.2;\n}\n\n.session-container.vertical .session-header > div:before {\n background: none !important;\n}\n\n.session-container.vertical .session-header > i {\n margin-left: 10px;\n}\n\n.session-container.vertical .session-header .ui.dropdown > i {\n margin: 0px 5px;\n}\n\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\n.session-container.horizontal .session-header .header > i,\n.session-container.vertical .session-header > i {\n width: inherit !important;\n font-size: 1.5em;\n}\n\n.session-container.horizontal .session-header .ui.header {\n align-items: center;\n}\n\n.session-container.vertical .menu-bar {\n border-radius: 0px !important;\n padding-bottom: 0px;\n}\n\n.session-container,\n.session-layout,\n.session-container.horizontal .column {\n height: 100%;\n}\n\n.session-container.horizontal .column > div {\n max-height: 100%;\n}\n\n.session-container .session-item {\n overflow: hidden;\n display: flex !important;\n align-items: center;\n padding: 0.68571429em 0.92857143em !important;\n height: 35px;\n}\n\n.session-container .session-item .session-status {\n float: none !important;\n margin: 0 0.5em 0 0 !important;\n}\n\n.session-container .session-item .session-name {\n overflow: hidden;\n flex: 1 1 100%;\n line-height: 1.2;\n}\n\n.session-container .session-status {\n margin-right: 5px;\n margin-top: 3px;\n}\n\n.session-container.horizontal .menu-column {\n display: flex !important;\n flex-direction: column;\n padding-right: 0px !important;\n}\n\n.session-container.horizontal .menu-column .menu {\n width: initial !important;\n overflow-y: auto;\n padding-top: 10px;\n flex: 1;\n}\n\n.session-container.horizontal .menu-column .session-item span.session-name,\n.session-container .session-header .ui.dropdown .caption {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.session-container .session-header .title .ui.dropdown {\n width: 100%;\n}\n\n.session-layout .sub.header {\n overflow: hidden;\n}\n\n.session-layout .sub.header img {\n vertical-align: text-top;\n}\n\n.session-footer .info-grid {\n margin-top: 7px !important;\n font-size: small;\n color: grey;\n display: flex;\n flex: 1;\n align-items: flex-end;\n}\n\n.session-footer .info-grid > div {\n flex: 1;\n}\n\n.session-footer .info-grid > div:last-child > div {\n float: right;\n}\n\n.session-footer .info-grid > div:only-child > div {\n float: inherit;\n}\n\n.session-footer .ui.checkbox {\n min-height: inherit !important;\n}\n\n.session-footer .divider {\n margin-top: 8px;\n margin-bottom: 0px;\n}\n\n/* New session layout */\n.session.new {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n overflow-y: hidden;\n margin-top: 20px;\n padding: 1px;\n}\n\n.session.new .recents {\n flex: 100 100 0%;\n display: flex;\n flex-direction: column;\n margin-top: 20px;\n overflow-y: hidden;\n}\n\n.session.new .recents .list {\n padding: 3px 5px;\n flex: 100 100 0%;\n overflow-y: auto;\n overflow-x: hidden;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/sessions.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,uBAAuB;AACzB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,sCAAsC;AACxC;;AAEA;EACE,qCAAqC;AACvC;;AAEA;EACE,uBAAuB;AACzB;;AAEA;EACE,aAAa;EACb,aAAa;EACb,sBAAsB;AACxB;AACA;EACE,kBAAkB;EAClB,aAAa;EACb,gBAAgB;AAClB;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,8BAA8B;EAC9B,sBAAsB;AACxB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gCAAgC;EAChC,gBAAgB;EAChB,kBAAkB;EAClB,6BAA6B;AAC/B;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,YAAY;AACd;;AAEA;EACE,cAAc,EAAE,2GAA2G;EAC3H,iCAAiC;EACjC,gBAAgB;AAClB;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,eAAe;AACjB;;AAEA,oEAAoE;AACpE;;EAEE,yBAAyB;EACzB,gBAAgB;AAClB;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;;;EAGE,YAAY;AACd;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,wBAAwB;EACxB,mBAAmB;EACnB,6CAA6C;EAC7C,YAAY;AACd;;AAEA;EACE,sBAAsB;EACtB,8BAA8B;AAChC;;AAEA;EACE,gBAAgB;EAChB,cAAc;EACd,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;EACjB,eAAe;AACjB;;AAEA;EACE,wBAAwB;EACxB,sBAAsB;EACtB,6BAA6B;AAC/B;;AAEA;EACE,yBAAyB;EACzB,gBAAgB;EAChB,iBAAiB;EACjB,OAAO;AACT;;AAEA;;EAEE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,WAAW;AACb;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,wBAAwB;AAC1B;;AAEA;EACE,0BAA0B;EAC1B,gBAAgB;EAChB,WAAW;EACX,aAAa;EACb,OAAO;EACP,qBAAqB;AACvB;;AAEA;EACE,OAAO;AACT;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;AAChB;;AAEA;EACE,8BAA8B;AAChC;;AAEA;EACE,eAAe;EACf,kBAAkB;AACpB;;AAEA,uBAAuB;AACvB;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,kBAAkB;EAClB,gBAAgB;EAChB,YAAY;AACd;;AAEA;EACE,gBAAgB;EAChB,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,kBAAkB;AACpB\",\"sourcesContent\":[\".session-container {\\n background-color: white;\\n}\\n\\n.session-container.horizontal.ui.grid {\\n margin: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .item.new {\\n padding: 0.78571429em 1.1em !important;\\n}\\n\\n.session-container.horizontal .ui.vertical.menu .item > i.icon {\\n margin: 0 0.35714286em 0 0 !important;\\n}\\n\\n.session-container.horizontal .session-layout > .ui.divider {\\n margin: 5px 0px 0px 0px;\\n}\\n\\n.session-container.vertical {\\n padding: 15px;\\n display: flex;\\n flex-direction: column;\\n}\\n.session-layout {\\n flex: 100 100 auto;\\n display: flex;\\n overflow: hidden;\\n}\\n\\n.session-container.horizontal .session-layout {\\n flex-direction: column;\\n}\\n\\n.session-container.vertical .menu-bar {\\n justify-content: space-between;\\n margin: 0px !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left {\\n width: 100%;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .close-button.item {\\n box-shadow: none !important;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown {\\n float: left;\\n}\\n\\n.session-container.vertical .menu-bar .content-left > .ui.dropdown .menu {\\n max-height: calc(100dvh - 140px);\\n overflow-y: auto;\\n overflow-x: hidden;\\n max-width: calc(100vw - 30px);\\n}\\n\\n.session-container.vertical .session-item .count.label {\\n margin-left: 1em !important;\\n}\\n\\n.session-container.vertical .session-header {\\n display: flex;\\n align-items: center;\\n height: 100%;\\n}\\n\\n.session-container.vertical .session-header > div {\\n max-width: 90%; /* Hack, auto width won't work without \\\"overflow: hidden\\\", but that would prevent viewing the menu items */\\n padding: 0.82857143em 0.4285714em;\\n line-height: 1.2;\\n}\\n\\n.session-container.vertical .session-header > div:before {\\n background: none !important;\\n}\\n\\n.session-container.vertical .session-header > i {\\n margin-left: 10px;\\n}\\n\\n.session-container.vertical .session-header .ui.dropdown > i {\\n margin: 0px 5px;\\n}\\n\\n/* Fix a few inconsistencies between 'icon' and 'icons' classnames */\\n.session-container.horizontal .session-header .header > i,\\n.session-container.vertical .session-header > i {\\n width: inherit !important;\\n font-size: 1.5em;\\n}\\n\\n.session-container.horizontal .session-header .ui.header {\\n align-items: center;\\n}\\n\\n.session-container.vertical .menu-bar {\\n border-radius: 0px !important;\\n padding-bottom: 0px;\\n}\\n\\n.session-container,\\n.session-layout,\\n.session-container.horizontal .column {\\n height: 100%;\\n}\\n\\n.session-container.horizontal .column > div {\\n max-height: 100%;\\n}\\n\\n.session-container .session-item {\\n overflow: hidden;\\n display: flex !important;\\n align-items: center;\\n padding: 0.68571429em 0.92857143em !important;\\n height: 35px;\\n}\\n\\n.session-container .session-item .session-status {\\n float: none !important;\\n margin: 0 0.5em 0 0 !important;\\n}\\n\\n.session-container .session-item .session-name {\\n overflow: hidden;\\n flex: 1 1 100%;\\n line-height: 1.2;\\n}\\n\\n.session-container .session-status {\\n margin-right: 5px;\\n margin-top: 3px;\\n}\\n\\n.session-container.horizontal .menu-column {\\n display: flex !important;\\n flex-direction: column;\\n padding-right: 0px !important;\\n}\\n\\n.session-container.horizontal .menu-column .menu {\\n width: initial !important;\\n overflow-y: auto;\\n padding-top: 10px;\\n flex: 1;\\n}\\n\\n.session-container.horizontal .menu-column .session-item span.session-name,\\n.session-container .session-header .ui.dropdown .caption {\\n overflow: hidden;\\n white-space: nowrap;\\n}\\n\\n.session-container .session-header .title .ui.dropdown {\\n width: 100%;\\n}\\n\\n.session-layout .sub.header {\\n overflow: hidden;\\n}\\n\\n.session-layout .sub.header img {\\n vertical-align: text-top;\\n}\\n\\n.session-footer .info-grid {\\n margin-top: 7px !important;\\n font-size: small;\\n color: grey;\\n display: flex;\\n flex: 1;\\n align-items: flex-end;\\n}\\n\\n.session-footer .info-grid > div {\\n flex: 1;\\n}\\n\\n.session-footer .info-grid > div:last-child > div {\\n float: right;\\n}\\n\\n.session-footer .info-grid > div:only-child > div {\\n float: inherit;\\n}\\n\\n.session-footer .ui.checkbox {\\n min-height: inherit !important;\\n}\\n\\n.session-footer .divider {\\n margin-top: 8px;\\n margin-bottom: 0px;\\n}\\n\\n/* New session layout */\\n.session.new {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n overflow-y: hidden;\\n margin-top: 20px;\\n padding: 1px;\\n}\\n\\n.session.new .recents {\\n flex: 100 100 0%;\\n display: flex;\\n flex-direction: column;\\n margin-top: 20px;\\n overflow-y: hidden;\\n}\\n\\n.session.new .recents .list {\\n padding: 3px 5px;\\n flex: 100 100 0%;\\n overflow-y: auto;\\n overflow-x: hidden;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import SocketService from 'services/SocketService';\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\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\nexport const BuildRemoveSessionAction = (\r\n sessionsUrl: string,\r\n editAccess: API.AccessEnum,\r\n) => {\r\n const handleRemoveSession: UI.ActionHandler<SessionType> = ({ itemData: session }) => {\r\n return SocketService.delete(`${sessionsUrl}/${session.id}`);\r\n };\r\n\r\n const SessionRemoveAction = {\r\n id: 'remove',\r\n displayName: 'Close',\r\n access: editAccess,\r\n icon: IconConstants.REMOVE,\r\n handler: handleRemoveSession,\r\n };\r\n\r\n return SessionRemoveAction;\r\n};\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LocalSettingStore from 'stores/LocalSettingStore';\r\nimport { LocalSettings } from 'constants/SettingConstants';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\ntype SessionType = UI.SessionItemBase;\r\n\r\ninterface ActiveSessionDecoratorProps<\r\n SessionT extends SessionType,\r\n ActionT extends object,\r\n> extends Pick<SessionChildProps<SessionT, ActionT>, 'session'> {\r\n sessionApi: UI.SessionActions<SessionT> & ActionT;\r\n //uiActions:\r\n //session: SessionT;\r\n}\r\n\r\n// This decorator will fire updates for currently active session\r\n// and set them as read\r\nexport default function <\r\n PropsT,\r\n SessionT extends SessionType,\r\n ActionT extends object = UI.EmptyObject,\r\n>(Component: React.ComponentType<PropsT>, useReadDelay = false) {\r\n class ActiveSessionDecorator extends React.Component<\r\n PropsT & ActiveSessionDecoratorProps<SessionT, ActionT>\r\n > {\r\n /*static propTypes = {\r\n session: PropTypes.any, // Required (cloned)\r\n actions: PropTypes.object, // Required (cloned)\r\n };*/\r\n\r\n readTimeout: number | undefined;\r\n\r\n setRead = (session: SessionT) => {\r\n this.props.sessionApi.setRead(session);\r\n this.readTimeout = undefined;\r\n };\r\n\r\n setSession = (session: SessionT | null) => {\r\n if (this.readTimeout) {\r\n // Set the previously active session as read\r\n clearTimeout(this.readTimeout);\r\n this.setRead(this.props.session);\r\n }\r\n\r\n this.props.sessionApi.sessionChanged(session);\r\n if (!session) {\r\n return;\r\n }\r\n\r\n const timeout = !useReadDelay\r\n ? 0\r\n : LocalSettingStore.getValue<number>(LocalSettings.UNREAD_LABEL_DELAY) * 1000;\r\n this.readTimeout = window.setTimeout(() => this.setRead(session), timeout);\r\n };\r\n\r\n componentDidMount() {\r\n this.setSession(this.props.session);\r\n }\r\n\r\n componentWillUnmount() {\r\n this.setSession(null);\r\n }\r\n\r\n componentDidUpdate(prevProps: ActiveSessionDecoratorProps<SessionT, ActionT>) {\r\n if (this.props.session.id !== prevProps.session.id) {\r\n this.setSession(this.props.session);\r\n }\r\n }\r\n\r\n render() {\r\n return <Component {...this.props} />;\r\n }\r\n }\r\n\r\n return ActiveSessionDecorator;\r\n}\r\n","import * as React from 'react';\n\nimport * as UI from 'types/ui';\n\ninterface FooterItemProps {\n label?: string;\n text: string | React.ReactElement<any>;\n}\n\nexport const FooterItem: React.FC<FooterItemProps> = ({ label, text }) => (\n <div className=\"grid-item\">\n <div className=\"item-inner\">\n {!!label && typeof text === 'string' ? `${label}: ${text}` : text}\n </div>\n </div>\n);\n\nexport const SessionFooter: React.FC<UI.PropsWithChildren> = ({ children }) => (\n <div className=\"session-footer\">\n <div className=\"ui footer divider\" />\n <div className=\"info-grid ui\">{children}</div>\n </div>\n);\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport ActionButton from 'components/ActionButton';\r\nimport SectionedDropdown from 'components/semantic/SectionedDropdown';\r\nimport MenuSection from 'components/semantic/MenuSection';\r\nimport { MenuIcon } from 'components/icon/MenuIcon';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { SessionMainLayoutProps } from './types';\r\n\r\ntype SessionDropdownProps<SessionT extends UI.SessionItemBase> = Pick<\r\n SessionMainLayoutProps<SessionT>,\r\n 'sessionMenuItems' | 'newButton' | 'unreadInfoStore' | 'listActionMenuGetter'\r\n>;\r\n\r\nconst SessionDropdown = <SessionT extends UI.SessionItemBase>({\r\n sessionMenuItems,\r\n newButton,\r\n unreadInfoStore,\r\n listActionMenuGetter,\r\n}: SessionDropdownProps<SessionT>) => {\r\n const { t } = useTranslation();\r\n return (\r\n <SectionedDropdown\r\n triggerIcon={\r\n <MenuIcon\r\n urgencies={unreadInfoStore ? unreadInfoStore.getTotalUrgencies() : null}\r\n />\r\n }\r\n >\r\n <MenuSection caption={translate('New', t, UI.Modules.COMMON)}>\r\n {newButton}\r\n </MenuSection>\r\n <MenuSection caption={translate('Current sessions', t, UI.Modules.COMMON)}>\r\n {sessionMenuItems}\r\n </MenuSection>\r\n <MenuSection>{listActionMenuGetter()}</MenuSection>\r\n </SectionedDropdown>\r\n );\r\n};\r\n\r\ntype CloseButtonProps<\r\n SessionT extends UI.SessionItemBase,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n> = Pick<\r\n SessionMainLayoutProps<SessionT, UI.EmptyObject, UIActionsT>,\r\n 'actions' | 'activeItem'\r\n>;\r\n\r\nconst CloseButton = <\r\n SessionT extends UI.SessionItemBase,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n actions,\r\n activeItem,\r\n}: CloseButtonProps<SessionT, UIActionsT>) => {\r\n if (!activeItem || useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n /*const closeAction = Object.values(actions.actions).find(\r\n (action) => !!action && action.id === 'remove',\r\n ) as UI.ActionDefinition<UI.SessionItemBase>;*/\r\n\r\n const closeAction = Object.values(actions.actions)[\r\n Object.values(actions.actions).length - 1\r\n ];\r\n return (\r\n <ActionButton\r\n className=\"basic small item close-button\"\r\n action={closeAction as UI.ActionDefinition<UI.SessionItemBase>}\r\n moduleData={actions.moduleData}\r\n itemData={activeItem}\r\n icon={IconConstants.CLOSE}\r\n />\r\n );\r\n};\r\n\r\ntype SessionItemHeaderProps = Pick<\r\n SessionMainLayoutProps<any>,\r\n 'itemHeaderIcon' | 'itemHeaderTitle'\r\n>;\r\n\r\nconst SessionItemHeader: React.FC<SessionItemHeaderProps> = ({\r\n itemHeaderIcon,\r\n itemHeaderTitle,\r\n}) => (\r\n <div className=\"session-header\">\r\n {itemHeaderIcon}\r\n {itemHeaderTitle}\r\n </div>\r\n);\r\n\r\nconst TopMenuLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n children,\r\n onKeyDown,\r\n ...props\r\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => (\r\n <div className=\"session-container vertical\" onKeyDown={onKeyDown} tabIndex={0}>\r\n <div className=\"ui main menu menu-bar\">\r\n <div className=\"content-left\">\r\n <SessionDropdown {...props} />\r\n <SessionItemHeader {...props} />\r\n </div>\r\n <CloseButton {...props} />\r\n </div>\r\n\r\n <div className=\"session-layout\">{children}</div>\r\n </div>\r\n);\r\n\r\n/*TopMenuLayout.propTypes = {\r\n itemHeaderTitle: PropTypes.node.isRequired,\r\n itemHeaderIcon: PropTypes.node.isRequired,\r\n activeItem: PropTypes.object,\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n closeAction: PropTypes.func.isRequired,\r\n listActionMenuGetter: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default TopMenuLayout;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { Grid } from 'components/semantic/Grid';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { SessionMainLayoutProps } from './types';\r\n\r\nconst SideMenuLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>({\r\n sessionMenuItems,\r\n newButton,\r\n itemHeaderIcon,\r\n itemHeaderTitle,\r\n children,\r\n itemHeaderDescription,\r\n onKeyDown,\r\n}: SessionMainLayoutProps<SessionT, SessionApiT, UIActionsT>) => {\r\n if (newButton) {\r\n newButton = React.cloneElement(newButton, {\r\n className: newButton.props.className + ' ui fluid button',\r\n });\r\n }\r\n\r\n return (\r\n <Grid className=\"session-container horizontal\" onKeyDown={onKeyDown} tabIndex={0}>\r\n <div className=\"four wide column menu-column\">\r\n {newButton}\r\n {!!sessionMenuItems.length && (\r\n <div className=\"ui vertical secondary menu\">{sessionMenuItems}</div>\r\n )}\r\n </div>\r\n <div className=\"twelve wide stretched column content-column session\">\r\n <div className=\"ui segment session-layout\">\r\n <LayoutHeader\r\n className=\"session-header\"\r\n icon={itemHeaderIcon}\r\n title={<div className=\"title\">{itemHeaderTitle}</div>}\r\n subHeader={itemHeaderDescription}\r\n />\r\n <div className=\"ui divider\" style={{ margin: '5px 0px 0px 0px' }} />\r\n {children}\r\n </div>\r\n </div>\r\n </Grid>\r\n );\r\n};\r\n\r\n/*SideMenuLayout.propTypes = {\r\n newButton: PropTypes.node,\r\n sessionMenuItems: PropTypes.array.isRequired,\r\n\r\n itemHeaderTitle: PropTypes.node,\r\n itemHeaderIcon: PropTypes.node,\r\n itemHeaderDescription: PropTypes.node.isRequired,\r\n};*/\r\n\r\nexport default SideMenuLayout;\r\n","import invariant from 'invariant';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { useNavigate } from 'react-router-dom';\r\nimport { SessionLocationState } from '../types';\r\n\r\ninterface SessionRouteHelperProps {\r\n baseUrl: string;\r\n}\r\n\r\nexport const useSessionRouteHelpers = ({ baseUrl }: SessionRouteHelperProps) => {\r\n const navigate = useNavigate();\r\n\r\n // HELPERS\r\n const getSessionUrl = (id: API.IdType) => {\r\n invariant(!!id, 'Trying to get session URL without a session');\r\n return `/${baseUrl}/session/${id}`;\r\n };\r\n\r\n const pushSession = (id: API.IdType) => {\r\n navigate(getSessionUrl(id));\r\n };\r\n\r\n const replaceSession = (id: API.IdType, state?: SessionLocationState) => {\r\n navigate(getSessionUrl(id), { replace: true, state });\r\n };\r\n\r\n const newUrl = `/${baseUrl}/new`;\r\n const replaceNew = () => {\r\n // const { navigate } = props;\r\n navigate(newUrl, { replace: true });\r\n };\r\n\r\n return {\r\n newUrl: `/${baseUrl}/new`,\r\n replaceNew,\r\n\r\n getSessionUrl,\r\n pushSession,\r\n replaceSession,\r\n };\r\n};\r\n","import * as React from 'react';\r\n\r\nimport { loadLocalProperty, saveLocalProperty } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useLocation } from 'react-router-dom';\r\nimport { useSessionRouteHelpers } from './useSessionHelpers';\r\nimport { SessionLocationState } from '../types';\r\n\r\nconst findItem = <SessionT extends UI.SessionItemBase>(\r\n items: SessionT[],\r\n id: API.IdType | undefined,\r\n): SessionT | undefined => {\r\n return items.find((item) => item.id === id);\r\n};\r\n\r\nexport interface SessionManagerProps<\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n> {\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | undefined;\r\n\r\n // Array of the items to list\r\n items: SessionT[];\r\n\r\n baseUrl: string;\r\n\r\n sessionApi: UI.SessionActions<SessionT> & SessionApiT;\r\n}\r\n\r\nexport const useSessionManager = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n>(\r\n props: SessionManagerProps<SessionT, SessionApiT>,\r\n) => {\r\n const [activeItem, setActiveItem] = React.useState<SessionT | null>(null);\r\n const location = useLocation();\r\n\r\n const { pushSession, replaceSession, newUrl, replaceNew } = useSessionRouteHelpers({\r\n baseUrl: props.baseUrl,\r\n });\r\n\r\n // HELPERS\r\n const getStorageKey = () => {\r\n return `${props.baseUrl}_last_active`;\r\n };\r\n\r\n // Common logic for selecting the item to display (after mounting or session updates)\r\n // Returns true active item selection was handled\r\n // Returns false if the active item couldn't be selected but there are valid items to choose from by the caller\r\n const checkActiveItem = () => {\r\n // Did we just create this session?\r\n const routerLocation = location;\r\n const pending =\r\n routerLocation.state && (routerLocation.state as SessionLocationState).pending;\r\n\r\n // Update the active item\r\n const activeItemNew = findItem(props.items, props.activeId);\r\n if (activeItemNew) {\r\n if (pending) {\r\n // Disable pending state\r\n replaceSession(activeItemNew.id, {\r\n pending: false,\r\n });\r\n\r\n return true;\r\n }\r\n\r\n setActiveItem(activeItemNew);\r\n saveLocalProperty(getStorageKey(), props.activeId);\r\n return true;\r\n } else if (pending) {\r\n // We'll just display a loading indicator in 'render', no item needed\r\n return true;\r\n } else if (/*routerLocation.action === 'POP' ||*/ props.items.length === 0) {\r\n // Browsing from history and item removed (or all items removed)... go to \"new session\" page\r\n replaceNew();\r\n setActiveItem(null);\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n // LIFECYCLE/REACT\r\n // Set the session early so that we wont' flash the \"new session\" layout\r\n React.useLayoutEffect(() => {\r\n if (location.pathname === newUrl) {\r\n // Don't redirect to it if the \"new session\" layout is open\r\n if (activeItem) {\r\n setActiveItem(null);\r\n }\r\n return;\r\n }\r\n\r\n if (checkActiveItem()) {\r\n // We got an item\r\n return;\r\n }\r\n\r\n if (!activeItem) {\r\n const lastId = loadLocalProperty<API.IdType>(getStorageKey());\r\n if (lastId && findItem(props.items, lastId)) {\r\n // Previous session exists\r\n replaceSession(lastId);\r\n return;\r\n }\r\n }\r\n\r\n // The old tab was closed or we didn't have any session before\r\n\r\n const { items, activeId } = props;\r\n let newItemPos = 0;\r\n const oldItem = findItem(items, activeId);\r\n if (oldItem) {\r\n // Find the old position and use the item in that position (if possible)\r\n newItemPos = items.indexOf(oldItem);\r\n if (newItemPos === items.length - 1) {\r\n // The last item was removed\r\n newItemPos = newItemPos - 1;\r\n }\r\n }\r\n\r\n replaceSession(items[newItemPos].id);\r\n }, [location, props.items]);\r\n\r\n const onKeyDown = (event: React.KeyboardEvent) => {\r\n const { key, altKey } = event;\r\n\r\n if (altKey && (key === 'ArrowUp' || key === 'ArrowDown')) {\r\n // Arrow up/down\r\n event.preventDefault();\r\n\r\n const { items, activeId } = props;\r\n const item = findItem(items, activeId);\r\n if (!item) {\r\n return;\r\n }\r\n\r\n const currentIndex = items.indexOf(item);\r\n if (currentIndex === -1) {\r\n return;\r\n }\r\n\r\n const newSession = items[key === 'ArrowUp' ? currentIndex - 1 : currentIndex + 1];\r\n if (newSession) {\r\n pushSession(newSession.id);\r\n }\r\n } else if (altKey && key === 'Insert') {\r\n // Insert\r\n event.preventDefault();\r\n\r\n replaceNew();\r\n } else if (altKey && key === 'Delete') {\r\n // Delete\r\n event.preventDefault();\r\n\r\n const { items, activeId, sessionApi } = props;\r\n const item = findItem(items, activeId);\r\n if (!!item) {\r\n sessionApi.removeSession(item);\r\n }\r\n }\r\n };\r\n\r\n return {\r\n onKeyDown,\r\n activeItem,\r\n };\r\n};\r\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!./sessions.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!./sessions.css\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\ninterface SessionNewButtonProps {\r\n url: string;\r\n title: React.ReactNode;\r\n className?: string;\r\n}\r\n\r\nconst SessionNewButton: React.FC<SessionNewButtonProps> = ({\r\n url,\r\n title,\r\n // pushNew,\r\n className,\r\n}) => (\r\n <RouterMenuItemLink\r\n key=\"button-new\"\r\n className={classNames('new', className)}\r\n icon={IconConstants.CREATE}\r\n url={url}\r\n >\r\n {title}\r\n </RouterMenuItemLink>\r\n);\r\n\r\nexport default SessionNewButton;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport RouterMenuItemLink from 'components/semantic/RouterMenuItemLink';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\ninterface SessionMenuItemProps {\r\n url: string;\r\n name: React.ReactNode;\r\n unreadInfoStore: UI.UnreadInfoStore;\r\n status: React.ReactElement<any>;\r\n sessionItem: UI.SessionItemBase;\r\n}\r\n\r\nconst SessionMenuItem: React.FC<SessionMenuItemProps> = ({\r\n sessionItem,\r\n status,\r\n name,\r\n unreadInfoStore,\r\n url,\r\n}) => (\r\n <RouterMenuItemLink\r\n url={url}\r\n className=\"session-item\"\r\n icon={status}\r\n session={sessionItem}\r\n unreadInfoStore={unreadInfoStore}\r\n >\r\n <span className=\"session-name\">{name}</span>\r\n </RouterMenuItemLink>\r\n);\r\n\r\n/*SessionMenuItem.propTypes = {\r\n // Item URL\r\n url: PropTypes.string.isRequired,\r\n\r\n name: PropTypes.node.isRequired,\r\n\r\n unreadInfoStore: PropTypes.object.isRequired,\r\n\r\n status: PropTypes.node.isRequired,\r\n\r\n sessionItem: PropTypes.object.isRequired,\r\n\r\n pushSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default SessionMenuItem;\r\n","import { ActionMenu } from 'components/action-menu';\r\nimport SessionNewButton from './SessionNewButton';\r\nimport SessionMenuItem from './SessionMenuItem';\r\n\r\nimport Icon from 'components/semantic/Icon';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { SessionLayoutLabels, SessionLayoutManageProps } from './types';\r\nimport { useLocation } from 'react-router-dom';\r\nimport { useSessionRouteHelpers } from './effects/useSessionHelpers';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\nexport const useComponents = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject,\r\n>(\r\n props: UI.SessionInfoGetter<SessionT> & {\r\n activeItem: SessionT | null;\r\n hasEditAccess: boolean;\r\n } & SessionLayoutLabels &\r\n SessionLayoutManageProps<SessionT, SessionApiT, UIActionT>,\r\n) => {\r\n const location = useLocation();\r\n const { t } = useTranslation();\r\n const { newUrl, getSessionUrl } = useSessionRouteHelpers({\r\n baseUrl: props.baseUrl,\r\n });\r\n\r\n // COMPONENT GETTERS\r\n const getItemStatus = (sessionItem: SessionT) => {\r\n const { itemStatusGetter, itemHeaderIconGetter } = props;\r\n if (itemStatusGetter) {\r\n return (\r\n <div\r\n className={\r\n 'ui session-status empty circular left mini label ' +\r\n itemStatusGetter(sessionItem)\r\n }\r\n />\r\n );\r\n }\r\n\r\n return <Icon icon={itemHeaderIconGetter(sessionItem)} />;\r\n };\r\n\r\n const components = {\r\n getItemHeaderDescription: () => {\r\n const { itemHeaderDescriptionGetter, newDescription, activeItem } = props;\r\n if (!activeItem) {\r\n return newDescription;\r\n }\r\n\r\n return itemHeaderDescriptionGetter(activeItem);\r\n },\r\n getItemHeaderIcon: () => {\r\n const { itemHeaderIconGetter, newIcon, activeItem } = props;\r\n return <Icon icon={activeItem ? itemHeaderIconGetter(activeItem) : newIcon} />;\r\n },\r\n getItemHeaderTitle: () => {\r\n const { activeItem, newCaption, remoteMenuId } = props;\r\n if (!activeItem) {\r\n return <div>{newCaption}</div>;\r\n }\r\n\r\n const { uiActions, actionIds, itemNameGetter, itemHeaderTitleGetter } = props;\r\n\r\n const ids = actionIds ? [...actionIds, 'divider', 'remove'] : undefined;\r\n const actionMenu = (\r\n <ActionMenu\r\n caption={itemNameGetter(activeItem)}\r\n actions={uiActions}\r\n itemData={activeItem}\r\n ids={ids}\r\n remoteMenuId={remoteMenuId}\r\n />\r\n );\r\n\r\n // Use the header getter only if there is a getter that returns a valid value\r\n if (itemHeaderTitleGetter) {\r\n const header = itemHeaderTitleGetter(activeItem, location, actionMenu);\r\n if (header) {\r\n return header;\r\n }\r\n }\r\n\r\n return actionMenu;\r\n },\r\n getSessionActionMenuItems: () => {\r\n const { items, hasEditAccess } = props;\r\n if (!hasEditAccess || items.length === 0) {\r\n return null;\r\n }\r\n\r\n const handleCloseAll = () => {\r\n const { sessionApi, items } = props;\r\n items.forEach((session) => sessionApi.removeSession(session));\r\n };\r\n\r\n return (\r\n <MenuItemLink key=\"close\" onClick={handleCloseAll} icon={IconConstants.REMOVE}>\r\n {translate('Close all', t, UI.Modules.COMMON)}\r\n </MenuItemLink>\r\n );\r\n },\r\n getNewButton: () => {\r\n const { newCaption, hasEditAccess } = props;\r\n if (!hasEditAccess || !newCaption) {\r\n return null;\r\n }\r\n\r\n return <SessionNewButton key=\"new-button\" title={newCaption} url={newUrl} />;\r\n },\r\n getSessionMenuItems: () => {\r\n const getSessionMenuItem = (sessionItem: SessionT) => {\r\n const { itemNameGetter, unreadInfoStore } = props;\r\n return (\r\n <SessionMenuItem\r\n key={sessionItem.id}\r\n url={getSessionUrl(sessionItem.id)}\r\n name={itemNameGetter(sessionItem)}\r\n unreadInfoStore={unreadInfoStore}\r\n status={getItemStatus(sessionItem)}\r\n sessionItem={sessionItem}\r\n />\r\n );\r\n };\r\n\r\n return props.items.map(getSessionMenuItem);\r\n },\r\n };\r\n\r\n return components;\r\n};\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\n\r\nimport TopMenuLayout from './TopMenuLayout';\r\nimport SideMenuLayout from './SideMenuLayout';\r\n\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { useLayoutWidth } from 'context/LayoutWidthContext';\r\nimport { useSessionManager } from './effects/useSessionManager';\r\nimport { useLocation, useNavigate } from 'react-router';\r\n\r\nimport '../sessions.css';\r\nimport {\r\n NewSessionLayoutProps,\r\n SessionChildProps,\r\n SessionLayoutLabels,\r\n SessionLayoutManageProps,\r\n SessionLocationState,\r\n} from './types';\r\nimport { useComponents } from './SessionMenuComponents';\r\n\r\nexport interface SessionLayoutProps<\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object = UI.EmptyObject,\r\n UIActionT extends UI.ActionListType<UI.SessionItemBase> = UI.EmptyObject,\r\n> extends UI.SessionInfoGetter<SessionT>,\r\n SessionLayoutLabels,\r\n SessionLayoutManageProps<SessionT, SessionApiT, UIActionT> {\r\n // Item ID that is currently active (if any)\r\n activeId: API.IdType | undefined;\r\n\r\n // Set to false if the side menu should never be shown (the session will use all width that is available)\r\n disableSideMenu?: boolean;\r\n\r\n sessionItemLayout: React.ComponentType<\r\n SessionChildProps<SessionT, SessionApiT, UIActionT>\r\n >;\r\n\r\n newLayout?: React.ComponentType<NewSessionLayoutProps>;\r\n\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst SessionLayout = <\r\n SessionT extends UI.SessionItemBase,\r\n SessionApiT extends object,\r\n UIActionsT extends UI.ActionListType<UI.SessionItemBase>,\r\n>(\r\n props: SessionLayoutProps<SessionT, SessionApiT, UIActionsT>,\r\n) => {\r\n const layoutWidth = useLayoutWidth();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const { activeItem, onKeyDown } = useSessionManager(props);\r\n\r\n const hasEditAccess = LoginStore.hasAccess(props.editAccess);\r\n\r\n const getSessionChildren = () => {\r\n const {\r\n activeId,\r\n items,\r\n sessionItemLayout: SessionItemLayout,\r\n sessionApi,\r\n uiActions,\r\n sessionT,\r\n } = props;\r\n\r\n if (!activeItem) {\r\n const { state } = location;\r\n if (!!state && (state as SessionLocationState).pending) {\r\n // The session was just created\r\n return (\r\n <Loader\r\n text={translate(\r\n 'Waiting for server response',\r\n sessionT.plainT,\r\n UI.Modules.COMMON,\r\n )}\r\n />\r\n );\r\n } else if (activeId || items.length !== 0) {\r\n // Redirecting to a new page\r\n return (\r\n <Loader\r\n text={translate('Loading session', sessionT.plainT, UI.Modules.COMMON)}\r\n />\r\n );\r\n }\r\n\r\n console.error('SessionLayout route: active session missing');\r\n return;\r\n }\r\n\r\n // We have a session\r\n return (\r\n <SessionItemLayout\r\n session={activeItem}\r\n sessionApi={sessionApi}\r\n uiActions={uiActions}\r\n location={location}\r\n navigate={navigate}\r\n sessionT={sessionT}\r\n />\r\n );\r\n };\r\n\r\n const getChildren = () => {\r\n const { newLayout: NewLayout, sessionT } = props;\r\n if (!props.activeId && NewLayout) {\r\n return <NewLayout navigate={navigate} location={location} sessionT={sessionT} />;\r\n }\r\n\r\n return getSessionChildren();\r\n };\r\n\r\n const { disableSideMenu, items, unreadInfoStore, sessionT, uiActions } = props;\r\n\r\n if (!hasEditAccess && items.length === 0) {\r\n // Nothing to show\r\n return (\r\n <Message\r\n title={translate('No items to show', sessionT.plainT, UI.Modules.COMMON)}\r\n description={sessionT.plainT<string>(\r\n toI18nKey('noSessionEditAccess', UI.Modules.COMMON),\r\n `You aren't allowed to open new sessions`,\r\n )}\r\n />\r\n );\r\n }\r\n\r\n const useTopMenu = disableSideMenu || useMobileLayout(layoutWidth);\r\n\r\n const MenuLayout = useTopMenu ? TopMenuLayout : SideMenuLayout;\r\n const {\r\n getItemHeaderTitle,\r\n getItemHeaderDescription,\r\n getItemHeaderIcon,\r\n getNewButton,\r\n getSessionMenuItems,\r\n getSessionActionMenuItems,\r\n } = useComponents({ ...props, activeItem, hasEditAccess });\r\n return (\r\n <MenuLayout\r\n itemHeaderTitle={getItemHeaderTitle()}\r\n itemHeaderDescription={getItemHeaderDescription()}\r\n itemHeaderIcon={getItemHeaderIcon()}\r\n newButton={getNewButton()}\r\n sessionMenuItems={getSessionMenuItems()}\r\n listActionMenuGetter={getSessionActionMenuItems}\r\n activeItem={activeItem}\r\n unreadInfoStore={unreadInfoStore}\r\n onKeyDown={onKeyDown}\r\n actions={uiActions}\r\n >\r\n {getChildren()}\r\n </MenuLayout>\r\n );\r\n};\r\n\r\nexport default SessionLayout;\r\n","import * as React from 'react';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport { useStore } from 'effects/StoreListenerEffect';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { getModuleT, translate } from 'utils/TranslationUtils';\r\nimport { useParams } from 'react-router-dom';\r\n\r\nexport interface SessionProviderDecoratorProps {}\r\n\r\nexport interface SessionProviderDecoratorChildProps<SessionT extends UI.SessionType> {\r\n items: SessionT[];\r\n sessionT: UI.ModuleTranslator;\r\n params: UI.RouteParams;\r\n}\r\n\r\nconst SessionProviderDecorator = <SessionT extends UI.SessionType>(\r\n Component: React.ComponentType<SessionProviderDecoratorChildProps<SessionT>>,\r\n store: UI.SessionStore<SessionT>,\r\n moduleId: UI.Modules,\r\n) => {\r\n const Decorator = (props: SessionProviderDecoratorProps) => {\r\n const { t } = useTranslation();\r\n const sessionT = getModuleT(t, moduleId);\r\n const params = useParams();\r\n const sessions = useStore<SessionT[]>(store);\r\n if (!store.isInitialized()) {\r\n return <Loader text={translate('Loading sessions', t, UI.Modules.COMMON)} />;\r\n }\r\n\r\n return <Component items={sessions} params={params} sessionT={sessionT} />;\r\n };\r\n\r\n return Decorator;\r\n};\r\n\r\nexport { SessionProviderDecorator };\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","BuildRemoveSessionAction","sessionsUrl","editAccess","displayName","access","icon","REMOVE","handler","itemData","session","delete","Component","useReadDelay","ActiveSessionDecorator","setRead","this","props","sessionApi","readTimeout","undefined","setSession","clearTimeout","sessionChanged","timeout","getValue","UNREAD_LABEL_DELAY","window","setTimeout","componentDidMount","componentWillUnmount","componentDidUpdate","prevProps","render","FooterItem","label","text","className","SessionFooter","children","SessionDropdown","sessionMenuItems","newButton","unreadInfoStore","listActionMenuGetter","t","SectionedDropdown","triggerIcon","MenuIcon","urgencies","getTotalUrgencies","MenuSection","caption","COMMON","CloseButton","actions","activeItem","closeAction","Object","values","length","ActionButton","A","action","moduleData","IconConstants","CLOSE","SessionItemHeader","itemHeaderIcon","itemHeaderTitle","onKeyDown","tabIndex","itemHeaderDescription","Grid","LayoutHeader","title","subHeader","style","margin","useSessionRouteHelpers","baseUrl","navigate","getSessionUrl","newUrl","replaceNew","replace","pushSession","replaceSession","state","findItem","items","find","item","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","url","RouterMenuItemLink","CREATE","sessionItem","status","name","layoutWidth","location","setActiveItem","getStorageKey","pathname","routerLocation","pending","activeItemNew","activeId","checkActiveItem","lastId","newItemPos","oldItem","indexOf","event","key","altKey","preventDefault","removeSession","currentIndex","newSession","useSessionManager","hasEditAccess","LoginStore","hasAccess","disableSideMenu","sessionT","uiActions","Message","plainT","description","MenuLayout","getItemHeaderTitle","getItemHeaderDescription","getItemHeaderIcon","getNewButton","getSessionMenuItems","getSessionActionMenuItems","getItemStatus","itemStatusGetter","itemHeaderIconGetter","Icon","itemHeaderDescriptionGetter","newDescription","newIcon","newCaption","remoteMenuId","actionIds","itemNameGetter","itemHeaderTitleGetter","ids","actionMenu","header","MenuItemLink","onClick","forEach","map","useComponents","newLayout","NewLayout","sessionItemLayout","SessionItemLayout","Loader","console","error","getSessionChildren","getChildren","SessionProviderDecorator","store","moduleId","params","sessions","isInitialized"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[760],{52237:(e,t,s)=>{s.d(t,{A:()=>a});var n=s(71354),i=s.n(n),o=s(76314),r=s.n(o)()(i());r.push([e.id,".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:[".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n"],sourceRoot:""}]);const a=r},98737:(e,t,s)=>{s.d(t,{A:()=>a});var n=s(71354),i=s.n(n),o=s(76314),r=s.n(o)()(i());r.push([e.id,"#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Filelists/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB",sourcesContent:["#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n"],sourceRoot:""}]);const a=r},90264:(e,t,s)=>{s.d(t,{G:()=>L});var n=s(74848),i=(s(96540),s(98573)),o=s(71352),r=s(86038),a=s(67749),l=s(32389),c=s(42695),d=s(85072),A=s.n(d),p=s(97825),u=s.n(p),m=s(77659),h=s.n(m),f=s(55056),E=s.n(f),x=s(10540),y=s.n(x),g=s(41113),I=s.n(g),w=s(52237),S={};S.styleTagTransform=I(),S.setAttributes=E(),S.insert=h().bind(null,"head"),S.domAPI=u(),S.insertStyleElement=y(),A()(w.A,S),w.A&&w.A.locals&&w.A.locals;var b=s(73070);const v={[r.YF.SHARE_PARTIAL]:"Share (partial)",[r.YF.SHARE_FULL]:"Share (full)",[r.YF.QUEUE_PARTIAL]:"Queue (partial)",[r.YF.QUEUE_FULL]:"Queue (full)",[r.YF.FINISHED_PARTIAL]:"Finished (partial)",[r.YF.FINISHED_FULL]:"Finished (full)",[r.YF.SHARE_QUEUE]:"Share and queue",[r.YF.SHARE_FINISHED]:"Share and finished",[r.YF.QUEUE_FINISHED]:"Queue and finished",[r.YF.SHARE_QUEUE_FINISHED]:"Share, queue and finished"},j=({paths:e})=>(0,n.jsx)("div",{className:"dupe-paths",children:e.map((e=>(0,n.jsx)("div",{className:"path",children:e},e)))}),L=({session:e,fileItem:t,user:s,downloadHandler:r,showPath:d=!0})=>{const{t:A}=(0,l.Bd)(),p=e=>(0,c.Tl)(e,A,a.KV.COMMON);return(0,n.jsxs)("div",{className:"ui fileitem info segment",children:[(0,n.jsxs)(b.xA,{columns:"two",stackable:!0,children:[(0,n.jsx)(b.fI,{title:p("Name"),text:t.name}),(0,n.jsx)(b.fI,{title:p("Type/content"),text:t.type.str}),(0,n.jsx)(b.fI,{title:p("Size"),text:(0,i.Xq)(t.size,A,!0)}),(0,n.jsx)(b.fI,{title:p("Last modified"),text:(0,i.fw)(t.time||0)}),"file"===t.type.id&&(0,n.jsx)(b.fI,{title:p("TTH"),text:t.tth}),!!t.dupe&&(0,n.jsx)(b.fI,{title:p("Dupe type"),text:p(v[t.dupe.id])}),!!t.dupe&&(0,n.jsx)(b.fI,{title:p("Dupe paths"),text:(0,n.jsx)(j,{paths:t.dupe.paths})}),d&&(0,n.jsx)(b.fI,{title:p("Path"),text:t.path})]}),(0,n.jsx)(o.gU,{caption:p("Actions..."),button:!0,user:s,itemInfoGetter:()=>t,downloadHandler:r,contextElement:".ui.modal > .content",entity:e})]})}},86818:(e,t,s)=>{s.d(t,{A:()=>i});const n="share_profiles",i={MODULE_URL:n,PROFILES_URL:n,PROFILE_ADDED:"share_profile_added",PROFILE_UPDATED:"share_profile_updated",PROFILE_REMOVED:"share_profile_removed",HIDDEN_PROFILE_ID:1}},71299:(e,t,s)=>{s.d(t,{A:()=>l,T:()=>a});var n=s(2543),i=s(86818),o=s(13546),r=s(98573);const a=e=>({id:e.id,name:e.str}),l=function(e,t,s,a=!0){return(0,o.A)(e,(0,n.merge)(s,{urls:{profiles:i.A.PROFILES_URL},dataConverters:{profiles:(e,{t:s})=>{const n=e.filter((e=>t||e.id!==i.A.HIDDEN_PROFILE_ID)).map((e=>((e,t)=>{let s=e.str;return a&&e.id!==i.A.HIDDEN_PROFILE_ID&&(s+=` (${(0,r.Xq)(e.size,t)})`),Object.assign(Object.assign({},e),{str:s})})(e,s)));return n}},onSocketConnected:(e,{refetchData:t})=>{e(i.A.MODULE_URL,i.A.PROFILE_ADDED,(()=>t())),e(i.A.MODULE_URL,i.A.PROFILE_UPDATED,(()=>t())),e(i.A.MODULE_URL,i.A.PROFILE_REMOVED,(()=>t()))}}))}},62705:(e,t,s)=>{s.d(t,{A:()=>p});var n=s(74848),i=(s(96540),s(13546)),o=s(98573),r=s(31224),a=s(2253),l=s(93226),c=s(67749),d=s(42695),A=s(32389);const p=(0,i.A)((({entries:e,entryTitleRenderer:t,hasSession:s,entryIcon:i})=>{const{t:l}=(0,A.Bd)();return 0===e.length?null:(0,n.jsxs)("div",{className:"recents",children:[(0,n.jsx)(r.A,{title:(0,d.Tl)("Recent sessions",l,c.KV.COMMON),size:""}),(0,n.jsx)("div",{className:"ui relaxed divided list",children:e.map(((e,r)=>(0,n.jsx)(a.c,{header:t(e),description:!!e.last_opened&&l((0,d.j2)("openedAgo",c.KV.COMMON),{defaultValue:"Opened {{timeAgo}}",replace:{timeAgo:(0,o.fw)(e.last_opened)}}),icon:(s(e)?"green ":"")+i},r)))})]})}),{urls:{entries:({entryType:e},t)=>t.get(`${l.Ay.SESSIONS_URL}/${e}/0`)}})},22187:(e,t,s)=>{s.d(t,{A:()=>l});var n=s(74848),i=s(77856),o=s(71352),r=s(93866),a=s(39115);function l(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:t}=e.user;return(0,i.Z)(t)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,n.jsx)(r.A,{flags:e.user.flags}),itemHeaderTitleGetter(t,s,i){const{user:r}=t;return(0,n.jsx)(o.Bg,{user:r,ids:e,remoteMenuId:a.Ay.HINTED_USER,children:i})}}}},50747:(e,t,s)=>{s.r(t),s.d(t,{default:()=>_e});var n=s(74848),i=s(96540),o=s(91950),r=s(22187),a=s(17585),l=s(40599),c=s(62705),d=s(90425),A=s(27725),p=s(71299);class u extends i.Component{constructor(){super(...arguments),this.onClick=e=>{this.props.onProfileChanged(e.id)},this.getDropdownItem=e=>(0,n.jsx)(A.A,{onClick:()=>this.props.onProfileChanged(e.id),children:e.str},e.id)}render(){const{sessionT:e,profiles:t}=this.props;return(0,n.jsx)(d.A,{className:"profile top right pointing",caption:e.translate("Browse own share..."),triggerIcon:"",children:t.map(this.getDropdownItem)})}}const m=(0,p.A)(u,!1);var h=s(93226),f=s(4425),E=s(84855);const x=e=>{const t=t=>{const{navigate:s,location:n}=e;l.A.createSession({user:t},{navigate:s,location:n,sessionStore:a.A})},{sessionT:s}=e;return(0,n.jsxs)("div",{className:"filelist session new",children:[(0,n.jsx)(E.M,{onChange:t,offlineMessage:s.t("offlineMessage","You must to be connected to at least one hub in order to download filelists from other users"),isClearable:!1,autoFocus:!0}),(0,n.jsx)(m,{onProfileChanged:t=>{const{navigate:s,location:n}=e;l.A.ownList(t,{navigate:s,location:n,sessionStore:a.A})},sessionT:s}),(0,n.jsx)(c.A,{entryType:h.iM.FILELIST,hasSession:e=>a.A.getSession(e.user.cid),entryTitleRenderer:e=>(0,n.jsx)("a",{onClick:s=>t(e.user),children:e.user.nicks+(e.description?` (${e.description})`:"")}),entryIcon:f.A.FILELISTS_PLAIN})]})};var y=s(98573),g=s(38453),I=s(8098);const w=({session:e,sessionT:t})=>{if((0,I.mY)())return null;let s=e.location.type.str;return s.length>0&&(s=`${(0,y.Xq)(e.location.size,t.plainT)} (${s})`),(0,n.jsxs)(g.q,{children:[(0,n.jsx)(g.J,{label:t.translate("Directory size"),text:s}),(0,n.jsx)(g.J,{label:t.translate("Total list size"),text:(0,y.Xq)(e.total_size,t.plainT)})]})};var S=s(79531),b=s(99347),v=s(32728),j=s(46942),L=s.n(j),_=s(85035),D=s(71352),C=s(88544),T=s(75662),R=s(5945),O=s(65385),B=s(13546),F=s(90264),N=s(34792),U=s(50915);const P=e=>(t,s)=>s.get(`${N.A.MODULE_URL}/${e.id}/items/${t}`);class H extends i.Component{render(){const{fileItem:e,session:t}=this.props;return(0,n.jsxs)(T.A,Object.assign({className:"filelist-item",title:e.name,closable:!0,icon:(0,n.jsx)(R.A,{typeInfo:e.type}),fullHeight:!0},this.props,{children:[(0,n.jsx)(C.A,{downloadHandler:U.jJ,itemDataGetter:P(t),userGetter:()=>t.user,session:t}),(0,n.jsx)(F.G,{fileItem:e,downloadHandler:U.jJ,user:t.user,session:t})]}))}}H.displayName="FilelistItemInfoDialog";const G=(0,O.A)((0,B.A)(H,{urls:{fileItem:({params:e,session:t},s)=>P(t)(e.itemId,s)}}),"item/:itemId");var k=s(77856),M=s(52267),$=s(22005);const V=s.n($)().createStore({_viewName:"filelist_view",_apiUrl:N.A.SESSIONS_URL,_sessionStore:a.A,mixins:[(0,M.A)("name")]});var Y=s(22373),z=s(44247),K=s(68465),q=s(67749),Q=s(39115),J=s(32811),X=s(86038),W=s(59548);const Z={reloadDirectory:{id:"reloadDirectory",displayName:"Reload",access:X.US.FILELISTS_VIEW,icon:f.A.RELOAD,filter:e=>(({entity:e})=>e.partial_list)(e)&&(({itemData:e})=>"directory"===e.type.id)(e),handler:({itemData:e,entity:t})=>J.A.post(`${N.A.SESSIONS_URL}/${t.id}/directory`,{list_path:e.path,reload:!0})},refreshShare:{id:"refreshShare",displayName:"Refresh in share",access:X.US.SETTINGS_EDIT,icon:f.A.REFRESH_COLORED,filter:({entity:e})=>e.user.flags.includes("self"),handler:({itemData:e})=>(0,W.t7)(e.path)},details:{id:"details",displayName:"Details",icon:f.A.DETAILS,handler:({itemData:e,navigate:t})=>{t(`item/${e.id}`)},filter:e=>!(({itemData:e})=>"/"===e.path)(e)}},ee={moduleData:{moduleId:q.KV.FILELISTS,subId:"item"},actions:Z},te={remove:(0,s(4112).R)(N.A.SESSIONS_URL,X.US.FILELISTS_EDIT)},se={moduleData:{moduleId:q.KV.FILELISTS},actions:te};const ne=e=>{var{rowDataGetter:t,onClickDirectory:s,session:i}=e,o=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["rowDataGetter","onClickDirectory","session"]);return(0,n.jsx)(z.BH,Object.assign({clickHandlerGetter:s,userGetter:()=>i.user,downloadHandler:U.jJ,rowDataGetter:t,entity:i,remoteMenuId:Q.Ay.FILELIST_ITEM},o,{children:(0,n.jsx)(D.yj,{actions:ee,itemData:t,ids:["refreshShare","details"],entity:i})}))};class ie extends i.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>this.props.session.user.flags.includes("self")?"":(0,k.L5)(e.dupe),this.emptyRowsNodeGetter=()=>{const{location:e,state:t}=this.props.session,{translate:s}=this.props.sessionT;if("download_failed"===t.id)return(0,n.jsx)(v.A,{icon:f.A.ERROR,title:s("Download failed"),description:t.str});const{files:i,directories:o}=e.type;return 0!==i||0!==o?(0,n.jsx)(b.A,{text:s("Updating view")}):e.complete?(0,n.jsx)(v.A,{title:s("No content to display"),description:s("The directory is empty")}):(0,n.jsx)(b.A,{text:s("Preparing download")})},this.onClickDirectory=(e,t)=>{if("directory"===t().type.id)return()=>this.props.onClickDirectory(this.props.session.location.path+e+"/")},this.userGetter=()=>this.props.session.user}render(){const{session:e}=this.props;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(Y.A,{emptyRowsNodeGetter:this.emptyRowsNodeGetter,rowClassNameGetter:this.rowClassNameGetter,store:V,entityId:e.id,viewId:e.location.path,sessionStore:a.A,moduleId:q.KV.FILELISTS,children:[(0,n.jsx)(K.VP,{name:"Name",width:200,columnKey:"name",cell:(0,n.jsx)(ne,{onClickDirectory:this.onClickDirectory,session:e}),flexGrow:8}),(0,n.jsx)(K.VP,{name:"Size",width:60,columnKey:"size",cell:(0,n.jsx)(z.us,{}),flexGrow:1}),(0,n.jsx)(K.VP,{name:"Type",width:70,columnKey:"type",flexGrow:1,hideWidth:500}),(0,n.jsx)(K.VP,{name:"Last modified",width:80,columnKey:"time",cell:(0,n.jsx)(z.Jo,{}),flexGrow:1})]}),(0,n.jsx)(G,{session:e})]})}}const oe=ie;var re=s(47767),ae=s(36076);var le=s(88939);const ce=e=>{const{sessionT:t,session:s}=e,[o,r]=i.useState(!1),a=(({session:e,location:t,sessionT:s})=>{var n,o;const r=(0,re.Zp)(),a=(e,s)=>{const n=t.state;if(e===(null==n?void 0:n.directory))return;const i={directory:e};r(t.pathname,{state:i,replace:s})};return i.useEffect((()=>{const s=t.state;s?s.directory!==e.location.path&&a(e.location.path,!0):a(e.location.path,!0)}),[null===(n=e.location)||void 0===n?void 0:n.path]),i.useEffect((()=>{const n=t.state;if(!n)return;const i=n.directory;i!==e.location.path&&i&&(t=>{(0,ae.bd)((()=>(0,U.Qs)(e,t)),s.plainT)})(i)}),[null===(o=t.state)||void 0===o?void 0:o.directory]),a})(e),l=e=>{o||r(!0),a(e,!1)};(0,re.KP)((({currentLocation:e,nextLocation:s,historyAction:n})=>!("POP"!==n||!o||s.pathname===e.pathname||(r(!1),le.A.info({title:t.t("confirmLeave","Confirm action"),message:t.t("confirmLeaveDesc","Click the back button again to leave this filelist")}),0))));const c=()=>s.location,d=P(s);return(0,n.jsxs)("div",{className:"browser",children:[(0,n.jsx)(_.A,{path:s.location.path,separator:"/",rootPath:"/",rootName:t.translate("Root"),itemClickHandler:l,selectedNameFormatter:e=>(0,n.jsx)(D.gU,{caption:e,user:s.user,itemInfoGetter:c,downloadHandler:U.jJ,contextElement:".session-container",entity:s,remoteMenuId:Q.Ay.FILELIST_ITEM,children:(0,n.jsx)(D.Wy,{itemData:s.location,actions:ee,entity:s})}),entityId:s.id}),(0,n.jsx)(oe,{session:s,sessionT:t,onClickDirectory:l}),(0,n.jsx)(C.A,{downloadHandler:U.jJ,itemDataGetter:d,userGetter:()=>s.user,session:s})]})},de=(0,S.A)((e=>{const{session:t,sessionT:s,location:i}=e,{user:o,location:r,state:a}=t,l=o.flags.includes("self"),c=L()("filelist session",{self:l});return o.flags.includes("offline")&&!l?(0,n.jsx)("div",{className:c,children:(0,n.jsx)(v.A,{title:s.t("userOffline","User offline"),description:s.t("userOfflineDesc","You will be able to continue browsing when the user comes back online")})}):"loaded"!==a.id&&"download_failed"!==a.id||!r?(0,n.jsx)("div",{className:c,children:(0,n.jsx)(b.A,{text:a.str})}):(0,n.jsxs)("div",{className:c,children:[(0,n.jsx)(ce,{location:i,session:t,sessionT:s}),(0,n.jsx)(w,{session:t,sessionT:s})]})}));var Ae=s(85072),pe=s.n(Ae),ue=s(97825),me=s.n(ue),he=s(77659),fe=s.n(he),Ee=s(55056),xe=s.n(Ee),ye=s(10540),ge=s.n(ye),Ie=s(41113),we=s.n(Ie),Se=s(98737),be={};be.styleTagTransform=we(),be.setAttributes=xe(),be.insert=fe().bind(null,"head"),be.domAPI=me(),be.insertStyleElement=ge(),pe()(Se.A,be),Se.A&&Se.A.locals&&Se.A.locals;var ve=s(78046);const je=(0,r.A)(["message"]),Le={itemLabelGetter:()=>null,itemNameGetter:e=>e.share_profile?e.share_profile.str:je.itemNameGetter(e),itemStatusGetter:e=>e.share_profile?"blue":je.itemStatusGetter(e),itemHeaderTitleGetter:(e,t,s)=>e.share_profile?s:je.itemHeaderTitleGetter(e,t,s),itemHeaderDescriptionGetter:e=>e.share_profile?null:je.itemHeaderDescriptionGetter(e),itemHeaderIconGetter:e=>e.share_profile?"green server":je.itemHeaderIconGetter(e)},_e=(0,ve.Z)((e=>{const{params:t,sessionT:s}=e,i=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["params","sessionT"]);return(0,n.jsx)(o.A,Object.assign({activeId:t.id,baseUrl:"filelists",newCaption:s.t("new","Open filelist"),newDescription:s.t("newDesc","Start browsing a new filelist"),newIcon:f.A.FILELISTS_PLAIN,disableSideMenu:!0,editAccess:X.US.FILELISTS_EDIT,uiActions:se,sessionApi:l.A,unreadInfoStore:a.A,sessionItemLayout:de,newLayout:x,sessionT:s},Le,i))}),a.A,q.KV.FILELISTS)},88569:(e,t,s)=>{s.d(t,{H:()=>a,U:()=>r});var n=s(41860),i=s(41110),o=function(e,t,s,n){return new(s||(s=Promise))((function(i,o){function r(e){try{l(n.next(e))}catch(e){o(e)}}function a(e){try{l(n.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,a)}l((n=n.apply(e,t||[])).next())}))};const r=e=>o(void 0,void 0,void 0,(function*(){try{return(yield(0,i.F)(`${getBasePath()}temp`,{method:"POST",headers:{"X-Authorization":n.A.authToken,Authorization:n.A.authToken},body:e})).headers.get("Location")}catch(e){throw e}})),a=(e,t,s)=>o(void 0,void 0,void 0,(function*(){try{const o=yield(0,i.F)((e=>`${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(e)}`)(e),Object.assign({headers:{"X-Authorization":n.A.authToken,"Cache-Control":"no-store, must-revalidate, max-age=0"}},s));return(yield t)?o.json():o.text()}catch(t){throw console.error(`CORS HTTP request failed (${e})`,t),t}}))},59548:(e,t,s)=>{s.d(t,{Lt:()=>d,eo:()=>a,sf:()=>l,t7:()=>c});var n=s(42191),i=s(32811),o=s(88569),r=s(86038);const a=(e,t,s)=>{return r=void 0,a=void 0,c=function*(){try{const r=yield(0,o.U)(e);return yield i.A.post(n.A.TEMP_SHARES_URL,{name:e.name,file_id:r,hub_url:t,cid:s})}catch(e){throw e}},new((l=void 0)||(l=Promise))((function(e,t){function s(e){try{i(c.next(e))}catch(e){t(e)}}function n(e){try{i(c.throw(e))}catch(e){t(e)}}function i(t){var i;t.done?e(t.value):(i=t.value,i instanceof l?i:new l((function(e){e(i)}))).then(s,n)}i((c=c.apply(r,a||[])).next())}));var r,a,l,c},l=e=>i.A.post(n.A.REFRESH_PATHS_URL,{paths:e,priority:r.DH.MANUAL}),c=e=>i.A.post(n.A.REFRESH_VIRTUAL_URL,{path:e}),d=e=>i.A.delete(`${n.A.REFRESH_TASKS_URL}/${e}`)}}]);
2
- //# sourceMappingURL=filelists.9bbe06c108a8677ee055.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[760],{52237:(e,t,s)=>{s.d(t,{A:()=>a});var n=s(71354),i=s.n(n),o=s(76314),r=s.n(o)()(i());r.push([e.id,".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n","",{version:3,sources:["webpack://./src/components/file-item-info/style.css"],names:[],mappings:"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB",sourcesContent:[".fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n"],sourceRoot:""}]);const a=r},98737:(e,t,s)=>{s.d(t,{A:()=>a});var n=s(71354),i=s.n(n),o=s(76314),r=s.n(o)()(i());r.push([e.id,"#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Filelists/style.css"],names:[],mappings:"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB",sourcesContent:["#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n"],sourceRoot:""}]);const a=r},90264:(e,t,s)=>{s.d(t,{G:()=>L});var n=s(74848),i=(s(96540),s(98573)),o=s(71352),r=s(86038),a=s(67749),l=s(32389),c=s(42695),d=s(85072),A=s.n(d),p=s(97825),u=s.n(p),m=s(77659),h=s.n(m),f=s(55056),E=s.n(f),x=s(10540),y=s.n(x),g=s(41113),I=s.n(g),w=s(52237),S={};S.styleTagTransform=I(),S.setAttributes=E(),S.insert=h().bind(null,"head"),S.domAPI=u(),S.insertStyleElement=y(),A()(w.A,S),w.A&&w.A.locals&&w.A.locals;var b=s(73070);const v={[r.YF.SHARE_PARTIAL]:"Share (partial)",[r.YF.SHARE_FULL]:"Share (full)",[r.YF.QUEUE_PARTIAL]:"Queue (partial)",[r.YF.QUEUE_FULL]:"Queue (full)",[r.YF.FINISHED_PARTIAL]:"Finished (partial)",[r.YF.FINISHED_FULL]:"Finished (full)",[r.YF.SHARE_QUEUE]:"Share and queue",[r.YF.SHARE_FINISHED]:"Share and finished",[r.YF.QUEUE_FINISHED]:"Queue and finished",[r.YF.SHARE_QUEUE_FINISHED]:"Share, queue and finished"},j=({paths:e})=>(0,n.jsx)("div",{className:"dupe-paths",children:e.map((e=>(0,n.jsx)("div",{className:"path",children:e},e)))}),L=({session:e,fileItem:t,user:s,downloadHandler:r,showPath:d=!0})=>{const{t:A}=(0,l.Bd)(),p=e=>(0,c.Tl)(e,A,a.KV.COMMON);return(0,n.jsxs)("div",{className:"ui fileitem info segment",children:[(0,n.jsxs)(b.xA,{columns:"two",stackable:!0,children:[(0,n.jsx)(b.fI,{title:p("Name"),text:t.name}),(0,n.jsx)(b.fI,{title:p("Type/content"),text:t.type.str}),(0,n.jsx)(b.fI,{title:p("Size"),text:(0,i.Xq)(t.size,A,!0)}),(0,n.jsx)(b.fI,{title:p("Last modified"),text:(0,i.fw)(t.time||0)}),"file"===t.type.id&&(0,n.jsx)(b.fI,{title:p("TTH"),text:t.tth}),!!t.dupe&&(0,n.jsx)(b.fI,{title:p("Dupe type"),text:p(v[t.dupe.id])}),!!t.dupe&&(0,n.jsx)(b.fI,{title:p("Dupe paths"),text:(0,n.jsx)(j,{paths:t.dupe.paths})}),d&&(0,n.jsx)(b.fI,{title:p("Path"),text:t.path})]}),(0,n.jsx)(o.gU,{caption:p("Actions..."),button:!0,user:s,itemInfoGetter:()=>t,downloadHandler:r,contextElement:".ui.modal > .content",entity:e})]})}},86818:(e,t,s)=>{s.d(t,{A:()=>i});const n="share_profiles",i={MODULE_URL:n,PROFILES_URL:n,PROFILE_ADDED:"share_profile_added",PROFILE_UPDATED:"share_profile_updated",PROFILE_REMOVED:"share_profile_removed",HIDDEN_PROFILE_ID:1}},71299:(e,t,s)=>{s.d(t,{A:()=>l,T:()=>a});var n=s(2543),i=s(86818),o=s(13546),r=s(98573);const a=e=>({id:e.id,name:e.str}),l=function(e,t,s,a=!0){return(0,o.A)(e,(0,n.merge)(s,{urls:{profiles:i.A.PROFILES_URL},dataConverters:{profiles:(e,{t:s})=>{const n=e.filter((e=>t||e.id!==i.A.HIDDEN_PROFILE_ID)).map((e=>((e,t)=>{let s=e.str;return a&&e.id!==i.A.HIDDEN_PROFILE_ID&&(s+=` (${(0,r.Xq)(e.size,t)})`),Object.assign(Object.assign({},e),{str:s})})(e,s)));return n}},onSocketConnected:(e,{refetchData:t})=>{e(i.A.MODULE_URL,i.A.PROFILE_ADDED,(()=>t())),e(i.A.MODULE_URL,i.A.PROFILE_UPDATED,(()=>t())),e(i.A.MODULE_URL,i.A.PROFILE_REMOVED,(()=>t()))}}))}},62705:(e,t,s)=>{s.d(t,{A:()=>p});var n=s(74848),i=(s(96540),s(13546)),o=s(98573),r=s(31224),a=s(2253),l=s(93226),c=s(67749),d=s(42695),A=s(32389);const p=(0,i.A)((({entries:e,entryTitleRenderer:t,hasSession:s,entryIcon:i})=>{const{t:l}=(0,A.Bd)();return 0===e.length?null:(0,n.jsxs)("div",{className:"recents",children:[(0,n.jsx)(r.A,{title:(0,d.Tl)("Recent sessions",l,c.KV.COMMON),size:""}),(0,n.jsx)("div",{className:"ui relaxed divided list",children:e.map(((e,r)=>(0,n.jsx)(a.c,{header:t(e),description:!!e.last_opened&&l((0,d.j2)("openedAgo",c.KV.COMMON),{defaultValue:"Opened {{timeAgo}}",replace:{timeAgo:(0,o.fw)(e.last_opened)}}),icon:(s(e)?"green ":"")+i},r)))})]})}),{urls:{entries:({entryType:e},t)=>t.get(`${l.Ay.SESSIONS_URL}/${e}/0`)}})},22187:(e,t,s)=>{s.d(t,{A:()=>l});var n=s(74848),i=s(77856),o=s(71352),r=s(93866),a=s(39115);function l(e){return{itemNameGetter:e=>e.user.nicks,itemStatusGetter(e){const{flags:t}=e.user;return(0,i.Z)(t)},itemHeaderDescriptionGetter:e=>e.user.hub_names,itemHeaderIconGetter:e=>(0,n.jsx)(r.A,{flags:e.user.flags}),itemHeaderTitleGetter(t,s,i){const{user:r}=t;return(0,n.jsx)(o.Bg,{user:r,ids:e,remoteMenuId:a.Ay.HINTED_USER,children:i})}}}},50747:(e,t,s)=>{s.r(t),s.d(t,{default:()=>_e});var n=s(74848),i=s(96540),o=s(91950),r=s(22187),a=s(17585),l=s(40599),c=s(62705),d=s(90425),A=s(27725),p=s(71299);class u extends i.Component{constructor(){super(...arguments),this.onClick=e=>{this.props.onProfileChanged(e.id)},this.getDropdownItem=e=>(0,n.jsx)(A.A,{onClick:()=>this.props.onProfileChanged(e.id),children:e.str},e.id)}render(){const{sessionT:e,profiles:t}=this.props;return(0,n.jsx)(d.A,{className:"profile top right pointing",caption:e.translate("Browse own share..."),triggerIcon:"",children:t.map(this.getDropdownItem)})}}const m=(0,p.A)(u,!1);var h=s(93226),f=s(4425),E=s(16674);const x=e=>{const t=t=>{const{navigate:s,location:n}=e;l.A.createSession({user:t},{navigate:s,location:n,sessionStore:a.A})},{sessionT:s}=e;return(0,n.jsxs)("div",{className:"filelist session new",children:[(0,n.jsx)(E.M,{onChange:t,offlineMessage:s.t("offlineMessage","You must to be connected to at least one hub in order to download filelists from other users"),isClearable:!1,autoFocus:!0}),(0,n.jsx)(m,{onProfileChanged:t=>{const{navigate:s,location:n}=e;l.A.ownList(t,{navigate:s,location:n,sessionStore:a.A})},sessionT:s}),(0,n.jsx)(c.A,{entryType:h.iM.FILELIST,hasSession:e=>a.A.getSession(e.user.cid),entryTitleRenderer:e=>(0,n.jsx)("a",{onClick:s=>t(e.user),children:e.user.nicks+(e.description?` (${e.description})`:"")}),entryIcon:f.A.FILELISTS_PLAIN})]})};var y=s(98573),g=s(38453),I=s(8098);const w=({session:e,sessionT:t})=>{if((0,I.mY)())return null;let s=e.location.type.str;return s.length>0&&(s=`${(0,y.Xq)(e.location.size,t.plainT)} (${s})`),(0,n.jsxs)(g.q,{children:[(0,n.jsx)(g.J,{label:t.translate("Directory size"),text:s}),(0,n.jsx)(g.J,{label:t.translate("Total list size"),text:(0,y.Xq)(e.total_size,t.plainT)})]})};var S=s(79531),b=s(99347),v=s(32728),j=s(46942),L=s.n(j),_=s(85035),D=s(71352),C=s(88544),T=s(75662),R=s(5945),O=s(65385),B=s(13546),F=s(90264),N=s(34792),U=s(50915);const P=e=>(t,s)=>s.get(`${N.A.MODULE_URL}/${e.id}/items/${t}`);class H extends i.Component{render(){const{fileItem:e,session:t}=this.props;return(0,n.jsxs)(T.A,Object.assign({className:"filelist-item",title:e.name,closable:!0,icon:(0,n.jsx)(R.A,{typeInfo:e.type}),fullHeight:!0},this.props,{children:[(0,n.jsx)(C.A,{downloadHandler:U.jJ,itemDataGetter:P(t),userGetter:()=>t.user,session:t}),(0,n.jsx)(F.G,{fileItem:e,downloadHandler:U.jJ,user:t.user,session:t})]}))}}H.displayName="FilelistItemInfoDialog";const G=(0,O.A)((0,B.A)(H,{urls:{fileItem:({params:e,session:t},s)=>P(t)(e.itemId,s)}}),"item/:itemId");var k=s(77856),M=s(52267),$=s(22005);const V=s.n($)().createStore({_viewName:"filelist_view",_apiUrl:N.A.SESSIONS_URL,_sessionStore:a.A,mixins:[(0,M.A)("name")]});var Y=s(22373),z=s(44247),K=s(68465),q=s(67749),Q=s(39115),J=s(32811),X=s(86038),W=s(59548);const Z={reloadDirectory:{id:"reloadDirectory",displayName:"Reload",access:X.US.FILELISTS_VIEW,icon:f.A.RELOAD,filter:e=>(({entity:e})=>e.partial_list)(e)&&(({itemData:e})=>"directory"===e.type.id)(e),handler:({itemData:e,entity:t})=>J.A.post(`${N.A.SESSIONS_URL}/${t.id}/directory`,{list_path:e.path,reload:!0})},refreshShare:{id:"refreshShare",displayName:"Refresh in share",access:X.US.SETTINGS_EDIT,icon:f.A.REFRESH_COLORED,filter:({entity:e})=>e.user.flags.includes("self"),handler:({itemData:e})=>(0,W.t7)(e.path)},details:{id:"details",displayName:"Details",icon:f.A.DETAILS,handler:({itemData:e,navigate:t})=>{t(`item/${e.id}`)},filter:e=>!(({itemData:e})=>"/"===e.path)(e)}},ee={moduleData:{moduleId:q.KV.FILELISTS,subId:"item"},actions:Z},te={remove:(0,s(4112).R)(N.A.SESSIONS_URL,X.US.FILELISTS_EDIT)},se={moduleData:{moduleId:q.KV.FILELISTS},actions:te};const ne=e=>{var{rowDataGetter:t,onClickDirectory:s,session:i}=e,o=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["rowDataGetter","onClickDirectory","session"]);return(0,n.jsx)(z.BH,Object.assign({clickHandlerGetter:s,userGetter:()=>i.user,downloadHandler:U.jJ,rowDataGetter:t,entity:i,remoteMenuId:Q.Ay.FILELIST_ITEM},o,{children:(0,n.jsx)(D.yj,{actions:ee,itemData:t,ids:["refreshShare","details"],entity:i})}))};class ie extends i.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>this.props.session.user.flags.includes("self")?"":(0,k.L5)(e.dupe),this.emptyRowsNodeGetter=()=>{const{location:e,state:t}=this.props.session,{translate:s}=this.props.sessionT;if("download_failed"===t.id)return(0,n.jsx)(v.A,{icon:f.A.ERROR,title:s("Download failed"),description:t.str});const{files:i,directories:o}=e.type;return 0!==i||0!==o?(0,n.jsx)(b.A,{text:s("Updating view")}):e.complete?(0,n.jsx)(v.A,{title:s("No content to display"),description:s("The directory is empty")}):(0,n.jsx)(b.A,{text:s("Preparing download")})},this.onClickDirectory=(e,t)=>{if("directory"===t().type.id)return()=>this.props.onClickDirectory(this.props.session.location.path+e+"/")},this.userGetter=()=>this.props.session.user}render(){const{session:e}=this.props;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(Y.A,{emptyRowsNodeGetter:this.emptyRowsNodeGetter,rowClassNameGetter:this.rowClassNameGetter,store:V,entityId:e.id,viewId:e.location.path,sessionStore:a.A,moduleId:q.KV.FILELISTS,children:[(0,n.jsx)(K.VP,{name:"Name",width:200,columnKey:"name",cell:(0,n.jsx)(ne,{onClickDirectory:this.onClickDirectory,session:e}),flexGrow:8}),(0,n.jsx)(K.VP,{name:"Size",width:60,columnKey:"size",cell:(0,n.jsx)(z.us,{}),flexGrow:1}),(0,n.jsx)(K.VP,{name:"Type",width:70,columnKey:"type",flexGrow:1,hideWidth:500}),(0,n.jsx)(K.VP,{name:"Last modified",width:80,columnKey:"time",cell:(0,n.jsx)(z.Jo,{}),flexGrow:1})]}),(0,n.jsx)(G,{session:e})]})}}const oe=ie;var re=s(47767),ae=s(36076);var le=s(88939);const ce=e=>{const{sessionT:t,session:s}=e,[o,r]=i.useState(!1),a=(({session:e,location:t,sessionT:s})=>{var n,o;const r=(0,re.Zp)(),a=(e,s)=>{const n=t.state;if(e===(null==n?void 0:n.directory))return;const i={directory:e};r(t.pathname,{state:i,replace:s})};return i.useEffect((()=>{const s=t.state;s?s.directory!==e.location.path&&a(e.location.path,!0):a(e.location.path,!0)}),[null===(n=e.location)||void 0===n?void 0:n.path]),i.useEffect((()=>{const n=t.state;if(!n)return;const i=n.directory;i!==e.location.path&&i&&(t=>{(0,ae.bd)((()=>(0,U.Qs)(e,t)),s.plainT)})(i)}),[null===(o=t.state)||void 0===o?void 0:o.directory]),a})(e),l=e=>{o||r(!0),a(e,!1)};(0,re.KP)((({currentLocation:e,nextLocation:s,historyAction:n})=>!("POP"!==n||!o||s.pathname===e.pathname||(r(!1),le.A.info({title:t.t("confirmLeave","Confirm action"),message:t.t("confirmLeaveDesc","Click the back button again to leave this filelist")}),0))));const c=()=>s.location,d=P(s);return(0,n.jsxs)("div",{className:"browser",children:[(0,n.jsx)(_.A,{path:s.location.path,separator:"/",rootPath:"/",rootName:t.translate("Root"),itemClickHandler:l,selectedNameFormatter:e=>(0,n.jsx)(D.gU,{caption:e,user:s.user,itemInfoGetter:c,downloadHandler:U.jJ,contextElement:".session-container",entity:s,remoteMenuId:Q.Ay.FILELIST_ITEM,children:(0,n.jsx)(D.Wy,{itemData:s.location,actions:ee,entity:s})}),entityId:s.id}),(0,n.jsx)(oe,{session:s,sessionT:t,onClickDirectory:l}),(0,n.jsx)(C.A,{downloadHandler:U.jJ,itemDataGetter:d,userGetter:()=>s.user,session:s})]})},de=(0,S.A)((e=>{const{session:t,sessionT:s,location:i}=e,{user:o,location:r,state:a}=t,l=o.flags.includes("self"),c=L()("filelist session",{self:l});return o.flags.includes("offline")&&!l?(0,n.jsx)("div",{className:c,children:(0,n.jsx)(v.A,{title:s.t("userOffline","User offline"),description:s.t("userOfflineDesc","You will be able to continue browsing when the user comes back online")})}):"loaded"!==a.id&&"download_failed"!==a.id||!r?(0,n.jsx)("div",{className:c,children:(0,n.jsx)(b.A,{text:a.str})}):(0,n.jsxs)("div",{className:c,children:[(0,n.jsx)(ce,{location:i,session:t,sessionT:s}),(0,n.jsx)(w,{session:t,sessionT:s})]})}));var Ae=s(85072),pe=s.n(Ae),ue=s(97825),me=s.n(ue),he=s(77659),fe=s.n(he),Ee=s(55056),xe=s.n(Ee),ye=s(10540),ge=s.n(ye),Ie=s(41113),we=s.n(Ie),Se=s(98737),be={};be.styleTagTransform=we(),be.setAttributes=xe(),be.insert=fe().bind(null,"head"),be.domAPI=me(),be.insertStyleElement=ge(),pe()(Se.A,be),Se.A&&Se.A.locals&&Se.A.locals;var ve=s(78046);const je=(0,r.A)(["message"]),Le={itemLabelGetter:()=>null,itemNameGetter:e=>e.share_profile?e.share_profile.str:je.itemNameGetter(e),itemStatusGetter:e=>e.share_profile?"blue":je.itemStatusGetter(e),itemHeaderTitleGetter:(e,t,s)=>e.share_profile?s:je.itemHeaderTitleGetter(e,t,s),itemHeaderDescriptionGetter:e=>e.share_profile?null:je.itemHeaderDescriptionGetter(e),itemHeaderIconGetter:e=>e.share_profile?"green server":je.itemHeaderIconGetter(e)},_e=(0,ve.Z)((e=>{const{params:t,sessionT:s}=e,i=function(e,t){var s={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(s[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(n=Object.getOwnPropertySymbols(e);i<n.length;i++)t.indexOf(n[i])<0&&Object.prototype.propertyIsEnumerable.call(e,n[i])&&(s[n[i]]=e[n[i]])}return s}(e,["params","sessionT"]);return(0,n.jsx)(o.A,Object.assign({activeId:t.id,baseUrl:"filelists",newCaption:s.t("new","Open filelist"),newDescription:s.t("newDesc","Start browsing a new filelist"),newIcon:f.A.FILELISTS_PLAIN,disableSideMenu:!0,editAccess:X.US.FILELISTS_EDIT,uiActions:se,sessionApi:l.A,unreadInfoStore:a.A,sessionItemLayout:de,newLayout:x,sessionT:s,remoteMenuId:"filelist"},Le,i))}),a.A,q.KV.FILELISTS)},88569:(e,t,s)=>{s.d(t,{H:()=>a,U:()=>r});var n=s(41860),i=s(41110),o=function(e,t,s,n){return new(s||(s=Promise))((function(i,o){function r(e){try{l(n.next(e))}catch(e){o(e)}}function a(e){try{l(n.throw(e))}catch(e){o(e)}}function l(e){var t;e.done?i(e.value):(t=e.value,t instanceof s?t:new s((function(e){e(t)}))).then(r,a)}l((n=n.apply(e,t||[])).next())}))};const r=e=>o(void 0,void 0,void 0,(function*(){try{return(yield(0,i.F)(`${getBasePath()}temp`,{method:"POST",headers:{"X-Authorization":n.A.authToken,Authorization:n.A.authToken},body:e})).headers.get("Location")}catch(e){throw e}})),a=(e,t,s)=>o(void 0,void 0,void 0,(function*(){try{const o=yield(0,i.F)((e=>`${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(e)}`)(e),Object.assign({headers:{"X-Authorization":n.A.authToken,"Cache-Control":"no-store, must-revalidate, max-age=0"}},s));return(yield t)?o.json():o.text()}catch(t){throw console.error(`CORS HTTP request failed (${e})`,t),t}}))},59548:(e,t,s)=>{s.d(t,{Lt:()=>d,eo:()=>a,sf:()=>l,t7:()=>c});var n=s(42191),i=s(32811),o=s(88569),r=s(86038);const a=(e,t,s)=>{return r=void 0,a=void 0,c=function*(){try{const r=yield(0,o.U)(e);return yield i.A.post(n.A.TEMP_SHARES_URL,{name:e.name,file_id:r,hub_url:t,cid:s})}catch(e){throw e}},new((l=void 0)||(l=Promise))((function(e,t){function s(e){try{i(c.next(e))}catch(e){t(e)}}function n(e){try{i(c.throw(e))}catch(e){t(e)}}function i(t){var i;t.done?e(t.value):(i=t.value,i instanceof l?i:new l((function(e){e(i)}))).then(s,n)}i((c=c.apply(r,a||[])).next())}));var r,a,l,c},l=e=>i.A.post(n.A.REFRESH_PATHS_URL,{paths:e,priority:r.DH.MANUAL}),c=e=>i.A.post(n.A.REFRESH_VIRTUAL_URL,{path:e}),d=e=>i.A.delete(`${n.A.REFRESH_TASKS_URL}/${e}`)}}]);
2
+ //# sourceMappingURL=filelists.36c094bb9481fe161076.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"js/filelists.36c094bb9481fe161076.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/constants/ShareProfileConstants.ts","webpack://airdcpp-webui/./src/decorators/ShareProfileDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/RecentLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ShareProfileSelector.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistNew.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/item-info-dialog/FilelistItemInfoDialog.tsx","webpack://airdcpp-webui/./src/stores/FilelistViewStore.js","webpack://airdcpp-webui/./src/actions/ui/filelist/FilelistItemActions.ts","webpack://airdcpp-webui/./src/actions/ui/filelist/FilelistSessionActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistItemTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ListBrowser.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/effects/useSyncFilelistLocation.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css?8d81","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/Filelists.tsx","webpack://airdcpp-webui/./src/services/HttpService.ts","webpack://airdcpp-webui/./src/services/api/ShareApi.ts"],"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, `.fileitem.info.segment .dupe-paths .path {\n overflow-x: hidden;\n}\n\n.fileitem.info.segment .download.ui.dropdown {\n max-width: 150px;\n margin-top: 10px;\n}\n\n.fileitem.info.segment .title.column {\n margin-top: auto;\n margin-bottom: auto;\n}\n\n.fileitem.info.segment .value.column {\n word-break: break-all;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\".fileitem.info.segment .dupe-paths .path {\\n overflow-x: hidden;\\n}\\n\\n.fileitem.info.segment .download.ui.dropdown {\\n max-width: 150px;\\n margin-top: 10px;\\n}\\n\\n.fileitem.info.segment .title.column {\\n margin-top: auto;\\n margin-bottom: auto;\\n}\\n\\n.fileitem.info.segment .value.column {\\n word-break: break-all;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// 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, `#sidebar .virtual-table {\n flex: 1 100 100%;\n}\n\n.filelist.session .browser,\n.filelist.session .browser .virtual-table {\n height: calc(100% - 35px);\n}\n\n#mobile-layout .filelist.session .browser {\n height: 100%;\n}\n\n#mobile-layout .filelist.session .browser {\n height: calc(100% - 10px);\n}\n\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\n /* Safari specific CSS */\n .filelist.session .browser {\n height: calc(100% - 95px);\n }\n\n #mobile-layout .filelist.session .browser {\n height: calc(100% - 60px);\n }\n}\n\n.filelist.session .browser .ui.segment {\n margin-bottom: 10px;\n}\n\n.filelist.session {\n max-height: 100%;\n overflow: hidden;\n margin-top: 10px;\n flex: 1 1 100%;\n}\n\n.session.new .profile.ui.dropdown {\n margin-top: 10px;\n color: gray;\n align-self: flex-end;\n}\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Filelists/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB\",\"sourcesContent\":[\"#sidebar .virtual-table {\\n flex: 1 100 100%;\\n}\\n\\n.filelist.session .browser,\\n.filelist.session .browser .virtual-table {\\n height: calc(100% - 35px);\\n}\\n\\n#mobile-layout .filelist.session .browser {\\n height: 100%;\\n}\\n\\n#mobile-layout .filelist.session .browser {\\n height: calc(100% - 10px);\\n}\\n\\n@media screen and (min-color-index: 0) and(-webkit-min-device-pixel-ratio:0) {\\n /* Safari specific CSS */\\n .filelist.session .browser {\\n height: calc(100% - 95px);\\n }\\n\\n #mobile-layout .filelist.session .browser {\\n height: calc(100% - 60px);\\n }\\n}\\n\\n.filelist.session .browser .ui.segment {\\n margin-bottom: 10px;\\n}\\n\\n.filelist.session {\\n max-height: 100%;\\n overflow: hidden;\\n margin-top: 10px;\\n flex: 1 1 100%;\\n}\\n\\n.session.new .profile.ui.dropdown {\\n margin-top: 10px;\\n color: gray;\\n align-self: flex-end;\\n}\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\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 * as React from 'react';\n\nimport { formatRelativeTime, formatSize } from 'utils/ValueFormat';\n\nimport { DownloadMenu } from 'components/action-menu';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { useTranslation } from 'react-i18next';\nimport { translate } from 'utils/TranslationUtils';\n\nimport './style.css';\nimport { Row, Grid } from 'components/semantic/Grid';\n\nconst DupeStrings = {\n //[API.DupeEnum.NONE]: 'None',\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\n [API.DupeEnum.SHARE_FINISHED]: 'Share and finished',\n [API.DupeEnum.QUEUE_FINISHED]: 'Queue and finished',\n [API.DupeEnum.SHARE_QUEUE_FINISHED]: 'Share, queue and finished',\n};\n\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\n <div className=\"dupe-paths\">\n {paths.map((path) => (\n <div key={path} className=\"path\">\n {path}\n </div>\n ))}\n </div>\n);\n\ninterface FileItemInfoGridProps {\n fileItem: UI.DownloadableItemInfo;\n user: API.HintedUser;\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\n showPath?: boolean;\n session: UI.SessionItemBase;\n}\n\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({\n session,\n fileItem,\n user,\n downloadHandler,\n showPath = true,\n}) => {\n const { t } = useTranslation();\n const gridT = (text: string) => {\n return translate(text, t, UI.Modules.COMMON);\n };\n\n return (\n <div className=\"ui fileitem info segment\">\n <Grid columns=\"two\" stackable={true}>\n <Row title={gridT('Name')} text={fileItem.name} />\n <Row title={gridT('Type/content')} text={fileItem.type.str} />\n <Row title={gridT('Size')} text={formatSize(fileItem.size, t, true)} />\n <Row\n title={gridT('Last modified')}\n text={formatRelativeTime(fileItem.time || 0)}\n />\n {fileItem.type.id === 'file' && <Row title={gridT('TTH')} text={fileItem.tth} />}\n {!!fileItem.dupe && (\n <Row title={gridT('Dupe type')} text={gridT(DupeStrings[fileItem.dupe.id])} />\n )}\n {!!fileItem.dupe && (\n <Row\n title={gridT('Dupe paths')}\n text={<DupePaths paths={fileItem.dupe.paths} />}\n />\n )}\n {showPath && <Row title={gridT('Path')} text={fileItem.path} />}\n </Grid>\n\n <DownloadMenu\n caption={gridT('Actions...')}\n button={true}\n user={user}\n itemInfoGetter={() => fileItem}\n downloadHandler={downloadHandler}\n contextElement=\".ui.modal > .content\"\n entity={session}\n />\n </div>\n );\n};\n\nexport { FileItemInfoGrid };\n","const MODULE_URL = 'share_profiles';\nexport default {\n MODULE_URL: MODULE_URL,\n PROFILES_URL: MODULE_URL,\n\n PROFILE_ADDED: 'share_profile_added',\n PROFILE_UPDATED: 'share_profile_updated',\n PROFILE_REMOVED: 'share_profile_removed',\n\n HIDDEN_PROFILE_ID: 1,\n};\n","import * as React from 'react';\r\nimport { merge } from 'lodash';\r\n\r\nimport ShareProfileConstants from 'constants/ShareProfileConstants';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n DataProviderDecoratorSettings,\r\n DataConverter,\r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ninterface ShareProfileDecoratorDataProps {\r\n profiles: API.ShareProfile[];\r\n}\r\n\r\nexport const profileToEnumValue = (profile: API.ShareProfile) => {\r\n return {\r\n id: profile.id,\r\n name: profile.str,\r\n };\r\n};\r\n\r\nexport type ShareProfileDecoratorChildProps = DataProviderDecoratorChildProps &\r\n ShareProfileDecoratorDataProps;\r\n\r\nconst ShareProfileDecorator = function <PropsT extends object>(\r\n Component: React.ComponentType<PropsT & ShareProfileDecoratorChildProps>,\r\n listHidden: boolean,\r\n dataProviderDecoratorSettings?: DataProviderDecoratorSettings<\r\n PropsT,\r\n ShareProfileDecoratorDataProps\r\n >,\r\n addSize = true,\r\n) {\r\n const convertProfile = (\r\n profile: API.ShareProfile,\r\n t: UI.TranslateF,\r\n ): API.ShareProfile => {\r\n let str = profile.str;\r\n if (addSize && profile.id !== ShareProfileConstants.HIDDEN_PROFILE_ID) {\r\n str += ` (${formatSize(profile.size, t)})`;\r\n }\r\n\r\n return {\r\n ...profile,\r\n str,\r\n };\r\n };\r\n\r\n const convertProfiles: DataConverter<PropsT> = (data: API.ShareProfile[], { t }) => {\r\n const profiles = data\r\n .filter((p) => listHidden || p.id !== ShareProfileConstants.HIDDEN_PROFILE_ID)\r\n .map((p) => convertProfile(p, t));\r\n\r\n return profiles;\r\n };\r\n\r\n return DataProviderDecorator<PropsT, ShareProfileDecoratorDataProps>(\r\n Component,\r\n merge(dataProviderDecoratorSettings, {\r\n urls: {\r\n profiles: ShareProfileConstants.PROFILES_URL,\r\n },\r\n dataConverters: {\r\n profiles: convertProfiles,\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_ADDED,\r\n () => refetchData(),\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_UPDATED,\r\n () => refetchData(),\r\n );\r\n addSocketListener(\r\n ShareProfileConstants.MODULE_URL,\r\n ShareProfileConstants.PROFILE_REMOVED,\r\n () => refetchData(),\r\n );\r\n },\r\n } as DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>),\r\n );\r\n};\r\n\r\nexport default ShareProfileDecorator;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\n//import RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { ListItem } from 'components/semantic/List';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\nimport { useTranslation } from 'react-i18next';\r\n\r\ninterface RecentLayoutProps {\r\n entryIcon: string;\r\n entryType: string;\r\n entryTitleRenderer: (entry: API.HistoryItem) => React.ReactNode;\r\n hasSession: (entry: API.HistoryItem) => boolean;\r\n}\r\n\r\ninterface DataProps {\r\n entries: API.HistoryItem[];\r\n}\r\n\r\ntype Props = RecentLayoutProps & DataProps & DataProviderDecoratorChildProps;\r\n\r\nconst RecentLayout: React.FC<Props> = ({\r\n entries,\r\n entryTitleRenderer,\r\n hasSession,\r\n entryIcon,\r\n}) => {\r\n const { t } = useTranslation();\r\n if (entries.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"recents\">\r\n <LayoutHeader title={translate('Recent sessions', t, UI.Modules.COMMON)} size=\"\" />\r\n <div className=\"ui relaxed divided list\">\r\n {entries.map((entry, index) => (\r\n <ListItem\r\n key={index}\r\n header={entryTitleRenderer(entry)}\r\n description={\r\n !!entry.last_opened &&\r\n t(toI18nKey('openedAgo', UI.Modules.COMMON), {\r\n defaultValue: 'Opened {{timeAgo}}',\r\n replace: {\r\n timeAgo: formatRelativeTime(entry.last_opened),\r\n },\r\n })\r\n }\r\n icon={(hasSession(entry) ? 'green ' : '') + entryIcon}\r\n />\r\n ))}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n/*RecentLayout.propTypes = {\r\n // Title of the button\r\n entryIcon: PropTypes.string.isRequired,\r\n\r\n // URL for fetching the recent entries\r\n entryType: PropTypes.string.isRequired,\r\n\r\n // Renders the recent entry title\r\n entryTitleRenderer: PropTypes.func.isRequired,\r\n\r\n // Returns whether the recent entry is currently active\r\n hasSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default DataProviderDecorator<RecentLayoutProps, DataProps>(\r\n //RedrawDecorator<Props>(RecentLayout),\r\n RecentLayout,\r\n {\r\n urls: {\r\n entries: ({ entryType }, socket) =>\r\n socket.get(`${HistoryConstants.SESSIONS_URL}/${entryType}/0`),\r\n },\r\n },\r\n);\r\n","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/action-menu';\r\nimport UserIcon from 'components/icon/UserIcon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(\r\n itemMenuIds: string[],\r\n) {\r\n const UserItemHandlerDecorator: UI.SessionInfoGetter<SessionT> = {\r\n itemNameGetter(session) {\r\n return session.user.nicks;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n const { flags } = session.user;\r\n return userOnlineStatusToColor(flags);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.user.hub_names;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <UserIcon flags={session.user.flags} />;\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n const { user } = session;\r\n return (\r\n <UserMenu user={user} ids={itemMenuIds} remoteMenuId={MenuConstants.HINTED_USER}>\r\n {actionMenu}\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","//import PropTypes from 'prop-types';\nimport { Component } from 'react';\n\nimport Dropdown from 'components/semantic/Dropdown';\nimport MenuItemLink from 'components/semantic/MenuItemLink';\n\nimport ShareProfileDecorator, {\n ShareProfileDecoratorChildProps,\n} from 'decorators/ShareProfileDecorator';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\ninterface ShareProfileSelectorProps {\n onProfileChanged: (profileId: number) => void;\n sessionT: UI.ModuleTranslator;\n}\n\nclass ShareProfileSelector extends Component<\n ShareProfileSelectorProps & ShareProfileDecoratorChildProps\n> {\n /*static propTypes = {\n // Callback after selecting a profile\n onProfileChanged: PropTypes.func.isRequired,\n };*/\n\n onClick = (profile: API.ShareProfile) => {\n this.props.onProfileChanged(profile.id);\n };\n\n getDropdownItem = (profile: API.ShareProfile) => {\n return (\n <MenuItemLink\n key={profile.id}\n onClick={() => this.props.onProfileChanged(profile.id)}\n >\n {profile.str}\n </MenuItemLink>\n );\n };\n\n render() {\n const { sessionT, profiles } = this.props;\n return (\n <Dropdown\n className=\"profile top right pointing\"\n caption={sessionT.translate('Browse own share...')}\n triggerIcon=\"\"\n >\n {profiles.map(this.getDropdownItem)}\n </Dropdown>\n );\n }\n}\n\nexport default ShareProfileDecorator(ShareProfileSelector, false);\n","import RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport ShareProfileSelector from 'routes/Sidebar/routes/Filelists/components/ShareProfileSelector';\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/types';\r\n\r\nconst FilelistNew: React.FC<NewSessionLayoutProps> = (props) => {\r\n const handleSubmit = (user: API.HintedUser) => {\r\n const { navigate, location } = props;\r\n FilelistSessionActions.createSession(\r\n { user },\r\n {\r\n navigate,\r\n location,\r\n sessionStore: FilelistSessionStore,\r\n },\r\n );\r\n };\r\n\r\n const onProfileChanged = (profileId: number) => {\r\n const { navigate, location } = props;\r\n FilelistSessionActions.ownList(profileId, {\r\n navigate,\r\n location,\r\n sessionStore: FilelistSessionStore,\r\n });\r\n };\r\n\r\n const recentUserRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={(_) => handleSubmit(entry.user!)}>\r\n {entry.user!.nicks + (entry.description ? ` (${entry.description})` : '')}\r\n </a>\r\n );\r\n };\r\n\r\n const hasSession = (entry: API.HistoryItem) => {\r\n return FilelistSessionStore.getSession(entry.user!.cid);\r\n };\r\n\r\n const { sessionT } = props;\r\n return (\r\n <div className=\"filelist session new\">\r\n <UserSelectField\r\n onChange={handleSubmit}\r\n offlineMessage={sessionT.t<string>(\r\n 'offlineMessage',\r\n 'You must to be connected to at least one hub in order to download filelists from other users',\r\n )}\r\n isClearable={false}\r\n autoFocus={true}\r\n />\r\n <ShareProfileSelector onProfileChanged={onProfileChanged} sessionT={sessionT} />\r\n <RecentLayout\r\n entryType={HistoryEntryEnum.FILELIST}\r\n hasSession={hasSession}\r\n entryTitleRenderer={recentUserRender}\r\n entryIcon={IconConstants.FILELISTS_PLAIN}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default FilelistNew;\r\n","import * as React from 'react';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { FooterItem, SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\ninterface FilelistFooterProps {\r\n session: API.FilelistSession;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FilelistFooter: React.FC<FilelistFooterProps> = ({ session, sessionT }) => {\r\n if (useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n let locationText = session.location!.type.str;\r\n if (locationText.length > 0) {\r\n locationText = `${formatSize(\r\n session.location!.size,\r\n sessionT.plainT,\r\n )} (${locationText})`;\r\n }\r\n\r\n return (\r\n <SessionFooter>\r\n <FooterItem label={sessionT.translate('Directory size')} text={locationText} />\r\n <FooterItem\r\n label={sessionT.translate('Total list size')}\r\n text={formatSize(session.total_size, sessionT.plainT)}\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default FilelistFooter;\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport ModalRouteDecorator, {\r\n ModalRouteDecoratorChildProps,\r\n} from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, {\r\n DataProviderDecoratorChildProps,\r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\n\r\ninterface FilelistItemInfoDialogProps {\r\n session: API.FilelistSession;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n fileItem: API.FilelistItem;\r\n}\r\n\r\n/*interface RouteProps {\r\n itemId: string;\r\n}*/\r\n\r\ntype Props = FilelistItemInfoDialogProps & ModalRouteDecoratorChildProps;\r\n\r\nexport const FilelistItemGetter = (session: API.FilelistSession) => {\r\n const ret: UI.DownloadItemDataGetter<API.FilelistItem> = (itemId, socket) => {\r\n return socket.get(`${FilelistConstants.MODULE_URL}/${session.id}/items/${itemId}`);\r\n };\r\n\r\n return ret;\r\n};\r\n\r\nclass FilelistItemInfoDialog extends Component<Props & DataProps> {\r\n static displayName = 'FilelistItemInfoDialog';\r\n\r\n render() {\r\n const { fileItem, session } = this.props;\r\n return (\r\n <Modal\r\n className=\"filelist-item\"\r\n title={fileItem.name}\r\n closable={true}\r\n icon={<FileIcon typeInfo={fileItem.type} />}\r\n fullHeight={true}\r\n {...this.props}\r\n >\r\n <DownloadDialog\r\n downloadHandler={filelistDownloadHandler}\r\n itemDataGetter={FilelistItemGetter(session)}\r\n userGetter={() => session.user}\r\n session={session}\r\n />\r\n <FileItemInfoGrid\r\n fileItem={fileItem}\r\n downloadHandler={filelistDownloadHandler}\r\n user={session.user}\r\n session={session}\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<FilelistItemInfoDialogProps>(\r\n DataProviderDecorator<Props, DataProps>(FilelistItemInfoDialog, {\r\n urls: {\r\n fileItem: ({ params, session }, socket) =>\r\n FilelistItemGetter(session)(params.itemId!, socket),\r\n },\r\n }),\r\n 'item/:itemId',\r\n);\r\n\r\nexport { Decorated as FilelistItemInfoDialog };\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\nimport Reflux from 'reflux';\nimport FilelistConstants from 'constants/FilelistConstants';\nimport FilelistSessionStore from './FilelistSessionStore';\n\nexport default Reflux.createStore({\n _viewName: 'filelist_view',\n _apiUrl: FilelistConstants.SESSIONS_URL,\n _sessionStore: FilelistSessionStore,\n mixins: [ViewStoreMixin('name')],\n});\n","import FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport SocketService from 'services/SocketService';\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 { refreshVirtual } from 'services/api/ShareApi';\r\n\r\ntype Filter = UI.ActionFilter<API.FilelistItem, API.FilelistSession>;\r\n\r\n// Filters\r\nconst isMe: Filter = ({ entity }) => entity.user.flags.includes('self');\r\nconst isRoot: Filter = ({ itemData }) => itemData.path === '/';\r\nconst isPartialList: Filter = ({ entity }) => entity.partial_list;\r\nconst isDirectory: Filter = ({ itemData }) => itemData.type.id === 'directory';\r\n\r\nconst filterReload: Filter = (data) => isPartialList(data) && isDirectory(data);\r\nconst filterDetails: Filter = (data) => !isRoot(data);\r\n\r\n// Handlers\r\ntype Handler = UI.ActionHandler<API.FilelistItem, API.FilelistSession>;\r\n\r\nconst handleReloadDirectory: Handler = ({ itemData: item, entity: session }) => {\r\n return SocketService.post(`${FilelistConstants.SESSIONS_URL}/${session.id}/directory`, {\r\n list_path: item.path,\r\n reload: true,\r\n });\r\n};\r\n\r\nconst handleRefreshShare: Handler = ({ itemData }) => {\r\n return refreshVirtual(itemData.path);\r\n};\r\n\r\nconst handleItemDetails: Handler = ({ itemData, navigate }) => {\r\n navigate(`item/${itemData.id}`);\r\n};\r\n\r\n// Actions\r\nexport const FilelistItemReloadDirectoryAction = {\r\n id: 'reloadDirectory',\r\n displayName: 'Reload',\r\n access: API.AccessEnum.FILELISTS_VIEW,\r\n icon: IconConstants.RELOAD,\r\n filter: filterReload,\r\n handler: handleReloadDirectory,\r\n};\r\n\r\nexport const FilelistItemRefreshShareAction = {\r\n id: 'refreshShare',\r\n displayName: 'Refresh in share',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: isMe,\r\n handler: handleRefreshShare,\r\n};\r\n\r\nexport const FilelistItemDetailsAction = {\r\n id: 'details',\r\n displayName: 'Details',\r\n icon: IconConstants.DETAILS,\r\n handler: handleItemDetails,\r\n filter: filterDetails,\r\n};\r\n\r\nconst FilelistItemActions: UI.ActionListType<API.FilelistItem, API.FilelistSession> = {\r\n reloadDirectory: FilelistItemReloadDirectoryAction,\r\n refreshShare: FilelistItemRefreshShareAction,\r\n details: FilelistItemDetailsAction,\r\n};\r\n\r\nexport const FilelistItemActionModule = {\r\n moduleId: UI.Modules.FILELISTS,\r\n subId: 'item',\r\n};\r\n\r\nexport const FilelistItemActionMenu = {\r\n moduleData: FilelistItemActionModule,\r\n actions: FilelistItemActions,\r\n};\r\n","import FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { BuildRemoveSessionAction } from '../decorators/SessionActionDecorator';\r\n\r\nconst FilelistRemoveAction = BuildRemoveSessionAction(\r\n FilelistConstants.SESSIONS_URL,\r\n API.AccessEnum.FILELISTS_EDIT,\r\n);\r\n\r\nconst FilelistSessionActions: UI.ActionListType<API.FilelistSession> = {\r\n remove: FilelistRemoveAction,\r\n};\r\n\r\nexport const FilelistSessionActionModule = {\r\n moduleId: UI.Modules.FILELISTS,\r\n};\r\n\r\nexport const FilelistSessionActionMenu = {\r\n moduleData: FilelistSessionActionModule,\r\n actions: FilelistSessionActions,\r\n};\r\n","//import { useMemo } from 'react';\nimport * as React from 'react';\n\nimport { dupeToStringType } from 'utils/TypeConvert';\nimport { TableActionMenu } from 'components/action-menu';\n\nimport FilelistViewStore from 'stores/FilelistViewStore';\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\n\nimport VirtualTable from 'components/table/VirtualTable';\nimport {\n SizeCell,\n DurationCell,\n FileDownloadCell,\n FileDownloadCellClickHandler,\n} from 'components/table/Cell';\nimport { Column } from 'fixed-data-table-2';\n\nimport IconConstants from 'constants/IconConstants';\nimport Loader from 'components/semantic/Loader';\nimport Message from 'components/semantic/Message';\n\nimport * as API from 'types/api';\nimport * as UI from 'types/ui';\n\nimport { FilelistItemInfoDialog } from './item-info-dialog';\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\nimport MenuConstants from 'constants/MenuConstants';\nimport { FilelistItemActionMenu } from 'actions/ui/filelist';\n\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.FilelistItem> {\n session: API.FilelistSession;\n onClickDirectory: FileDownloadCellClickHandler;\n}\n\nconst NameCell: React.FC<NameCellProps> = ({\n rowDataGetter,\n onClickDirectory,\n session,\n ...other\n}) => {\n return (\n <FileDownloadCell\n clickHandlerGetter={onClickDirectory}\n userGetter={() => session.user}\n downloadHandler={filelistDownloadHandler}\n rowDataGetter={rowDataGetter}\n entity={session}\n remoteMenuId={MenuConstants.FILELIST_ITEM}\n {...other}\n >\n <TableActionMenu\n actions={FilelistItemActionMenu}\n itemData={rowDataGetter}\n ids={['refreshShare', 'details']}\n entity={session}\n />\n </FileDownloadCell>\n );\n};\n\ninterface ListBrowserProps {\n session: API.FilelistSession;\n onClickDirectory: (path: string) => void;\n sessionT: UI.ModuleTranslator;\n}\n\nclass FilelistItemTable extends React.Component<ListBrowserProps> {\n rowClassNameGetter = (rowData: API.FilelistItem) => {\n // Don't highlight dupes in own filelist...\n const isOwnList = this.props.session.user.flags.includes('self');\n return isOwnList ? '' : dupeToStringType(rowData.dupe);\n };\n\n emptyRowsNodeGetter = () => {\n const { location, state } = this.props.session;\n const { translate } = this.props.sessionT;\n\n if (state.id === 'download_failed') {\n return (\n <Message\n icon={IconConstants.ERROR}\n title={translate('Download failed')}\n description={state.str}\n />\n );\n }\n\n // The list finished downloading but the view hasn't updated yet\n const { files, directories } = location!.type as API.DirectoryType;\n if (files !== 0 || directories !== 0) {\n return <Loader text={translate('Updating view')} />;\n //return null;\n }\n\n // The directory was changed but the download state hasn't changed yet\n if (!location!.complete) {\n return <Loader text={translate('Preparing download')} />;\n }\n\n return (\n <Message\n title={translate('No content to display')}\n description={translate('The directory is empty')}\n />\n );\n };\n\n onClickDirectory: FileDownloadCellClickHandler = (cellData, rowDataGetter) => {\n if (rowDataGetter().type.id === 'directory') {\n return () =>\n this.props.onClickDirectory(this.props.session.location!.path + cellData + '/');\n }\n\n return undefined;\n };\n\n userGetter = () => {\n return this.props.session.user;\n };\n\n render() {\n const { session } = this.props;\n return (\n <>\n <VirtualTable\n emptyRowsNodeGetter={this.emptyRowsNodeGetter}\n rowClassNameGetter={this.rowClassNameGetter}\n store={FilelistViewStore}\n entityId={session.id}\n viewId={session.location!.path}\n sessionStore={FilelistSessionStore}\n moduleId={UI.Modules.FILELISTS}\n >\n <Column\n name=\"Name\"\n width={200}\n columnKey=\"name\"\n cell={<NameCell onClickDirectory={this.onClickDirectory} session={session} />}\n flexGrow={8}\n />\n <Column\n name=\"Size\"\n width={60}\n columnKey=\"size\"\n cell={<SizeCell />}\n flexGrow={1}\n />\n <Column name=\"Type\" width={70} columnKey=\"type\" flexGrow={1} hideWidth={500} />\n <Column\n name=\"Last modified\"\n width={80}\n columnKey=\"time\"\n cell={<DurationCell />}\n flexGrow={1}\n />\n </VirtualTable>\n <FilelistItemInfoDialog session={session} />\n </>\n );\n }\n}\n\nexport default FilelistItemTable;\n","import * as React from 'react';\r\n\r\nimport BrowserBar from 'components/browserbar/BrowserBar';\r\nimport { ActionMenu, DownloadMenu } from 'components/action-menu';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FilelistItemGetter } from './item-info-dialog';\r\nimport FilelistItemTable from './FilelistItemTable';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\nimport MenuConstants from 'constants/MenuConstants';\r\nimport { Location, useBlocker } from 'react-router-dom';\r\nimport { useSyncFilelistLocation } from '../effects/useSyncFilelistLocation';\r\nimport NotificationActions from 'actions/NotificationActions';\r\nimport { FilelistItemActionMenu } from 'actions/ui/filelist';\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n location: Location;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst ListBrowser: React.FC<ListBrowserProps> = (props) => {\r\n const { sessionT, session } = props;\r\n const [hasClickedDirectory, setHasClickedDirectory] = React.useState(false);\r\n\r\n const updateLocationState = useSyncFilelistLocation(props);\r\n\r\n const handleClickDirectory = (path: string) => {\r\n if (!hasClickedDirectory) {\r\n setHasClickedDirectory(true);\r\n }\r\n\r\n updateLocationState(path, false);\r\n };\r\n\r\n useBlocker(({ currentLocation, nextLocation, historyAction }) => {\r\n if (\r\n historyAction === 'POP' &&\r\n hasClickedDirectory &&\r\n nextLocation.pathname !== currentLocation.pathname\r\n ) {\r\n setHasClickedDirectory(false);\r\n NotificationActions.info({\r\n title: sessionT.t('confirmLeave', 'Confirm action'),\r\n message: sessionT.t(\r\n 'confirmLeaveDesc',\r\n 'Click the back button again to leave this filelist',\r\n ),\r\n });\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n const getCurrentDirectory = () => {\r\n return session.location;\r\n };\r\n\r\n const selectedNameFormatter = (caption: React.ReactNode) => {\r\n return (\r\n <DownloadMenu\r\n caption={caption}\r\n user={session.user}\r\n itemInfoGetter={getCurrentDirectory}\r\n downloadHandler={filelistDownloadHandler}\r\n contextElement=\".session-container\"\r\n entity={session}\r\n remoteMenuId={MenuConstants.FILELIST_ITEM}\r\n >\r\n <ActionMenu\r\n itemData={session.location}\r\n actions={FilelistItemActionMenu}\r\n entity={session}\r\n />\r\n </DownloadMenu>\r\n );\r\n };\r\n\r\n const userGetter = () => {\r\n return session.user;\r\n };\r\n\r\n const filelistItemFetcher = FilelistItemGetter(session);\r\n\r\n return (\r\n <div className=\"browser\">\r\n <BrowserBar\r\n path={session.location!.path}\r\n separator=\"/\"\r\n rootPath=\"/\"\r\n rootName={sessionT.translate('Root')}\r\n itemClickHandler={handleClickDirectory}\r\n selectedNameFormatter={selectedNameFormatter}\r\n // Just to make sure that the bar gets re-rendered when the switching to a different session (due to dropdown)\r\n entityId={session.id}\r\n />\r\n <FilelistItemTable\r\n session={session}\r\n sessionT={sessionT}\r\n onClickDirectory={handleClickDirectory}\r\n />\r\n <DownloadDialog\r\n downloadHandler={filelistDownloadHandler}\r\n itemDataGetter={filelistItemFetcher}\r\n userGetter={userGetter}\r\n session={session}\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ListBrowser;\r\n","import * as React from 'react';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { changeFilelistDirectory } from 'services/api/FilelistApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport { Location, useNavigate } from 'react-router-dom';\r\n\r\nexport type FilelistLocationState = { directory: string } | undefined;\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n location: Location;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n// Keeps the current location in sync with the backend\r\nexport const useSyncFilelistLocation = ({\r\n session,\r\n location,\r\n sessionT,\r\n}: ListBrowserProps) => {\r\n const navigate = useNavigate();\r\n\r\n const apiSendChangeDirectory = (directory: string) => {\r\n runBackgroundSocketAction(\r\n () => changeFilelistDirectory(session, directory),\r\n sessionT.plainT,\r\n );\r\n };\r\n\r\n const updateLocationState = (directory: string, replace: boolean) => {\r\n const locationState = location.state as FilelistLocationState;\r\n if (directory === locationState?.directory) {\r\n return;\r\n }\r\n\r\n // Handle it through location state data\r\n // as we also handle history navigation changes\r\n const newState: FilelistLocationState = {\r\n directory,\r\n };\r\n\r\n navigate(location.pathname, {\r\n state: newState,\r\n replace,\r\n });\r\n };\r\n\r\n // Handler for directory changes received from the API\r\n React.useEffect(() => {\r\n const locationState = location.state as FilelistLocationState;\r\n\r\n if (!locationState) {\r\n // Initial mount\r\n updateLocationState(session.location!.path, true);\r\n return;\r\n }\r\n\r\n // Nothing has changed?\r\n if (locationState.directory === session.location!.path) {\r\n return;\r\n }\r\n\r\n // Change initiated by another session/GUI, update our location\r\n updateLocationState(session.location!.path, true);\r\n }, [session.location?.path]);\r\n\r\n // Handler for own changes\r\n React.useEffect(() => {\r\n const locationState = location.state as FilelistLocationState;\r\n if (!locationState) {\r\n // Initial mount, handled by the previous useEffect\r\n return;\r\n }\r\n\r\n const directory = locationState.directory;\r\n if (directory === session.location!.path) {\r\n return;\r\n }\r\n\r\n // It's our change\r\n if (directory) {\r\n apiSendChangeDirectory(directory);\r\n }\r\n }, [(location.state as FilelistLocationState)?.directory]);\r\n\r\n return updateLocationState;\r\n};\r\n","import FilelistFooter from 'routes/Sidebar/routes/Filelists/components/FilelistFooter';\r\n\r\nimport ActiveSessionDecorator from 'decorators/ActiveSessionDecorator';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport classNames from 'classnames';\r\nimport ListBrowser from './ListBrowser';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/types';\r\n\r\ntype FilelistSessionProps = SessionChildProps<\r\n API.FilelistSession,\r\n UI.EmptyObject,\r\n UI.EmptyObject\r\n>;\r\n\r\nconst FilelistSession: React.FC<FilelistSessionProps> = (props) => {\r\n const { session, sessionT, location: routerLocation } = props;\r\n const { user, location: listLocation, state } = session;\r\n\r\n const isOwnList = user.flags.includes('self');\r\n const className = classNames('filelist session', { self: isOwnList });\r\n if (user.flags.includes('offline') && !isOwnList) {\r\n return (\r\n <div className={className}>\r\n <Message\r\n title={sessionT.t('userOffline', 'User offline')}\r\n description={sessionT.t<string>(\r\n 'userOfflineDesc',\r\n 'You will be able to continue browsing when the user comes back online',\r\n )}\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if ((state.id !== 'loaded' && state.id !== 'download_failed') || !listLocation) {\r\n return (\r\n <div className={className}>\r\n <Loader text={state.str} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className={className}>\r\n <ListBrowser location={routerLocation} session={session} sessionT={sessionT} />\r\n\r\n <FilelistFooter session={session} sessionT={sessionT} />\r\n </div>\r\n );\r\n};\r\n\r\nexport default ActiveSessionDecorator<FilelistSessionProps, API.FilelistSession>(\r\n FilelistSession,\r\n);\r\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 * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\nimport UserItemHandlerDecorator from 'routes/Sidebar/decorators/UserItemHandlerDecorator';\r\n\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\nimport FilelistSessionAPIActions from 'actions/reflux/FilelistSessionActions';\r\n\r\nimport FilelistNew from 'routes/Sidebar/routes/Filelists/components/FilelistNew';\r\nimport FilelistSession from 'routes/Sidebar/routes/Filelists/components/FilelistSession';\r\n\r\nimport '../style.css';\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 { FilelistSessionActionMenu } from 'actions/ui/filelist';\r\n\r\nconst UserItemHandler = UserItemHandlerDecorator(['message']);\r\nconst ItemHandler: UI.SessionInfoGetter<API.FilelistSession> = {\r\n itemLabelGetter() {\r\n return null;\r\n },\r\n\r\n itemNameGetter(session) {\r\n return session.share_profile\r\n ? session.share_profile.str\r\n : UserItemHandler.itemNameGetter(session);\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return session.share_profile ? 'blue' : UserItemHandler.itemStatusGetter!(session);\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n return session.share_profile\r\n ? actionMenu\r\n : UserItemHandler.itemHeaderTitleGetter!(session, location, actionMenu);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.share_profile\r\n ? null\r\n : UserItemHandler.itemHeaderDescriptionGetter(session);\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return session.share_profile\r\n ? 'green server'\r\n : UserItemHandler.itemHeaderIconGetter(session);\r\n },\r\n};\r\n\r\nconst Filelists: React.FC<SessionProviderDecoratorChildProps<API.FilelistSession>> = (\r\n props,\r\n) => {\r\n const { params, sessionT, ...other } = props;\r\n return (\r\n <SessionLayout\r\n activeId={params.id}\r\n baseUrl=\"filelists\"\r\n newCaption={sessionT.t('new', 'Open filelist')}\r\n newDescription={sessionT.t('newDesc', 'Start browsing a new filelist')}\r\n newIcon={IconConstants.FILELISTS_PLAIN}\r\n disableSideMenu={true}\r\n editAccess={API.AccessEnum.FILELISTS_EDIT}\r\n uiActions={FilelistSessionActionMenu}\r\n sessionApi={FilelistSessionAPIActions as UI.SessionActions<API.FilelistSession>}\r\n unreadInfoStore={FilelistSessionStore}\r\n sessionItemLayout={FilelistSession}\r\n newLayout={FilelistNew}\r\n sessionT={sessionT}\r\n remoteMenuId=\"filelist\"\r\n {...ItemHandler}\r\n {...other}\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(\r\n Filelists,\r\n FilelistSessionStore,\r\n UI.Modules.FILELISTS,\r\n);\r\n","import LoginStore from 'stores/LoginStore';\r\nimport { fetchData } from 'utils/HttpUtils';\r\n\r\nexport const uploadTempFile = async (file: File): Promise<string> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const res = await fetchData(`${getBasePath()}temp`, {\r\n method: 'POST',\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n Authorization: LoginStore.authToken,\r\n },\r\n body: file,\r\n });\r\n\r\n return res.headers.get('Location')!;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nconst toCorsSafeUrl = (url: string) => {\r\n const proxyUrl = `${\r\n window.location.origin\r\n }${getBasePath()}proxy?url=${encodeURIComponent(url)}`;\r\n return proxyUrl;\r\n};\r\n\r\nexport const fetchCorsSafeData = async (\r\n url: string,\r\n isJSON: boolean,\r\n options?: RequestInit,\r\n) => {\r\n try {\r\n //console.log(`CORS HTTP request started (${url})`);\r\n\r\n const res = await fetchData(toCorsSafeUrl(url), {\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n // Temp workaround for people upgrading from versions < 2.7.0\r\n // If the new UI was loaded before restarting the app, a cache expiration time of\r\n // one year would have been set for \"Not found\" errors...\r\n 'Cache-Control': 'no-store, must-revalidate, max-age=0',\r\n },\r\n ...options,\r\n });\r\n\r\n const data = (await isJSON) ? res.json() : res.text();\r\n return data;\r\n } catch (e) {\r\n console.error(`CORS HTTP request failed (${url})`, e);\r\n throw e;\r\n }\r\n};\r\n","import ShareConstants from 'constants/ShareConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport { uploadTempFile } from '../HttpService';\r\n\r\nimport * as API from 'types/api';\r\n\r\nexport interface AddTempShareResponse {\r\n magnet: string;\r\n}\r\n\r\nexport const shareTempFile = async (\r\n file: File,\r\n hubUrl: string,\r\n cid: string | undefined,\r\n): Promise<AddTempShareResponse> => {\r\n // eslint-disable-next-line no-useless-catch\r\n try {\r\n const fileId = await uploadTempFile(file);\r\n const res = await SocketService.post<AddTempShareResponse>(\r\n ShareConstants.TEMP_SHARES_URL,\r\n {\r\n name: file.name,\r\n file_id: fileId,\r\n hub_url: hubUrl,\r\n cid,\r\n },\r\n );\r\n\r\n return res;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nexport const refresh = (incoming: boolean) => {\r\n return SocketService.post(ShareConstants.REFRESH_URL, {\r\n incoming,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshPaths = (paths: string[]) => {\r\n return SocketService.post(ShareConstants.REFRESH_PATHS_URL, {\r\n paths,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshVirtual = (path: string) => {\r\n return SocketService.post(ShareConstants.REFRESH_VIRTUAL_URL, {\r\n path,\r\n });\r\n};\r\n\r\nexport const abortRefreshTask = (id: number) => {\r\n return SocketService.delete(`${ShareConstants.REFRESH_TASKS_URL}/${id}`);\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","locals","DupeStrings","SHARE_PARTIAL","SHARE_FULL","QUEUE_PARTIAL","QUEUE_FULL","FINISHED_PARTIAL","FINISHED_FULL","SHARE_QUEUE","SHARE_FINISHED","QUEUE_FINISHED","SHARE_QUEUE_FINISHED","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","gridT","text","COMMON","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","entity","MODULE_URL","PROFILES_URL","PROFILE_ADDED","PROFILE_UPDATED","PROFILE_REMOVED","HIDDEN_PROFILE_ID","profileToEnumValue","profile","Component","listHidden","dataProviderDecoratorSettings","addSize","merge","urls","profiles","dataConverters","data","filter","p","convertProfile","onSocketConnected","addSocketListener","refetchData","entries","entryTitleRenderer","hasSession","entryIcon","length","entry","index","header","description","last_opened","defaultValue","replace","timeAgo","icon","entryType","socket","get","SESSIONS_URL","itemMenuIds","itemNameGetter","nicks","itemStatusGetter","flags","itemHeaderDescriptionGetter","hub_names","itemHeaderIconGetter","itemHeaderTitleGetter","location","actionMenu","ids","remoteMenuId","HINTED_USER","ShareProfileSelector","onClick","this","props","onProfileChanged","getDropdownItem","MenuItemLink","render","sessionT","Dropdown","translate","triggerIcon","ShareProfileDecorator","handleSubmit","navigate","FilelistSessionActions","createSession","sessionStore","FilelistSessionStore","onChange","offlineMessage","isClearable","autoFocus","profileId","ownList","RecentLayout","FILELIST","getSession","cid","_","IconConstants","FILELISTS_PLAIN","locationText","plainT","SessionFooter","label","total_size","FilelistItemGetter","itemId","FilelistConstants","FilelistItemInfoDialog","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","itemDataGetter","userGetter","displayName","Decorated","ModalRouteDecorator","DataProviderDecorator","params","_viewName","_apiUrl","_sessionStore","mixins","ViewStoreMixin","FilelistItemActions","reloadDirectory","access","FILELISTS_VIEW","RELOAD","partial_list","isPartialList","itemData","isDirectory","handler","item","SocketService","post","list_path","reload","refreshShare","SETTINGS_EDIT","REFRESH_COLORED","includes","details","DETAILS","isRoot","FilelistItemActionMenu","moduleData","moduleId","FILELISTS","subId","actions","remove","FILELISTS_EDIT","FilelistSessionActionMenu","NameCell","rowDataGetter","onClickDirectory","other","clickHandlerGetter","MenuConstants","FILELIST_ITEM","FilelistItemTable","rowClassNameGetter","rowData","emptyRowsNodeGetter","state","Message","ERROR","files","directories","Loader","complete","cellData","VirtualTable","store","FilelistViewStore","entityId","viewId","width","columnKey","cell","flexGrow","hideWidth","hasClickedDirectory","setHasClickedDirectory","updateLocationState","directory","locationState","newState","pathname","apiSendChangeDirectory","useSyncFilelistLocation","handleClickDirectory","currentLocation","nextLocation","historyAction","NotificationActions","info","message","getCurrentDirectory","filelistItemFetcher","BrowserBar","separator","rootPath","rootName","itemClickHandler","selectedNameFormatter","ActiveSessionDecorator","A","routerLocation","listLocation","isOwnList","self","UserItemHandler","UserItemHandlerDecorator","ItemHandler","itemLabelGetter","share_profile","SessionProviderDecorator","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","disableSideMenu","editAccess","uiActions","sessionApi","unreadInfoStore","sessionItemLayout","newLayout","uploadTempFile","file","getBasePath","method","headers","authToken","Authorization","body","e","fetchCorsSafeData","url","isJSON","res","window","origin","encodeURIComponent","toCorsSafeUrl","json","console","error","shareTempFile","hubUrl","fileId","TEMP_SHARES_URL","file_id","hub_url","refreshPaths","REFRESH_PATHS_URL","priority","MANUAL","refreshVirtual","REFRESH_VIRTUAL_URL","abortRefreshTask","delete","REFRESH_TASKS_URL"],"sourceRoot":""}
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[664],{69865:(e,n,t)=>{t.d(n,{A:()=>a});var s=t(71354),i=t.n(s),o=t(76314),r=t.n(o)()(i());r.push([e.id,".file.session {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n margin-top: 10px;\n}\n\n.file.session .content {\n flex: 1;\n overflow: auto;\n}\n\n.file.session .content pre {\n overflow: initial;\n}\n\n.file.session.nfo .file-content pre {\n font-family: 'Courier New', 'DejaVu Sans Mono', monospace;\n font-size: 11px;\n line-height: 12px;\n padding: 3px;\n margin: 0px;\n}\n\n.file.session img,\n.file.session video {\n max-width: 100%;\n max-height: 99%;\n}\n\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\n:-webkit-full-screen-ancestor:not(iframe) {\n max-width: inherit !important;\n overflow-x: initial;\n}\n\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\n visibility: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Files/style.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB",sourcesContent:[".file.session {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n margin-top: 10px;\n}\n\n.file.session .content {\n flex: 1;\n overflow: auto;\n}\n\n.file.session .content pre {\n overflow: initial;\n}\n\n.file.session.nfo .file-content pre {\n font-family: 'Courier New', 'DejaVu Sans Mono', monospace;\n font-size: 11px;\n line-height: 12px;\n padding: 3px;\n margin: 0px;\n}\n\n.file.session img,\n.file.session video {\n max-width: 100%;\n max-height: 99%;\n}\n\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\n:-webkit-full-screen-ancestor:not(iframe) {\n max-width: inherit !important;\n overflow-x: initial;\n}\n\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\n visibility: hidden;\n}\n"],sourceRoot:""}]);const a=r},51938:(e,n,t)=>{t.d(n,{rI:()=>r,E5:()=>a,ug:()=>f,Ag:()=>p});var s=t(74848),i=t(96540);function o(e){return({url:n,autoPlay:t})=>{const[o,r]=i.useState(null),a=i.useRef(null);if(i.useEffect((()=>{a.current&&a.current.load(),r(null)}),[n]),o)return(0,s.jsx)("div",{children:o});const l={onError:e=>{r((e=>{const n=e.target.error;switch(n.code){case n.MEDIA_ERR_NETWORK:return"A network error caused the media download to fail";case n.MEDIA_ERR_DECODE:return"The media playback was aborted due to a corruption problem or because the media used features your browser did not support";case n.MEDIA_ERR_SRC_NOT_SUPPORTED:return"The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser";default:return"An unknown media error occurred"}})(e))},autoPlay:t,controls:!0,src:n};return(0,s.jsx)(e,{mediaRef:a,mediaProps:l,url:n})}}const r=o((({mediaRef:e,mediaProps:n})=>(0,s.jsx)("audio",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},n)))),a=({url:e})=>(0,s.jsx)("img",{src:e,style:{maxWidth:"100%",maxHeight:"100%"}});var l=t(62048),c=t(32728),d=t(67749),u=t(42695),A=t(32389),m=t(99347);const f=({textGetter:e,url:n})=>{const[t,o]=(0,i.useState)(null),[r,a]=(0,i.useState)(null),{t:f}=(0,A.Bd)();return(0,i.useEffect)((()=>(e().then(o).catch(a),()=>{o(null),a(null)})),[n]),t?(0,s.jsx)("pre",{children:(0,s.jsx)(l.PW,{text:t})}):r?(0,s.jsx)(c.A,{title:(0,u.Tl)("Failed to fetch content",f,d.KV.COMMON),description:r.message}):(0,s.jsx)(m.A,{})},p=o((({mediaRef:e,mediaProps:n})=>(0,s.jsx)("video",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},n))))},73070:(e,n,t)=>{t.d(n,{Y9:()=>u,fI:()=>d,xA:()=>A});var s=t(74848),i=(t(96540),t(46942)),o=t.n(i),r=t(32389),a=t(42695),l=t(67749);const c=e=>e||(0,s.jsx)(r.x6,{i18nKey:(0,a.j2)("na",l.KV.COMMON),children:"N/A"}),d=({title:e,text:n,className:t,titleWidth:i="four",noText:r})=>(0,s.jsxs)("div",{className:o()("ui row",t),children:[(0,s.jsx)("div",{className:o()(r?"sixteen":i,"wide column title"),children:(0,s.jsx)("div",{className:"ui tiny header",style:{overflow:"hidden"},children:e})}),!r&&(0,s.jsx)("div",{className:"column value",children:c(n)})]}),u=({title:e})=>(0,s.jsx)("div",{className:"ui row",children:(0,s.jsx)("div",{className:"sixteen wide column",children:(0,s.jsx)("div",{className:"ui blue section header",children:e})})}),A=e=>{var{className:n,children:t,columns:i,stackable:r}=e,a=function(e,n){var t={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&n.indexOf(s)<0&&(t[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(s=Object.getOwnPropertySymbols(e);i<s.length;i++)n.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(e,s[i])&&(t[s[i]]=e[s[i]])}return t}(e,["className","children","columns","stackable"]);return(0,s.jsx)("div",Object.assign({className:o()("ui grid",{[`${i} column`]:!!i},{stackable:r},n)},a,{children:t}))}},53632:(e,n,t)=>{t.d(n,{A:()=>o});var s=t(74848),i=t(96540);function o(e,n=60){class t extends i.Component{constructor(){super(...arguments),this.scheduleComponentRefresh=()=>{this.redrawTimeout=window.setTimeout((()=>{this.forceUpdate(),this.scheduleComponentRefresh()}),1e3*n)}}componentDidMount(){this.scheduleComponentRefresh()}componentWillUnmount(){clearTimeout(this.redrawTimeout)}render(){return(0,s.jsx)(e,Object.assign({},this.props))}}return t}},57279:(e,n,t)=>{t.r(n),t.d(n,{default:()=>J});var s=t(74848),i=t(96540),o=t(91950),r=t(83148),a=t(83762),l=t(5945),c=t(32728),d=t(46942),u=t.n(d),A=t(4425),m=t(99347),f=t(79531),p=t(53632),h=t(98573),x=t(38453),E=t(8098);const b=(0,p.A)((({item:e,sessionT:n})=>{if((0,E.mY)())return null;const t=e.download_state;return(0,s.jsx)(x.q,{children:(0,s.jsx)(x.J,{label:n.translate(t?"Downloaded":"Opened"),text:(0,h.fw)(t?t.time_finished:e.time_opened)})})}));var w=t(41860),y=t(51938),j=t(95093),v=t.n(j),g=t(41110),C=t(68443);const O=e=>v().duration(v()().diff(v().unix(e.time_opened))).asMinutes()<=1,_=(0,i.memo)((function({session:e,sessionT:n,scrollPositionHandler:t}){const{scrollable:i,restoreScrollPosition:o}=(0,C.Lu)(t,e),r=(e=>{if(e.text)return e=>(0,s.jsx)(y.ug,Object.assign({},e,{textGetter:()=>(0,g.F)(e.url).then((e=>e.text())).then((n=>(e.onReady(),n))),url:e.url}));switch(e.type.content_type){case"audio":return n=>(0,s.jsx)(y.rI,Object.assign({autoPlay:O(e)},n));case"picture":return e=>(0,s.jsx)(y.E5,Object.assign({},e));case"video":return n=>(0,s.jsx)(y.Ag,Object.assign({autoPlay:O(e)},n))}return null})(e);let a;var l;return a=r?(0,s.jsx)(r,{item:e,url:(l=e.tth,`${getBasePath()}view/${l}?auth_token=${w.A.authToken}`),type:e.mime_type,extension:e.type.str,sessionT:n,onReady:o}):n.translate("Unsupported format"),(0,s.jsx)("div",{ref:i,className:"content",children:a})}));class B extends i.Component{render(){const{session:e,sessionT:n}=this.props;return e.content_ready?(0,s.jsxs)("div",{className:u()("file session",e.type.str,e.type.content_type),children:[(0,s.jsx)(_,{session:e,sessionT:n,scrollPositionHandler:r.A.scroll}),(0,s.jsx)(b,{item:e,sessionT:n})]}):"download_failed"===e.download_state.id?(0,s.jsx)("div",{className:"file session",children:(0,s.jsx)(c.A,{icon:A.A.ERROR,title:n.translate("Download failed"),description:e.download_state.str})}):(0,s.jsx)(m.A,{text:e.download_state.str})}}const T=(0,f.A)(B);var I=t(85072),N=t.n(I),R=t(97825),S=t.n(R),k=t(77659),P=t.n(k),D=t(55056),W=t.n(D),M=t(10540),V=t.n(M),F=t(41113),L=t.n(F),U=t(69865),H={};H.styleTagTransform=L(),H.setAttributes=W(),H.insert=P().bind(null,"head"),H.domAPI=S(),H.insertStyleElement=V(),N()(U.A,H),U.A&&U.A.locals&&U.A.locals;var G=t(86038),K=t(67749),Y=t(78046),$=t(85899);const z={remove:(0,t(4112).R)($.A.SESSIONS_URL,G.US.VIEW_FILE_EDIT)},Z={moduleData:{moduleId:K.KV.VIEWED_FILES},actions:z};const q={itemNameGetter:e=>e.name,itemLabelGetter:()=>null,itemHeaderDescriptionGetter:()=>null,itemHeaderIconGetter:e=>(0,s.jsx)(l.A,{typeInfo:e.type})},J=(0,Y.Z)((e=>{const{params:n,sessionT:t}=e,i=function(e,n){var t={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&n.indexOf(s)<0&&(t[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(s=Object.getOwnPropertySymbols(e);i<s.length;i++)n.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(e,s[i])&&(t[s[i]]=e[s[i]])}return t}(e,["params","sessionT"]);return 0===e.items.length?(0,s.jsx)(c.A,{title:t.t("noFiles","No files to view"),description:t.t("noFilesDesc","You may open text or media files to be viewed here from search or filelists")}):(0,s.jsx)(o.A,Object.assign({activeId:n.id,baseUrl:"files",disableSideMenu:!0,editAccess:G.US.VIEW_FILE_EDIT,uiActions:Z,sessionApi:a.A,unreadInfoStore:r.A,sessionItemLayout:T,sessionT:t},q,i))}),r.A,K.KV.VIEWED_FILES)}}]);
2
- //# sourceMappingURL=files.c892fc18f34c0df21798.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[664],{69865:(e,n,t)=>{t.d(n,{A:()=>a});var s=t(71354),i=t.n(s),o=t(76314),r=t.n(o)()(i());r.push([e.id,".file.session {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n margin-top: 10px;\n}\n\n.file.session .content {\n flex: 1;\n overflow: auto;\n}\n\n.file.session .content pre {\n overflow: initial;\n}\n\n.file.session.nfo .file-content pre {\n font-family: 'Courier New', 'DejaVu Sans Mono', monospace;\n font-size: 11px;\n line-height: 12px;\n padding: 3px;\n margin: 0px;\n}\n\n.file.session img,\n.file.session video {\n max-width: 100%;\n max-height: 99%;\n}\n\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\n:-webkit-full-screen-ancestor:not(iframe) {\n max-width: inherit !important;\n overflow-x: initial;\n}\n\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\n visibility: hidden;\n}\n","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Files/style.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB",sourcesContent:[".file.session {\n flex: 1 1 auto;\n display: flex;\n flex-direction: column;\n max-height: 100%;\n max-width: 100%;\n margin-top: 10px;\n}\n\n.file.session .content {\n flex: 1;\n overflow: auto;\n}\n\n.file.session .content pre {\n overflow: initial;\n}\n\n.file.session.nfo .file-content pre {\n font-family: 'Courier New', 'DejaVu Sans Mono', monospace;\n font-size: 11px;\n line-height: 12px;\n padding: 3px;\n margin: 0px;\n}\n\n.file.session img,\n.file.session video {\n max-width: 100%;\n max-height: 99%;\n}\n\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\n:-webkit-full-screen-ancestor:not(iframe) {\n max-width: inherit !important;\n overflow-x: initial;\n}\n\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\n visibility: hidden;\n}\n"],sourceRoot:""}]);const a=r},51938:(e,n,t)=>{t.d(n,{rI:()=>r,E5:()=>a,ug:()=>f,Ag:()=>p});var s=t(74848),i=t(96540);function o(e){return({url:n,autoPlay:t})=>{const[o,r]=i.useState(null),a=i.useRef(null);if(i.useEffect((()=>{a.current&&a.current.load(),r(null)}),[n]),o)return(0,s.jsx)("div",{children:o});const l={onError:e=>{r((e=>{const n=e.target.error;switch(n.code){case n.MEDIA_ERR_NETWORK:return"A network error caused the media download to fail";case n.MEDIA_ERR_DECODE:return"The media playback was aborted due to a corruption problem or because the media used features your browser did not support";case n.MEDIA_ERR_SRC_NOT_SUPPORTED:return"The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser";default:return"An unknown media error occurred"}})(e))},autoPlay:t,controls:!0,src:n};return(0,s.jsx)(e,{mediaRef:a,mediaProps:l,url:n})}}const r=o((({mediaRef:e,mediaProps:n})=>(0,s.jsx)("audio",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},n)))),a=({url:e})=>(0,s.jsx)("img",{src:e,style:{maxWidth:"100%",maxHeight:"100%"}});var l=t(62048),c=t(32728),d=t(67749),u=t(42695),A=t(32389),m=t(99347);const f=({textGetter:e,url:n})=>{const[t,o]=(0,i.useState)(null),[r,a]=(0,i.useState)(null),{t:f}=(0,A.Bd)();return(0,i.useEffect)((()=>(e().then(o).catch(a),()=>{o(null),a(null)})),[n]),t?(0,s.jsx)("pre",{children:(0,s.jsx)(l.PW,{text:t})}):r?(0,s.jsx)(c.A,{title:(0,u.Tl)("Failed to fetch content",f,d.KV.COMMON),description:r.message}):(0,s.jsx)(m.A,{})},p=o((({mediaRef:e,mediaProps:n})=>(0,s.jsx)("video",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},n))))},73070:(e,n,t)=>{t.d(n,{Y9:()=>u,fI:()=>d,xA:()=>A});var s=t(74848),i=(t(96540),t(46942)),o=t.n(i),r=t(32389),a=t(42695),l=t(67749);const c=e=>e||(0,s.jsx)(r.x6,{i18nKey:(0,a.j2)("na",l.KV.COMMON),children:"N/A"}),d=({title:e,text:n,className:t,titleWidth:i="four",noText:r})=>(0,s.jsxs)("div",{className:o()("ui row",t),children:[(0,s.jsx)("div",{className:o()(r?"sixteen":i,"wide column title"),children:(0,s.jsx)("div",{className:"ui tiny header",style:{overflow:"hidden"},children:e})}),!r&&(0,s.jsx)("div",{className:"column value",children:c(n)})]}),u=({title:e})=>(0,s.jsx)("div",{className:"ui row",children:(0,s.jsx)("div",{className:"sixteen wide column",children:(0,s.jsx)("div",{className:"ui blue section header",children:e})})}),A=e=>{var{className:n,children:t,columns:i,stackable:r}=e,a=function(e,n){var t={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&n.indexOf(s)<0&&(t[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(s=Object.getOwnPropertySymbols(e);i<s.length;i++)n.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(e,s[i])&&(t[s[i]]=e[s[i]])}return t}(e,["className","children","columns","stackable"]);return(0,s.jsx)("div",Object.assign({className:o()("ui grid",{[`${i} column`]:!!i},{stackable:r},n)},a,{children:t}))}},53632:(e,n,t)=>{t.d(n,{A:()=>o});var s=t(74848),i=t(96540);function o(e,n=60){class t extends i.Component{constructor(){super(...arguments),this.scheduleComponentRefresh=()=>{this.redrawTimeout=window.setTimeout((()=>{this.forceUpdate(),this.scheduleComponentRefresh()}),1e3*n)}}componentDidMount(){this.scheduleComponentRefresh()}componentWillUnmount(){clearTimeout(this.redrawTimeout)}render(){return(0,s.jsx)(e,Object.assign({},this.props))}}return t}},57279:(e,n,t)=>{t.r(n),t.d(n,{default:()=>J});var s=t(74848),i=t(96540),o=t(91950),r=t(83148),a=t(83762),l=t(5945),c=t(32728),d=t(46942),u=t.n(d),A=t(4425),m=t(99347),f=t(79531),p=t(53632),h=t(98573),x=t(38453),E=t(8098);const b=(0,p.A)((({item:e,sessionT:n})=>{if((0,E.mY)())return null;const t=e.download_state;return(0,s.jsx)(x.q,{children:(0,s.jsx)(x.J,{label:n.translate(t?"Downloaded":"Opened"),text:(0,h.fw)(t?t.time_finished:e.time_opened)})})}));var w=t(41860),y=t(51938),j=t(95093),v=t.n(j),g=t(41110),C=t(68443);const O=e=>v().duration(v()().diff(v().unix(e.time_opened))).asMinutes()<=1,_=(0,i.memo)((function({session:e,sessionT:n,scrollPositionHandler:t}){const{scrollable:i,restoreScrollPosition:o}=(0,C.Lu)(t,e),r=(e=>{if(e.text)return e=>(0,s.jsx)(y.ug,Object.assign({},e,{textGetter:()=>(0,g.F)(e.url).then((e=>e.text())).then((n=>(e.onReady(),n))),url:e.url}));switch(e.type.content_type){case"audio":return n=>(0,s.jsx)(y.rI,Object.assign({autoPlay:O(e)},n));case"picture":return e=>(0,s.jsx)(y.E5,Object.assign({},e));case"video":return n=>(0,s.jsx)(y.Ag,Object.assign({autoPlay:O(e)},n))}return null})(e);let a;var l;return a=r?(0,s.jsx)(r,{item:e,url:(l=e.tth,`${getBasePath()}view/${l}?auth_token=${w.A.authToken}`),type:e.mime_type,extension:e.type.str,sessionT:n,onReady:o}):n.translate("Unsupported format"),(0,s.jsx)("div",{ref:i,className:"content",children:a})}));class B extends i.Component{render(){const{session:e,sessionT:n}=this.props;return e.content_ready?(0,s.jsxs)("div",{className:u()("file session",e.type.str,e.type.content_type),children:[(0,s.jsx)(_,{session:e,sessionT:n,scrollPositionHandler:r.A.scroll}),(0,s.jsx)(b,{item:e,sessionT:n})]}):"download_failed"===e.download_state.id?(0,s.jsx)("div",{className:"file session",children:(0,s.jsx)(c.A,{icon:A.A.ERROR,title:n.translate("Download failed"),description:e.download_state.str})}):(0,s.jsx)(m.A,{text:e.download_state.str})}}const I=(0,f.A)(B);var T=t(85072),N=t.n(T),R=t(97825),S=t.n(R),k=t(77659),P=t.n(k),D=t(55056),W=t.n(D),M=t(10540),V=t.n(M),F=t(41113),L=t.n(F),U=t(69865),H={};H.styleTagTransform=L(),H.setAttributes=W(),H.insert=P().bind(null,"head"),H.domAPI=S(),H.insertStyleElement=V(),N()(U.A,H),U.A&&U.A.locals&&U.A.locals;var G=t(86038),K=t(67749),Y=t(78046),$=t(85899);const z={remove:(0,t(4112).R)($.A.SESSIONS_URL,G.US.VIEW_FILE_EDIT)},Z={moduleData:{moduleId:K.KV.VIEWED_FILES},actions:z};const q={itemNameGetter:e=>e.name,itemLabelGetter:()=>null,itemHeaderDescriptionGetter:()=>null,itemHeaderIconGetter:e=>(0,s.jsx)(l.A,{typeInfo:e.type})},J=(0,Y.Z)((e=>{const{params:n,sessionT:t}=e,i=function(e,n){var t={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&n.indexOf(s)<0&&(t[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(s=Object.getOwnPropertySymbols(e);i<s.length;i++)n.indexOf(s[i])<0&&Object.prototype.propertyIsEnumerable.call(e,s[i])&&(t[s[i]]=e[s[i]])}return t}(e,["params","sessionT"]);return 0===e.items.length?(0,s.jsx)(c.A,{title:t.t("noFiles","No files to view"),description:t.t("noFilesDesc","You may open text or media files to be viewed here from search or filelists")}):(0,s.jsx)(o.A,Object.assign({activeId:n.id,baseUrl:"files",disableSideMenu:!0,editAccess:G.US.VIEW_FILE_EDIT,uiActions:Z,sessionApi:a.A,unreadInfoStore:r.A,sessionItemLayout:I,sessionT:t,remoteMenuId:"view_file"},q,i))}),r.A,K.KV.VIEWED_FILES)}}]);
2
+ //# sourceMappingURL=files.e2f20d9b781cccf39e46.chunk.js.map