airdcpp-webui 2.11.2 → 2.11.3-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.html +2 -2
  3. package/dist/js/{285.902dc3166e82226541a5.chunk.js → 285.c10a92f5e683562b290c.chunk.js} +2 -2
  4. package/dist/js/285.c10a92f5e683562b290c.chunk.js.gz +0 -0
  5. package/dist/js/{285.902dc3166e82226541a5.chunk.js.map → 285.c10a92f5e683562b290c.chunk.js.map} +1 -1
  6. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js +2 -0
  7. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.gz +0 -0
  8. package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.map +1 -0
  9. package/dist/js/{424.b407aaf3218fa480b144.chunk.js → 424.2b137728423ffe5720b9.chunk.js} +1 -1
  10. package/dist/js/424.2b137728423ffe5720b9.chunk.js.gz +0 -0
  11. package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map} +1 -1
  12. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js → 668.d8fc363a0da7c52c6cf3.chunk.js} +1 -1
  13. package/dist/js/668.d8fc363a0da7c52c6cf3.chunk.js.gz +0 -0
  14. package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js.map → 668.d8fc363a0da7c52c6cf3.chunk.js.map} +1 -1
  15. package/dist/js/{69.8ca10b3d679cc4c52a20.chunk.js → 69.90201ebd79a3d236605f.chunk.js} +2 -2
  16. package/dist/js/69.90201ebd79a3d236605f.chunk.js.gz +0 -0
  17. package/dist/js/69.90201ebd79a3d236605f.chunk.js.map +1 -0
  18. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
  19. package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
  20. package/dist/js/{702.99e6ce480dc579b6e542.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
  21. package/dist/js/760.28a29fef05eb0889fc25.chunk.js +3 -0
  22. package/dist/js/{760.75d229a05d7b9bdf414b.chunk.js.LICENSE.txt → 760.28a29fef05eb0889fc25.chunk.js.LICENSE.txt} +0 -0
  23. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.gz +0 -0
  24. package/dist/js/760.28a29fef05eb0889fc25.chunk.js.map +1 -0
  25. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js → favorite-hubs.d78427e6a9006438d07b.chunk.js} +1 -1
  26. package/dist/js/favorite-hubs.d78427e6a9006438d07b.chunk.js.gz +0 -0
  27. package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.map → favorite-hubs.d78427e6a9006438d07b.chunk.js.map} +1 -1
  28. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js → filelists.726450e0ff6e77eaa054.chunk.js} +1 -1
  29. package/dist/js/filelists.726450e0ff6e77eaa054.chunk.js.gz +0 -0
  30. package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js.map → filelists.726450e0ff6e77eaa054.chunk.js.map} +1 -1
  31. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js → files.50c047ffc599c58eb13a.chunk.js} +2 -2
  32. package/dist/js/files.50c047ffc599c58eb13a.chunk.js.gz +0 -0
  33. package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map} +1 -1
  34. package/dist/js/home.ed1091a84aa53f290563.chunk.js +3 -0
  35. package/dist/js/{home.21a1fe21d45ac82fafe5.chunk.js.LICENSE.txt → home.ed1091a84aa53f290563.chunk.js.LICENSE.txt} +0 -0
  36. package/dist/js/home.ed1091a84aa53f290563.chunk.js.gz +0 -0
  37. package/dist/js/home.ed1091a84aa53f290563.chunk.js.map +1 -0
  38. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js → hubs.eed2f41d894688465906.chunk.js} +2 -2
  39. package/dist/js/hubs.eed2f41d894688465906.chunk.js.gz +0 -0
  40. package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js.map → hubs.eed2f41d894688465906.chunk.js.map} +1 -1
  41. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
  42. package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
  43. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
  44. package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
  45. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
  46. package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
  47. package/dist/js/locales/{el.648369d465eb99118703.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
  48. package/dist/js/locales/{el.648369d465eb99118703.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
  49. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
  50. package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
  51. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js → es.cbe6378a22cf5ee485cd.chunk.js} +0 -0
  52. package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js.gz → es.cbe6378a22cf5ee485cd.chunk.js.gz} +0 -0
  53. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
  54. package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
  55. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
  56. package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
  57. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
  58. package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
  59. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
  60. package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
  61. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
  62. package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
  63. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
  64. package/dist/js/locales/{nl.88085590f152551ec225.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
  65. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
  66. package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
  67. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
  68. package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
  69. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
  70. package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
  71. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
  72. package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
  73. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
  74. package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
  75. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
  76. package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
  77. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
  78. package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
  79. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
  80. package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
  81. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js +1 -0
  82. package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js.gz +0 -0
  83. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
  84. package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
  85. package/dist/js/{main.d64158ea2453985dde98.entry.js → main.ad3d59f07b32feb5be60.entry.js} +3 -3
  86. package/dist/js/{main.d64158ea2453985dde98.entry.js.LICENSE.txt → main.ad3d59f07b32feb5be60.entry.js.LICENSE.txt} +0 -0
  87. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.gz +0 -0
  88. package/dist/js/main.ad3d59f07b32feb5be60.entry.js.map +1 -0
  89. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js → messages.d213dd0ac314a64b5a6c.chunk.js} +1 -1
  90. package/dist/js/messages.d213dd0ac314a64b5a6c.chunk.js.gz +0 -0
  91. package/dist/js/{messages.e4523315258f6dab0f37.chunk.js.map → messages.d213dd0ac314a64b5a6c.chunk.js.map} +1 -1
  92. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js → queue.2fcf7a1381f1fb4af03f.chunk.js} +1 -1
  93. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.gz → queue.2fcf7a1381f1fb4af03f.chunk.js.gz} +0 -0
  94. package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.map → queue.2fcf7a1381f1fb4af03f.chunk.js.map} +1 -1
  95. package/dist/js/{search.321f771dd92b51431378.chunk.js → search.24ec8c5fe5f45b1180a9.chunk.js} +2 -2
  96. package/dist/js/search.24ec8c5fe5f45b1180a9.chunk.js.gz +0 -0
  97. package/dist/js/{search.321f771dd92b51431378.chunk.js.map → search.24ec8c5fe5f45b1180a9.chunk.js.map} +1 -1
  98. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js +2 -0
  99. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.gz +0 -0
  100. package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.map +1 -0
  101. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js → share.d94de2f3077842a88c25.chunk.js} +2 -2
  102. package/dist/js/share.d94de2f3077842a88c25.chunk.js.gz +0 -0
  103. package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js.map → share.d94de2f3077842a88c25.chunk.js.map} +1 -1
  104. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js → system-log.b3fc65678cc7480e44e0.chunk.js} +1 -1
  105. package/dist/js/system-log.b3fc65678cc7480e44e0.chunk.js.gz +0 -0
  106. package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js.map → system-log.b3fc65678cc7480e44e0.chunk.js.map} +1 -1
  107. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js → transfers.5ec21f789068ff2e228f.chunk.js} +2 -2
  108. package/dist/js/transfers.5ec21f789068ff2e228f.chunk.js.gz +0 -0
  109. package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js.map → transfers.5ec21f789068ff2e228f.chunk.js.map} +1 -1
  110. package/dist/sw.js +1 -1
  111. package/dist/sw.js.gz +0 -0
  112. package/package.json +53 -51
  113. package/dist/js/285.902dc3166e82226541a5.chunk.js.gz +0 -0
  114. package/dist/js/334.f72694a737e72404ed6e.chunk.js +0 -2
  115. package/dist/js/334.f72694a737e72404ed6e.chunk.js.gz +0 -0
  116. package/dist/js/334.f72694a737e72404ed6e.chunk.js.map +0 -1
  117. package/dist/js/424.b407aaf3218fa480b144.chunk.js.gz +0 -0
  118. package/dist/js/668.d0b45ae92f54a69beee3.chunk.js.gz +0 -0
  119. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.gz +0 -0
  120. package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.map +0 -1
  121. package/dist/js/702.99e6ce480dc579b6e542.chunk.js.gz +0 -0
  122. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js +0 -3
  123. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.gz +0 -0
  124. package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.map +0 -1
  125. package/dist/js/favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.gz +0 -0
  126. package/dist/js/filelists.a1ecb558a5c0c376191d.chunk.js.gz +0 -0
  127. package/dist/js/files.9b2b25680e1e04de1931.chunk.js.gz +0 -0
  128. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js +0 -3
  129. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.gz +0 -0
  130. package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.map +0 -1
  131. package/dist/js/hubs.f336a1aeaac00fab20ce.chunk.js.gz +0 -0
  132. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js +0 -1
  133. package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js.gz +0 -0
  134. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js +0 -1
  135. package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js.gz +0 -0
  136. package/dist/js/main.d64158ea2453985dde98.entry.js.gz +0 -0
  137. package/dist/js/main.d64158ea2453985dde98.entry.js.map +0 -1
  138. package/dist/js/messages.e4523315258f6dab0f37.chunk.js.gz +0 -0
  139. package/dist/js/search.321f771dd92b51431378.chunk.js.gz +0 -0
  140. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js +0 -2
  141. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.gz +0 -0
  142. package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.map +0 -1
  143. package/dist/js/share.ecb413c8d6a1cc8a6154.chunk.js.gz +0 -0
  144. package/dist/js/system-log.7aa8ba9d8b4a5711c4fc.chunk.js.gz +0 -0
  145. package/dist/js/transfers.5a7661c5701a462d4c53.chunk.js.gz +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[364],{80803:(e,s,t)=>{t.d(s,{Z:()=>a});var n=t(87537),o=t.n(n),i=t(23645),r=t.n(i)()(o());r.push([e.id,".hub-action-prompt {\r\n flex-direction: column;\r\n align-items: flex-start !important;\r\n}\r\n\r\n.hub-action-prompt .header {\r\n margin: 0 0 1rem !important;\r\n}\r\n\r\n.hub-action-prompt .password.prompt .help {\r\n margin-top: 10px;\r\n}\r\n\r\n.hub-action-prompt .redirect.prompt {\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.hub.session .virtual-table,\r\n.hub.session .offline-message,\r\n.hub.session .loader-wrapper {\r\n flex: 1;\r\n margin-top: 5px;\r\n}\r\n\r\n.hub.session .cell-wrapper.tag,\r\n.hub.session .cell-wrapper.nick,\r\n.hub.session .cell-wrapper.description,\r\n.hub.session .cell-wrapper.share_size {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.hub.session .cell-wrapper.nick.op {\r\n color: steelblue;\r\n}\r\n.hub.session .session-footer .actions-wrapper > a,\r\n.hub.session .session-footer .actions-wrapper > div {\r\n /* Don't cut the shadow */\r\n padding-left: 1px;\r\n padding-bottom: 1px;\r\n}\r\n\r\n.hub.session .session-footer .userlist-button label {\r\n color: grey;\r\n font-size: small;\r\n}\r\n\r\n.hub.session .session-footer .actions-wrapper .dropdown {\r\n margin-left: 10px;\r\n}","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Hubs/style.css"],names:[],mappings:"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB",sourcesContent:[".hub-action-prompt {\r\n flex-direction: column;\r\n align-items: flex-start !important;\r\n}\r\n\r\n.hub-action-prompt .header {\r\n margin: 0 0 1rem !important;\r\n}\r\n\r\n.hub-action-prompt .password.prompt .help {\r\n margin-top: 10px;\r\n}\r\n\r\n.hub-action-prompt .redirect.prompt {\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.hub.session .virtual-table,\r\n.hub.session .offline-message,\r\n.hub.session .loader-wrapper {\r\n flex: 1;\r\n margin-top: 5px;\r\n}\r\n\r\n.hub.session .cell-wrapper.tag,\r\n.hub.session .cell-wrapper.nick,\r\n.hub.session .cell-wrapper.description,\r\n.hub.session .cell-wrapper.share_size {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.hub.session .cell-wrapper.nick.op {\r\n color: steelblue;\r\n}\r\n.hub.session .session-footer .actions-wrapper > a,\r\n.hub.session .session-footer .actions-wrapper > div {\r\n /* Don't cut the shadow */\r\n padding-left: 1px;\r\n padding-bottom: 1px;\r\n}\r\n\r\n.hub.session .session-footer .userlist-button label {\r\n color: grey;\r\n font-size: small;\r\n}\r\n\r\n.hub.session .session-footer .actions-wrapper .dropdown {\r\n margin-left: 10px;\r\n}"],sourceRoot:""}]);const a=r},48005:(e,s,t)=>{t.d(s,{Z:()=>r});var n=t(85893),o=(t(67294),t(35936)),i=t(55019);const r=e=>{var{hub:s}=e,t=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["hub"]);return(0,n.jsx)(o.Z,Object.assign({},t,{icon:(0,i.iU)(s.connect_state.id)+" sitemap"}),void 0)}},6659:(e,s,t)=>{t.r(s),t.d(s,{default:()=>De});var n=t(85893),o=t(67294),i=t(64935),r=t(10907),a=t(93281),c=t(21222),l=t(518),d=t(50566),p=t(38982),h=t(48117),u=t(76249),m=t(32347);const S={reconnect:{displayName:"Reconnect",access:u.PS.HUBS_EDIT,icon:h.Z.REFRESH_COLORED,handler:({data:e})=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/reconnect`)},favorite:{access:u.PS.HUBS_EDIT,displayName:"Add to favorites",icon:h.Z.FAVORITE,filter:e=>!e.favorite_hub,handler:({data:e})=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/favorite`),notifications:{onSuccess:"The hub {{item.identity.name}} was added in favorites"}},toggleChatNotify:{access:u.PS.HUBS_EDIT,displayName:"Use chat notification",handler:({data:e})=>l.Z.patch(`${c.Z.SESSIONS_URL}/${e.id}`,{use_main_chat_notify:!e.settings.use_main_chat_notify}),checked:e=>e.settings.use_main_chat_notify},toggleShowJoins:{access:u.PS.HUBS_EDIT,displayName:"Show joins/parts",handler:({data:e})=>l.Z.patch(`${c.Z.SESSIONS_URL}/${e.id}`,{show_joins:!e.settings.show_joins}),checked:e=>e.settings.show_joins}},A=(0,p.Z)((0,d.Z)(S,c.Z.SESSIONS_URL,u.PS.HUBS_EDIT),c.Z.SESSIONS_URL,u.PS.HUBS_EDIT),v={moduleId:m.jv.HUBS,actions:A};var b=t(16119),g=t(55019),w=t(10293),x=t.n(w),E=t(41143),j=t.n(E),f=t(14936),_=t(94897),C=t(46614);const Z=x().createStore({scroll:(0,C.$)(),onSocketConnected(e){j()(!this.hasMessages(),"No existing hub messages should exist on socket connect"),j()(!this.hasInitializedSessions(),"No initialized hub sessions should exist on socket connect"),e(c.Z.MODULE_URL,c.Z.HUB_MESSAGE,this._onChatMessage),e(c.Z.MODULE_URL,c.Z.HUB_STATUS_MESSAGE,this._onStatusMessage),e(c.Z.MODULE_URL,c.Z.SESSION_UPDATED,this._onSessionUpdated),e(c.Z.MODULE_URL,c.Z.SESSION_REMOVED,this._onSessionRemoved)}}),y=(0,f.Z)(Z,b.Z,_.Z.HUBS_VIEW);var O=t(10606),U=t(70516),N=t(40479),I=t(45697),B=t.n(I),T=t(93836);const R=x().createStore({_viewName:"hub_user_view",_apiUrl:c.Z.SESSIONS_URL,_sessionStore:a.Z,mixins:[(0,T.Z)("nick")]});var L=t(35108),D=t(78230),H=t(68126),G=t(47021),P=t(27695),k=t(54883),$=t(4333);const F=({cellData:e,rowDataGetter:s,session:t})=>(0,n.jsx)(G.cG,{text:e,user:s(),userIcon:!0,remoteMenuId:$.Z.HUB_USER,entityId:t.id},void 0);class M extends o.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>e.flags.join(" "),this.emptyRowsNodeGetter=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;if(t===u.XF.DISCONNECTED||t===u.XF.REDIRECT)return(0,n.jsx)("div",Object.assign({className:"offline-message"},{children:(0,n.jsx)(P.Z,{className:"offline",title:s.translate("Not connected to the hub"),icon:h.Z.OFFLINE},void 0)}),void 0);const o=s.translate(t!==u.XF.CONNECTED?"Connecting":"Loading userlist");return(0,n.jsx)("div",Object.assign({className:"loader-wrapper"},{children:(0,n.jsx)(k.Z,{text:o},void 0)}),void 0)}}render(){const{session:e}=this.props;return(0,n.jsxs)(D.Z,Object.assign({store:R,entityId:e.id,sessionStore:a.Z,rowClassNameGetter:this.rowClassNameGetter,emptyRowsNodeGetter:this.emptyRowsNodeGetter,moduleId:m.jv.HUBS},{children:[(0,n.jsx)(L.Column,{name:"Nick",width:170,columnKey:"nick",flexGrow:8,cell:(0,n.jsx)(F,{session:e},void 0)},void 0),(0,n.jsx)(L.Column,{name:"Share size",width:85,columnKey:"share_size",cell:(0,n.jsx)(H.Eh,{},void 0),flexGrow:1},void 0),(0,n.jsx)(L.Column,{name:"Description",width:100,columnKey:"description",flexGrow:1},void 0),(0,n.jsx)(L.Column,{name:"Tag",width:150,columnKey:"tag",flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"Upload speed",width:80,columnKey:"upload_speed",cell:(0,n.jsx)(H.$A,{},void 0),flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"Download speed",width:80,columnKey:"download_speed",cell:(0,n.jsx)(H.$A,{},void 0),flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"IP (v4)",width:120,columnKey:"ip4",flexGrow:3,cell:(0,n.jsx)(H.fI,{},void 0)},void 0),(0,n.jsx)(L.Column,{name:"IP (v6)",width:120,columnKey:"ip6",flexGrow:3,cell:(0,n.jsx)(H.fI,{},void 0)},void 0),(0,n.jsx)(L.Column,{name:"Files",width:70,columnKey:"file_count",flexGrow:3},void 0)]}),void 0)}}M.propTypes={session:B().object};const K=M;var z=t(2445),V=t(88998),X=t(68325),J=t(11485),W=t(54080);const q=(0,J.i)((e=>{const[s,t]=(0,o.useState)({share_size:0,user_count:0});(0,o.useEffect)((()=>{l.Z.get(`${c.Z.SESSIONS_URL}/${e.session.id}/counts`).then(t).catch((e=>console.error("Failed to fetch hub counts",e.message)));const s=c.Z.SESSIONS_URL;return e.addSocketListener(s,c.Z.SESSION_COUNTS_UPDATED,(e=>t(e)),e.session.id),()=>e.removeSocketListeners(e)}),[e.session]);const i=(0,o.useContext)(W.c),{userlistToggle:r,session:a,sessionT:d}=e,{user_count:p,share_size:h}=s,u=(0,z.BU)(p>0?h/p:0,d.plainT);return(0,n.jsxs)(V.C,{children:[(0,n.jsx)(V.o,{text:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(X.Z,{encryption:a.encryption},void 0),d.t("xUsers",{defaultValue:"{{count}} user",defaultValue_plural:"{{count}} users",count:p,replace:{count:p}})]},void 0)},void 0),!(0,O.wd)(i)&&(0,n.jsx)(V.o,{text:d.t("sharePerUser",{defaultValue:"{{total}} ({{average}}/user)",replace:{total:(0,z.BU)(h,d.plainT),average:u}})},void 0),(0,n.jsx)("div",Object.assign({className:"actions-wrapper"},{children:(0,n.jsxs)("div",Object.assign({className:"actions"},{children:[r,(0,n.jsx)(G.PC,{className:"top left pointing",actions:v,ids:["toggleChatNotify","toggleShowJoins"],header:d.translate("Notification settings"),itemData:a,triggerIcon:a.settings.use_main_chat_notify||a.settings.show_joins?"yellow bell":"bell"},void 0)]}),void 0)}),void 0)]},void 0)}),(({session:e})=>!!a.Z.getSession(e.id)));var Q=t(78217),Y=t(84807),ee=t(66883),se=t(35936),te=t(89116),ne=t(94076);(0,ne.yE)(c.Z.SESSIONS_URL),(0,ne.c8)(c.Z.SESSIONS_URL),(0,ne._b)(c.Z.SESSIONS_URL),(0,ne.pJ)(c.Z.SESSIONS_URL);var oe=t(89519);const ie=({icon:e,title:s,content:t})=>ee.Z.hasAccess(u.PS.HUBS_EDIT)?(0,n.jsxs)("div",Object.assign({className:"ui icon message hub-action-prompt"},{children:[(0,n.jsxs)("h3",Object.assign({className:"ui header"},{children:[(0,n.jsx)(se.Z,{icon:e},void 0),(0,n.jsx)("div",Object.assign({className:"content"},{children:s}),void 0)]}),void 0),t]}),void 0):null,re=({hub:e,sessionT:s})=>(0,n.jsxs)("div",Object.assign({className:"password prompt"},{children:[(0,n.jsx)(Q.Z,{placeholder:s.translate("Password"),caption:s.translate("Submit"),icon:h.Z.CONNECT,handleAction:t=>(0,oe.h9)((()=>((e,s)=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/password`,{password:s}))(e,t)),s.plainT)},void 0),(0,n.jsx)("div",Object.assign({className:"help"},{children:(0,n.jsx)(te.c,Object.assign({i18nKey:s.toI18nKey("passwordPromptHelp")},{children:"This usually means that there's a registered account associated with your nick. If you don't remember having a registered account in this hub, there may be someone else using the same nick."}),void 0)}),void 0)]}),void 0),ae=({hub:e,sessionT:s})=>(0,n.jsx)(Y.Z,{className:"redirect prompt",icon:h.Z.CONNECT,onClick:t=>(0,oe.h9)((()=>(e=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/redirect`))(e)),s.plainT),caption:s.t("acceptRedirect",{defaultValue:"Accept redirect to {{url}}",replace:{url:e.connect_state.data.hub_url}})},void 0);var ce=t(93379),le=t.n(ce),de=t(7795),pe=t.n(de),he=t(90569),ue=t.n(he),me=t(3565),Se=t.n(me),Ae=t(19216),ve=t.n(Ae),be=t(44589),ge=t.n(be),we=t(80803),xe={};xe.styleTagTransform=ge(),xe.setAttributes=Se(),xe.insert=ue().bind(null,"head"),xe.domAPI=pe(),xe.insertStyleElement=ve(),le()(we.Z,xe),we.Z&&we.Z.locals&&we.Z.locals;var Ee=t(74225);const je=e=>`view_userlist_${e.session.id}`,fe=e=>(0,O.TG)(je(e),!1);class _e extends o.Component{constructor(){super(...arguments),this.state={showList:fe(this.props)},this.toggleListState=()=>{this.setState({showList:!this.state.showList})},this.getMessage=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;return t===u.XF.PASSWORD?(0,n.jsx)(ie,{title:s.translate("Password required"),icon:h.Z.LOCK,content:(0,n.jsx)(re,{hub:e,sessionT:s},void 0)},void 0):t===u.XF.REDIRECT?(0,n.jsx)(ie,{title:s.translate("Redirect requested"),icon:h.Z.REDIRECT,content:(0,n.jsx)(ae,{hub:e,sessionT:s},void 0)},void 0):null},this.onClickUsers=()=>{this.toggleListState(),(0,O.nG)(je(this.props),this.state.showList)},this.handleFileUpload=e=>{const{hub_url:s}=this.props.session;return(0,Ee.Pd)(e,s,void 0)}}componentDidUpdate(e){e.session.id!==this.props.session.id&&this.state.showList!==fe(this.props)&&this.toggleListState()}render(){const{session:e,sessionApi:s,sessionT:t,uiActions:o}=this.props,{showList:i}=this.state,r=(0,n.jsx)(U.Z,{className:"userlist-button",type:"toggle",caption:t.translate("User list"),onChange:this.onClickUsers,checked:i},void 0);return(0,n.jsxs)("div",Object.assign({className:"hub chat session"},{children:[this.getMessage(),i?(0,n.jsx)(K,{session:e,sessionT:t},void 0):(0,n.jsx)(N.Z,{messageStore:y,chatApi:b.Z,sessionApi:s,chatActions:o,chatAccess:u.PS.HUBS_SEND,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:$.Z.HUB_MESSAGE_HIGHLIGHT},void 0),(0,n.jsx)(q,{userlistToggle:r,session:e,sessionT:t},void 0)]}),void 0)}}_e.displayName="HubSession";const Ce=_e;var Ze=t(61283),ye=t(3267),Oe=t(73727),Ue=t(15479);class Ne extends o.Component{constructor(){super(...arguments),this.handleConnect=e=>{b.Z.createSession(this.props.location,e,a.Z)},this.hasSession=e=>a.Z.getSessionByUrl(e.hub_url),this.recentHubRender=e=>(0,n.jsx)("a",Object.assign({onClick:s=>this.handleConnect(e.hub_url)},{children:e.name}),void 0)}render(){const{sessionT:e}=this.props;return(0,n.jsxs)("div",Object.assign({className:"hub session new"},{children:[(0,n.jsx)(Ze.Z,{submitHandler:this.handleConnect,button:(0,n.jsx)(Y.Z,{icon:h.Z.CONNECT,caption:e.translate("Connect")},void 0)},void 0),(0,n.jsx)(P.Z,{description:(0,n.jsxs)(te.c,Object.assign({i18nKey:e.toI18nKey("favoriteHubsHint")},{children:["Tip: visit the ",(0,n.jsx)(Oe.rU,Object.assign({to:"/favorite-hubs"},{children:"Favorite hubs"}),void 0)," page to connect using custom settings"]}),void 0)},void 0),(0,n.jsx)(ye.Z,{entryType:Ue.WJ.HUB,hasSession:this.hasSession,entryTitleRenderer:this.recentHubRender,entryIcon:"sitemap"},void 0)]}),void 0)}}const Ie=Ne;var Be=t(48005),Te=t(93101),Re=t(8717);const Le={itemNameGetter:e=>e.identity.name,itemStatusGetter:e=>(0,g.iU)(e.connect_state.id),itemHeaderDescriptionGetter:e=>(0,n.jsx)(i.lB,{text:e.identity.description,emojify:!0},void 0),itemHeaderIconGetter:e=>(0,n.jsx)(Be.Z,{hub:e},void 0)},De=(0,Te.J)((e=>{const{match:s,t}=e,o=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["match","t"]);return(0,n.jsx)(r.Z,Object.assign({activeId:(i=s.params,i.id?parseInt(i.id):null),baseUrl:"hubs",newCaption:t((0,Re.zS)("new",m.jv.HUBS),"Connect"),newDescription:t((0,Re.zS)("newDesc",m.jv.HUBS),"Connect to a new hub"),newIcon:h.Z.HUBS_PLAIN,editAccess:u.PS.HUBS_EDIT,uiActions:v,actionIds:["reconnect","clear","favorite"],sessionApi:b.Z,sessionItemLayout:Ce,newLayout:Ie,t,unreadInfoStore:a.Z},Le,o),void 0);var i}),a.Z)}}]);
2
- //# sourceMappingURL=hubs.f336a1aeaac00fab20ce.chunk.js.map
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[364],{80803:(e,s,t)=>{t.d(s,{Z:()=>a});var n=t(87537),o=t.n(n),i=t(23645),r=t.n(i)()(o());r.push([e.id,".hub-action-prompt {\r\n flex-direction: column;\r\n align-items: flex-start !important;\r\n}\r\n\r\n.hub-action-prompt .header {\r\n margin: 0 0 1rem !important;\r\n}\r\n\r\n.hub-action-prompt .password.prompt .help {\r\n margin-top: 10px;\r\n}\r\n\r\n.hub-action-prompt .redirect.prompt {\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.hub.session .virtual-table,\r\n.hub.session .offline-message,\r\n.hub.session .loader-wrapper {\r\n flex: 1;\r\n margin-top: 5px;\r\n}\r\n\r\n.hub.session .cell-wrapper.tag,\r\n.hub.session .cell-wrapper.nick,\r\n.hub.session .cell-wrapper.description,\r\n.hub.session .cell-wrapper.share_size {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.hub.session .cell-wrapper.nick.op {\r\n color: steelblue;\r\n}\r\n.hub.session .session-footer .actions-wrapper > a,\r\n.hub.session .session-footer .actions-wrapper > div {\r\n /* Don't cut the shadow */\r\n padding-left: 1px;\r\n padding-bottom: 1px;\r\n}\r\n\r\n.hub.session .session-footer .userlist-button label {\r\n color: grey;\r\n font-size: small;\r\n}\r\n\r\n.hub.session .session-footer .actions-wrapper .dropdown {\r\n margin-left: 10px;\r\n}","",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Hubs/style.css"],names:[],mappings:"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB",sourcesContent:[".hub-action-prompt {\r\n flex-direction: column;\r\n align-items: flex-start !important;\r\n}\r\n\r\n.hub-action-prompt .header {\r\n margin: 0 0 1rem !important;\r\n}\r\n\r\n.hub-action-prompt .password.prompt .help {\r\n margin-top: 10px;\r\n}\r\n\r\n.hub-action-prompt .redirect.prompt {\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.hub.session .virtual-table,\r\n.hub.session .offline-message,\r\n.hub.session .loader-wrapper {\r\n flex: 1;\r\n margin-top: 5px;\r\n}\r\n\r\n.hub.session .cell-wrapper.tag,\r\n.hub.session .cell-wrapper.nick,\r\n.hub.session .cell-wrapper.description,\r\n.hub.session .cell-wrapper.share_size {\r\n overflow: hidden;\r\n white-space: nowrap;\r\n}\r\n\r\n.hub.session .cell-wrapper.nick.op {\r\n color: steelblue;\r\n}\r\n.hub.session .session-footer .actions-wrapper > a,\r\n.hub.session .session-footer .actions-wrapper > div {\r\n /* Don't cut the shadow */\r\n padding-left: 1px;\r\n padding-bottom: 1px;\r\n}\r\n\r\n.hub.session .session-footer .userlist-button label {\r\n color: grey;\r\n font-size: small;\r\n}\r\n\r\n.hub.session .session-footer .actions-wrapper .dropdown {\r\n margin-left: 10px;\r\n}"],sourceRoot:""}]);const a=r},48005:(e,s,t)=>{t.d(s,{Z:()=>r});var n=t(85893),o=(t(67294),t(35936)),i=t(55019);const r=e=>{var{hub:s}=e,t=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["hub"]);return(0,n.jsx)(o.Z,Object.assign({},t,{icon:(0,i.iU)(s.connect_state.id)+" sitemap"}),void 0)}},6659:(e,s,t)=>{t.r(s),t.d(s,{default:()=>De});var n=t(85893),o=t(67294),i=t(64935),r=t(10907),a=t(93281),c=t(21222),l=t(518),d=t(50566),p=t(38982),h=t(48117),u=t(76249),m=t(32347);const S={reconnect:{displayName:"Reconnect",access:u.PS.HUBS_EDIT,icon:h.Z.REFRESH_COLORED,handler:({data:e})=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/reconnect`)},favorite:{access:u.PS.HUBS_EDIT,displayName:"Add to favorites",icon:h.Z.FAVORITE,filter:e=>!e.favorite_hub,handler:({data:e})=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/favorite`),notifications:{onSuccess:"The hub {{item.identity.name}} was added in favorites"}},toggleChatNotify:{access:u.PS.HUBS_EDIT,displayName:"Use chat notification",handler:({data:e})=>l.Z.patch(`${c.Z.SESSIONS_URL}/${e.id}`,{use_main_chat_notify:!e.settings.use_main_chat_notify}),checked:e=>e.settings.use_main_chat_notify},toggleShowJoins:{access:u.PS.HUBS_EDIT,displayName:"Show joins/parts",handler:({data:e})=>l.Z.patch(`${c.Z.SESSIONS_URL}/${e.id}`,{show_joins:!e.settings.show_joins}),checked:e=>e.settings.show_joins}},A=(0,p.Z)((0,d.Z)(S,c.Z.SESSIONS_URL,u.PS.HUBS_EDIT),c.Z.SESSIONS_URL,u.PS.HUBS_EDIT),v={moduleId:m.jv.HUBS,actions:A};var b=t(16119),g=t(55019),w=t(10293),x=t.n(w),E=t(41143),j=t.n(E),f=t(14936),_=t(94897),C=t(46614);const Z=x().createStore({scroll:(0,C.$)(),onSocketConnected(e){j()(!this.hasMessages(),"No existing hub messages should exist on socket connect"),j()(!this.hasInitializedSessions(),"No initialized hub sessions should exist on socket connect"),e(c.Z.MODULE_URL,c.Z.HUB_MESSAGE,this._onChatMessage),e(c.Z.MODULE_URL,c.Z.HUB_STATUS_MESSAGE,this._onStatusMessage),e(c.Z.MODULE_URL,c.Z.SESSION_UPDATED,this._onSessionUpdated),e(c.Z.MODULE_URL,c.Z.SESSION_REMOVED,this._onSessionRemoved)}}),y=(0,f.Z)(Z,b.Z,_.Z.HUBS_VIEW);var O=t(10606),U=t(70516),N=t(40479),I=t(45697),B=t.n(I),T=t(93836);const R=x().createStore({_viewName:"hub_user_view",_apiUrl:c.Z.SESSIONS_URL,_sessionStore:a.Z,mixins:[(0,T.Z)("nick")]});var L=t(35108),D=t(78230),H=t(68126),G=t(47021),P=t(27695),k=t(54883),$=t(4333);const F=({cellData:e,rowDataGetter:s,session:t})=>(0,n.jsx)(G.cG,{text:e,user:s(),userIcon:!0,remoteMenuId:$.Z.HUB_USER,entityId:t.id},void 0);class M extends o.Component{constructor(){super(...arguments),this.rowClassNameGetter=e=>e.flags.join(" "),this.emptyRowsNodeGetter=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;if(t===u.XF.DISCONNECTED||t===u.XF.REDIRECT)return(0,n.jsx)("div",Object.assign({className:"offline-message"},{children:(0,n.jsx)(P.Z,{className:"offline",title:s.translate("Not connected to the hub"),icon:h.Z.OFFLINE},void 0)}),void 0);const o=s.translate(t!==u.XF.CONNECTED?"Connecting":"Loading userlist");return(0,n.jsx)("div",Object.assign({className:"loader-wrapper"},{children:(0,n.jsx)(k.Z,{text:o},void 0)}),void 0)}}render(){const{session:e}=this.props;return(0,n.jsxs)(D.Z,Object.assign({store:R,entityId:e.id,sessionStore:a.Z,rowClassNameGetter:this.rowClassNameGetter,emptyRowsNodeGetter:this.emptyRowsNodeGetter,moduleId:m.jv.HUBS},{children:[(0,n.jsx)(L.Column,{name:"Nick",width:170,columnKey:"nick",flexGrow:8,cell:(0,n.jsx)(F,{session:e},void 0)},void 0),(0,n.jsx)(L.Column,{name:"Share size",width:85,columnKey:"share_size",cell:(0,n.jsx)(H.Eh,{},void 0),flexGrow:1},void 0),(0,n.jsx)(L.Column,{name:"Description",width:100,columnKey:"description",flexGrow:1},void 0),(0,n.jsx)(L.Column,{name:"Tag",width:150,columnKey:"tag",flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"Upload speed",width:80,columnKey:"upload_speed",cell:(0,n.jsx)(H.$A,{},void 0),flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"Download speed",width:80,columnKey:"download_speed",cell:(0,n.jsx)(H.$A,{},void 0),flexGrow:2},void 0),(0,n.jsx)(L.Column,{name:"IP (v4)",width:120,columnKey:"ip4",flexGrow:3,cell:(0,n.jsx)(H.fI,{},void 0)},void 0),(0,n.jsx)(L.Column,{name:"IP (v6)",width:120,columnKey:"ip6",flexGrow:3,cell:(0,n.jsx)(H.fI,{},void 0)},void 0),(0,n.jsx)(L.Column,{name:"Files",width:70,columnKey:"file_count",flexGrow:3},void 0)]}),void 0)}}M.propTypes={session:B().object};const K=M;var z=t(2445),V=t(88998),X=t(68325),J=t(11485),W=t(54080);const q=(0,J.i)((e=>{const[s,t]=(0,o.useState)({share_size:0,user_count:0});(0,o.useEffect)((()=>{l.Z.get(`${c.Z.SESSIONS_URL}/${e.session.id}/counts`).then(t).catch((e=>console.error("Failed to fetch hub counts",e.message)));const s=c.Z.SESSIONS_URL;return e.addSocketListener(s,c.Z.SESSION_COUNTS_UPDATED,(e=>t(e)),e.session.id),()=>e.removeSocketListeners(e)}),[e.session]);const i=(0,o.useContext)(W.c),{userlistToggle:r,session:a,sessionT:d}=e,{user_count:p,share_size:h}=s,u=(0,z.BU)(p>0?h/p:0,d.plainT);return(0,n.jsxs)(V.C,{children:[(0,n.jsx)(V.o,{text:(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(X.Z,{encryption:a.encryption},void 0),d.t("xUsers",{defaultValue:"{{count}} user",defaultValue_plural:"{{count}} users",count:p,replace:{count:p}})]},void 0)},void 0),!(0,O.wd)(i)&&(0,n.jsx)(V.o,{text:d.t("sharePerUser",{defaultValue:"{{total}} ({{average}}/user)",replace:{total:(0,z.BU)(h,d.plainT),average:u}})},void 0),(0,n.jsx)("div",Object.assign({className:"actions-wrapper"},{children:(0,n.jsxs)("div",Object.assign({className:"actions"},{children:[r,(0,n.jsx)(G.PC,{className:"top left pointing",actions:v,ids:["toggleChatNotify","toggleShowJoins"],header:d.translate("Notification settings"),itemData:a,triggerIcon:a.settings.use_main_chat_notify||a.settings.show_joins?"yellow bell":"bell"},void 0)]}),void 0)}),void 0)]},void 0)}),(({session:e})=>!!a.Z.getSession(e.id)));var Q=t(78217),Y=t(84807),ee=t(66883),se=t(35936),te=t(85444),ne=t(94076);(0,ne.yE)(c.Z.SESSIONS_URL),(0,ne.c8)(c.Z.SESSIONS_URL),(0,ne._b)(c.Z.SESSIONS_URL),(0,ne.pJ)(c.Z.SESSIONS_URL);var oe=t(89519);const ie=({icon:e,title:s,content:t})=>ee.Z.hasAccess(u.PS.HUBS_EDIT)?(0,n.jsxs)("div",Object.assign({className:"ui icon message hub-action-prompt"},{children:[(0,n.jsxs)("h3",Object.assign({className:"ui header"},{children:[(0,n.jsx)(se.Z,{icon:e},void 0),(0,n.jsx)("div",Object.assign({className:"content"},{children:s}),void 0)]}),void 0),t]}),void 0):null,re=({hub:e,sessionT:s})=>(0,n.jsxs)("div",Object.assign({className:"password prompt"},{children:[(0,n.jsx)(Q.Z,{placeholder:s.translate("Password"),caption:s.translate("Submit"),icon:h.Z.CONNECT,handleAction:t=>(0,oe.h9)((()=>((e,s)=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/password`,{password:s}))(e,t)),s.plainT)},void 0),(0,n.jsx)("div",Object.assign({className:"help"},{children:(0,n.jsx)(te.c,Object.assign({i18nKey:s.toI18nKey("passwordPromptHelp")},{children:"This usually means that there's a registered account associated with your nick. If you don't remember having a registered account in this hub, there may be someone else using the same nick."}),void 0)}),void 0)]}),void 0),ae=({hub:e,sessionT:s})=>(0,n.jsx)(Y.Z,{className:"redirect prompt",icon:h.Z.CONNECT,onClick:t=>(0,oe.h9)((()=>(e=>l.Z.post(`${c.Z.SESSIONS_URL}/${e.id}/redirect`))(e)),s.plainT),caption:s.t("acceptRedirect",{defaultValue:"Accept redirect to {{url}}",replace:{url:e.connect_state.data.hub_url}})},void 0);var ce=t(93379),le=t.n(ce),de=t(7795),pe=t.n(de),he=t(90569),ue=t.n(he),me=t(3565),Se=t.n(me),Ae=t(19216),ve=t.n(Ae),be=t(44589),ge=t.n(be),we=t(80803),xe={};xe.styleTagTransform=ge(),xe.setAttributes=Se(),xe.insert=ue().bind(null,"head"),xe.domAPI=pe(),xe.insertStyleElement=ve(),le()(we.Z,xe),we.Z&&we.Z.locals&&we.Z.locals;var Ee=t(74225);const je=e=>`view_userlist_${e.session.id}`,fe=e=>(0,O.TG)(je(e),!1);class _e extends o.Component{constructor(){super(...arguments),this.state={showList:fe(this.props)},this.toggleListState=()=>{this.setState({showList:!this.state.showList})},this.getMessage=()=>{const{session:e,sessionT:s}=this.props,t=e.connect_state.id;return t===u.XF.PASSWORD?(0,n.jsx)(ie,{title:s.translate("Password required"),icon:h.Z.LOCK,content:(0,n.jsx)(re,{hub:e,sessionT:s},void 0)},void 0):t===u.XF.REDIRECT?(0,n.jsx)(ie,{title:s.translate("Redirect requested"),icon:h.Z.REDIRECT,content:(0,n.jsx)(ae,{hub:e,sessionT:s},void 0)},void 0):null},this.onClickUsers=()=>{this.toggleListState(),(0,O.nG)(je(this.props),this.state.showList)},this.handleFileUpload=e=>{const{hub_url:s}=this.props.session;return(0,Ee.Pd)(e,s,void 0)}}componentDidUpdate(e){e.session.id!==this.props.session.id&&this.state.showList!==fe(this.props)&&this.toggleListState()}render(){const{session:e,sessionApi:s,sessionT:t,uiActions:o}=this.props,{showList:i}=this.state,r=(0,n.jsx)(U.Z,{className:"userlist-button",type:"toggle",caption:t.translate("User list"),onChange:this.onClickUsers,checked:i},void 0);return(0,n.jsxs)("div",Object.assign({className:"hub chat session"},{children:[this.getMessage(),i?(0,n.jsx)(K,{session:e,sessionT:t},void 0):(0,n.jsx)(N.Z,{messageStore:y,chatApi:b.Z,sessionApi:s,chatActions:o,chatAccess:u.PS.HUBS_SEND,session:e,handleFileUpload:this.handleFileUpload,highlightRemoteMenuId:$.Z.HUB_MESSAGE_HIGHLIGHT},void 0),(0,n.jsx)(q,{userlistToggle:r,session:e,sessionT:t},void 0)]}),void 0)}}_e.displayName="HubSession";const Ce=_e;var Ze=t(61283),ye=t(3267),Oe=t(73727),Ue=t(15479);class Ne extends o.Component{constructor(){super(...arguments),this.handleConnect=e=>{b.Z.createSession(this.props.location,e,a.Z)},this.hasSession=e=>a.Z.getSessionByUrl(e.hub_url),this.recentHubRender=e=>(0,n.jsx)("a",Object.assign({onClick:s=>this.handleConnect(e.hub_url)},{children:e.name}),void 0)}render(){const{sessionT:e}=this.props;return(0,n.jsxs)("div",Object.assign({className:"hub session new"},{children:[(0,n.jsx)(Ze.Z,{submitHandler:this.handleConnect,button:(0,n.jsx)(Y.Z,{icon:h.Z.CONNECT,caption:e.translate("Connect")},void 0)},void 0),(0,n.jsx)(P.Z,{description:(0,n.jsxs)(te.c,Object.assign({i18nKey:e.toI18nKey("favoriteHubsHint")},{children:["Tip: visit the ",(0,n.jsx)(Oe.rU,Object.assign({to:"/favorite-hubs"},{children:"Favorite hubs"}),void 0)," page to connect using custom settings"]}),void 0)},void 0),(0,n.jsx)(ye.Z,{entryType:Ue.WJ.HUB,hasSession:this.hasSession,entryTitleRenderer:this.recentHubRender,entryIcon:"sitemap"},void 0)]}),void 0)}}const Ie=Ne;var Be=t(48005),Te=t(93101),Re=t(8717);const Le={itemNameGetter:e=>e.identity.name,itemStatusGetter:e=>(0,g.iU)(e.connect_state.id),itemHeaderDescriptionGetter:e=>(0,n.jsx)(i.lB,{text:e.identity.description,emojify:!0},void 0),itemHeaderIconGetter:e=>(0,n.jsx)(Be.Z,{hub:e},void 0)},De=(0,Te.J)((e=>{const{match:s,t}=e,o=function(e,s){var t={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&s.indexOf(n)<0&&(t[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)s.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(t[n[o]]=e[n[o]])}return t}(e,["match","t"]);return(0,n.jsx)(r.Z,Object.assign({activeId:(i=s.params,i.id?parseInt(i.id):null),baseUrl:"hubs",newCaption:t((0,Re.zS)("new",m.jv.HUBS),"Connect"),newDescription:t((0,Re.zS)("newDesc",m.jv.HUBS),"Connect to a new hub"),newIcon:h.Z.HUBS_PLAIN,editAccess:u.PS.HUBS_EDIT,uiActions:v,actionIds:["reconnect","clear","favorite"],sessionApi:b.Z,sessionItemLayout:Ce,newLayout:Ie,t,unreadInfoStore:a.Z},Le,o),void 0);var i}),a.Z)}}]);
2
+ //# sourceMappingURL=hubs.eed2f41d894688465906.chunk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"js/hubs.f336a1aeaac00fab20ce.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/actions/ui/HubActions.ts","webpack://airdcpp-webui/./src/stores/HubMessageStore.ts","webpack://airdcpp-webui/./src/stores/HubUserViewStore.js","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubUserTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubFooter.tsx","webpack://airdcpp-webui/./src/services/api/HubApi.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubPrompt.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css?5587","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubNew.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/Hubs.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".hub-action-prompt {\\r\\n flex-direction: column;\\r\\n align-items: flex-start !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .header {\\r\\n margin: 0 0 1rem !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .password.prompt .help {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .redirect.prompt {\\r\\n max-width: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.hub.session .virtual-table,\\r\\n.hub.session .offline-message,\\r\\n.hub.session .loader-wrapper {\\r\\n flex: 1;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.tag,\\r\\n.hub.session .cell-wrapper.nick,\\r\\n.hub.session .cell-wrapper.description,\\r\\n.hub.session .cell-wrapper.share_size {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.nick.op {\\r\\n color: steelblue;\\r\\n}\\r\\n.hub.session .session-footer .actions-wrapper > a,\\r\\n.hub.session .session-footer .actions-wrapper > div {\\r\\n /* Don't cut the shadow */\\r\\n padding-left: 1px;\\r\\n padding-bottom: 1px;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .userlist-button label {\\r\\n color: grey;\\r\\n font-size: small;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .actions-wrapper .dropdown {\\r\\n margin-left: 10px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Hubs/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB\",\"sourcesContent\":[\".hub-action-prompt {\\r\\n flex-direction: column;\\r\\n align-items: flex-start !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .header {\\r\\n margin: 0 0 1rem !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .password.prompt .help {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .redirect.prompt {\\r\\n max-width: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.hub.session .virtual-table,\\r\\n.hub.session .offline-message,\\r\\n.hub.session .loader-wrapper {\\r\\n flex: 1;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.tag,\\r\\n.hub.session .cell-wrapper.nick,\\r\\n.hub.session .cell-wrapper.description,\\r\\n.hub.session .cell-wrapper.share_size {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.nick.op {\\r\\n color: steelblue;\\r\\n}\\r\\n.hub.session .session-footer .actions-wrapper > a,\\r\\n.hub.session .session-footer .actions-wrapper > div {\\r\\n /* Don't cut the shadow */\\r\\n padding-left: 1px;\\r\\n padding-bottom: 1px;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .userlist-button label {\\r\\n color: grey;\\r\\n font-size: small;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .actions-wrapper .dropdown {\\r\\n margin-left: 10px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Icon, { IconProps } from 'components/semantic/Icon';\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface HubIconProps extends IconProps {\r\n hub: API.Hub;\r\n}\r\n\r\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\r\n <Icon\r\n { ...other }\r\n icon={ hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap' }\r\n />\r\n);\r\n\r\n/*HubIcon.propTypes = {\r\n // Hub object\r\n hub: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default HubIcon;","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport ChatActionDecorator from './decorators/ChatActionDecorator';\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst showFav = (hub: API.Hub) => !hub.favorite_hub;\r\n\r\n\r\nconst handleFavorite: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/favorite`);\r\n};\r\n\r\nconst handleToggleChatNotify: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n use_main_chat_notify: !hub.settings.use_main_chat_notify,\r\n });\r\n};\r\n\r\nconst handleToggleJoins: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n show_joins: !hub.settings.show_joins,\r\n });\r\n};\r\n\r\nconst handleReconnect: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/reconnect`);\r\n};\r\n\r\nconst HubActions: UI.ActionListType<API.Hub> = {\r\n reconnect: { \r\n displayName: 'Reconnect',\r\n access: API.AccessEnum.HUBS_EDIT, \r\n icon: IconConstants.REFRESH_COLORED,\r\n handler: handleReconnect,\r\n },\r\n favorite: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Add to favorites', \r\n icon: IconConstants.FAVORITE,\r\n filter: showFav,\r\n handler: handleFavorite,\r\n notifications: {\r\n onSuccess: 'The hub {{item.identity.name}} was added in favorites',\r\n }\r\n },\r\n toggleChatNotify: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Use chat notification',\r\n handler: handleToggleChatNotify,\r\n checked: hub => {\r\n return hub.settings.use_main_chat_notify;\r\n }\r\n },\r\n toggleShowJoins: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Show joins/parts', \r\n handler: handleToggleJoins,\r\n checked: hub => {\r\n return hub.settings.show_joins;\r\n }\r\n },\r\n};\r\n\r\n\r\nconst HubActionsDecorated = SessionActionDecorator(\r\n ChatActionDecorator(\r\n HubActions, \r\n HubConstants.SESSIONS_URL, \r\n API.AccessEnum.HUBS_EDIT\r\n ), \r\n HubConstants.SESSIONS_URL, \r\n API.AccessEnum.HUBS_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.HUBS,\r\n actions: HubActionsDecorated,\r\n};\r\n","//@ts-ignore\r\nimport Reflux from 'reflux';\r\nimport invariant from 'invariant';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport HubActions from 'actions/reflux/HubActions';\r\n\r\nimport MessageStoreDecorator from './decorators/MessageStoreDecorator';\r\n\r\nimport AccessConstants from 'constants/AccessConstants';\r\nimport { SessionScrollPositionKeeper } from './helpers/SessionScrollPositionKeeper';\r\nimport { AddSocketListener } from 'decorators/SocketSubscriptionDecorator';\r\n\r\n\r\nconst HubMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(!this.hasMessages(), 'No existing hub messages should exist on socket connect');\r\n invariant(!this.hasInitializedSessions(), 'No initialized hub sessions should exist on socket connect');\r\n\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.HUB_MESSAGE, this._onChatMessage);\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.HUB_STATUS_MESSAGE, this._onStatusMessage);\r\n\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_UPDATED, this._onSessionUpdated);\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_REMOVED, this._onSessionRemoved);\r\n },\r\n});\r\n\r\nexport default MessageStoreDecorator(HubMessageStore, HubActions, AccessConstants.HUBS_VIEW)\r\n;\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\r\nimport Reflux from 'reflux';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport HubSessionStore from './HubSessionStore';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'hub_user_view',\r\n _apiUrl: HubConstants.SESSIONS_URL,\r\n _sessionStore: HubSessionStore,\r\n mixins: [ ViewStoreMixin('nick') ],\r\n});\r\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubUserViewStore from 'stores/HubUserViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, ConnectionCell, IpCell } from 'components/table/Cell';\r\n\r\nimport { TableUserMenu } from 'components/menu';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface NickCellProps extends RowWrapperCellChildProps<string, API.HubUser> {\r\n session: API.Hub;\r\n}\r\n\r\nconst NickCell: React.FC<NickCellProps> = (\r\n { cellData, rowDataGetter, session }\r\n) => (\r\n <TableUserMenu \r\n text={ cellData } \r\n user={ rowDataGetter!() }\r\n userIcon={ true }\r\n remoteMenuId={ MenuConstants.HUB_USER }\r\n entityId={ session.id }\r\n />\r\n);\r\n\r\n\r\ninterface HubUserTableProps {\r\n session: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass HubUserTable extends React.Component<HubUserTableProps> {\r\n static propTypes = {\r\n session: PropTypes.object, // required\r\n };\r\n\r\n rowClassNameGetter = (user: API.HubUser) => {\r\n return user.flags.join(' ');\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (connectState === API.HubConnectStateEnum.DISCONNECTED || connectState === API.HubConnectStateEnum.REDIRECT) {\r\n return (\r\n <div className=\"offline-message\">\r\n <Message \r\n className=\"offline\"\r\n title={ sessionT.translate('Not connected to the hub') }\r\n icon={ IconConstants.OFFLINE }\r\n />\r\n </div>\r\n );\r\n } \r\n\r\n const text = sessionT.translate(\r\n connectState !== API.HubConnectStateEnum.CONNECTED ? 'Connecting' : 'Loading userlist'\r\n );\r\n \r\n return (\r\n <div className=\"loader-wrapper\">\r\n <Loader text={ text }/>\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n const { session } = this.props;\r\n return (\r\n <VirtualTable\r\n store={ HubUserViewStore }\r\n entityId={ session.id }\r\n sessionStore={ HubSessionStore }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n moduleId={ UI.Modules.HUBS }\r\n >\r\n <Column\r\n name=\"Nick\"\r\n width={170}\r\n columnKey=\"nick\"\r\n flexGrow={8}\r\n cell={ <NickCell session={ session }/> }\r\n />\r\n <Column\r\n name=\"Share size\"\r\n width={85}\r\n columnKey=\"share_size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Description\"\r\n width={100}\r\n columnKey=\"description\"\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Tag\"\r\n width={150}\r\n columnKey=\"tag\"\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"Upload speed\"\r\n width={80}\r\n columnKey=\"upload_speed\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"Download speed\"\r\n width={80}\r\n columnKey=\"download_speed\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"IP (v4)\"\r\n width={120}\r\n columnKey=\"ip4\"\r\n flexGrow={3}\r\n cell={ <IpCell/> }\r\n />\r\n <Column\r\n name=\"IP (v6)\"\r\n width={120}\r\n columnKey=\"ip6\"\r\n flexGrow={3}\r\n cell={ <IpCell/> }\r\n />\r\n <Column\r\n name=\"Files\"\r\n width={70}\r\n columnKey=\"file_count\"\r\n flexGrow={3}\r\n />\r\n </VirtualTable>\r\n );\r\n }\r\n}\r\n\r\nexport default HubUserTable;","//import PropTypes from 'prop-types';\r\nimport { useEffect, useState, useContext } from 'react';\r\n\r\nimport * as React from 'react';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { SessionFooter, FooterItem } from 'routes/Sidebar/components/SessionFooter';\r\nimport EncryptionState from 'components/EncryptionState';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\nimport { \r\n SocketSubscriptionDecorator, SocketSubscriptionDecoratorChildProps\r\n} from 'decorators/SocketSubscriptionDecorator';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { LayoutWidthContext } from 'context/LayoutWidthContext';\r\nimport { ActionMenu } from 'components/menu';\r\nimport HubActions from 'actions/ui/HubActions';\r\n\r\n\r\ninterface HubFooterProps {\r\n session: API.Hub;\r\n userlistToggle: React.ReactNode;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n\r\ntype DataProps = SocketSubscriptionDecoratorChildProps<HubFooterProps>;\r\nconst HubFooter: React.FC<HubFooterProps & DataProps> = (props) => {\r\n const [ counts, setCounts ] = useState<API.HubCounts>({\r\n share_size: 0,\r\n user_count: 0\r\n });\r\n\r\n useEffect(\r\n () => {\r\n // Fetch initial\r\n SocketService.get<API.HubCounts>(`${HubConstants.SESSIONS_URL}/${props.session.id}/counts`)\r\n .then(setCounts)\r\n .catch((error: ErrorResponse) => console.error('Failed to fetch hub counts', error.message));\r\n\r\n // Subscription\r\n const url = HubConstants.SESSIONS_URL;\r\n props.addSocketListener(\r\n url, \r\n HubConstants.SESSION_COUNTS_UPDATED, \r\n (data: API.HubCounts) => setCounts(data), \r\n props.session.id\r\n );\r\n\r\n return () => props.removeSocketListeners(props);\r\n },\r\n [ props.session ]\r\n );\r\n\r\n const layoutWidth = useContext(LayoutWidthContext);\r\n\r\n const { userlistToggle, session, sessionT } = props;\r\n const { user_count: users, share_size: shared } = counts;\r\n\r\n const averageShare = formatSize(users > 0 ? (shared / users) : 0, sessionT.plainT);\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n text={(\r\n <>\r\n <EncryptionState encryption={ session.encryption }/>\r\n { sessionT.t('xUsers', {\r\n defaultValue: '{{count}} user',\r\n defaultValue_plural: '{{count}} users',\r\n count: users,\r\n replace: {\r\n count: users\r\n }\r\n }\r\n ) }\r\n </>\r\n )}\r\n />\r\n { !useMobileLayout(layoutWidth) && (\r\n <FooterItem \r\n text={ sessionT.t('sharePerUser', {\r\n defaultValue: '{{total}} ({{average}}/user)',\r\n replace: {\r\n total: formatSize(shared, sessionT.plainT),\r\n average: averageShare\r\n }\r\n }) }\r\n /> \r\n ) }\r\n <div className=\"actions-wrapper\">\r\n <div className=\"actions\">\r\n { userlistToggle }\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n actions={ HubActions }\r\n ids={[ 'toggleChatNotify', 'toggleShowJoins' ]}\r\n header={ sessionT.translate('Notification settings') } \r\n itemData={ session }\r\n triggerIcon={ \r\n session.settings.use_main_chat_notify || session.settings.show_joins ? 'yellow bell' : 'bell' \r\n }\r\n />\r\n </div>\r\n </div>\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default SocketSubscriptionDecorator(\r\n HubFooter,\r\n ({ session }) => !!HubSessionStore.getSession(session.id)\r\n);","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport { \r\n sendChatMessageDecorator, clearMessagesDecorator, setReadDecorator, fetchMessagesDecorator \r\n} from './common/ChatActions';\r\n//import * as UI from 'types/ui';\r\n\r\n\r\nexport const sendHubPassword = (\r\n hub: API.Hub, \r\n password: string\r\n) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/password`, { password: password });\r\n};\r\n\r\nexport const acceptHubRedirect = (hub: API.Hub) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/redirect`);\r\n};\r\n\r\nexport const sendHubChatMessage = sendChatMessageDecorator(HubConstants.SESSIONS_URL);\r\nexport const clearHubChatMessages = clearMessagesDecorator(HubConstants.SESSIONS_URL);\r\nexport const fetchHubChatMessages = fetchMessagesDecorator(HubConstants.SESSIONS_URL);\r\n\r\nexport const setHubSessionRead = setReadDecorator(HubConstants.SESSIONS_URL);\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport ActionInput from 'components/semantic/ActionInput';\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\nimport Icon, { IconType } from 'components/semantic/Icon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { Trans } from 'react-i18next';\r\nimport { sendHubPassword, acceptHubRedirect } from 'services/api/HubApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\ninterface HubActionPromptProps {\r\n icon: IconType;\r\n title: React.ReactNode;\r\n content: React.ReactNode;\r\n}\r\n\r\n// Main prompt (HUBS_EDIT permission is required for the content to be rendered)\r\nconst HubActionPrompt: React.FC<HubActionPromptProps> = (\r\n { icon, title, content }\r\n) => {\r\n if (!LoginStore.hasAccess(API.AccessEnum.HUBS_EDIT)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"ui icon message hub-action-prompt\">\r\n <h3 className=\"ui header\">\r\n <Icon icon={ icon }/>\r\n <div className=\"content\">\r\n { title }\r\n </div>\r\n </h3>\r\n { content }\r\n </div>\r\n );\r\n};\r\n\r\n/*HubActionPrompt.propTypes = {\r\n // Message title\r\n title: PropTypes.node.isRequired,\r\n\r\n // Children\r\n content: PropTypes.node.isRequired,\r\n};*/\r\n\r\n\r\ninterface PasswordPromptProps {\r\n hub: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n// Sub prompts\r\nconst PasswordPrompt: React.FC<PasswordPromptProps> = ({ hub, sessionT }) => (\r\n <div className=\"password prompt\">\r\n <ActionInput \r\n placeholder={ sessionT.translate('Password') } \r\n caption={ sessionT.translate('Submit') }\r\n icon={ IconConstants.CONNECT }\r\n handleAction={ text => \r\n runBackgroundSocketAction(\r\n () => sendHubPassword(hub, text),\r\n sessionT.plainT\r\n )\r\n }\r\n />\r\n <div className=\"help\">\r\n <Trans i18nKey={ sessionT.toI18nKey('passwordPromptHelp') }>\r\n This usually means that there's a registered account associated with your nick. \r\n If you don't remember having a registered account in this hub, \r\n there may be someone else using the same nick.\r\n </Trans>\r\n </div>\r\n </div>\r\n);\r\n\r\ninterface RedirectPromptProps {\r\n hub: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst RedirectPrompt: React.FC<RedirectPromptProps> = ({ hub, sessionT }) => (\r\n <Button\r\n className=\"redirect prompt\"\r\n icon={ IconConstants.CONNECT }\r\n onClick={ _ => \r\n runBackgroundSocketAction(\r\n () => acceptHubRedirect(hub),\r\n sessionT.plainT\r\n )\r\n }\r\n caption={ sessionT.t('acceptRedirect', {\r\n defaultValue: 'Accept redirect to {{url}}',\r\n replace: {\r\n url: hub.connect_state.data!.hub_url\r\n }\r\n }) }\r\n />\r\n);\r\n\r\nexport { RedirectPrompt, PasswordPrompt, HubActionPrompt };","\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;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { Component } from 'react';\r\n\r\nimport HubMessageStore from 'stores/HubMessageStore';\r\n\r\nimport { loadSessionProperty, saveSessionProperty } from 'utils/BrowserUtils';\r\nimport Checkbox from 'components/semantic/Checkbox';\r\n\r\nimport ChatLayout, { ChatAPI, ChatActionList } from 'routes/Sidebar/components/chat/ChatLayout';\r\nimport HubUserTable from 'routes/Sidebar/routes/Hubs/components/HubUserTable';\r\n\r\nimport HubFooter from 'routes/Sidebar/routes/Hubs/components/HubFooter';\r\nimport { RedirectPrompt, PasswordPrompt, HubActionPrompt } from 'routes/Sidebar/routes/Hubs/components/HubPrompt';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nconst getStorageKey = (props: HubSessionProps) => {\r\n return `view_userlist_${props.session.id}`;\r\n};\r\n\r\nconst checkList = (props: HubSessionProps) => {\r\n return loadSessionProperty(getStorageKey(props), false);\r\n};\r\n\r\ninterface HubSessionProps extends SessionChildProps<API.Hub, {}, ChatActionList> {\r\n\r\n}\r\n\r\nclass HubSession extends Component<HubSessionProps> {\r\n static displayName = 'HubSession';\r\n\r\n state = {\r\n showList: checkList(this.props),\r\n };\r\n \r\n componentDidUpdate(prevProps: HubSessionProps) {\r\n if (prevProps.session.id !== this.props.session.id && this.state.showList !== checkList(this.props)) {\r\n this.toggleListState();\r\n }\r\n }\r\n\r\n toggleListState = () => {\r\n this.setState({ showList: !this.state.showList });\r\n }\r\n\r\n getMessage = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (connectState === API.HubConnectStateEnum.PASSWORD) {\r\n return (\r\n <HubActionPrompt \r\n title={ sessionT.translate('Password required') }\r\n icon={ IconConstants.LOCK }\r\n content={ <PasswordPrompt hub={ session } sessionT={ sessionT }/> }\r\n />\r\n );\r\n }\r\n\r\n if (connectState === API.HubConnectStateEnum.REDIRECT) {\r\n return (\r\n <HubActionPrompt \r\n title={ sessionT.translate('Redirect requested') }\r\n icon={ IconConstants.REDIRECT }\r\n content={ <RedirectPrompt hub={ session } sessionT={ sessionT }/> }\r\n />\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n onClickUsers = () => {\r\n this.toggleListState();\r\n\r\n saveSessionProperty(getStorageKey(this.props), this.state.showList);\r\n }\r\n\r\n handleFileUpload = (file: File) => {\r\n const { hub_url } = this.props.session;\r\n return shareTempFile(file, hub_url, undefined);\r\n }\r\n\r\n render() {\r\n const { session, sessionApi, sessionT, uiActions } = this.props;\r\n const { showList } = this.state;\r\n\r\n const checkbox = (\r\n <Checkbox\r\n className=\"userlist-button\"\r\n type=\"toggle\"\r\n caption={ sessionT.translate('User list') }\r\n onChange={ this.onClickUsers }\r\n checked={ showList }\r\n />\r\n );\r\n\r\n return (\r\n <div className=\"hub chat session\">\r\n { this.getMessage() }\r\n { showList ? (\r\n <HubUserTable\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n ) : (\r\n <ChatLayout\r\n messageStore={ HubMessageStore }\r\n chatApi={ HubActions as ChatAPI }\r\n sessionApi={ sessionApi }\r\n chatActions={ uiActions }\r\n chatAccess={ API.AccessEnum.HUBS_SEND }\r\n session={ session }\r\n handleFileUpload={ this.handleFileUpload }\r\n highlightRemoteMenuId={ MenuConstants.HUB_MESSAGE_HIGHLIGHT }\r\n />\r\n ) }\r\n <HubFooter\r\n userlistToggle={ checkbox }\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubSession;","import { Component } from 'react';\r\n\r\nimport HubSearchInput from 'components/autosuggest/HubSearchInput';\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Button from 'components/semantic/Button';\r\n\r\n\r\nclass HubNew extends Component<NewSessionLayoutProps> {\r\n handleConnect = (hubUrl: string) => {\r\n HubActions.createSession(this.props.location, hubUrl, HubSessionStore);\r\n }\r\n\r\n hasSession = (entry: API.HistoryItem) => {\r\n return HubSessionStore.getSessionByUrl(entry.hub_url);\r\n }\r\n\r\n recentHubRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={ _ => this.handleConnect(entry.hub_url) }>\r\n { entry.name }\r\n </a> \r\n );\r\n }\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"hub session new\">\r\n <HubSearchInput \r\n submitHandler={ this.handleConnect }\r\n button={ \r\n <Button\r\n icon={ IconConstants.CONNECT }\r\n caption={ sessionT.translate('Connect') }\r\n />\r\n }\r\n />\r\n <Message\r\n description={(\r\n <Trans i18nKey={ sessionT.toI18nKey('favoriteHubsHint') }>\r\n Tip: visit the <Link to=\"/favorite-hubs\">Favorite hubs</Link> page to connect using custom settings\r\n </Trans>\r\n )}\r\n />\r\n <RecentLayout\r\n entryType={ HistoryEntryEnum.HUB }\r\n hasSession={ this.hasSession }\r\n entryTitleRenderer={ this.recentHubRender }\r\n entryIcon=\"sitemap\"\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubNew;\r\n","import * as React from 'react';\r\n\r\nimport { TextDecorator } from 'components/text';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubUIActions from 'actions/ui/HubActions';\r\nimport HubAPIActions from 'actions/reflux/HubActions';\r\n\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport HubSession from 'routes/Sidebar/routes/Hubs/components/HubSession';\r\nimport HubNew from 'routes/Sidebar/routes/Hubs/components/HubNew';\r\nimport HubIcon from 'components/icon/HubIcon';\r\n\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecorator, SessionProviderDecoratorChildProps \r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst ItemHandler: UI.SessionInfoGetter<API.Hub> = {\r\n itemNameGetter(session) {\r\n return session.identity.name;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return hubOnlineStatusToColor(session.connect_state.id);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return (\r\n <TextDecorator\r\n text={ session.identity.description }\r\n emojify={ true }\r\n />\r\n );\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <HubIcon hub={ session } />;\r\n },\r\n};\r\n\r\nconst parseNumericId = (params: UI.SessionRouteParams) => {\r\n if (!params.id) {\r\n return null;\r\n }\r\n\r\n return parseInt(params['id']);\r\n};\r\n\r\n//const hubActions = [ 'reconnect', 'favorite', 'clear' ];\r\n\r\nconst Hubs: React.FC<SessionProviderDecoratorChildProps<API.Hub>> = props => {\r\n const { match, t, ...other } = props;\r\n return (\r\n <SessionLayout \r\n activeId={ parseNumericId(match.params) }\r\n baseUrl=\"hubs\"\r\n newCaption={ t(toI18nKey('new', UI.Modules.HUBS), 'Connect') }\r\n newDescription={ t(toI18nKey('newDesc', UI.Modules.HUBS), 'Connect to a new hub') } \r\n newIcon={ IconConstants.HUBS_PLAIN }\r\n editAccess={ API.AccessEnum.HUBS_EDIT }\r\n uiActions={ HubUIActions }\r\n actionIds={[ 'reconnect', 'clear', 'favorite' ]}\r\n sessionApi={ HubAPIActions as UI.SessionActions<API.Hub> }\r\n sessionItemLayout={ HubSession }\r\n newLayout={ HubNew }\r\n t={ t }\r\n unreadInfoStore={ HubSessionStore }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Hubs, HubSessionStore);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","hub","other","icon","connect_state","HubActions","reconnect","displayName","access","IconConstants","handler","data","SocketService","HubConstants","favorite","filter","favorite_hub","notifications","onSuccess","toggleChatNotify","use_main_chat_notify","settings","checked","toggleShowJoins","show_joins","HubActionsDecorated","SessionActionDecorator","ChatActionDecorator","moduleId","actions","HubMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","this","hasMessages","hasInitializedSessions","_onChatMessage","_onStatusMessage","_onSessionUpdated","_onSessionRemoved","MessageStoreDecorator","AccessConstants","_viewName","_apiUrl","_sessionStore","HubSessionStore","mixins","ViewStoreMixin","NickCell","cellData","rowDataGetter","session","text","user","userIcon","remoteMenuId","MenuConstants","entityId","HubUserTable","rowClassNameGetter","flags","join","emptyRowsNodeGetter","sessionT","props","connectState","className","Message","title","translate","Loader","render","VirtualTable","store","HubUserViewStore","sessionStore","Column","name","width","columnKey","flexGrow","cell","propTypes","SocketSubscriptionDecorator","counts","setCounts","useState","share_size","user_count","useEffect","then","catch","error","console","message","url","removeSocketListeners","layoutWidth","useContext","LayoutWidthContext","userlistToggle","users","shared","averageShare","plainT","SessionFooter","EncryptionState","encryption","t","defaultValue","defaultValue_plural","count","replace","total","average","ids","header","itemData","triggerIcon","HubActionPrompt","content","LoginStore","Icon","PasswordPrompt","ActionInput","placeholder","caption","handleAction","password","sendHubPassword","Trans","i18nKey","toI18nKey","RedirectPrompt","Button","onClick","_","acceptHubRedirect","hub_url","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","getStorageKey","checkList","HubSession","Component","state","showList","toggleListState","setState","getMessage","onClickUsers","handleFileUpload","file","undefined","componentDidUpdate","prevProps","sessionApi","uiActions","checkbox","Checkbox","type","onChange","ChatLayout","messageStore","chatApi","chatActions","chatAccess","highlightRemoteMenuId","HubNew","handleConnect","hubUrl","location","hasSession","entry","recentHubRender","HubSearchInput","submitHandler","button","description","to","RecentLayout","entryType","entryTitleRenderer","entryIcon","ItemHandler","itemNameGetter","identity","itemStatusGetter","itemHeaderDescriptionGetter","emojify","itemHeaderIconGetter","HubIcon","SessionProviderDecorator","match","SessionLayout","activeId","params","parseInt","baseUrl","newCaption","newDescription","newIcon","editAccess","actionIds","sessionItemLayout","newLayout","unreadInfoStore"],"sourceRoot":""}
1
+ {"version":3,"file":"js/hubs.eed2f41d894688465906.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css","webpack://airdcpp-webui/./src/components/icon/HubIcon.tsx","webpack://airdcpp-webui/./src/actions/ui/HubActions.ts","webpack://airdcpp-webui/./src/stores/HubMessageStore.ts","webpack://airdcpp-webui/./src/stores/HubUserViewStore.js","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubUserTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubFooter.tsx","webpack://airdcpp-webui/./src/services/api/HubApi.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubPrompt.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/style.css?5587","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/HubNew.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Hubs/components/Hubs.tsx"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".hub-action-prompt {\\r\\n flex-direction: column;\\r\\n align-items: flex-start !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .header {\\r\\n margin: 0 0 1rem !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .password.prompt .help {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .redirect.prompt {\\r\\n max-width: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.hub.session .virtual-table,\\r\\n.hub.session .offline-message,\\r\\n.hub.session .loader-wrapper {\\r\\n flex: 1;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.tag,\\r\\n.hub.session .cell-wrapper.nick,\\r\\n.hub.session .cell-wrapper.description,\\r\\n.hub.session .cell-wrapper.share_size {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.nick.op {\\r\\n color: steelblue;\\r\\n}\\r\\n.hub.session .session-footer .actions-wrapper > a,\\r\\n.hub.session .session-footer .actions-wrapper > div {\\r\\n /* Don't cut the shadow */\\r\\n padding-left: 1px;\\r\\n padding-bottom: 1px;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .userlist-button label {\\r\\n color: grey;\\r\\n font-size: small;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .actions-wrapper .dropdown {\\r\\n margin-left: 10px;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Hubs/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,sBAAsB;EACtB,kCAAkC;AACpC;;AAEA;EACE,2BAA2B;AAC7B;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,eAAe;EACf,gBAAgB;AAClB;;AAEA;;;EAGE,OAAO;EACP,eAAe;AACjB;;AAEA;;;;EAIE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;AAClB;AACA;;EAEE,yBAAyB;EACzB,iBAAiB;EACjB,mBAAmB;AACrB;;AAEA;EACE,WAAW;EACX,gBAAgB;AAClB;;AAEA;EACE,iBAAiB;AACnB\",\"sourcesContent\":[\".hub-action-prompt {\\r\\n flex-direction: column;\\r\\n align-items: flex-start !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .header {\\r\\n margin: 0 0 1rem !important;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .password.prompt .help {\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.hub-action-prompt .redirect.prompt {\\r\\n max-width: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.hub.session .virtual-table,\\r\\n.hub.session .offline-message,\\r\\n.hub.session .loader-wrapper {\\r\\n flex: 1;\\r\\n margin-top: 5px;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.tag,\\r\\n.hub.session .cell-wrapper.nick,\\r\\n.hub.session .cell-wrapper.description,\\r\\n.hub.session .cell-wrapper.share_size {\\r\\n overflow: hidden;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.hub.session .cell-wrapper.nick.op {\\r\\n color: steelblue;\\r\\n}\\r\\n.hub.session .session-footer .actions-wrapper > a,\\r\\n.hub.session .session-footer .actions-wrapper > div {\\r\\n /* Don't cut the shadow */\\r\\n padding-left: 1px;\\r\\n padding-bottom: 1px;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .userlist-button label {\\r\\n color: grey;\\r\\n font-size: small;\\r\\n}\\r\\n\\r\\n.hub.session .session-footer .actions-wrapper .dropdown {\\r\\n margin-left: 10px;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport Icon, { IconProps } from 'components/semantic/Icon';\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\ninterface HubIconProps extends IconProps {\r\n hub: API.Hub;\r\n}\r\n\r\nconst HubIcon: React.FC<HubIconProps> = ({ hub, ...other }) => (\r\n <Icon\r\n { ...other }\r\n icon={ hubOnlineStatusToColor(hub.connect_state.id) + ' sitemap' }\r\n />\r\n);\r\n\r\n/*HubIcon.propTypes = {\r\n // Hub object\r\n hub: PropTypes.object.isRequired,\r\n};*/\r\n\r\nexport default HubIcon;","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport ChatActionDecorator from './decorators/ChatActionDecorator';\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst showFav = (hub: API.Hub) => !hub.favorite_hub;\r\n\r\n\r\nconst handleFavorite: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/favorite`);\r\n};\r\n\r\nconst handleToggleChatNotify: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n use_main_chat_notify: !hub.settings.use_main_chat_notify,\r\n });\r\n};\r\n\r\nconst handleToggleJoins: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.patch(`${HubConstants.SESSIONS_URL}/${hub.id}`, {\r\n show_joins: !hub.settings.show_joins,\r\n });\r\n};\r\n\r\nconst handleReconnect: UI.ActionHandler<API.Hub> = ({ data: hub }) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/reconnect`);\r\n};\r\n\r\nconst HubActions: UI.ActionListType<API.Hub> = {\r\n reconnect: { \r\n displayName: 'Reconnect',\r\n access: API.AccessEnum.HUBS_EDIT, \r\n icon: IconConstants.REFRESH_COLORED,\r\n handler: handleReconnect,\r\n },\r\n favorite: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Add to favorites', \r\n icon: IconConstants.FAVORITE,\r\n filter: showFav,\r\n handler: handleFavorite,\r\n notifications: {\r\n onSuccess: 'The hub {{item.identity.name}} was added in favorites',\r\n }\r\n },\r\n toggleChatNotify: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Use chat notification',\r\n handler: handleToggleChatNotify,\r\n checked: hub => {\r\n return hub.settings.use_main_chat_notify;\r\n }\r\n },\r\n toggleShowJoins: { \r\n access: API.AccessEnum.HUBS_EDIT, \r\n displayName: 'Show joins/parts', \r\n handler: handleToggleJoins,\r\n checked: hub => {\r\n return hub.settings.show_joins;\r\n }\r\n },\r\n};\r\n\r\n\r\nconst HubActionsDecorated = SessionActionDecorator(\r\n ChatActionDecorator(\r\n HubActions, \r\n HubConstants.SESSIONS_URL, \r\n API.AccessEnum.HUBS_EDIT\r\n ), \r\n HubConstants.SESSIONS_URL, \r\n API.AccessEnum.HUBS_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.HUBS,\r\n actions: HubActionsDecorated,\r\n};\r\n","//@ts-ignore\r\nimport Reflux from 'reflux';\r\nimport invariant from 'invariant';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport HubActions from 'actions/reflux/HubActions';\r\n\r\nimport MessageStoreDecorator from './decorators/MessageStoreDecorator';\r\n\r\nimport AccessConstants from 'constants/AccessConstants';\r\nimport { SessionScrollPositionKeeper } from './helpers/SessionScrollPositionKeeper';\r\nimport { AddSocketListener } from 'decorators/SocketSubscriptionDecorator';\r\n\r\n\r\nconst HubMessageStore = Reflux.createStore({\r\n scroll: SessionScrollPositionKeeper(),\r\n\r\n onSocketConnected(addSocketListener: AddSocketListener) {\r\n invariant(!this.hasMessages(), 'No existing hub messages should exist on socket connect');\r\n invariant(!this.hasInitializedSessions(), 'No initialized hub sessions should exist on socket connect');\r\n\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.HUB_MESSAGE, this._onChatMessage);\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.HUB_STATUS_MESSAGE, this._onStatusMessage);\r\n\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_UPDATED, this._onSessionUpdated);\r\n addSocketListener(HubConstants.MODULE_URL, HubConstants.SESSION_REMOVED, this._onSessionRemoved);\r\n },\r\n});\r\n\r\nexport default MessageStoreDecorator(HubMessageStore, HubActions, AccessConstants.HUBS_VIEW)\r\n;\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\r\nimport Reflux from 'reflux';\r\nimport HubConstants from 'constants/HubConstants';\r\nimport HubSessionStore from './HubSessionStore';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'hub_user_view',\r\n _apiUrl: HubConstants.SESSIONS_URL,\r\n _sessionStore: HubSessionStore,\r\n mixins: [ ViewStoreMixin('nick') ],\r\n});\r\n","import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubUserViewStore from 'stores/HubUserViewStore';\r\n\r\nimport { Column } from 'fixed-data-table-2';\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, ConnectionCell, IpCell } from 'components/table/Cell';\r\n\r\nimport { TableUserMenu } from 'components/menu';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport Loader from 'components/semantic/Loader';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface NickCellProps extends RowWrapperCellChildProps<string, API.HubUser> {\r\n session: API.Hub;\r\n}\r\n\r\nconst NickCell: React.FC<NickCellProps> = (\r\n { cellData, rowDataGetter, session }\r\n) => (\r\n <TableUserMenu \r\n text={ cellData } \r\n user={ rowDataGetter!() }\r\n userIcon={ true }\r\n remoteMenuId={ MenuConstants.HUB_USER }\r\n entityId={ session.id }\r\n />\r\n);\r\n\r\n\r\ninterface HubUserTableProps {\r\n session: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass HubUserTable extends React.Component<HubUserTableProps> {\r\n static propTypes = {\r\n session: PropTypes.object, // required\r\n };\r\n\r\n rowClassNameGetter = (user: API.HubUser) => {\r\n return user.flags.join(' ');\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (connectState === API.HubConnectStateEnum.DISCONNECTED || connectState === API.HubConnectStateEnum.REDIRECT) {\r\n return (\r\n <div className=\"offline-message\">\r\n <Message \r\n className=\"offline\"\r\n title={ sessionT.translate('Not connected to the hub') }\r\n icon={ IconConstants.OFFLINE }\r\n />\r\n </div>\r\n );\r\n } \r\n\r\n const text = sessionT.translate(\r\n connectState !== API.HubConnectStateEnum.CONNECTED ? 'Connecting' : 'Loading userlist'\r\n );\r\n \r\n return (\r\n <div className=\"loader-wrapper\">\r\n <Loader text={ text }/>\r\n </div>\r\n );\r\n }\r\n\r\n render() {\r\n const { session } = this.props;\r\n return (\r\n <VirtualTable\r\n store={ HubUserViewStore }\r\n entityId={ session.id }\r\n sessionStore={ HubSessionStore }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n moduleId={ UI.Modules.HUBS }\r\n >\r\n <Column\r\n name=\"Nick\"\r\n width={170}\r\n columnKey=\"nick\"\r\n flexGrow={8}\r\n cell={ <NickCell session={ session }/> }\r\n />\r\n <Column\r\n name=\"Share size\"\r\n width={85}\r\n columnKey=\"share_size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Description\"\r\n width={100}\r\n columnKey=\"description\"\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Tag\"\r\n width={150}\r\n columnKey=\"tag\"\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"Upload speed\"\r\n width={80}\r\n columnKey=\"upload_speed\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"Download speed\"\r\n width={80}\r\n columnKey=\"download_speed\"\r\n cell={ <ConnectionCell/> }\r\n flexGrow={2}\r\n />\r\n <Column\r\n name=\"IP (v4)\"\r\n width={120}\r\n columnKey=\"ip4\"\r\n flexGrow={3}\r\n cell={ <IpCell/> }\r\n />\r\n <Column\r\n name=\"IP (v6)\"\r\n width={120}\r\n columnKey=\"ip6\"\r\n flexGrow={3}\r\n cell={ <IpCell/> }\r\n />\r\n <Column\r\n name=\"Files\"\r\n width={70}\r\n columnKey=\"file_count\"\r\n flexGrow={3}\r\n />\r\n </VirtualTable>\r\n );\r\n }\r\n}\r\n\r\nexport default HubUserTable;","//import PropTypes from 'prop-types';\r\nimport { useEffect, useState, useContext } from 'react';\r\n\r\nimport * as React from 'react';\r\n\r\nimport HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { SessionFooter, FooterItem } from 'routes/Sidebar/components/SessionFooter';\r\nimport EncryptionState from 'components/EncryptionState';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { ErrorResponse } from 'airdcpp-apisocket';\r\nimport { \r\n SocketSubscriptionDecorator, SocketSubscriptionDecoratorChildProps\r\n} from 'decorators/SocketSubscriptionDecorator';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\nimport { LayoutWidthContext } from 'context/LayoutWidthContext';\r\nimport { ActionMenu } from 'components/menu';\r\nimport HubActions from 'actions/ui/HubActions';\r\n\r\n\r\ninterface HubFooterProps {\r\n session: API.Hub;\r\n userlistToggle: React.ReactNode;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n\r\ntype DataProps = SocketSubscriptionDecoratorChildProps<HubFooterProps>;\r\nconst HubFooter: React.FC<HubFooterProps & DataProps> = (props) => {\r\n const [ counts, setCounts ] = useState<API.HubCounts>({\r\n share_size: 0,\r\n user_count: 0\r\n });\r\n\r\n useEffect(\r\n () => {\r\n // Fetch initial\r\n SocketService.get<API.HubCounts>(`${HubConstants.SESSIONS_URL}/${props.session.id}/counts`)\r\n .then(setCounts)\r\n .catch((error: ErrorResponse) => console.error('Failed to fetch hub counts', error.message));\r\n\r\n // Subscription\r\n const url = HubConstants.SESSIONS_URL;\r\n props.addSocketListener(\r\n url, \r\n HubConstants.SESSION_COUNTS_UPDATED, \r\n (data: API.HubCounts) => setCounts(data), \r\n props.session.id\r\n );\r\n\r\n return () => props.removeSocketListeners(props);\r\n },\r\n [ props.session ]\r\n );\r\n\r\n const layoutWidth = useContext(LayoutWidthContext);\r\n\r\n const { userlistToggle, session, sessionT } = props;\r\n const { user_count: users, share_size: shared } = counts;\r\n\r\n const averageShare = formatSize(users > 0 ? (shared / users) : 0, sessionT.plainT);\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n text={(\r\n <>\r\n <EncryptionState encryption={ session.encryption }/>\r\n { sessionT.t('xUsers', {\r\n defaultValue: '{{count}} user',\r\n defaultValue_plural: '{{count}} users',\r\n count: users,\r\n replace: {\r\n count: users\r\n }\r\n }\r\n ) }\r\n </>\r\n )}\r\n />\r\n { !useMobileLayout(layoutWidth) && (\r\n <FooterItem \r\n text={ sessionT.t('sharePerUser', {\r\n defaultValue: '{{total}} ({{average}}/user)',\r\n replace: {\r\n total: formatSize(shared, sessionT.plainT),\r\n average: averageShare\r\n }\r\n }) }\r\n /> \r\n ) }\r\n <div className=\"actions-wrapper\">\r\n <div className=\"actions\">\r\n { userlistToggle }\r\n <ActionMenu\r\n className=\"top left pointing\"\r\n actions={ HubActions }\r\n ids={[ 'toggleChatNotify', 'toggleShowJoins' ]}\r\n header={ sessionT.translate('Notification settings') } \r\n itemData={ session }\r\n triggerIcon={ \r\n session.settings.use_main_chat_notify || session.settings.show_joins ? 'yellow bell' : 'bell' \r\n }\r\n />\r\n </div>\r\n </div>\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default SocketSubscriptionDecorator(\r\n HubFooter,\r\n ({ session }) => !!HubSessionStore.getSession(session.id)\r\n);","import HubConstants from 'constants/HubConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport * as API from 'types/api';\r\nimport { \r\n sendChatMessageDecorator, clearMessagesDecorator, setReadDecorator, fetchMessagesDecorator \r\n} from './common/ChatActions';\r\n//import * as UI from 'types/ui';\r\n\r\n\r\nexport const sendHubPassword = (\r\n hub: API.Hub, \r\n password: string\r\n) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/password`, { password: password });\r\n};\r\n\r\nexport const acceptHubRedirect = (hub: API.Hub) => {\r\n return SocketService.post(`${HubConstants.SESSIONS_URL}/${hub.id}/redirect`);\r\n};\r\n\r\nexport const sendHubChatMessage = sendChatMessageDecorator(HubConstants.SESSIONS_URL);\r\nexport const clearHubChatMessages = clearMessagesDecorator(HubConstants.SESSIONS_URL);\r\nexport const fetchHubChatMessages = fetchMessagesDecorator(HubConstants.SESSIONS_URL);\r\n\r\nexport const setHubSessionRead = setReadDecorator(HubConstants.SESSIONS_URL);\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport ActionInput from 'components/semantic/ActionInput';\r\nimport Button from 'components/semantic/Button';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\nimport Icon, { IconType } from 'components/semantic/Icon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { Trans } from 'react-i18next';\r\nimport { sendHubPassword, acceptHubRedirect } from 'services/api/HubApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\ninterface HubActionPromptProps {\r\n icon: IconType;\r\n title: React.ReactNode;\r\n content: React.ReactNode;\r\n}\r\n\r\n// Main prompt (HUBS_EDIT permission is required for the content to be rendered)\r\nconst HubActionPrompt: React.FC<HubActionPromptProps> = (\r\n { icon, title, content }\r\n) => {\r\n if (!LoginStore.hasAccess(API.AccessEnum.HUBS_EDIT)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"ui icon message hub-action-prompt\">\r\n <h3 className=\"ui header\">\r\n <Icon icon={ icon }/>\r\n <div className=\"content\">\r\n { title }\r\n </div>\r\n </h3>\r\n { content }\r\n </div>\r\n );\r\n};\r\n\r\n/*HubActionPrompt.propTypes = {\r\n // Message title\r\n title: PropTypes.node.isRequired,\r\n\r\n // Children\r\n content: PropTypes.node.isRequired,\r\n};*/\r\n\r\n\r\ninterface PasswordPromptProps {\r\n hub: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\n// Sub prompts\r\nconst PasswordPrompt: React.FC<PasswordPromptProps> = ({ hub, sessionT }) => (\r\n <div className=\"password prompt\">\r\n <ActionInput \r\n placeholder={ sessionT.translate('Password') } \r\n caption={ sessionT.translate('Submit') }\r\n icon={ IconConstants.CONNECT }\r\n handleAction={ text => \r\n runBackgroundSocketAction(\r\n () => sendHubPassword(hub, text),\r\n sessionT.plainT\r\n )\r\n }\r\n />\r\n <div className=\"help\">\r\n <Trans i18nKey={ sessionT.toI18nKey('passwordPromptHelp') }>\r\n This usually means that there's a registered account associated with your nick. \r\n If you don't remember having a registered account in this hub, \r\n there may be someone else using the same nick.\r\n </Trans>\r\n </div>\r\n </div>\r\n);\r\n\r\ninterface RedirectPromptProps {\r\n hub: API.Hub;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst RedirectPrompt: React.FC<RedirectPromptProps> = ({ hub, sessionT }) => (\r\n <Button\r\n className=\"redirect prompt\"\r\n icon={ IconConstants.CONNECT }\r\n onClick={ _ => \r\n runBackgroundSocketAction(\r\n () => acceptHubRedirect(hub),\r\n sessionT.plainT\r\n )\r\n }\r\n caption={ sessionT.t('acceptRedirect', {\r\n defaultValue: 'Accept redirect to {{url}}',\r\n replace: {\r\n url: hub.connect_state.data!.hub_url\r\n }\r\n }) }\r\n />\r\n);\r\n\r\nexport { RedirectPrompt, PasswordPrompt, HubActionPrompt };","\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;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n export default content && content.locals ? content.locals : undefined;\n","import { Component } from 'react';\r\n\r\nimport HubMessageStore from 'stores/HubMessageStore';\r\n\r\nimport { loadSessionProperty, saveSessionProperty } from 'utils/BrowserUtils';\r\nimport Checkbox from 'components/semantic/Checkbox';\r\n\r\nimport ChatLayout, { ChatAPI, ChatActionList } from 'routes/Sidebar/components/chat/ChatLayout';\r\nimport HubUserTable from 'routes/Sidebar/routes/Hubs/components/HubUserTable';\r\n\r\nimport HubFooter from 'routes/Sidebar/routes/Hubs/components/HubFooter';\r\nimport { RedirectPrompt, PasswordPrompt, HubActionPrompt } from 'routes/Sidebar/routes/Hubs/components/HubPrompt';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport { shareTempFile } from 'services/api/ShareApi';\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nconst getStorageKey = (props: HubSessionProps) => {\r\n return `view_userlist_${props.session.id}`;\r\n};\r\n\r\nconst checkList = (props: HubSessionProps) => {\r\n return loadSessionProperty(getStorageKey(props), false);\r\n};\r\n\r\ninterface HubSessionProps extends SessionChildProps<API.Hub, {}, ChatActionList> {\r\n\r\n}\r\n\r\nclass HubSession extends Component<HubSessionProps> {\r\n static displayName = 'HubSession';\r\n\r\n state = {\r\n showList: checkList(this.props),\r\n };\r\n \r\n componentDidUpdate(prevProps: HubSessionProps) {\r\n if (prevProps.session.id !== this.props.session.id && this.state.showList !== checkList(this.props)) {\r\n this.toggleListState();\r\n }\r\n }\r\n\r\n toggleListState = () => {\r\n this.setState({ showList: !this.state.showList });\r\n }\r\n\r\n getMessage = () => {\r\n const { session, sessionT } = this.props;\r\n const connectState = session.connect_state.id;\r\n\r\n if (connectState === API.HubConnectStateEnum.PASSWORD) {\r\n return (\r\n <HubActionPrompt \r\n title={ sessionT.translate('Password required') }\r\n icon={ IconConstants.LOCK }\r\n content={ <PasswordPrompt hub={ session } sessionT={ sessionT }/> }\r\n />\r\n );\r\n }\r\n\r\n if (connectState === API.HubConnectStateEnum.REDIRECT) {\r\n return (\r\n <HubActionPrompt \r\n title={ sessionT.translate('Redirect requested') }\r\n icon={ IconConstants.REDIRECT }\r\n content={ <RedirectPrompt hub={ session } sessionT={ sessionT }/> }\r\n />\r\n );\r\n }\r\n\r\n return null;\r\n }\r\n\r\n onClickUsers = () => {\r\n this.toggleListState();\r\n\r\n saveSessionProperty(getStorageKey(this.props), this.state.showList);\r\n }\r\n\r\n handleFileUpload = (file: File) => {\r\n const { hub_url } = this.props.session;\r\n return shareTempFile(file, hub_url, undefined);\r\n }\r\n\r\n render() {\r\n const { session, sessionApi, sessionT, uiActions } = this.props;\r\n const { showList } = this.state;\r\n\r\n const checkbox = (\r\n <Checkbox\r\n className=\"userlist-button\"\r\n type=\"toggle\"\r\n caption={ sessionT.translate('User list') }\r\n onChange={ this.onClickUsers }\r\n checked={ showList }\r\n />\r\n );\r\n\r\n return (\r\n <div className=\"hub chat session\">\r\n { this.getMessage() }\r\n { showList ? (\r\n <HubUserTable\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n ) : (\r\n <ChatLayout\r\n messageStore={ HubMessageStore }\r\n chatApi={ HubActions as ChatAPI }\r\n sessionApi={ sessionApi }\r\n chatActions={ uiActions }\r\n chatAccess={ API.AccessEnum.HUBS_SEND }\r\n session={ session }\r\n handleFileUpload={ this.handleFileUpload }\r\n highlightRemoteMenuId={ MenuConstants.HUB_MESSAGE_HIGHLIGHT }\r\n />\r\n ) }\r\n <HubFooter\r\n userlistToggle={ checkbox }\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubSession;","import { Component } from 'react';\r\n\r\nimport HubSearchInput from 'components/autosuggest/HubSearchInput';\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport Message from 'components/semantic/Message';\r\nimport { Link } from 'react-router-dom';\r\n\r\nimport HubActions from 'actions/reflux/HubActions';\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\n\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Button from 'components/semantic/Button';\r\n\r\n\r\nclass HubNew extends Component<NewSessionLayoutProps> {\r\n handleConnect = (hubUrl: string) => {\r\n HubActions.createSession(this.props.location, hubUrl, HubSessionStore);\r\n }\r\n\r\n hasSession = (entry: API.HistoryItem) => {\r\n return HubSessionStore.getSessionByUrl(entry.hub_url);\r\n }\r\n\r\n recentHubRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={ _ => this.handleConnect(entry.hub_url) }>\r\n { entry.name }\r\n </a> \r\n );\r\n }\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"hub session new\">\r\n <HubSearchInput \r\n submitHandler={ this.handleConnect }\r\n button={ \r\n <Button\r\n icon={ IconConstants.CONNECT }\r\n caption={ sessionT.translate('Connect') }\r\n />\r\n }\r\n />\r\n <Message\r\n description={(\r\n <Trans i18nKey={ sessionT.toI18nKey('favoriteHubsHint') }>\r\n Tip: visit the <Link to=\"/favorite-hubs\">Favorite hubs</Link> page to connect using custom settings\r\n </Trans>\r\n )}\r\n />\r\n <RecentLayout\r\n entryType={ HistoryEntryEnum.HUB }\r\n hasSession={ this.hasSession }\r\n entryTitleRenderer={ this.recentHubRender }\r\n entryIcon=\"sitemap\"\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default HubNew;\r\n","import * as React from 'react';\r\n\r\nimport { TextDecorator } from 'components/text';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\n\r\nimport HubSessionStore from 'stores/HubSessionStore';\r\nimport HubUIActions from 'actions/ui/HubActions';\r\nimport HubAPIActions from 'actions/reflux/HubActions';\r\n\r\nimport { hubOnlineStatusToColor } from 'utils/TypeConvert';\r\n\r\nimport HubSession from 'routes/Sidebar/routes/Hubs/components/HubSession';\r\nimport HubNew from 'routes/Sidebar/routes/Hubs/components/HubNew';\r\nimport HubIcon from 'components/icon/HubIcon';\r\n\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecorator, SessionProviderDecoratorChildProps \r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\n\r\nconst ItemHandler: UI.SessionInfoGetter<API.Hub> = {\r\n itemNameGetter(session) {\r\n return session.identity.name;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return hubOnlineStatusToColor(session.connect_state.id);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return (\r\n <TextDecorator\r\n text={ session.identity.description }\r\n emojify={ true }\r\n />\r\n );\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <HubIcon hub={ session } />;\r\n },\r\n};\r\n\r\nconst parseNumericId = (params: UI.SessionRouteParams) => {\r\n if (!params.id) {\r\n return null;\r\n }\r\n\r\n return parseInt(params['id']);\r\n};\r\n\r\n//const hubActions = [ 'reconnect', 'favorite', 'clear' ];\r\n\r\nconst Hubs: React.FC<SessionProviderDecoratorChildProps<API.Hub>> = props => {\r\n const { match, t, ...other } = props;\r\n return (\r\n <SessionLayout \r\n activeId={ parseNumericId(match.params) }\r\n baseUrl=\"hubs\"\r\n newCaption={ t(toI18nKey('new', UI.Modules.HUBS), 'Connect') }\r\n newDescription={ t(toI18nKey('newDesc', UI.Modules.HUBS), 'Connect to a new hub') } \r\n newIcon={ IconConstants.HUBS_PLAIN }\r\n editAccess={ API.AccessEnum.HUBS_EDIT }\r\n uiActions={ HubUIActions }\r\n actionIds={[ 'reconnect', 'clear', 'favorite' ]}\r\n sessionApi={ HubAPIActions as UI.SessionActions<API.Hub> }\r\n sessionItemLayout={ HubSession }\r\n newLayout={ HubNew }\r\n t={ t }\r\n unreadInfoStore={ HubSessionStore }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Hubs, HubSessionStore);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","hub","other","icon","connect_state","HubActions","reconnect","displayName","access","IconConstants","handler","data","SocketService","HubConstants","favorite","filter","favorite_hub","notifications","onSuccess","toggleChatNotify","use_main_chat_notify","settings","checked","toggleShowJoins","show_joins","HubActionsDecorated","SessionActionDecorator","ChatActionDecorator","moduleId","actions","HubMessageStore","scroll","SessionScrollPositionKeeper","onSocketConnected","addSocketListener","this","hasMessages","hasInitializedSessions","_onChatMessage","_onStatusMessage","_onSessionUpdated","_onSessionRemoved","MessageStoreDecorator","AccessConstants","_viewName","_apiUrl","_sessionStore","HubSessionStore","mixins","ViewStoreMixin","NickCell","cellData","rowDataGetter","session","text","user","userIcon","remoteMenuId","MenuConstants","entityId","HubUserTable","rowClassNameGetter","flags","join","emptyRowsNodeGetter","sessionT","props","connectState","className","Message","title","translate","Loader","render","VirtualTable","store","HubUserViewStore","sessionStore","Column","name","width","columnKey","flexGrow","cell","propTypes","SocketSubscriptionDecorator","counts","setCounts","useState","share_size","user_count","useEffect","then","catch","error","console","message","url","removeSocketListeners","layoutWidth","useContext","LayoutWidthContext","userlistToggle","users","shared","averageShare","plainT","SessionFooter","EncryptionState","encryption","t","defaultValue","defaultValue_plural","count","replace","total","average","ids","header","itemData","triggerIcon","HubActionPrompt","content","LoginStore","Icon","PasswordPrompt","ActionInput","placeholder","caption","handleAction","password","sendHubPassword","Trans","i18nKey","toI18nKey","RedirectPrompt","Button","onClick","_","acceptHubRedirect","hub_url","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","getStorageKey","checkList","HubSession","Component","state","showList","toggleListState","setState","getMessage","onClickUsers","handleFileUpload","file","undefined","componentDidUpdate","prevProps","sessionApi","uiActions","checkbox","Checkbox","type","onChange","ChatLayout","messageStore","chatApi","chatActions","chatAccess","highlightRemoteMenuId","HubNew","handleConnect","hubUrl","location","hasSession","entry","recentHubRender","HubSearchInput","submitHandler","button","description","to","RecentLayout","entryType","entryTitleRenderer","entryIcon","ItemHandler","itemNameGetter","identity","itemStatusGetter","itemHeaderDescriptionGetter","emojify","itemHeaderIconGetter","HubIcon","SessionProviderDecorator","match","SessionLayout","activeId","params","parseInt","baseUrl","newCaption","newDescription","newIcon","editAccess","actionIds","sessionItemLayout","newLayout","unreadInfoStore"],"sourceRoot":""}
@@ -0,0 +1 @@
1
+ "use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[293],{52365:e=>{e.exports=JSON.parse('{"widgets":{"application":{"widgetName":"Application","addWidget":"Ajouter un widget...","loggedInAs":"Connecté en tant que","clientStarted":"Client démarré","activeSessions":"Sessions actives"},"rss":{"widgetName":"Flux RSS","invalidUrl":"URL invalide","lastUpdated":"Mis à jour : {{time}}","actions":{"openLink":"Ouvrir le lien","search":"Recherche"},"loadingFeed":"Chargement des flux","form":{"feedUrlName":"URL du flux","feedUrlHelp":"Les flux Atom et RSS sont supportés","feedCacheMinutesName":"Intervalle minimum de réinitialisation (minutes)"},"invalidFeed":"Flux invalide/non pris en charge: {{erreur}}"},"transfers":{"widgetName":"Transferts","trafficBps":"Bande passante (bps)","downloads":"Téléchargements","uploads":"Envois","downloaded":"Téléchargé","uploaded":"Envoyé","downloadLimit":"Limite de téléchargement","uploadLimit":"Limite d\'envoi"},"notepad":{"widgetName":"Notes"},"extensions":{"widgetName":"Versions d\'extension","updatedAgo":"Mis à jour le {{date}}"},"actions":{"editWidget":"Éditer le widget","removeWidget":"Retirer le widget","prompts":{"removeApprove":"Retirer le widget","removeReject":"Ne pas retirer","removeContent":"Êtes-vous sûr de vouloir retirer le widget {{item.settings.name}} ?"}},"form":{"nameName":"Nom"},"widgetPositionHint":"Les widgets et leurs positions sont spécifiques au navigateur","accessDenied":"Vous n\'êtes pas autorisé à accéder à ce widget","settingsMissing":"Paramètres de widget manquants"},"events":{"events":"Événements","loadingMessages":"Chargement des messages","noMessagesToShow":"Aucun nouveau message","actions":{"clear":"Effacer"},"notifications":{"information":"Informations","info":"INFO","warning":"AVERTISSEMENT","error":"ERREUR","actions":{"viewEvents":"Voir les événements"}}},"table":{"filter":{"filter":"Filtrer","matchType":"Type à comparer","partial":"Partiel","regex":"RegEx","wildcard":"Wildcard","exact":"Exact","filterByProfile":"Filtrer par profil","allProfiles":"Tous les profils"}},"search":{"table":{"name":"Nom","size":"Taille","relevance":"Pertinence","type":"Type","connection":"Connexion","users":"Utilisateurs","time":"Dernière modification","slots":"Slots"},"actions":{"resultDetails":"Détails des résultats","browseContent":"Parcourir le contenu"},"form":{"fileTypeName":"type de fichier","hubUrlsName":"Hubs","maxSizeName":"Taille maximum","minSizeName":"Taille minimum","sizeLimitsName":"Tailles limites"},"resetAll":"Réinitialiser tout","user":"Utilisateur","hubs":"Hubs","connection":"Connexion","slots":"Slots","ip":"IP","path":"Chemin","searchOffline":"Vous devez être connecté à au moins un hub pour pouvoir effectuer une recherche.","enterSearchString":"Entrez votre recherche...","search":"Recherche","usersCount":"Utilisateur ({{count}})","usersCount_plural":"Utilisateurs ({{count}})","xUsersNicks":"{{count}} utilisateur ({{user.nicks}})","xUsersNicks_plural":"{{count}} utilisateurs ({{user.nicks}})","noResults":"Pas de résultat pour \\"{{searchString}}\\"","noResultsHint":"<0><0>Assurez-vous d\'avoir correctement orthographié les mots</0><1>Utilisez des mots-clés différents</1><2>Vous effectuez des recherches trop fréquemment (les hubs ont souvent un intervalle de recherche minimum)</2><3>Si vous ne recevez jamais de résultats pour les termes de recherche courants, assurez-vous que vos paramètres de connectivité sont correctement configurés</3></0>"},"share":{"table":{"path":"Chemin","size":"Taille","virtual_name":"Nom virtuel","profiles":"Profils","last_refresh_time":"Dernier rafraîchissement","type":"Contenu","virtualName":"Nom virtuel","lastRefreshTime":"Dernier rafraîchissement"},"actions":{"editDirectory":"Éditer le dossier","removeDirectory":"Supprimer le dossier","addDirectory":"Ajouter un dossier","refreshAll":"Tout rafraîchir","prompts":{"removeRootApprove":"Supprimer le dossier","removeRootReject":"Ne pas retirer","removeRootContent":"Voulez-vous vraiment supprimer le répertoire {{item.virtual_name}} du partage ? Il sera retiré de tous les profils de partage. "}},"actionsCaption":"Actions…","shareActions":"Actions de partage","hashingInformation":"Infos de hachage","hashingInformationDesc":"<0>Nouveaux fichiers n\'apparaîtront dans le partage qu\'une fois le hachage terminé (le client a calculé les sommes de contrôle pour eux). Les infos sur la progression du hachage seront publiées dans le journal des événements.</0> ","addShareDirectory":"Ajouter un dossier à partager","editShareDirectory":"Éditer un dossier à partager","unknown":"Inconnu","form":{"pathName":"Chemin","virtualNameName":"Nom virtuel","virtualNameHelp":"Les répertoires avec des noms virtuels identiques seront fusionnés dans la liste de fichiers","profilesName":"Profiles de partage","profilesHelp":"De nouveaux profils de partage peuvent être créés à partir des paramètres de l\'application","incomingName":"Réception"}},"favoriteHubs":{"actions":{"addNew":"Nouveau","setPassword":"Entrer le mot de passe","edit":"Modif.","remove":"Retirer","changePassword":"Changer de mot de passe","removePassword":"Retirer le mot de passe","prompts":{"changePasswordPlaceholder":"Entrer le mot de passe","changePasswordApprove":"Mettre à jour le mot de passe","changePasswordContent":"Entrez le nouveau mot de passe pour le hub {{item.name}}","removePasswordApprove":"Retirer le mot de passe","removePasswordReject":"Ne pas retirer","removePasswordContent":"Êtes-vous sûr de vouloir réinitialiser le mot de passe du hub {{item.name}}?","createPasswordPlaceholder":"Entrer le mot de passe","createPasswordApprove":"Entrer le mot de passe","createPasswordContent":"Définir mot de passe pour le hub {{item.name}}","removeApprove":"Retirer le hub favori","removeReject":"Ne pas retirer","removeContent":"Êtes-vous sûr de vouloir retirer le hub favori {{item.name}}?"}},"table":{"connectState":"État","name":"Nom","autoConnect":"Connexion auto","nick":"Pseudo","hasPassword":"Mot de passe","hubUrl":"Adresse","shareProfile":"Profil de partage"},"notSet":"Non défini","set":"Définir","globalDefault":"Valeur globale par défaut","addFavoriteHub":"Ajouter un hub favori","editFavoriteHub":"Éditer hub favori","form":{"genericName":"Propriétés de hub","nameName":"Nom","hubUrlName":"URL du hub","hubDescriptionName":"Description du hub","shareProfileName":"Profil de partage","shareProfileHelp":"Profils de partage personnalisés ne peuvent être sélectionnés qu\'après avoir saisi une adresse de hub ADC (débutant par adc:// ou adcs://)","autoConnectName":"Connexion auto","userName":"Remplacement des réglages utilisateur","nickName":"Pseudo","userDescriptionName":"Description utilisateur","connectivityV4Name":"Remplacements du réglage de connectivité (IPv4)","connectionModeV4Name":"Mode de connectivité","connectionModeV4Option-1":"Désactivé","connectionModeV4Option0":"Mode actif","connectionModeV4Option2":"Mode passif","connectionIpV4Name":"Adresse IP","connectivityV6Name":"Remplacements du réglage de connectivité (IPv6)","connectionModeV6Name":"Mode de connectivité","connectionModeV6Option-1":"Désactivé","connectionModeV6Option0":"Mode actif","connectionModeV6Option2":"Mode passif","connectionIpV6Name":"Adresse IP","miscName":"Diverses dérogations","useMainChatNotifyName":"Utiliser notification de chat","awayMessageName":"Message d’absence","showJoinsName":"Afficher les entrées/sorties"}},"filelists":{"new":"Ouvrir la liste de fichiers","newDesc":"Commencer à parcourir une nouvelle liste de fichiers","offlineMessage":"Vous devez être connecté à au moins un hub pour pouvoir télécharger les listes de fichiers d\'autres utilisateurs","directorySize":"Taille du répertoire","totalListSize":"Taille totale de la liste","browseOwnShare":"Parcourir sa propre liste...","root":"Root","userOffline":"Utilisateur déconnecté","userOfflineDesc":"Vous pourrez continuer à naviguer lorsque l\'utilisateur se reconnectera","noContentToDisplay":"Pas de contenu à afficher","theDirectoryIsEmpty":"Le dossier est vide","updatingView":"Mettre à jour l\'affichage","downloadFailed":"Téléchargement échoué","confirmLeave":"Confirmer l\'action","confirmLeaveDesc":"Cliquez à nouveau sur bouton Retour pour quitter cette liste de fichiers","table":{"name":"Nom","size":"Taille","time":"Dernière modification","type":"Type"},"actions":{"reload":"Recharger","refreshInShare":"Rafraîchir le partageur","close":"Fermer","details":"Détails"}},"common":{"actions":{"copy":"Copier","download":"Réception","downloadTo":"Télécharger vers...","findNfo":"Trouver le NFO","search":"Recherche","sendMessage":"Envoyer un message","browseShare":"Parcourir le dossier de partage","ignoreMessages":"Ignorer les messages","viewAsText":"Afficher comme texte","playVideo":"Visualiser la vidéo","viewImage":"Voir l\'image","playAudio":"Jouer le son","copyMagnetLink":"Copier le lien magnet","shutDownApplication":"Quitter l\'application","restartWebServer":"Redémarrer le serveur web","unignoreMessages":"Ne plus ignorer les messages","closeAndDontShowAgain":"Fermer et ne plus afficher","notifications":{"ignoreUserSuccess":"L\'utilisateur {{item.nicks}} est maintenant ignoré","unignoreUserSuccess":"L\'utilisateur {{item.nicks}} n\'est maintenant plus ignoré","copyMagnetSuccess":"Le lien Magnet a été copié dans le presse-papiers","copySuccess":"Le texte a été copié dans le presse-papier"},"prompts":{"restartWebSystemApprove":"Continuer et redémarrer","restartWebSystemReject":"Ne pas redémarrer","restartWebSystemContent":"Lors de la modification des options de liaison, il est recommandé de redémarrer le serveur Web uniquement quand vous pouvez accéder au serveur pour le dépannage. Si le serveur Web ne revient pas en ligne, vous devez lancer l\'application manuellement pour voir s\'il y a des messages d\'erreur. Le fichier de config se trouve par défaut dans votre répertoire utilisateur (dans le répertoire .AirDC++) au cas où vous auriez besoin de le modifier manuellement. ","shutdownSystemApprove":"Continuer et arrêter","shutdownSystemReject":"Annuler","shutdownSystemContent":"Êtes-vous sûr de vouloir fermer l\'application?"}},"units":{"b":"B","kib":"Ko","mib":"Mo","gib":"Go","tib":"To","pib":"PiB","eib":"EiB","bits":"bit/s","kbits":"Kbit/s","mbits":"Hashing","gbits":"Gbit/s"},"filename":"Fichier","xBytes":"{{octets}} octets","unitsPerSecond":"{{units}}/s","today":"Aujourd’hui","yesterday":"Hier","tomorrow":"Demain","lastWeek":"[Dernier] {{weekDay}}","awayModeWasEnabled":"Le mode Absent est activé","awayModeWasDisabled":"Le mode Absent est désactivé","actionSucceed":"Action réussie","actionFailed":"L\'action a échoué","queueingFailed":"Échec de mise en file d\'attente de l\'élément {{item.name}}","noNfoResultsWereReceived":"Aucun résultat NFO n\'a été reçu","networkClientError":"Erreur de réseau/client","failedToFetchData":"Échec de récupération des données","failedToLoadContent":"Échec chargement du contenu","loadingItems":"Chargement des éléments","root":"Root","name":"Nom","size":"Taille","path":"Chemin","createDirectory":"Créer un répertoire","create":"Créer","directoryName":"Nom du répertoire","computer":"Ordinateur","history":"Précédent","shared":"Partagé","favorites":"Favoris","dupes":"Doublons","browse":"Parcourir","download":"Réception","close":"Fermer","noPathsToDisplay":"Aucun chemin à afficher","spaceFree":"{{freeSpace}} gratuit","select":"Sélectionner","new":"Nouveau","currentSessions":"Sessions actuelles","closeAll":"Tout fermer","recentSessions":"Sessions récentes","openedAgo":"Ouvert {{timeAgo}}","waitingForServerResponse":"Attente de la réponse du serveur","loadingMessages":"Chargement des messages","loadingSession":"Chargement session","yes":"Oui","no":"Non","cancel":"Annuler","loading":"Chargement","loadingData":"Chargement des données","noOnlineHubs":"Aucun hub en ligne","installAsLocalApplication":"Installer en tant qu’application locale","pwaInstallDesc":"Cette application Web peut être installée localement, offrant une meilleure expérience utilisateur","install":"Installer","dontInstall":"Ne pas installer","statisticsNotAvailable":"Statistiques indisponibles","save":"Sauvegarder","enterNick":"Entrer un pseudo","disabled":"Désactivé","enterLimitUnit":"Entrer la limite ({{unit}}/s)","enterLimit":"Entrer les limites…","removeLimit":"Retirer les limites","tlsOk":"Authenticité du certificat est validé","tlsOutdatedWarning":"Protocole de chiffrement obsolète avec des vulnérabilités de sécurité connues","tlsAuthenticityWarning":"Impossible de valider l\'authenticité du certificat","upload":"Envoi","sendFiles":"Envoyer des fichiers","removeSharedFile":"Retirer fichier partagé","fileNoLongerShared":"Fichier {{file.name}} n\'est plus partagé","fileTooLarge":"Fichier est trop volumineux (taille max: {{maxSize}})","previewIsNotAvailable":"Aperçu indisponible","failedToFetchContent":"Échec récupération du contenu","noItemsToShow":"Rien à afficher","noSessionEditAccess":"Vous n\'êtes pas autorisé à ouvrir de nouvelles sessions","noChatAccess":"Vous n\'êtes pas autorisé à envoyer de nouveaux messages","loadingSessions":"Chargement des sessions","typeContent":"Type/contenu","lastModified":"Dernière modification","dupeType":"Type de doublon","shareFull":"Partage (complet)","sharePartial":"Partage (partiel)","queueFull":"File d\'attente (complète)","queuePartial":"File d\'attente (partielle)","finishedFull":"Achevé (complet)","finishedPartial":"Achevé (partiel)","shareAndQueue":"Partager et mettre en file d\'attente","dupePaths":"Chemins des doublons","actionsCaption":"Actions…","tth":"TTH","na":"N/A","noActionsAvailable":"Aucune action disponible","continue":"Continuer","form":{"browse":"Parcourir","noOptions":"Pas d\'options","fieldOptional":"{{definition.title}} (optionnel)","minimumValueError":"Valeur minimale autorisée est {{value}}","maximumValueError":"Valeur maximale autorisée est {{value}}","any":"Tous","directory":"Dossier","file":"&amp;Fichier","add":"Ajouter","down":"vers le bas","remove":"Retirer","up":"En haut","offlineMessage":"Aucun hub connecté","loading":"Chargement"}},"hubs":{"table":{"nick":"Pseudo","shareSize":"Taille du dossier de partage","description":"Description","tag":"Tag","uploadSpeed":"Vitesse d\'envoi","downloadSpeed":"Vitesse de réception","ip4":"IP (v4)","ip6":"IP (v6)","fileCount":"Fichiers"},"actions":{"reconnect":"Se reconnecter","clearChat":"Effacer la discussion","close":"Fermer","addToFavorites":"Ajouter aux Favoris","useChatNotification":"Utiliser notification de chat","showJoinsParts":"Afficher les entrées/sorties","notifications":{"favoriteSuccess":"Le hub {{item.identity.name}} a été ajouté aux favoris"}},"notifications":{"actions":{"viewChat":"Afficher le chat"}},"notificationSettings":"Paramètres de notification","enterHubAddress":"Entrer l\'adresse du hub","connect":"Se connecter","notConnectedToTheHub":"Pas connecter au hub","connecting":"En cours de connexion","loadingUserlist":"Chargement liste des utilisateurs","favoriteHubsHint":"Astuce: visitez page<1> des hubs favoris</1> pour vous connecter à l\'aide de paramètres personnalisés","new":"Se connecter","newDesc":"Connectez-vous à un nouveau hub","userList":"Liste d\'utilisateurs","sharePerUser":"{{total}} ({{moyenne}}/utilisateur)","xUsers":"{{count}} utilisateurs","xUsers_plural":"{{count}} utilisateurs","redirectRequested":"Redirection demandée","acceptRedirect":"Accepter redirection vers {{url}}","passwordRequired":"Mot de passe requis","password":"Mot de passe","submit":"Soumettre","passwordPromptHelp":"Cela signifie généralement qu\'un compte enregistré est associé à votre pseudo. Si vous ne vous souvenez pas d\'avoir un compte enregistré dans ce hub, il se peut que quelqu\'un d\'autre utilise le même pseudo. "},"queue":{"table":{"name":"Nom","size":"Taille","status":"État","sources":"Sources","secondsLeft":"Temps restant","speed":"Vitesse","priority":"Priorité","type":"Type/contenu","timeAdded":"Ajouté","timeFinished":"Terminé"},"actionsCaption":"Actions…","queueActions":"Actions de la fille d\'att.","pausedForced":"Pause (forcé)","queueEmpty":"La file d\'attente est vide","queueEmptyDesc":"Nouveaux éléments peuvent être mis en file d\'attente depuis liste recherche ou fichiers","actions":{"removeCompletedBundles":"Retirer les paquets terminés","pauseAllBundles":"Mettre en pause tous les paquets","resumeAllBundles":"Reprendre tous les paquets","manageFiles":"Gérer les fichiers…","manageSources":"Gérer les sources…","searchForeground":"Rechercher (nouvelle fenêtre)","searchForAlternates":"Rechercher d\'autres sources","remove":"Retirer","removeSource":"Retirer la source","rescanForErrors":"Réanalyser les erreurs","forceInShare":"Forcer à partager","prompts":{"removeBundleApprove":"Retirer le paquet","removeBundleReject":"Ne pas retirer","removeBundleContent":"Voulez-vous vraiment retirer le paquet {{item.name}} ?","removeBundleCheckbox":"Retirer les fichiers finis","removeFileApprove":"Retirer le fichier","removeFileReject":"Ne pas retirer","removeFileContent":"Voulez-vous vraiment retirer le fichier {{item.name}} ?","removeFileCheckbox":"Supprimer le fichier"},"notifications":{"removeFileSuccess":"Fichier {{item.name}} a été retiré de la file d\'attente","removeCompletedSuccess":"{{result.count}} les paquets terminés ont été retirés","searchBundleAlternatesSuccess":"Paquet {{item.name}} a été recherché pour des alternatives"}},"paused":"En pause","lowest":"La plus basse","low":"Basse","normal":"Normal","high":"Haute","highest":"La plus haute","auto":"Auto","sources":"Sources","user":"Utilisateur","hubs":"Hubs","lastKnownSpeed":"Dernière vitesse connue","files":"Fichiers","size":"Taille","notifications":{"bundleWasAddedInQueue":"Le paquet a été ajouté en file d\'attente","bundleDownloadError":"Erreur de téléchargement : {{error}}","bundleContentValidationError":"Validation contenu du paquet a échoué: {{error}} ({{hook}})","validatingDownloadedBundle":"Validation du paquet téléchargé","bundleWasCompletedSuccessfully":"Le paquet a été téléchargé entièrement","bundleWasAddedInShare":"Le paquet a été mis en partage","actions":{"viewQueue":"Voir la file d\'attente"}}},"transfers":{"table":{"user":"Utilisateur","name":"Nom","size":"Segment","status":"État","secondsLeft":"Temps restant","speed":"Vitesse","flags":"Drapeaux","ip":"IP"},"actions":{"forceConnect":"Forcer la connexion","disconnect":"Déconnecter","removeFileFromQueue":"Retirer le paquet de la file d\'attente","removeUserFromQueue":"Retirer l\'utilisateur de la file d\'attente","notifications":{"removeFileSuccess":"Fichier {{item.name}} a été retiré de la file d\'attente","removeSourceSuccess":"L\'utilisateur {{item.user.nicks}} a été retiré des fichiers {{result.count}}."}},"noActiveTransfers":"Pas de transfert actif"},"settings":{"actions":{"detectNow":"Détecter maintenant","addDirectory":"Ajouter un dossier","addUser":"Ajouter un utilisateur","editUser":"Éditer un utilisateur","editDirectory":"Éditer un dossier","removeDirectory":"Supprimer le dossier","addProfile":"Ajouter un profil","browseFiles":"Parcourir les fichiers","renameProfile":"Renommer le profil","addPath":"Ajouter chemin","removePath":"Retirer le chemin","removeUser":"Retirer l\'utilisateur","setAsDefault":"Définir par défaut","removeProfile":"Retirer le profil","addType":"Ajouter un type","editType":"Éditer type","removeType":"Retirer type","prompts":{"createProfilePlaceholder":"Entrez le nom","createProfileApprove":"Créer","createProfileContent":"Entrez le nom du profil","editProfilePlaceholder":"Entrez le nom","editProfileApprove":"Renommer","editProfileContent":"Entrer le nouveau nom du profil {{item.name}}","removeShareExcludeApprove":"Retirer le chemin","removeShareExcludeReject":"Ne pas retirer","removeShareExcludeContent":"Êtes-vous sûr de vouloir retirer le chemin exclu {{item}} ?","removeWebUserApprove":"Retirer l\'utilisateur","removeWebUserReject":"Ne pas retirer","removeWebUserContent":"Êtes-vous sûr de vouloir retirer l\'utilisateur {{item.username}} ?","removeFavoriteDirectoryApprove":"Supprimer le dossier","removeFavoriteDirectoryReject":"Ne pas retirer","removeFavoriteDirectoryContent":"Êtes-vous sûr de vouloir retirer le dossier favori {{item.name}} ?","removeSearchTypeApprove":"Retirer type","removeSearchTypeReject":"Ne pas retirer","removeSearchTypeContent":"Êtes-vous sûr de retirer le type de recherche {{item.name}} ?"}},"navigation":{"profile":"Profil","connectivity":"Connectivité","speedAndLimits":"Vitesse et limites","downloads":"Téléchargements","sharing":"En partage","view":"Voir","about":"À propos","extensions":"Extensions","extensionEngines":"Outils d\'extension","system":"Système","autoDetection":"Détection auto","iPv4ConnectivityManual":"Connectivité IPv4 (manuelle)","iPv6ConnectivityManual":"Connectivité IPv6 (manuelle)","portsManual":"Ports (manuel)","proxies":"Proxys","encryption":"Chiffrement","user":"Utilisateur","awayMode":"Mode absence","ignoredUsers":"Utilisateurs ignorés","miscellaneous":"Divers","manageInstalled":"Gérer installation","extensionCatalog":"Catalogue d’extensions","extensionOptions":"Options des extensions","application":"Application","transferStatistics":"Statistiques de transfert","shareStatistics":"Partager des statistiques","hubStatistics":"Statistiques des hubs","users":"Utilisateurs","logging":"Enregistrement journal","webServer":"Serveur web","advancedServerSettings":"Paramètres ue serveur avancés","refreshOptions":"Option de rafraîchissement","shareProfiles":"Profiles de partage","sharingOptions":"Option de partage","hashing":"Hachage","excludedPaths":"Chemins exclus","connectionSpeed":"Vitesse de connexion","bandwidthLimiting":"Limitation bande passante","downloadLimits":"Limite de téléchargement","uploadLimits":"Limite d\'envoi","perUserLimits":"Limites par utilisateur","locations":"Locations","skippingOptions":"Option d\'ignorance","searchMatching":"Correspondance de recherche","searchTypes":"Types de recherche","downloadOptions":"Options de téléchargement","priorities":"Priorités","notificationsCaption":"Notifications","histories":"Historiques","events":"Événements","appearance":"Apparence"},"advanced":"Avancé","noUnsavedChanges":"Pas de changements non sauvés","noSavePermission":"Pas de permission de sauvegarde","saveChanges":"Sauvegarder les changements","savingCompleted":"Sauvegarde terminée","settingsWereSavedSuccessfully":"Les paramètres ont bien été enregistrés","unsavedChangesPrompt":"Vous avez des changements non enregistrés. Êtes-vous sûr de vouloir quitter?","connectivity":{"detection":{"connectivityDetectionNote":"En cas de problèmes de connectivité de transfert de fichiers, veuillez confirmer que vos ports TCP sont vraiment ouverts en utilisant<1> un vérificateur de port en ligne</1>. Notez que la validité du port UDP (recherche) ne peut pas être vérifiée en ligne. Pour plus d\'infos sur les différents modes de connectivité, veuillez visiter<4> la FAQ sur la connectivité de DC++</4>. ","currentAutoDetectionStatus":"État actuel de la détection auto","iPv4Connectivity":"Connectivité IPv4","iPv6Connectivity":"Connectivité IPv6","manualConfiguration":"{{status}} (configuration manuelle)","autoDetected":"{{status}} (détection auto)","detecting":"En cours de détection…"},"ports":{"portsAutoValuesNote":"Numéros de port énumérés sur cette page peuvent être remplacés par les mappeurs de port (s\'ils sont activés)","form":{"tcpPortHelp":"Le port TCP est utilisé pour les transferts non chiffrés.","udpPortHelp":"Le port UDP est utilisé pour la recherche","tlsPortHelp":"Port TLS (TCP) est utilisé pour les transferts cryptés"}},"v6":{"protocolAutoValuesNote":"Détection auto de la connectivité est en activité; valeurs de réglage indiquées sur cette page ne sont pas utilisées"},"v4":{"protocolAutoValuesNote":"Détection auto de la connectivité est en activité; valeurs de réglage indiquées sur cette page ne sont pas utilisées"}},"profile":{"user":{"form":{"settingProfileHelp0":"Le client est utilisé dans des hubs privés / publics normaux pour transférer des fichiers via Internet. Utilisez ce profil en cas de doute.","settingProfileHelp1":"Client est utilisé pour transférer des fichiers divisés dans des archives RAR (ou dans d\'autres formats de petite taille)","settingProfileHelp2":"Client est utilisé pour transférer des fichiers dans un réseau local (ex: des parties de réseau local) ou dans un autre réseau fermé (ex: un réseau universitaire)","languageFileHelp":"<0>L\'application doit être redémarrée pour que la nouvelle langue prenne effet</0><1>. Si vous souhaitez aider à améliorer les traductions existantes ou traduire l\'application dans une nouvelle langue, veuillez consulter les<1> instructions pour les traducteurs</1>.</1>"}},"ignoredUsers":{"user":"Utilisateur","messagesIgnored":"Messages ignorés","noIgnoredUsers":"Aucun utilisateur ignoré"},"miscellaneous":{"form":{"nmdcEncodingHelp":"<0>Paramètre encodage n\'est utilisé que dans hubs NMDC. Hubs ADC utiliseront toujours l\'encodage UTF-8. <1></1><2></2><3>Valeurs couramment utilisées: <1><0>Europe centrale: cp1250</0><1>Cyrillique: cp1251</1><2>Europe occidentale: cp1252</2><3>Grec: cp1253</3><4>Turc: cp1254</4><5>Hébreu: cp1256 </5></1></3></0>"}}},"extensions":{"packages":{"byAuthor":"par {{author}}","latestVersion":"Dernière version","installedVersion":"Version installée","datePublished":"{{version}} (publié le {{date}})","readMore":"En savoir plus","defaultExtensionEngineMissing":"Le <1>nœud</1> du moteur d\'extension par défaut n\'est pas installé sur votre système. Veuillez visiter<3> la page d\'accueil</3> du moteur pour les instructions d\'installation. ","manage":"Gérer..."},"manage":{"byAuthor":"par {{author}}","latestVersion":"Dernière version","installedVersion":"Version installée","nonListedExtension":"Extension non listée","readMore":"En savoir plus","noInstalledExtensions":"Aucune extension installée trouvée. Nouvelles extensions peuvent être installées depuis la<1> page du catalogue d\'extensions</1>. ","defaultExtensionEngineMissing":"Le <1>nœud</1> du moteur d\'extension par défaut n\'est pas installé sur votre système. Veuillez visiter<3> la page d\'accueil</3> du moteur pour les instructions d\'installation. ","extensionDirectoryFetchError":"Échec de la récupération des infos du dossier d\'extension: {{error}}","unmanagedExtension":"Extension non gérée","manage":"Gérer..."}},"about":{"application":{"applicationVersion":"Version de l\'application","webUiVersion":"Version de l\'interface web","webUiBuildDate":"Date de création de l\'UI Web","apiVersion":"Version de l\'API","apiFeatureLevel":"Niveau de fonction API","started":"Démarré","activeSessions":"Sessions actives","serverThreads":"Threads de serveur","resources":"Ressources","homePage":"Page d\'accueil","featureRequestBugTracker":"Demande de fonctionnalité/suiveur de bugs","documentation":"Documentation","thirdPartyCredits":"Crédits tiers"},"transfers":{"totalDownloaded":"Total téléchargé","totalUploaded":"Total chargé","session":"Session","sessionDownloaded":"Session téléchargée","sessionUploaded":"Session chargée"},"share":{"noFilesShared":"Aucun fichier partagé","totalShareSize":"Taille totale du partage","totalFiles":"Total des fichiers","totalFilesValue":"{{totalCount}} ({{uniqueCount}} unique)","totalDirectories":"Total des dossiers","averageFileAge":"Nombre moyen du fichier","averageFilesPerDirectory":"Nombre moyen de fichiers par dossier","incomingSearches":"Recherches entrantes","totalSearches":"Total des recherches","searchesTotalValue":"{{totalCount}} ({{perSecondCount}} par seconde)","tthSearches":"Recherches TTH","textSearches":"Recherches de texte","searchesPerSecondValue":"{{totalCount}} ({{matchedCount}} correspond par seconde)","filteredTextSearches":"Recherches de texte filtré","searchesFilteredValue":"{{filteredPercentage}} ({{resultPercentage}} des correspondants ont renvoyé des résultats)","averageTextSearchTokensNonFiltered":"Moyenne des jetons de recherche de texte (non filtrés)","searchesAverageTokensValue":"{{tokenCount}} ({{tokenLength}} octets par jeton)","averageMatchingTimePerTextSearch":"Temps de correspondance moyen par recherche de texte","searchesAverageMatchTimeValue":"{{matchTime}} ms"},"hubs":{"noHubsOnline":"Aucun hub en ligne","totalUsers":"Nombre total d\'utilisateurs","uniqueUsers":"Utilisateurs uniques","activeUsers":"Utilisateurs actifs","totalShare":"Partage total","averageSharePerUser":"Partage moyen par utilisateur","averageAdcDownloadSpeed":"Vitesse moyenne de téléchargement ADC","clients":"Clients","averageAdcUploadSpeed":"Vitesse moyenne de chargement de l\'ADC"}},"system":{"logging":{"messages":"Messages","transfers":"Transferts","variableHelp":"Infos variables pour champs Nom de fichier et Format"},"serverSettings":{"defaultCertNote":"Certificat client par défaut est utilisé si les chemins de certificat sont vides"},"advancedServerSettings":{"hookTimeouts":"Délais d\'attente des crochets"},"users":{"username":"Nom d\'utilisateur","permissions":"Permissions","activeSessions":"Sessions actives","lastLoggedIn":"Dernière connexion","administrator":"Administrateur","form":{"usernameName":"Nom d\'utilisateur","passwordName":"Mot de passe","permissionsName":"Permissions"},"permissionSelector":{"administrator":"Administrateur","search":"Recherche","download":"Réception","transfers":"Transferts","events":"Événements","view":"Voir","edit":"Modif.","queue":"File d\'attente","favoriteHubs":"Hubs favoris","settings":"Paramètres","localFilesystem":"Système de fichiers local","hubs":"Hubs","sendMessages":"Envoyer les messages","privateChat":"Discussion privée","filelists":"Liste de fichiers","viewedFiles":"Fichiers consultés"},"addWebUser":"Ajouter un utilisateur web","editUser":"Éditer un utilisateur","adminPermissionNote":"Autorisation de l\'administrateur requise afin d\'accéder à la section Système dans les paramètres"}},"sharing":{"excludes":{"shareRefreshNote":"Partage doit être actualisé pour que modifs prennent effet","addExcludedPath":"Ajouter un chemin exclu","path":"Chemin"},"profiles":{"name":"Nom","totalSize":"Taille totale","totalFiles":"Total des fichiers","shareProfilesNote":"<0>Fichiers en file d\'attente sont partagés via fonction de partage de fichiers partiel dans tous les hubs où le partage n\'a pas été masqué, quels que soient les profils de partage configurés.</0><1>Profils de partage sont attribués à des dossiers individuels depuis la<1> page</1> Partager.</1>"},"sharingOptions":{"skiplist":"Liste de sauts"},"hashing":{"hashDatabase":"Données des hachages","fileIndexSize":"Taille d\'index de fichier","hashStoreSize":"Taille du fichier de hachage","maintenance":"Maintenance","verifyIntegrityOfHashData":"Vérifier l\'intégrité des données de hachage","optimizeNow":"Optimisez","hashDBOptimizeNote":"Cette opération supprimera toutes infos de hachage pour les fichiers qui ne sont pas actuellement partagés. Si vous partagez des fichiers depuis disques réseau ou d\'un stockage amovible, assurez-vous que les fichiers sont actuellement affichés dans le partage (sinon, ils doivent être rehachés) "}},"speedLimits":{"speed":{"connectionSpeedNote":"Veuillez être aussi précis que possible et définir le débit RÉEL de votre connexion. Possibilité d\'utiliser un site, tel que<1> Speedtest.net, pour tester votre débit</1>. "},"uploadLimits":{"manuallySet":"Définir manuellement"},"downloadLimits":{"manuallySet":"Définir manuellement"}},"downloads":{"locations":{"availablePathVariables":"Variables de chemin disponibles","favoriteDownloadDirectories":"Répertoires de téléchargement favori","name":"Nom","path":"Chemin","form":{"pathName":"Chemin","nameName":"Nom"},"addFavoriteDirectory":"Ajouter un dossier favori","editFavoriteDirectory":"Éditer le dossier favori"},"skippingOptions":{"skiplist":"Liste de sauts"},"priorities":{"filePriorities":"Priorités des fichiers","highPriorityFiles":"Fichiers de haute priorité"},"searchTypes":{"name":"Nom","fileExtensions":"Extensions de fichiers","default":"Défaut","searchTypesNote":"PS: Types de recherche personnalisés ne fonctionnent que dans les hubs ADC! Dans les hubs NMDC, l\'utilisation de types de recherche prédéfinis ne recherchera que des ensembles d\'extensions prédéfinies non définissables; l\'utilisation de types personnalisés recherchera n\'importe quelle extension par défaut","form":{"nameName":"Nom","extensionsName":"Extensions de fichiers"},"addSearchType":"Ajouter type de recherche","editSearchType":"Éditer type de recherche"},"downloadOptions":{"segments":"Segments","compression":"Compression","buffers":"Tampons"}},"browserSpecificNote":"Paramètres répertoriés sur cette page sont propres au navigateur","view":{"notifications":{"popupNotifications":"Notifications pop-up","form":{"notifyMentionMyNickName":"Mentions de mon pseudo","notifyPmUserName":"Messages privés (utilisateurs)","notifyPmBotName":"Messages privés (bots)","notifyHubMessageName":"Messages de chat du hub (seulement dans les hubs où les notifications de chat sont activées)","notifyBundleStatusName":"Changements de statut des paquets","notifyEventsInfoName":"Infos événements","notifyEventsWarningName":"Événements d\'alerte","notifyEventsErrorName":"Événements d\'erreur"}},"histories":{"maxMessageHistory":"Nombre maximum de messages en cache","maxSessionHistory":"Nombre maximal de sessions ouvertes précédemment"},"miscellaneous":{"form":{"unreadLabelDelayName":"Délai pour marquer sessions de chat comme lues (secondes)","backgroundImageUrlName":"URL de l\'image d\'arrière-plan personnalisée","noInstallPromptName":"Jamais montrer l\'invite d\'installation d\'application dans vue Accueil"}}}},"extensions":{"actions":{"uninstall":"Désinstaller","start":"Démarrer","installFromUrl":"Installer depuis l\'URL","install":"Installer","update":"MàJ","stop":"Stop","configure":"Configurer","prompts":{"installUrlPlaceholder":"Entrez l\'URL","installUrlApprove":"Installer","installUrlContent":"Entrer l\'URL de téléchargement","removeApprove":"Retirer l\'extension","removeReject":"Ne pas retirer","removeContent":"Voulez-vous vraiment retirer l\'extension {{item.name}} ? Cela retirera également les éventuels paramètres spécifiques à l\'extension. "}}},"navigation":{"home":"Accueil","queue":"File d\'attente","search":"Recherche","transfers":"Transferts","hubs":"Hubs","messages":"Messages","filelists":"Liste de fichiers","files":"Fichiers","events":"Événements","favoriteHubs":"Hubs favoris","share":"Partager","settings":"Paramètres","logout":"Se déconnecter","more":"Plus..."},"login":{"username":"Nom d\'utilisateur","password":"Mot de passe","keepMeLoggedIn":"Maintenir la connexion","login":"Login","authenticationFailed":"Authentification a échoué: {{lastError}}","connectingToTheServer":"Connexion en cours…","reestablishConnection":"Tentative de rétablir la connexion...","sessionLost":"Session perdue","connectionClosed":"Connexion fermée","privateBrowsingNotSupported":"Ce site ne peut pas être utilisé avec votre navigateur si le mode navigation privée est activé","dataStorageNotSupported":"Ce site ne peut pas être utilisé avec votre navigateur car il ne prend pas en charge le stockage des données."},"viewedFiles":{"actions":{"close":"Fermer"},"noFiles":"Aucun fichier à visualiser","noFilesDesc":"Vous pouvez ouvrir des fichiers texte ou multimédia à afficher ici depuis des listes de recherche ou de fichiers","preparingView":"Préparation de la vue","opened":"Ouvert","downloaded":"Téléchargé","unsupportedFormat":"Format non supporté","downloadFailed":"Téléchargement échoué","notifications":{"fileHasFinishedDownloading":"Le fichier a fini de télécharger","fileWasLoaded":"Le fichier a été chargé","actions":{"viewFile":"Voir le fichier"}}},"messages":{"actions":{"clearChat":"Effacer la discussion","close":"Fermer","connect":"Se connecter","disconnect":"Déconnecter"},"new":"Nouvelle session","newDesc":"Ouvrir une nouvelle session de chat privé","offlineMessage":"Vous devez être connecté à au moins un hub afin d\'envoyer des messages privés","directEncryptedChannelAvailable":"Canal direct et chiffré disponible","establishingConnection":"Établissement de la connexion...","directEncryptedChannelEstablished":"Canal direct crypté établi","notifications":{"actions":{"viewMessage":"Voir le message"}}},"home":{"newUserIntro":"Info pour nouvel utilisateur","newUserIntroDesc":"<0><0>Ajoutez quelques dossiers partagés avec d\'autres utilisateurs à depuis la<1> page</1> Partager</0><1> Vous souhaiterez peut-être parcourir au moins chaque page principale<1> des paramètres du client </1>avant de commencer. <3>Il est important que vous<1> configuriez correctement votre dédit</1> de connexion, car le client ne pourra pas utiliser votre bande passante efficacement autrement.</3></1><2>Il n\'y a pas encore de liste de hubs publics, vous devez donc connaître les adresses de hub auxquelles vous souhaitez vous connecter.</2></0><1>Visiter <1>page d\'accueil</1> pour plus d\'infos sur le client et ses fonctionnalités. </1><2>Si vous avez des questions, vous pouvez les poster sur le tracker <1>GitHub</1> ou rejoindre le hub dev/support:<3></3></2>"},"hash":{"actions":{"pause":"Pause","resume":"Reprendre","stop":"Stop"},"status":"État","paused":"En pause","filesLeft":"Fichiers à gauche","maximumSpeedPerHasher":"Vitesse maximale par hachage","runningThreads":"En cours d\'exécution ({{threadCount}} threads)","speed":"Vitesse","timeLeft":"Temps restant","idle":"Inactif","hashProgress":"Progression du hachage"}}')}}]);