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.
- package/LICENSE +21 -0
- package/dist/index.html +2 -2
- package/dist/js/{285.902dc3166e82226541a5.chunk.js → 285.c10a92f5e683562b290c.chunk.js} +2 -2
- package/dist/js/285.c10a92f5e683562b290c.chunk.js.gz +0 -0
- package/dist/js/{285.902dc3166e82226541a5.chunk.js.map → 285.c10a92f5e683562b290c.chunk.js.map} +1 -1
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js +2 -0
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.gz +0 -0
- package/dist/js/334.f0dae385c5c4aa9ceb6d.chunk.js.map +1 -0
- package/dist/js/{424.b407aaf3218fa480b144.chunk.js → 424.2b137728423ffe5720b9.chunk.js} +1 -1
- package/dist/js/424.2b137728423ffe5720b9.chunk.js.gz +0 -0
- package/dist/js/{424.b407aaf3218fa480b144.chunk.js.map → 424.2b137728423ffe5720b9.chunk.js.map} +1 -1
- package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js → 668.d8fc363a0da7c52c6cf3.chunk.js} +1 -1
- package/dist/js/668.d8fc363a0da7c52c6cf3.chunk.js.gz +0 -0
- package/dist/js/{668.d0b45ae92f54a69beee3.chunk.js.map → 668.d8fc363a0da7c52c6cf3.chunk.js.map} +1 -1
- package/dist/js/{69.8ca10b3d679cc4c52a20.chunk.js → 69.90201ebd79a3d236605f.chunk.js} +2 -2
- package/dist/js/69.90201ebd79a3d236605f.chunk.js.gz +0 -0
- package/dist/js/69.90201ebd79a3d236605f.chunk.js.map +1 -0
- package/dist/js/{702.99e6ce480dc579b6e542.chunk.js → 702.d36d38b2be52ab51c0a9.chunk.js} +1 -1
- package/dist/js/702.d36d38b2be52ab51c0a9.chunk.js.gz +0 -0
- package/dist/js/{702.99e6ce480dc579b6e542.chunk.js.map → 702.d36d38b2be52ab51c0a9.chunk.js.map} +1 -1
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js +3 -0
- package/dist/js/{760.75d229a05d7b9bdf414b.chunk.js.LICENSE.txt → 760.28a29fef05eb0889fc25.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js.gz +0 -0
- package/dist/js/760.28a29fef05eb0889fc25.chunk.js.map +1 -0
- package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js → favorite-hubs.d78427e6a9006438d07b.chunk.js} +1 -1
- package/dist/js/favorite-hubs.d78427e6a9006438d07b.chunk.js.gz +0 -0
- package/dist/js/{favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.map → favorite-hubs.d78427e6a9006438d07b.chunk.js.map} +1 -1
- package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js → filelists.726450e0ff6e77eaa054.chunk.js} +1 -1
- package/dist/js/filelists.726450e0ff6e77eaa054.chunk.js.gz +0 -0
- package/dist/js/{filelists.a1ecb558a5c0c376191d.chunk.js.map → filelists.726450e0ff6e77eaa054.chunk.js.map} +1 -1
- package/dist/js/{files.9b2b25680e1e04de1931.chunk.js → files.50c047ffc599c58eb13a.chunk.js} +2 -2
- package/dist/js/files.50c047ffc599c58eb13a.chunk.js.gz +0 -0
- package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map} +1 -1
- package/dist/js/home.ed1091a84aa53f290563.chunk.js +3 -0
- package/dist/js/{home.21a1fe21d45ac82fafe5.chunk.js.LICENSE.txt → home.ed1091a84aa53f290563.chunk.js.LICENSE.txt} +0 -0
- package/dist/js/home.ed1091a84aa53f290563.chunk.js.gz +0 -0
- package/dist/js/home.ed1091a84aa53f290563.chunk.js.map +1 -0
- package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js → hubs.eed2f41d894688465906.chunk.js} +2 -2
- package/dist/js/hubs.eed2f41d894688465906.chunk.js.gz +0 -0
- package/dist/js/{hubs.f336a1aeaac00fab20ce.chunk.js.map → hubs.eed2f41d894688465906.chunk.js.map} +1 -1
- package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js → ca.ed09d3a3d4bcca929ba1.chunk.js} +0 -0
- package/dist/js/locales/{ca.7409d603c21de58635a6.chunk.js.gz → ca.ed09d3a3d4bcca929ba1.chunk.js.gz} +0 -0
- package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js → da.6f60a77e9ef082dd3bf4.chunk.js} +0 -0
- package/dist/js/locales/{da.bd0c6f71e355d0794e71.chunk.js.gz → da.6f60a77e9ef082dd3bf4.chunk.js.gz} +0 -0
- package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js → de.3b7d3665460384259e82.chunk.js} +0 -0
- package/dist/js/locales/{de.5adea2a7ce417c784479.chunk.js.gz → de.3b7d3665460384259e82.chunk.js.gz} +0 -0
- package/dist/js/locales/{el.648369d465eb99118703.chunk.js → el.598573d2a5ed18804fe0.chunk.js} +0 -0
- package/dist/js/locales/{el.648369d465eb99118703.chunk.js.gz → el.598573d2a5ed18804fe0.chunk.js.gz} +0 -0
- package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js → en.f0fe75dca201449e5e47.chunk.js} +0 -0
- package/dist/js/locales/{en.c66f69f706afd2da9eb5.chunk.js.gz → en.f0fe75dca201449e5e47.chunk.js.gz} +0 -0
- package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js → es.cbe6378a22cf5ee485cd.chunk.js} +0 -0
- package/dist/js/locales/{es.793f17d88083bf7f0738.chunk.js.gz → es.cbe6378a22cf5ee485cd.chunk.js.gz} +0 -0
- package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js → eu.7734fc077f26418d6b32.chunk.js} +0 -0
- package/dist/js/locales/{eu.010416cbe0a067839d4a.chunk.js.gz → eu.7734fc077f26418d6b32.chunk.js.gz} +0 -0
- package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js → fi.d1f8a5f4048236243b0f.chunk.js} +0 -0
- package/dist/js/locales/{fi.7ecbf3197777fb8fd70f.chunk.js.gz → fi.d1f8a5f4048236243b0f.chunk.js.gz} +0 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js +1 -0
- package/dist/js/locales/fr.f46ce4fb57ed20dea8b5.chunk.js.gz +0 -0
- package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js → hu.d0d2c38a03a3b38c2bc5.chunk.js} +0 -0
- package/dist/js/locales/{hu.37c8f09717da5f1bc37c.chunk.js.gz → hu.d0d2c38a03a3b38c2bc5.chunk.js.gz} +0 -0
- package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js → it.0c911d75c50ea83190ad.chunk.js} +0 -0
- package/dist/js/locales/{it.9842f3b2b5bb3b7420c5.chunk.js.gz → it.0c911d75c50ea83190ad.chunk.js.gz} +0 -0
- package/dist/js/locales/{nl.88085590f152551ec225.chunk.js → nl.36d288d75b3d3cbabf11.chunk.js} +0 -0
- package/dist/js/locales/{nl.88085590f152551ec225.chunk.js.gz → nl.36d288d75b3d3cbabf11.chunk.js.gz} +0 -0
- package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js → no.8f2f465d5f785650175d.chunk.js} +0 -0
- package/dist/js/locales/{no.cfa0a90ce428e087e846.chunk.js.gz → no.8f2f465d5f785650175d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js → pl.06e51d7d7b09ba14714d.chunk.js} +0 -0
- package/dist/js/locales/{pl.89540648cb16acad8d27.chunk.js.gz → pl.06e51d7d7b09ba14714d.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js → pt-br.9d19d92899e8c0917c66.chunk.js} +0 -0
- package/dist/js/locales/{pt-br.a537d1e531731dbec9dd.chunk.js.gz → pt-br.9d19d92899e8c0917c66.chunk.js.gz} +0 -0
- package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js → pt.4390db3955db29b0e7dd.chunk.js} +0 -0
- package/dist/js/locales/{pt.08213e494539393b14d1.chunk.js.gz → pt.4390db3955db29b0e7dd.chunk.js.gz} +0 -0
- package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js → ro.705fcd327263fcf419bf.chunk.js} +0 -0
- package/dist/js/locales/{ro.23f02315e6d9ab090aac.chunk.js.gz → ro.705fcd327263fcf419bf.chunk.js.gz} +0 -0
- package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js → ru.8ab7e1c0d9eee7aa7afb.chunk.js} +0 -0
- package/dist/js/locales/{ru.c775ae5709b4e2affc37.chunk.js.gz → ru.8ab7e1c0d9eee7aa7afb.chunk.js.gz} +0 -0
- package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js → sv.be546e605910932db11f.chunk.js} +0 -0
- package/dist/js/locales/{sv.60ec4539680a48384a56.chunk.js.gz → sv.be546e605910932db11f.chunk.js.gz} +0 -0
- package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js → tr.25a0d0f19e007e2febc9.chunk.js} +0 -0
- package/dist/js/locales/{tr.c19f95d7bf191aad9a74.chunk.js.gz → tr.25a0d0f19e007e2febc9.chunk.js.gz} +0 -0
- package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js +1 -0
- package/dist/js/locales/uk_UA.64a1a537c623ae0259dd.chunk.js.gz +0 -0
- package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js → zh_CN.4b75674e4815a965ccea.chunk.js} +0 -0
- package/dist/js/locales/{zh_CN.d27ea53dd79304789681.chunk.js.gz → zh_CN.4b75674e4815a965ccea.chunk.js.gz} +0 -0
- package/dist/js/{main.d64158ea2453985dde98.entry.js → main.ad3d59f07b32feb5be60.entry.js} +3 -3
- package/dist/js/{main.d64158ea2453985dde98.entry.js.LICENSE.txt → main.ad3d59f07b32feb5be60.entry.js.LICENSE.txt} +0 -0
- package/dist/js/main.ad3d59f07b32feb5be60.entry.js.gz +0 -0
- package/dist/js/main.ad3d59f07b32feb5be60.entry.js.map +1 -0
- package/dist/js/{messages.e4523315258f6dab0f37.chunk.js → messages.d213dd0ac314a64b5a6c.chunk.js} +1 -1
- package/dist/js/messages.d213dd0ac314a64b5a6c.chunk.js.gz +0 -0
- package/dist/js/{messages.e4523315258f6dab0f37.chunk.js.map → messages.d213dd0ac314a64b5a6c.chunk.js.map} +1 -1
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js → queue.2fcf7a1381f1fb4af03f.chunk.js} +1 -1
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.gz → queue.2fcf7a1381f1fb4af03f.chunk.js.gz} +0 -0
- package/dist/js/{queue.e52e481f79bce96a17e1.chunk.js.map → queue.2fcf7a1381f1fb4af03f.chunk.js.map} +1 -1
- package/dist/js/{search.321f771dd92b51431378.chunk.js → search.24ec8c5fe5f45b1180a9.chunk.js} +2 -2
- package/dist/js/search.24ec8c5fe5f45b1180a9.chunk.js.gz +0 -0
- package/dist/js/{search.321f771dd92b51431378.chunk.js.map → search.24ec8c5fe5f45b1180a9.chunk.js.map} +1 -1
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js +2 -0
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.gz +0 -0
- package/dist/js/settings.83541ccd8eafaab78d16.chunk.js.map +1 -0
- package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js → share.d94de2f3077842a88c25.chunk.js} +2 -2
- package/dist/js/share.d94de2f3077842a88c25.chunk.js.gz +0 -0
- package/dist/js/{share.ecb413c8d6a1cc8a6154.chunk.js.map → share.d94de2f3077842a88c25.chunk.js.map} +1 -1
- package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js → system-log.b3fc65678cc7480e44e0.chunk.js} +1 -1
- package/dist/js/system-log.b3fc65678cc7480e44e0.chunk.js.gz +0 -0
- package/dist/js/{system-log.7aa8ba9d8b4a5711c4fc.chunk.js.map → system-log.b3fc65678cc7480e44e0.chunk.js.map} +1 -1
- package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js → transfers.5ec21f789068ff2e228f.chunk.js} +2 -2
- package/dist/js/transfers.5ec21f789068ff2e228f.chunk.js.gz +0 -0
- package/dist/js/{transfers.5a7661c5701a462d4c53.chunk.js.map → transfers.5ec21f789068ff2e228f.chunk.js.map} +1 -1
- package/dist/sw.js +1 -1
- package/dist/sw.js.gz +0 -0
- package/package.json +53 -51
- package/dist/js/285.902dc3166e82226541a5.chunk.js.gz +0 -0
- package/dist/js/334.f72694a737e72404ed6e.chunk.js +0 -2
- package/dist/js/334.f72694a737e72404ed6e.chunk.js.gz +0 -0
- package/dist/js/334.f72694a737e72404ed6e.chunk.js.map +0 -1
- package/dist/js/424.b407aaf3218fa480b144.chunk.js.gz +0 -0
- package/dist/js/668.d0b45ae92f54a69beee3.chunk.js.gz +0 -0
- package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.gz +0 -0
- package/dist/js/69.8ca10b3d679cc4c52a20.chunk.js.map +0 -1
- package/dist/js/702.99e6ce480dc579b6e542.chunk.js.gz +0 -0
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js +0 -3
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.gz +0 -0
- package/dist/js/760.75d229a05d7b9bdf414b.chunk.js.map +0 -1
- package/dist/js/favorite-hubs.8e51f1debd3cd6c6d6c7.chunk.js.gz +0 -0
- package/dist/js/filelists.a1ecb558a5c0c376191d.chunk.js.gz +0 -0
- package/dist/js/files.9b2b25680e1e04de1931.chunk.js.gz +0 -0
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js +0 -3
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.gz +0 -0
- package/dist/js/home.21a1fe21d45ac82fafe5.chunk.js.map +0 -1
- package/dist/js/hubs.f336a1aeaac00fab20ce.chunk.js.gz +0 -0
- package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js +0 -1
- package/dist/js/locales/fr.cf760489c7a0a9a02e31.chunk.js.gz +0 -0
- package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js +0 -1
- package/dist/js/locales/uk_UA.0678837b62a41e004e9c.chunk.js.gz +0 -0
- package/dist/js/main.d64158ea2453985dde98.entry.js.gz +0 -0
- package/dist/js/main.d64158ea2453985dde98.entry.js.map +0 -1
- package/dist/js/messages.e4523315258f6dab0f37.chunk.js.gz +0 -0
- package/dist/js/search.321f771dd92b51431378.chunk.js.gz +0 -0
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js +0 -2
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.gz +0 -0
- package/dist/js/settings.3c031a77619c7df3a86e.chunk.js.map +0 -1
- package/dist/js/share.ecb413c8d6a1cc8a6154.chunk.js.gz +0 -0
- package/dist/js/system-log.7aa8ba9d8b4a5711c4fc.chunk.js.gz +0 -0
- package/dist/js/transfers.5a7661c5701a462d4c53.chunk.js.gz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/filelists.a1ecb558a5c0c376191d.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/constants/ShareProfileConstants.ts","webpack://airdcpp-webui/./src/decorators/ShareProfileDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/RecentLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/actions/ui/FilelistSessionActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ShareProfileSelector.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistNew.tsx","webpack://airdcpp-webui/./src/actions/ui/FilelistItemActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/item-info-dialog/FilelistItemInfoDialog.tsx","webpack://airdcpp-webui/./src/stores/FilelistViewStore.js","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistItemTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ListBrowser.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css?8d81","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/Filelists.tsx","webpack://airdcpp-webui/./src/services/HttpService.ts","webpack://airdcpp-webui/./src/services/api/ShareApi.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#sidebar .virtual-table {\\r\\n flex: 1 100 100%;\\r\\n}\\r\\n\\r\\n.filelist.session .browser, \\r\\n.filelist.session .browser .virtual-table {\\r\\n height: calc(100% - 35px);\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 10px);\\r\\n}\\r\\n\\r\\n@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) {\\r\\n /* Safari specific CSS */\\r\\n .filelist.session .browser {\\r\\n height: calc(100% - 95px);\\r\\n }\\r\\n\\r\\n #mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 60px);\\r\\n }\\r\\n}\\r\\n\\r\\n.filelist.session .browser .ui.segment {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.filelist.session {\\r\\n max-height: 100%;\\r\\n overflow: hidden;\\r\\n margin-top: 10px;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.session.new .profile.ui.dropdown {\\r\\n margin-top: 10px;\\r\\n color: gray;\\r\\n align-self: flex-end;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Filelists/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB\",\"sourcesContent\":[\"#sidebar .virtual-table {\\r\\n flex: 1 100 100%;\\r\\n}\\r\\n\\r\\n.filelist.session .browser, \\r\\n.filelist.session .browser .virtual-table {\\r\\n height: calc(100% - 35px);\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 10px);\\r\\n}\\r\\n\\r\\n@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) {\\r\\n /* Safari specific CSS */\\r\\n .filelist.session .browser {\\r\\n height: calc(100% - 95px);\\r\\n }\\r\\n\\r\\n #mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 60px);\\r\\n }\\r\\n}\\r\\n\\r\\n.filelist.session .browser .ui.segment {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.filelist.session {\\r\\n max-height: 100%;\\r\\n overflow: hidden;\\r\\n margin-top: 10px;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.session.new .profile.ui.dropdown {\\r\\n margin-top: 10px;\\r\\n color: gray;\\r\\n align-self: flex-end;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport { formatRelativeTime, formatSize } from 'utils/ValueFormat';\r\n\r\nimport { DownloadMenu } from 'components/menu';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n { paths.map(path => (\r\n <div key={ path } className=\"path\">\r\n { path }\r\n </div>\r\n )) }\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n session: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({ \r\n session, fileItem, user, downloadHandler, showPath = true \r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid \r\n columns=\"two\"\r\n stackable={ true }\r\n >\r\n <Row \r\n title={ gridT('Name') }\r\n text={ fileItem.name }\r\n />\r\n <Row \r\n title={ gridT('Type/content') } \r\n text={ fileItem.type.str }\r\n />\r\n <Row \r\n title={ gridT('Size') } \r\n text={ formatSize(fileItem.size, t, true) }\r\n />\r\n <Row \r\n title={ gridT('Last modified') }\r\n text={ formatRelativeTime(fileItem.time || 0) }\r\n />\r\n { fileItem.type.id === 'file' && (\r\n <Row \r\n title={ gridT('TTH') } \r\n text={ fileItem.tth }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe type') }\r\n text={ gridT(DupeStrings[fileItem.dupe.id]) }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe paths') }\r\n text={ <DupePaths paths={ fileItem.dupe.paths }/> }\r\n /> \r\n )}\r\n { showPath && (\r\n <Row \r\n title={ gridT('Path') }\r\n text={ fileItem.path }\r\n /> \r\n )}\r\n </Grid>\r\n\r\n <DownloadMenu \r\n caption={ gridT('Actions...') }\r\n button={ true }\r\n user={ user }\r\n itemInfoGetter={ () => fileItem }\r\n downloadHandler={ downloadHandler }\r\n contextElement=\".ui.modal > .content\"\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };","const MODULE_URL = 'share_profiles';\r\nexport default {\r\n MODULE_URL: MODULE_URL,\r\n PROFILES_URL: MODULE_URL,\r\n\r\n PROFILE_ADDED: 'share_profile_added',\r\n PROFILE_UPDATED: 'share_profile_updated',\r\n PROFILE_REMOVED: 'share_profile_removed',\r\n\r\n HIDDEN_PROFILE_ID: 1\r\n}\r\n;\r\n","import * as React from 'react';\r\nimport { merge } from 'lodash';\r\n\r\nimport ShareProfileConstants from 'constants/ShareProfileConstants';\r\n\r\nimport DataProviderDecorator, { \r\n DataProviderDecoratorChildProps, DataProviderDecoratorSettings, DataConverter \r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\n\r\nimport * as API from 'types/api';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\ninterface ShareProfileDecoratorDataProps {\r\n profiles: API.ShareProfile[];\r\n}\r\n\r\nexport const profileToEnumValue = (profile: API.ShareProfile) => {\r\n return {\r\n id: profile.id,\r\n name: profile.str,\r\n };\r\n};\r\n\r\nexport type ShareProfileDecoratorChildProps = DataProviderDecoratorChildProps & ShareProfileDecoratorDataProps;\r\n\r\nconst ShareProfileDecorator = function <PropsT extends object>(\r\n Component: React.ComponentType<PropsT & ShareProfileDecoratorChildProps>, \r\n listHidden: boolean, \r\n dataProviderDecoratorSettings?: DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>,\r\n addSize: boolean = true\r\n) {\r\n const convertProfile = (profile: API.ShareProfile, t: TFunction): API.ShareProfile => {\r\n let str = profile.str;\r\n if (addSize && profile.id !== ShareProfileConstants.HIDDEN_PROFILE_ID) {\r\n str += ` (${formatSize(profile.size, t)})`;\r\n }\r\n\r\n return {\r\n ...profile,\r\n str,\r\n };\r\n };\r\n\r\n const convertProfiles: DataConverter<PropsT> = (data: API.ShareProfile[], { t }) => {\r\n const profiles = data\r\n .filter(p => listHidden || p.id !== ShareProfileConstants.HIDDEN_PROFILE_ID)\r\n .map(p => convertProfile(p, t));\r\n\r\n return profiles;\r\n };\r\n\r\n return DataProviderDecorator<PropsT, ShareProfileDecoratorDataProps>(\r\n Component, \r\n merge(dataProviderDecoratorSettings, {\r\n urls: {\r\n profiles: ShareProfileConstants.PROFILES_URL,\r\n },\r\n dataConverters: {\r\n profiles: convertProfiles,\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_ADDED, () => refetchData());\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_UPDATED, () => refetchData());\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_REMOVED, () => refetchData());\r\n },\r\n } as DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>)\r\n );\r\n};\r\n\r\nexport default ShareProfileDecorator;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n//import RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { ListItem } from 'components/semantic/List';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { TFunction } from 'i18next';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\n\r\n\r\ninterface RecentLayoutProps {\r\n entryIcon: string;\r\n entryType: string;\r\n entryTitleRenderer: (entry: API.HistoryItem) => React.ReactNode;\r\n hasSession: (entry: API.HistoryItem) => boolean;\r\n t: TFunction;\r\n}\r\n\r\ninterface DataProps {\r\n entries: API.HistoryItem[];\r\n}\r\n\r\ntype Props = RecentLayoutProps & DataProps & DataProviderDecoratorChildProps;\r\n\r\nconst RecentLayout: React.FC<Props> = ({ entries, entryTitleRenderer, hasSession, entryIcon, t }) => {\r\n if (entries.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"recents\">\r\n <LayoutHeader\r\n title={ translate('Recent sessions', t, UI.Modules.COMMON) }\r\n size=\"\"\r\n />\r\n <div className=\"ui relaxed divided list\">\r\n { entries.map((entry, index) => (\r\n <ListItem \r\n key={ index }\r\n header={ entryTitleRenderer(entry) }\r\n description={ !!entry.last_opened && t(toI18nKey('openedAgo', UI.Modules.COMMON), {\r\n defaultValue: 'Opened {{timeAgo}}',\r\n replace: {\r\n timeAgo: formatRelativeTime(entry.last_opened)\r\n }\r\n }) }\r\n icon={ (hasSession(entry) ? 'green ' : '') + entryIcon }\r\n />\r\n )) }\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n/*RecentLayout.propTypes = {\r\n // Title of the button\r\n entryIcon: PropTypes.string.isRequired,\r\n\r\n // URL for fetching the recent entries\r\n entryType: PropTypes.string.isRequired,\r\n\r\n // Renders the recent entry title\r\n entryTitleRenderer: PropTypes.func.isRequired,\r\n\r\n // Returns whether the recent entry is currently active\r\n hasSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default DataProviderDecorator<RecentLayoutProps, DataProps>(\r\n //RedrawDecorator<Props>(RecentLayout),\r\n RecentLayout,\r\n {\r\n urls: {\r\n entries: ({ entryType }, socket) => socket.get(`${HistoryConstants.SESSIONS_URL}/${entryType}/0`),\r\n },\r\n }\r\n);","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/menu';\r\nimport UserIcon from 'components/icon/UserIcon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(itemMenuIds: string[]) {\r\n const UserItemHandlerDecorator: UI.SessionInfoGetter<SessionT> = {\r\n itemNameGetter(session) {\r\n return session.user.nicks;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n const { flags } = session.user;\r\n return userOnlineStatusToColor(flags);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.user.hub_names;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <UserIcon flags={ session.user.flags } />;\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n const { user } = session;\r\n return (\r\n <UserMenu \r\n user={ user } \r\n ids={ itemMenuIds }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n { actionMenu }\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst FilelistSessionActions: UI.ActionListType<API.FilelistSession> = {};\r\n\r\n\r\nconst FilelistSessionActionsDecorated = SessionActionDecorator(\r\n FilelistSessionActions, \r\n FilelistConstants.SESSIONS_URL, \r\n API.AccessEnum.FILELISTS_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.FILELISTS,\r\n actions: FilelistSessionActionsDecorated,\r\n};\r\n","//import PropTypes from 'prop-types';\r\nimport { Component } from 'react';\r\n\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport ShareProfileDecorator, { ShareProfileDecoratorChildProps } from 'decorators/ShareProfileDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface ShareProfileSelectorProps {\r\n onProfileChanged: (profileId: number) => void;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass ShareProfileSelector extends Component<ShareProfileSelectorProps & ShareProfileDecoratorChildProps> {\r\n /*static propTypes = {\r\n // Callback after selecting a profile\r\n onProfileChanged: PropTypes.func.isRequired,\r\n };*/\r\n\r\n onClick = (profile: API.ShareProfile) => {\r\n this.props.onProfileChanged(profile.id);\r\n }\r\n\r\n getDropdownItem = (profile: API.ShareProfile) => {\r\n return (\r\n <MenuItemLink \r\n key={ profile.id } \r\n onClick={ () => this.props.onProfileChanged(profile.id) }\r\n >\r\n { profile.str }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n render() {\r\n const { sessionT, profiles } = this.props;\r\n return (\r\n <Dropdown \r\n className=\"profile top right pointing\" \r\n caption={ sessionT.translate('Browse own share...') }\r\n triggerIcon=\"\"\r\n >\r\n { profiles.map(this.getDropdownItem) }\r\n </Dropdown>\r\n );\r\n }\r\n}\r\n\r\nexport default ShareProfileDecorator(ShareProfileSelector, false);","import { Component } from 'react';\r\n\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport ShareProfileSelector from 'routes/Sidebar/routes/Filelists/components/ShareProfileSelector';\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\n\r\n\r\nclass FilelistNew extends Component<NewSessionLayoutProps> {\r\n handleSubmit = (user: API.HintedUser) => {\r\n FilelistSessionActions.createSession(this.props.location, user, FilelistSessionStore);\r\n }\r\n\r\n onProfileChanged = (profileId: number) => {\r\n FilelistSessionActions.ownList(this.props.location, profileId, FilelistSessionStore);\r\n }\r\n\r\n recentUserRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={ _ => this.handleSubmit(entry.user!) }>\r\n { entry.user!.nicks + (entry.description ? ` (${entry.description})` : '') }\r\n </a> \r\n );\r\n }\r\n\r\n hasSession = (entry: API.HistoryItem) => {\r\n return FilelistSessionStore.getSession(entry.user!.cid);\r\n }\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"filelist session new\">\r\n <UserSelectField \r\n onChange={ this.handleSubmit } \r\n offlineMessage={ sessionT.t<string>(\r\n 'offlineMessage',\r\n 'You must to be connected to at least one hub in order to download filelists from other users') \r\n }\r\n isClearable={ false }\r\n autoFocus={ true }\r\n />\r\n <ShareProfileSelector \r\n onProfileChanged={ this.onProfileChanged }\r\n sessionT={ sessionT }\r\n />\r\n <RecentLayout\r\n entryType={ HistoryEntryEnum.FILELIST }\r\n hasSession={ this.hasSession }\r\n entryTitleRenderer={ this.recentUserRender }\r\n entryIcon={ IconConstants.FILELISTS_PLAIN }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FilelistNew;\r\n","\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport History from 'utils/History';\r\nimport { refreshVirtual } from 'services/api/ShareApi';\r\n\r\n\r\ninterface ActionFilelistItemData {\r\n item: API.FilelistItem;\r\n session: API.FilelistSession;\r\n}\r\n\r\n\r\nconst isMe = ({ session }: ActionFilelistItemData) => session.user.flags.indexOf('self') !== -1;\r\nconst isRoot = ({ item }: ActionFilelistItemData) => item.path === '/';\r\nconst isPartialList = ({ session }: ActionFilelistItemData) => session.partial_list;\r\nconst isDirectory = ({ item }: ActionFilelistItemData) => item.type.id === 'directory';\r\n\r\nconst filterReload = (data: ActionFilelistItemData) => isPartialList(data) && isDirectory(data);\r\nconst filterDetails = (data: ActionFilelistItemData) => !isRoot(data);\r\n\r\n\r\nconst handleReloadDirectory: UI.ActionHandler<ActionFilelistItemData> = (\r\n { data } \r\n) => {\r\n const { session, item } = data;\r\n\r\n return SocketService.post(`${FilelistConstants.SESSIONS_URL}/${session.id}/directory`, { \r\n list_path: item.path,\r\n reload: true,\r\n });\r\n};\r\n\r\nconst handleRefreshShare: UI.ActionHandler<ActionFilelistItemData> = ({ data }) => {\r\n return refreshVirtual(data.item.path);\r\n};\r\n\r\nconst handleItemDetails: UI.ActionHandler<ActionFilelistItemData> = ({ data, location }) => {\r\n History.push(`${location.pathname}/item/${data.item.id}`);\r\n};\r\n\r\nconst FilelistItemActions: UI.ActionListType<ActionFilelistItemData> = {\r\n reloadDirectory: {\r\n displayName: 'Reload',\r\n access: API.AccessEnum.FILELISTS_VIEW,\r\n icon: IconConstants.RELOAD,\r\n filter: filterReload,\r\n handler: handleReloadDirectory,\r\n },\r\n refreshShare: {\r\n displayName: 'Refresh in share',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: isMe,\r\n handler: handleRefreshShare,\r\n },\r\n details: { \r\n displayName: 'Details',\r\n icon: IconConstants.OPEN,\r\n handler: handleItemDetails,\r\n filter: filterDetails\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.FILELISTS,\r\n subId: 'item',\r\n actions: FilelistItemActions,\r\n};\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\n\r\n\r\ninterface FilelistItemInfoDialogProps {\r\n session: API.FilelistSession;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n fileItem: API.FilelistItem;\r\n}\r\n\r\ninterface RouteProps {\r\n itemId: string;\r\n}\r\n\r\ntype Props = FilelistItemInfoDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\nexport const FilelistItemGetter = (session: API.FilelistSession) => {\r\n const ret: UI.DownloadItemDataGetter<API.FilelistItem> = (itemId, socket) => {\r\n return socket.get(`${FilelistConstants.MODULE_URL}/${session.id}/items/${itemId}`);\r\n };\r\n\r\n return ret;\r\n};\r\n\r\nclass FilelistItemInfoDialog extends Component<Props & DataProps> {\r\n static displayName = 'FilelistItemInfoDialog';\r\n\r\n render() {\r\n const { fileItem, session } = this.props;\r\n return (\r\n <Modal \r\n className=\"filelist-item\" \r\n title={ fileItem.name }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ fileItem.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <DownloadDialog \r\n downloadHandler={ filelistDownloadHandler }\r\n itemDataGetter={ FilelistItemGetter(session) }\r\n userGetter={ () => session.user }\r\n session={ session }\r\n />\r\n <FileItemInfoGrid \r\n fileItem={ fileItem }\r\n downloadHandler={ filelistDownloadHandler }\r\n user={ session.user }\r\n session={ session }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<FilelistItemInfoDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n FilelistItemInfoDialog, {\r\n urls: {\r\n fileItem: ({ match, session }, socket) => FilelistItemGetter(session)(match.params.itemId, socket),\r\n }\r\n }\r\n ), \r\n 'item/:itemId'\r\n);\r\n\r\nexport { Decorated as FilelistItemInfoDialog };\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\r\nimport Reflux from 'reflux';\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\nimport FilelistSessionStore from './FilelistSessionStore';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'filelist_view',\r\n _apiUrl: FilelistConstants.SESSIONS_URL,\r\n _sessionStore: FilelistSessionStore,\r\n mixins: [ ViewStoreMixin('name') ],\r\n});\r\n","import { useMemo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport FilelistItemActions from 'actions/ui/FilelistItemActions';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { TableActionMenu } from 'components/menu';\r\n\r\nimport FilelistViewStore from 'stores/FilelistViewStore';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, FileDownloadCell, FileDownloadCellClickHandler } from 'components/table/Cell';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FilelistItemInfoDialog } from './item-info-dialog';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.FilelistItem> {\r\n session: API.FilelistSession;\r\n onClickDirectory: FileDownloadCellClickHandler; \r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = (\r\n { rowDataGetter, onClickDirectory, session, ...other }\r\n) => {\r\n const itemDataGetter = useMemo(\r\n () => {\r\n return () => ({\r\n item: rowDataGetter!(),\r\n session\r\n });\r\n },\r\n [ session ]\r\n );\r\n\r\n return (\r\n <FileDownloadCell \r\n clickHandlerGetter={ onClickDirectory }\r\n userGetter={ () => session.user }\r\n downloadHandler={ filelistDownloadHandler }\r\n rowDataGetter={ rowDataGetter }\r\n session={ session }\r\n entityId={ session.id }\r\n remoteMenuId={ MenuConstants.FILELIST_ITEM }\r\n { ...other }\r\n >\r\n <TableActionMenu \r\n actions={ FilelistItemActions }\r\n itemData={ itemDataGetter }\r\n ids={ [ 'refreshShare', 'details' ] }\r\n />\r\n </FileDownloadCell>\r\n );\r\n};\r\n\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n onClickDirectory: (path: string) => void; \r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass FilelistItemTable extends React.Component<ListBrowserProps> {\r\n rowClassNameGetter = (rowData: API.FilelistItem) => {\r\n return dupeToStringType(rowData.dupe);\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { location, state } = this.props.session;\r\n const { translate } = this.props.sessionT;\r\n\r\n if (state.id === 'download_failed') {\r\n return (\r\n <Message \r\n icon={ IconConstants.ERROR }\r\n title={ translate('Download failed') }\r\n description={ state.str }\r\n />\r\n );\r\n }\r\n\r\n // The list finished downloading but the view hasn't updated yet\r\n const { files, directories } = location!.type as API.DirectoryType;\r\n if (files !== 0 || directories !== 0) {\r\n return <Loader text={ translate('Updating view') }/>;\r\n //return null;\r\n }\r\n\r\n // The directory was changed but the download state hasn't changed yet\r\n if (!location!.complete) {\r\n return <Loader text={ translate('Preparing download') }/>;\r\n }\r\n\r\n return (\r\n <Message \r\n title={ translate('No content to display') }\r\n description={ translate('The directory is empty') }\r\n />\r\n );\r\n }\r\n\r\n onClickDirectory: FileDownloadCellClickHandler = (cellData, rowDataGetter) => {\r\n if (rowDataGetter().type.id === 'directory') {\r\n return () => this.props.onClickDirectory(this.props.session.location!.path + cellData + '/');\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n userGetter = () => {\r\n return this.props.session.user;\r\n }\r\n\r\n render() {\r\n const { session } = this.props;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n store={ FilelistViewStore }\r\n entityId={ session.id }\r\n viewId={ session.location!.path }\r\n sessionStore={ FilelistSessionStore }\r\n moduleId={ FilelistItemActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n cell={\r\n <NameCell \r\n onClickDirectory={ this.onClickDirectory } \r\n session={ session }\r\n />\r\n }\r\n flexGrow={8}\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type\"\r\n width={70}\r\n columnKey=\"type\"\r\n flexGrow={1}\r\n hideWidth={ 500 }\r\n />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={ <DurationCell/> }\r\n flexGrow={1}\r\n />\r\n </VirtualTable>\r\n <FilelistItemInfoDialog\r\n session={ session }\r\n />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default FilelistItemTable;\r\n","import * as React from 'react';\r\nimport { Prompt } from 'react-router-dom';\r\n\r\nimport FilelistItemActions from 'actions/ui/FilelistItemActions';\r\n\r\nimport BrowserBar from 'components/browserbar/BrowserBar';\r\nimport { ActionMenu, DownloadMenu } from 'components/menu';\r\n\r\nimport History from 'utils/History';\r\nimport NotificationActions from 'actions/NotificationActions';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\nimport { Location } from 'history';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FilelistItemGetter } from './item-info-dialog';\r\nimport FilelistItemTable from './FilelistItemTable';\r\nimport { filelistDownloadHandler, changeFilelistDirectory } from 'services/api/FilelistApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nexport type FilelistLocationState = { directory: string; } | undefined;\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n location: Location<FilelistLocationState>;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass ListBrowser extends React.Component<ListBrowserProps> {\r\n hasClickedDirectory: boolean = false;\r\n\r\n routerWillLeave = (nextLocation: Location, action: string) => {\r\n if (action === 'POP' && this.hasClickedDirectory && nextLocation.pathname !== this.props.location.pathname) {\r\n const { sessionT } = this.props;\r\n this.hasClickedDirectory = false;\r\n NotificationActions.info({\r\n title: sessionT.t('confirmLeave', 'Confirm action'),\r\n message: sessionT.t('confirmLeaveDesc', 'Click the back button again to leave this filelist'),\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n handleClickDirectory = (path: string) => {\r\n this.hasClickedDirectory = true;\r\n\r\n // Handle it through location state data\r\n History.push({\r\n state: { \r\n directory: path\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n const { session, location } = this.props;\r\n\r\n const locationData = location.state;\r\n if (!locationData || !locationData.directory) {\r\n // We need an initial path for our history\r\n History.replace({\r\n state: { \r\n directory: session.location!.path \r\n } as FilelistLocationState\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: ListBrowserProps) {\r\n const newLocationData = this.props.location.state;\r\n if (!newLocationData || !newLocationData.directory) {\r\n return;\r\n }\r\n\r\n if (this.props.session.location!.path === newLocationData.directory) {\r\n // Nothing has changed\r\n return;\r\n }\r\n\r\n const oldLocationData = prevProps.location.state;\r\n if (!!oldLocationData && oldLocationData.directory !== newLocationData.directory) {\r\n // It's our change\r\n this.sendChangeDirectory(newLocationData.directory);\r\n } else {\r\n // Change initiated by another session/GUI, update our location\r\n History.replace({ \r\n state: {\r\n directory: this.props.session.location!.path \r\n }\r\n });\r\n }\r\n }\r\n\r\n sendChangeDirectory = (directory: string) => {\r\n runBackgroundSocketAction(\r\n () => changeFilelistDirectory(this.props.session, directory),\r\n this.props.sessionT.plainT\r\n );\r\n }\r\n\r\n getCurrentDirectory = () => {\r\n return this.props.session.location;\r\n }\r\n\r\n selectedNameFormatter = (caption: React.ReactNode) => {\r\n const { session } = this.props;\r\n return (\r\n <DownloadMenu \r\n caption={ caption }\r\n user={ session.user }\r\n itemInfoGetter={ this.getCurrentDirectory }\r\n downloadHandler={ filelistDownloadHandler }\r\n contextElement=\".session-container\"\r\n session={ session }\r\n remoteMenuId={ MenuConstants.FILELIST_ITEM }\r\n entityId={ session.id }\r\n >\r\n <ActionMenu\r\n itemData={{\r\n item: session.location,\r\n session,\r\n }}\r\n actions={ FilelistItemActions }\r\n />\r\n </DownloadMenu>\r\n );\r\n }\r\n\r\n userGetter = () => {\r\n return this.props.session.user;\r\n }\r\n\r\n filelistItemFetcher = FilelistItemGetter(this.props.session);\r\n\r\n render() {\r\n const { session, sessionT } = this.props;\r\n return (\r\n <div className=\"browser\">\r\n <Prompt\r\n message={ this.routerWillLeave as any }\r\n />\r\n\r\n <BrowserBar \r\n path={ session.location!.path }\r\n separator=\"/\"\r\n rootPath=\"/\"\r\n rootName={ sessionT.translate('Root') }\r\n itemClickHandler={ this.handleClickDirectory }\r\n selectedNameFormatter={ this.selectedNameFormatter }\r\n\r\n // Just to make sure that the bar gets re-rendered when the switching to a different session (due to dropdown)\r\n entityId={ session.id }\r\n />\r\n <FilelistItemTable\r\n session={ session }\r\n sessionT={ sessionT }\r\n onClickDirectory={ this.handleClickDirectory }\r\n />\r\n <DownloadDialog \r\n downloadHandler={ filelistDownloadHandler }\r\n itemDataGetter={ this.filelistItemFetcher }\r\n userGetter={ this.userGetter }\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ListBrowser;\r\n","import * as React from 'react';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { FooterItem, SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface FilelistFooterProps {\r\n session: API.FilelistSession;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FilelistFooter: React.FC<FilelistFooterProps> = ({ session, sessionT }) => {\r\n if (useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n let locationText = session.location!.type.str;\r\n if (locationText.length > 0) {\r\n locationText = `${formatSize(session.location!.size, sessionT.plainT)} (${locationText})`;\r\n }\r\n\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n label={ sessionT.translate('Directory size') } \r\n text={ locationText }\r\n />\r\n <FooterItem \r\n label={ sessionT.translate('Total list size') } \r\n text={ formatSize(session.total_size, sessionT.plainT) }\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default FilelistFooter;","import { Component } from 'react';\r\n\r\nimport ListBrowser, { FilelistLocationState } from 'routes/Sidebar/routes/Filelists/components/ListBrowser';\r\nimport FilelistFooter from 'routes/Sidebar/routes/Filelists/components/FilelistFooter';\r\n\r\nimport ActiveSessionDecorator from 'decorators/ActiveSessionDecorator';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as API from 'types/api';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport { Location } from 'history';\r\n\r\n\r\ninterface FilelistSessionProps extends SessionChildProps<API.FilelistSession> {\r\n\r\n}\r\n\r\nclass FilelistSession extends Component<FilelistSessionProps> {\r\n static displayName = 'FilelistSession';\r\n\r\n render() {\r\n const { session, sessionT } = this.props;\r\n const { user, location, state } = session;\r\n\r\n if (user.flags.indexOf('offline') !== -1 && user.flags.indexOf('self') === -1) {\r\n return (\r\n <div className=\"filelist session\">\r\n <Message \r\n title={ sessionT.t('userOffline', 'User offline') }\r\n description={ sessionT.t<string>(\r\n 'userOfflineDesc', \r\n 'You will be able to continue browsing when the user comes back online'\r\n ) }\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if ((state.id !== 'loaded' && state.id !== 'download_failed') || !location) {\r\n return (\r\n <div className=\"filelist session\">\r\n <Loader text={ state.str }/>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"filelist session\">\r\n <ListBrowser\r\n location={ this.props.location as Location<FilelistLocationState> }\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n\r\n <FilelistFooter\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ActiveSessionDecorator(FilelistSession);\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\nimport UserItemHandlerDecorator from 'routes/Sidebar/decorators/UserItemHandlerDecorator';\r\n\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\nimport FilelistSessionUIActions from 'actions/ui/FilelistSessionActions';\r\nimport FilelistSessionAPIActions from 'actions/reflux/FilelistSessionActions';\r\n\r\nimport FilelistNew from 'routes/Sidebar/routes/Filelists/components/FilelistNew';\r\nimport FilelistSession from 'routes/Sidebar/routes/Filelists/components/FilelistSession';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecorator, 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 UserItemHandler = UserItemHandlerDecorator([ 'message' ]);\r\nconst ItemHandler: UI.SessionInfoGetter<API.FilelistSession> = {\r\n itemLabelGetter() {\r\n return null;\r\n },\r\n\r\n itemNameGetter(session) {\r\n return session.share_profile ? session.share_profile.str : UserItemHandler.itemNameGetter(session);\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return session.share_profile ? 'blue' : UserItemHandler.itemStatusGetter!(session);\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n return session.share_profile ? actionMenu : UserItemHandler.itemHeaderTitleGetter!(session, location, actionMenu);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.share_profile ? null : UserItemHandler.itemHeaderDescriptionGetter(session);\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return session.share_profile ? 'green server' : UserItemHandler.itemHeaderIconGetter(session);\r\n },\r\n};\r\n\r\nconst Filelists: React.FC<SessionProviderDecoratorChildProps<API.FilelistSession>> = props => {\r\n const { match, t, ...other } = props;\r\n return (\r\n <SessionLayout \r\n activeId={ match.params.id }\r\n baseUrl=\"filelists\"\r\n newCaption={ t(toI18nKey('new', UI.Modules.FILELISTS), 'Open filelist') }\r\n newDescription={ t(toI18nKey('newDesc', UI.Modules.FILELISTS), 'Start browsing a new filelist') } \r\n newIcon={ IconConstants.FILELISTS_PLAIN }\r\n disableSideMenu={ true }\r\n editAccess={ API.AccessEnum.FILELISTS_EDIT }\r\n uiActions={ FilelistSessionUIActions }\r\n sessionApi={ FilelistSessionAPIActions as UI.SessionActions<API.FilelistSession> }\r\n unreadInfoStore={ FilelistSessionStore }\r\n sessionItemLayout={ FilelistSession }\r\n newLayout={ FilelistNew }\r\n t={ t }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Filelists, FilelistSessionStore);\r\n","import LoginStore from 'stores/LoginStore';\r\nimport { fetchData } from 'utils/HttpUtils';\r\n\r\n\r\nexport const uploadTempFile = async (file: File): Promise<string> => {\r\n try {\r\n const res = await fetchData(`${getBasePath()}temp`, {\r\n method: 'POST',\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n \r\n 'Authorization': LoginStore.authToken,\r\n },\r\n body: file\r\n });\r\n\r\n return res.headers.get('Location')!;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nconst toCorsSafeUrl = (url: string) => {\r\n const proxyUrl = `${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(url)}`;\r\n return proxyUrl;\r\n};\r\n\r\nexport const fetchCorsSafeData = async (url: string, isJSON: boolean, options?: RequestInit) => {\r\n try {\r\n //console.log(`CORS HTTP request started (${url})`);\r\n\r\n const res = await fetchData(\r\n toCorsSafeUrl(url), \r\n {\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n // Temp workaround for people upgrading from versions < 2.7.0\r\n // If the new UI was loaded before restarting the app, a cache expiration time of \r\n // one year would have been set for \"Not found\" errors...\r\n 'Cache-Control': 'no-store, must-revalidate, max-age=0'\r\n },\r\n ...options,\r\n }\r\n );\r\n\r\n const data = await isJSON ? res.json() : res.text();\r\n return data;\r\n } catch (e) {\r\n console.error(`CORS HTTP request failed (${url})`, e);\r\n throw e;\r\n }\r\n};\r\n","\r\nimport ShareConstants from 'constants/ShareConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport { uploadTempFile } from '../HttpService';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\nexport interface AddTempShareResponse { \r\n magnet: string; \r\n}\r\n\r\nexport const shareTempFile = async (\r\n file: File, hubUrl: string, cid: string | undefined\r\n): Promise<AddTempShareResponse> => {\r\n try {\r\n const fileId = await uploadTempFile(file);\r\n const res = await SocketService.post<AddTempShareResponse>(ShareConstants.TEMP_SHARES_URL, {\r\n name: file.name,\r\n file_id: fileId,\r\n hub_url: hubUrl,\r\n cid,\r\n });\r\n\r\n return res;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\n\r\nexport const refresh = (incoming: boolean) => {\r\n return SocketService.post(ShareConstants.REFRESH_URL, {\r\n incoming,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshPaths = (paths: string[]) => {\r\n return SocketService.post(ShareConstants.REFRESH_PATHS_URL, { \r\n paths,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshVirtual = (path: string) => {\r\n return SocketService.post(ShareConstants.REFRESH_VIRTUAL_URL, { \r\n path,\r\n });\r\n};\r\n\r\nexport const abortRefreshTask = (id: number) => {\r\n return SocketService.delete(`${ShareConstants.REFRESH_TASKS_URL}/${id}`);\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","DupeStrings","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","useTranslation","gridT","text","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","MODULE_URL","PROFILES_URL","PROFILE_ADDED","PROFILE_UPDATED","PROFILE_REMOVED","HIDDEN_PROFILE_ID","profileToEnumValue","profile","Component","listHidden","dataProviderDecoratorSettings","addSize","merge","urls","profiles","dataConverters","data","filter","p","convertProfile","onSocketConnected","addSocketListener","refetchData","entries","entryTitleRenderer","hasSession","entryIcon","length","entry","index","header","description","last_opened","defaultValue","replace","timeAgo","icon","entryType","socket","get","itemMenuIds","itemNameGetter","nicks","itemStatusGetter","flags","itemHeaderDescriptionGetter","hub_names","itemHeaderIconGetter","itemHeaderTitleGetter","location","actionMenu","ids","remoteMenuId","FilelistSessionActionsDecorated","SessionActionDecorator","FilelistConstants","moduleId","actions","ShareProfileSelector","onClick","this","props","onProfileChanged","getDropdownItem","MenuItemLink","render","sessionT","Dropdown","translate","triggerIcon","ShareProfileDecorator","FilelistNew","handleSubmit","FilelistSessionStore","profileId","recentUserRender","_","cid","onChange","offlineMessage","isClearable","autoFocus","RecentLayout","IconConstants","FilelistItemActions","reloadDirectory","displayName","access","partial_list","isPartialList","item","isDirectory","handler","SocketService","list_path","reload","refreshShare","indexOf","details","History","pathname","isRoot","subId","FilelistItemGetter","itemId","FilelistItemInfoDialog","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","itemDataGetter","userGetter","Decorated","ModalRouteDecorator","DataProviderDecorator","match","params","_viewName","_apiUrl","_sessionStore","mixins","ViewStoreMixin","NameCell","rowDataGetter","onClickDirectory","other","useMemo","clickHandlerGetter","entityId","MenuConstants","itemData","FilelistItemTable","rowClassNameGetter","rowData","emptyRowsNodeGetter","state","Message","files","directories","Loader","complete","cellData","VirtualTable","store","FilelistViewStore","viewId","sessionStore","Column","width","columnKey","cell","flexGrow","hideWidth","ListBrowser","hasClickedDirectory","routerWillLeave","nextLocation","action","NotificationActions","message","handleClickDirectory","directory","sendChangeDirectory","plainT","getCurrentDirectory","selectedNameFormatter","filelistItemFetcher","componentDidMount","locationData","componentDidUpdate","prevProps","newLocationData","oldLocationData","BrowserBar","separator","rootPath","rootName","itemClickHandler","locationText","SessionFooter","label","total_size","FilelistSession","ActiveSessionDecorator","UserItemHandler","UserItemHandlerDecorator","ItemHandler","itemLabelGetter","share_profile","SessionProviderDecorator","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","disableSideMenu","editAccess","uiActions","sessionApi","unreadInfoStore","sessionItemLayout","newLayout","uploadTempFile","file","getBasePath","method","headers","body","e","fetchCorsSafeData","url","isJSON","res","window","origin","encodeURIComponent","toCorsSafeUrl","json","console","error","shareTempFile","hubUrl","fileId","file_id","hub_url","refreshPaths","priority","refreshVirtual","abortRefreshTask"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/filelists.726450e0ff6e77eaa054.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/components/file-item-info/style.css","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css","webpack://airdcpp-webui/./src/components/file-item-info/style.css?a322","webpack://airdcpp-webui/./src/components/file-item-info/FileItemInfoGrid.tsx","webpack://airdcpp-webui/./src/constants/ShareProfileConstants.ts","webpack://airdcpp-webui/./src/decorators/ShareProfileDecorator.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/components/RecentLayout.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/decorators/UserItemHandlerDecorator.tsx","webpack://airdcpp-webui/./src/actions/ui/FilelistSessionActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ShareProfileSelector.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistNew.tsx","webpack://airdcpp-webui/./src/actions/ui/FilelistItemActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/item-info-dialog/FilelistItemInfoDialog.tsx","webpack://airdcpp-webui/./src/stores/FilelistViewStore.js","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistItemTable.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/ListBrowser.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/FilelistSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/style.css?8d81","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Filelists/components/Filelists.tsx","webpack://airdcpp-webui/./src/services/HttpService.ts","webpack://airdcpp-webui/./src/services/api/ShareApi.ts"],"sourcesContent":["// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/file-item-info/style.css\"],\"names\":[],\"mappings\":\";AACA;EACE,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;AAClB;;AAEA;EACE,gBAAgB;EAChB,mBAAmB;AACrB;;AAEA;EACE,qBAAqB;AACvB\",\"sourcesContent\":[\"\\r\\n.fileitem.info.segment .dupe-paths .path {\\r\\n overflow-x: hidden;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .download.ui.dropdown {\\r\\n max-width: 150px;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .title.column {\\r\\n margin-top: auto;\\r\\n margin-bottom: auto;\\r\\n}\\r\\n\\r\\n.fileitem.info.segment .value.column {\\r\\n word-break: break-all;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../../../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \"#sidebar .virtual-table {\\r\\n flex: 1 100 100%;\\r\\n}\\r\\n\\r\\n.filelist.session .browser, \\r\\n.filelist.session .browser .virtual-table {\\r\\n height: calc(100% - 35px);\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 10px);\\r\\n}\\r\\n\\r\\n@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) {\\r\\n /* Safari specific CSS */\\r\\n .filelist.session .browser {\\r\\n height: calc(100% - 95px);\\r\\n }\\r\\n\\r\\n #mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 60px);\\r\\n }\\r\\n}\\r\\n\\r\\n.filelist.session .browser .ui.segment {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.filelist.session {\\r\\n max-height: 100%;\\r\\n overflow: hidden;\\r\\n margin-top: 10px;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.session.new .profile.ui.dropdown {\\r\\n margin-top: 10px;\\r\\n color: gray;\\r\\n align-self: flex-end;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Filelists/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,gBAAgB;AAClB;;AAEA;;EAEE,yBAAyB;AAC3B;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,yBAAyB;AAC3B;;AAEA;EACE,wBAAwB;EACxB;IACE,yBAAyB;EAC3B;;EAEA;IACE,yBAAyB;EAC3B;AACF;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,gBAAgB;EAChB,gBAAgB;EAChB,gBAAgB;EAChB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,WAAW;EACX,oBAAoB;AACtB\",\"sourcesContent\":[\"#sidebar .virtual-table {\\r\\n flex: 1 100 100%;\\r\\n}\\r\\n\\r\\n.filelist.session .browser, \\r\\n.filelist.session .browser .virtual-table {\\r\\n height: calc(100% - 35px);\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n#mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 10px);\\r\\n}\\r\\n\\r\\n@media screen and (min-color-index:0) and(-webkit-min-device-pixel-ratio:0) {\\r\\n /* Safari specific CSS */\\r\\n .filelist.session .browser {\\r\\n height: calc(100% - 95px);\\r\\n }\\r\\n\\r\\n #mobile-layout .filelist.session .browser {\\r\\n height: calc(100% - 60px);\\r\\n }\\r\\n}\\r\\n\\r\\n.filelist.session .browser .ui.segment {\\r\\n margin-bottom: 10px;\\r\\n}\\r\\n\\r\\n.filelist.session {\\r\\n max-height: 100%;\\r\\n overflow: hidden;\\r\\n margin-top: 10px;\\r\\n flex: 1 1 100%;\\r\\n}\\r\\n\\r\\n.session.new .profile.ui.dropdown {\\r\\n margin-top: 10px;\\r\\n color: gray;\\r\\n align-self: flex-end;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n import API from \"!../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport { formatRelativeTime, formatSize } from 'utils/ValueFormat';\r\n\r\nimport { DownloadMenu } from 'components/menu';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { useTranslation } from 'react-i18next';\r\nimport { translate } from 'utils/TranslationUtils';\r\n\r\nimport './style.css';\r\nimport { Row, Grid } from 'components/semantic/Grid';\r\n\r\n\r\nconst DupeStrings = {\r\n //[API.DupeEnum.NONE]: 'None',\r\n [API.DupeEnum.SHARE_PARTIAL]: 'Share (partial)',\r\n [API.DupeEnum.SHARE_FULL]: 'Share (full)',\r\n [API.DupeEnum.QUEUE_PARTIAL]: 'Queue (partial)',\r\n [API.DupeEnum.QUEUE_FULL]: 'Queue (full)',\r\n [API.DupeEnum.FINISHED_PARTIAL]: 'Finished (partial)',\r\n [API.DupeEnum.FINISHED_FULL]: 'Finished (full)',\r\n [API.DupeEnum.SHARE_QUEUE]: 'Share and queue',\r\n};\r\n\r\nconst DupePaths: React.FC<{ paths: string[] }> = ({ paths }) => (\r\n <div className=\"dupe-paths\">\r\n { paths.map(path => (\r\n <div key={ path } className=\"path\">\r\n { path }\r\n </div>\r\n )) }\r\n </div>\r\n);\r\n\r\ninterface FileItemInfoGridProps {\r\n fileItem: UI.DownloadableItemInfo;\r\n user: API.HintedUser;\r\n downloadHandler: UI.DownloadHandler<UI.DownloadableItemInfo>;\r\n showPath?: boolean;\r\n session: UI.SessionItemBase;\r\n}\r\n\r\nconst FileItemInfoGrid: React.FC<FileItemInfoGridProps> = ({ \r\n session, fileItem, user, downloadHandler, showPath = true \r\n}) => {\r\n const { t } = useTranslation();\r\n const gridT = (text: string) => {\r\n return translate(text, t, UI.Modules.COMMON);\r\n };\r\n\r\n return (\r\n <div className=\"ui fileitem info segment\">\r\n <Grid \r\n columns=\"two\"\r\n stackable={ true }\r\n >\r\n <Row \r\n title={ gridT('Name') }\r\n text={ fileItem.name }\r\n />\r\n <Row \r\n title={ gridT('Type/content') } \r\n text={ fileItem.type.str }\r\n />\r\n <Row \r\n title={ gridT('Size') } \r\n text={ formatSize(fileItem.size, t, true) }\r\n />\r\n <Row \r\n title={ gridT('Last modified') }\r\n text={ formatRelativeTime(fileItem.time || 0) }\r\n />\r\n { fileItem.type.id === 'file' && (\r\n <Row \r\n title={ gridT('TTH') } \r\n text={ fileItem.tth }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe type') }\r\n text={ gridT(DupeStrings[fileItem.dupe.id]) }\r\n /> \r\n )}\r\n { !!fileItem.dupe && (\r\n <Row \r\n title={ gridT('Dupe paths') }\r\n text={ <DupePaths paths={ fileItem.dupe.paths }/> }\r\n /> \r\n )}\r\n { showPath && (\r\n <Row \r\n title={ gridT('Path') }\r\n text={ fileItem.path }\r\n /> \r\n )}\r\n </Grid>\r\n\r\n <DownloadMenu \r\n caption={ gridT('Actions...') }\r\n button={ true }\r\n user={ user }\r\n itemInfoGetter={ () => fileItem }\r\n downloadHandler={ downloadHandler }\r\n contextElement=\".ui.modal > .content\"\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n};\r\n\r\nexport { FileItemInfoGrid };","const MODULE_URL = 'share_profiles';\r\nexport default {\r\n MODULE_URL: MODULE_URL,\r\n PROFILES_URL: MODULE_URL,\r\n\r\n PROFILE_ADDED: 'share_profile_added',\r\n PROFILE_UPDATED: 'share_profile_updated',\r\n PROFILE_REMOVED: 'share_profile_removed',\r\n\r\n HIDDEN_PROFILE_ID: 1\r\n}\r\n;\r\n","import * as React from 'react';\r\nimport { merge } from 'lodash';\r\n\r\nimport ShareProfileConstants from 'constants/ShareProfileConstants';\r\n\r\nimport DataProviderDecorator, { \r\n DataProviderDecoratorChildProps, DataProviderDecoratorSettings, DataConverter \r\n} from 'decorators/DataProviderDecorator';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\n\r\nimport * as API from 'types/api';\r\nimport { TFunction } from 'i18next';\r\n\r\n\r\ninterface ShareProfileDecoratorDataProps {\r\n profiles: API.ShareProfile[];\r\n}\r\n\r\nexport const profileToEnumValue = (profile: API.ShareProfile) => {\r\n return {\r\n id: profile.id,\r\n name: profile.str,\r\n };\r\n};\r\n\r\nexport type ShareProfileDecoratorChildProps = DataProviderDecoratorChildProps & ShareProfileDecoratorDataProps;\r\n\r\nconst ShareProfileDecorator = function <PropsT extends object>(\r\n Component: React.ComponentType<PropsT & ShareProfileDecoratorChildProps>, \r\n listHidden: boolean, \r\n dataProviderDecoratorSettings?: DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>,\r\n addSize: boolean = true\r\n) {\r\n const convertProfile = (profile: API.ShareProfile, t: TFunction): API.ShareProfile => {\r\n let str = profile.str;\r\n if (addSize && profile.id !== ShareProfileConstants.HIDDEN_PROFILE_ID) {\r\n str += ` (${formatSize(profile.size, t)})`;\r\n }\r\n\r\n return {\r\n ...profile,\r\n str,\r\n };\r\n };\r\n\r\n const convertProfiles: DataConverter<PropsT> = (data: API.ShareProfile[], { t }) => {\r\n const profiles = data\r\n .filter(p => listHidden || p.id !== ShareProfileConstants.HIDDEN_PROFILE_ID)\r\n .map(p => convertProfile(p, t));\r\n\r\n return profiles;\r\n };\r\n\r\n return DataProviderDecorator<PropsT, ShareProfileDecoratorDataProps>(\r\n Component, \r\n merge(dataProviderDecoratorSettings, {\r\n urls: {\r\n profiles: ShareProfileConstants.PROFILES_URL,\r\n },\r\n dataConverters: {\r\n profiles: convertProfiles,\r\n },\r\n onSocketConnected: (addSocketListener, { refetchData }) => {\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_ADDED, () => refetchData());\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_UPDATED, () => refetchData());\r\n addSocketListener(ShareProfileConstants.MODULE_URL, ShareProfileConstants.PROFILE_REMOVED, () => refetchData());\r\n },\r\n } as DataProviderDecoratorSettings<PropsT, ShareProfileDecoratorDataProps>)\r\n );\r\n};\r\n\r\nexport default ShareProfileDecorator;\r\n","//import PropTypes from 'prop-types';\r\nimport * as React from 'react';\r\n\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n//import RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\n\r\nimport LayoutHeader from 'components/semantic/LayoutHeader';\r\nimport { ListItem } from 'components/semantic/List';\r\n\r\nimport HistoryConstants from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { TFunction } from 'i18next';\r\nimport { translate, toI18nKey } from 'utils/TranslationUtils';\r\n\r\n\r\ninterface RecentLayoutProps {\r\n entryIcon: string;\r\n entryType: string;\r\n entryTitleRenderer: (entry: API.HistoryItem) => React.ReactNode;\r\n hasSession: (entry: API.HistoryItem) => boolean;\r\n t: TFunction;\r\n}\r\n\r\ninterface DataProps {\r\n entries: API.HistoryItem[];\r\n}\r\n\r\ntype Props = RecentLayoutProps & DataProps & DataProviderDecoratorChildProps;\r\n\r\nconst RecentLayout: React.FC<Props> = ({ entries, entryTitleRenderer, hasSession, entryIcon, t }) => {\r\n if (entries.length === 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div className=\"recents\">\r\n <LayoutHeader\r\n title={ translate('Recent sessions', t, UI.Modules.COMMON) }\r\n size=\"\"\r\n />\r\n <div className=\"ui relaxed divided list\">\r\n { entries.map((entry, index) => (\r\n <ListItem \r\n key={ index }\r\n header={ entryTitleRenderer(entry) }\r\n description={ !!entry.last_opened && t(toI18nKey('openedAgo', UI.Modules.COMMON), {\r\n defaultValue: 'Opened {{timeAgo}}',\r\n replace: {\r\n timeAgo: formatRelativeTime(entry.last_opened)\r\n }\r\n }) }\r\n icon={ (hasSession(entry) ? 'green ' : '') + entryIcon }\r\n />\r\n )) }\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\n/*RecentLayout.propTypes = {\r\n // Title of the button\r\n entryIcon: PropTypes.string.isRequired,\r\n\r\n // URL for fetching the recent entries\r\n entryType: PropTypes.string.isRequired,\r\n\r\n // Renders the recent entry title\r\n entryTitleRenderer: PropTypes.func.isRequired,\r\n\r\n // Returns whether the recent entry is currently active\r\n hasSession: PropTypes.func.isRequired,\r\n};*/\r\n\r\nexport default DataProviderDecorator<RecentLayoutProps, DataProps>(\r\n //RedrawDecorator<Props>(RecentLayout),\r\n RecentLayout,\r\n {\r\n urls: {\r\n entries: ({ entryType }, socket) => socket.get(`${HistoryConstants.SESSIONS_URL}/${entryType}/0`),\r\n },\r\n }\r\n);","import { userOnlineStatusToColor } from 'utils/TypeConvert';\r\nimport { UserMenu } from 'components/menu';\r\nimport UserIcon from 'components/icon/UserIcon';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface UserSessionBase {\r\n user: API.HintedUser;\r\n}\r\n\r\nexport default function <SessionT extends UI.SessionItemBase & UserSessionBase>(itemMenuIds: string[]) {\r\n const UserItemHandlerDecorator: UI.SessionInfoGetter<SessionT> = {\r\n itemNameGetter(session) {\r\n return session.user.nicks;\r\n },\r\n\r\n itemStatusGetter(session) {\r\n const { flags } = session.user;\r\n return userOnlineStatusToColor(flags);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.user.hub_names;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <UserIcon flags={ session.user.flags } />;\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n const { user } = session;\r\n return (\r\n <UserMenu \r\n user={ user } \r\n ids={ itemMenuIds }\r\n remoteMenuId={ MenuConstants.HINTED_USER }\r\n >\r\n { actionMenu }\r\n </UserMenu>\r\n );\r\n },\r\n };\r\n\r\n return UserItemHandlerDecorator;\r\n}\r\n","\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst FilelistSessionActions: UI.ActionListType<API.FilelistSession> = {};\r\n\r\n\r\nconst FilelistSessionActionsDecorated = SessionActionDecorator(\r\n FilelistSessionActions, \r\n FilelistConstants.SESSIONS_URL, \r\n API.AccessEnum.FILELISTS_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.FILELISTS,\r\n actions: FilelistSessionActionsDecorated,\r\n};\r\n","//import PropTypes from 'prop-types';\r\nimport { Component } from 'react';\r\n\r\nimport Dropdown from 'components/semantic/Dropdown';\r\nimport MenuItemLink from 'components/semantic/MenuItemLink';\r\n\r\nimport ShareProfileDecorator, { ShareProfileDecoratorChildProps } from 'decorators/ShareProfileDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface ShareProfileSelectorProps {\r\n onProfileChanged: (profileId: number) => void;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass ShareProfileSelector extends Component<ShareProfileSelectorProps & ShareProfileDecoratorChildProps> {\r\n /*static propTypes = {\r\n // Callback after selecting a profile\r\n onProfileChanged: PropTypes.func.isRequired,\r\n };*/\r\n\r\n onClick = (profile: API.ShareProfile) => {\r\n this.props.onProfileChanged(profile.id);\r\n }\r\n\r\n getDropdownItem = (profile: API.ShareProfile) => {\r\n return (\r\n <MenuItemLink \r\n key={ profile.id } \r\n onClick={ () => this.props.onProfileChanged(profile.id) }\r\n >\r\n { profile.str }\r\n </MenuItemLink>\r\n );\r\n }\r\n\r\n render() {\r\n const { sessionT, profiles } = this.props;\r\n return (\r\n <Dropdown \r\n className=\"profile top right pointing\" \r\n caption={ sessionT.translate('Browse own share...') }\r\n triggerIcon=\"\"\r\n >\r\n { profiles.map(this.getDropdownItem) }\r\n </Dropdown>\r\n );\r\n }\r\n}\r\n\r\nexport default ShareProfileDecorator(ShareProfileSelector, false);","import { Component } from 'react';\r\n\r\nimport RecentLayout from 'routes/Sidebar/components/RecentLayout';\r\n\r\nimport FilelistSessionActions from 'actions/reflux/FilelistSessionActions';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport ShareProfileSelector from 'routes/Sidebar/routes/Filelists/components/ShareProfileSelector';\r\nimport { HistoryEntryEnum } from 'constants/HistoryConstants';\r\n\r\nimport * as API from 'types/api';\r\n\r\nimport { NewSessionLayoutProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport IconConstants from 'constants/IconConstants';\r\nimport { UserSelectField } from 'components/select';\r\n\r\n\r\nclass FilelistNew extends Component<NewSessionLayoutProps> {\r\n handleSubmit = (user: API.HintedUser) => {\r\n FilelistSessionActions.createSession(this.props.location, user, FilelistSessionStore);\r\n }\r\n\r\n onProfileChanged = (profileId: number) => {\r\n FilelistSessionActions.ownList(this.props.location, profileId, FilelistSessionStore);\r\n }\r\n\r\n recentUserRender = (entry: API.HistoryItem) => {\r\n return (\r\n <a onClick={ _ => this.handleSubmit(entry.user!) }>\r\n { entry.user!.nicks + (entry.description ? ` (${entry.description})` : '') }\r\n </a> \r\n );\r\n }\r\n\r\n hasSession = (entry: API.HistoryItem) => {\r\n return FilelistSessionStore.getSession(entry.user!.cid);\r\n }\r\n\r\n render() {\r\n const { sessionT } = this.props;\r\n return (\r\n <div className=\"filelist session new\">\r\n <UserSelectField \r\n onChange={ this.handleSubmit } \r\n offlineMessage={ sessionT.t<string>(\r\n 'offlineMessage',\r\n 'You must to be connected to at least one hub in order to download filelists from other users') \r\n }\r\n isClearable={ false }\r\n autoFocus={ true }\r\n />\r\n <ShareProfileSelector \r\n onProfileChanged={ this.onProfileChanged }\r\n sessionT={ sessionT }\r\n />\r\n <RecentLayout\r\n entryType={ HistoryEntryEnum.FILELIST }\r\n hasSession={ this.hasSession }\r\n entryTitleRenderer={ this.recentUserRender }\r\n entryIcon={ IconConstants.FILELISTS_PLAIN }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default FilelistNew;\r\n","\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\n\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport History from 'utils/History';\r\nimport { refreshVirtual } from 'services/api/ShareApi';\r\n\r\n\r\ninterface ActionFilelistItemData {\r\n item: API.FilelistItem;\r\n session: API.FilelistSession;\r\n}\r\n\r\n\r\nconst isMe = ({ session }: ActionFilelistItemData) => session.user.flags.indexOf('self') !== -1;\r\nconst isRoot = ({ item }: ActionFilelistItemData) => item.path === '/';\r\nconst isPartialList = ({ session }: ActionFilelistItemData) => session.partial_list;\r\nconst isDirectory = ({ item }: ActionFilelistItemData) => item.type.id === 'directory';\r\n\r\nconst filterReload = (data: ActionFilelistItemData) => isPartialList(data) && isDirectory(data);\r\nconst filterDetails = (data: ActionFilelistItemData) => !isRoot(data);\r\n\r\n\r\nconst handleReloadDirectory: UI.ActionHandler<ActionFilelistItemData> = (\r\n { data } \r\n) => {\r\n const { session, item } = data;\r\n\r\n return SocketService.post(`${FilelistConstants.SESSIONS_URL}/${session.id}/directory`, { \r\n list_path: item.path,\r\n reload: true,\r\n });\r\n};\r\n\r\nconst handleRefreshShare: UI.ActionHandler<ActionFilelistItemData> = ({ data }) => {\r\n return refreshVirtual(data.item.path);\r\n};\r\n\r\nconst handleItemDetails: UI.ActionHandler<ActionFilelistItemData> = ({ data, location }) => {\r\n History.push(`${location.pathname}/item/${data.item.id}`);\r\n};\r\n\r\nconst FilelistItemActions: UI.ActionListType<ActionFilelistItemData> = {\r\n reloadDirectory: {\r\n displayName: 'Reload',\r\n access: API.AccessEnum.FILELISTS_VIEW,\r\n icon: IconConstants.RELOAD,\r\n filter: filterReload,\r\n handler: handleReloadDirectory,\r\n },\r\n refreshShare: {\r\n displayName: 'Refresh in share',\r\n access: API.AccessEnum.SETTINGS_EDIT,\r\n icon: IconConstants.REFRESH_COLORED,\r\n filter: isMe,\r\n handler: handleRefreshShare,\r\n },\r\n details: { \r\n displayName: 'Details',\r\n icon: IconConstants.OPEN,\r\n handler: handleItemDetails,\r\n filter: filterDetails\r\n },\r\n};\r\n\r\nexport default {\r\n moduleId: UI.Modules.FILELISTS,\r\n subId: 'item',\r\n actions: FilelistItemActions,\r\n};\r\n","import { Component } from 'react';\r\nimport Modal from 'components/semantic/Modal';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\n\r\nimport ModalRouteDecorator, { ModalRouteDecoratorChildProps } from 'decorators/ModalRouteDecorator';\r\nimport DataProviderDecorator, { DataProviderDecoratorChildProps } from 'decorators/DataProviderDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FileItemInfoGrid } from 'components/file-item-info';\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\n\r\n\r\ninterface FilelistItemInfoDialogProps {\r\n session: API.FilelistSession;\r\n}\r\n\r\ninterface DataProps extends DataProviderDecoratorChildProps {\r\n fileItem: API.FilelistItem;\r\n}\r\n\r\ninterface RouteProps {\r\n itemId: string;\r\n}\r\n\r\ntype Props = FilelistItemInfoDialogProps & ModalRouteDecoratorChildProps<RouteProps>;\r\n\r\nexport const FilelistItemGetter = (session: API.FilelistSession) => {\r\n const ret: UI.DownloadItemDataGetter<API.FilelistItem> = (itemId, socket) => {\r\n return socket.get(`${FilelistConstants.MODULE_URL}/${session.id}/items/${itemId}`);\r\n };\r\n\r\n return ret;\r\n};\r\n\r\nclass FilelistItemInfoDialog extends Component<Props & DataProps> {\r\n static displayName = 'FilelistItemInfoDialog';\r\n\r\n render() {\r\n const { fileItem, session } = this.props;\r\n return (\r\n <Modal \r\n className=\"filelist-item\" \r\n title={ fileItem.name }\r\n closable={ true } \r\n icon={ <FileIcon typeInfo={ fileItem.type }/> } \r\n fullHeight={ true }\r\n { ...this.props }\r\n >\r\n <DownloadDialog \r\n downloadHandler={ filelistDownloadHandler }\r\n itemDataGetter={ FilelistItemGetter(session) }\r\n userGetter={ () => session.user }\r\n session={ session }\r\n />\r\n <FileItemInfoGrid \r\n fileItem={ fileItem }\r\n downloadHandler={ filelistDownloadHandler }\r\n user={ session.user }\r\n session={ session }\r\n />\r\n </Modal>\r\n );\r\n }\r\n}\r\n\r\nconst Decorated = ModalRouteDecorator<FilelistItemInfoDialogProps, RouteProps>(\r\n DataProviderDecorator<Props, DataProps>(\r\n FilelistItemInfoDialog, {\r\n urls: {\r\n fileItem: ({ match, session }, socket) => FilelistItemGetter(session)(match.params.itemId, socket),\r\n }\r\n }\r\n ), \r\n 'item/:itemId'\r\n);\r\n\r\nexport { Decorated as FilelistItemInfoDialog };\r\n","import ViewStoreMixin from 'mixins/ViewStoreMixin';\r\nimport Reflux from 'reflux';\r\nimport FilelistConstants from 'constants/FilelistConstants';\r\nimport FilelistSessionStore from './FilelistSessionStore';\r\n\r\nexport default Reflux.createStore({\r\n _viewName: 'filelist_view',\r\n _apiUrl: FilelistConstants.SESSIONS_URL,\r\n _sessionStore: FilelistSessionStore,\r\n mixins: [ ViewStoreMixin('name') ],\r\n});\r\n","import { useMemo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport FilelistItemActions from 'actions/ui/FilelistItemActions';\r\n\r\nimport { dupeToStringType } from 'utils/TypeConvert';\r\nimport { TableActionMenu } from 'components/menu';\r\n\r\nimport FilelistViewStore from 'stores/FilelistViewStore';\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\n\r\nimport VirtualTable from 'components/table/VirtualTable';\r\nimport { SizeCell, DurationCell, FileDownloadCell, FileDownloadCellClickHandler } from 'components/table/Cell';\r\nimport { Column } from 'fixed-data-table-2';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FilelistItemInfoDialog } from './item-info-dialog';\r\nimport { RowWrapperCellChildProps } from 'components/table/RowWrapperCell';\r\nimport { filelistDownloadHandler } from 'services/api/FilelistApi';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\ninterface NameCellProps extends RowWrapperCellChildProps<string, API.FilelistItem> {\r\n session: API.FilelistSession;\r\n onClickDirectory: FileDownloadCellClickHandler; \r\n}\r\n\r\nconst NameCell: React.FC<NameCellProps> = (\r\n { rowDataGetter, onClickDirectory, session, ...other }\r\n) => {\r\n const itemDataGetter = useMemo(\r\n () => {\r\n return () => ({\r\n item: rowDataGetter!(),\r\n session\r\n });\r\n },\r\n [ session ]\r\n );\r\n\r\n return (\r\n <FileDownloadCell \r\n clickHandlerGetter={ onClickDirectory }\r\n userGetter={ () => session.user }\r\n downloadHandler={ filelistDownloadHandler }\r\n rowDataGetter={ rowDataGetter }\r\n session={ session }\r\n entityId={ session.id }\r\n remoteMenuId={ MenuConstants.FILELIST_ITEM }\r\n { ...other }\r\n >\r\n <TableActionMenu \r\n actions={ FilelistItemActions }\r\n itemData={ itemDataGetter }\r\n ids={ [ 'refreshShare', 'details' ] }\r\n />\r\n </FileDownloadCell>\r\n );\r\n};\r\n\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n onClickDirectory: (path: string) => void; \r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass FilelistItemTable extends React.Component<ListBrowserProps> {\r\n rowClassNameGetter = (rowData: API.FilelistItem) => {\r\n return dupeToStringType(rowData.dupe);\r\n }\r\n\r\n emptyRowsNodeGetter = () => {\r\n const { location, state } = this.props.session;\r\n const { translate } = this.props.sessionT;\r\n\r\n if (state.id === 'download_failed') {\r\n return (\r\n <Message \r\n icon={ IconConstants.ERROR }\r\n title={ translate('Download failed') }\r\n description={ state.str }\r\n />\r\n );\r\n }\r\n\r\n // The list finished downloading but the view hasn't updated yet\r\n const { files, directories } = location!.type as API.DirectoryType;\r\n if (files !== 0 || directories !== 0) {\r\n return <Loader text={ translate('Updating view') }/>;\r\n //return null;\r\n }\r\n\r\n // The directory was changed but the download state hasn't changed yet\r\n if (!location!.complete) {\r\n return <Loader text={ translate('Preparing download') }/>;\r\n }\r\n\r\n return (\r\n <Message \r\n title={ translate('No content to display') }\r\n description={ translate('The directory is empty') }\r\n />\r\n );\r\n }\r\n\r\n onClickDirectory: FileDownloadCellClickHandler = (cellData, rowDataGetter) => {\r\n if (rowDataGetter().type.id === 'directory') {\r\n return () => this.props.onClickDirectory(this.props.session.location!.path + cellData + '/');\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n userGetter = () => {\r\n return this.props.session.user;\r\n }\r\n\r\n render() {\r\n const { session } = this.props;\r\n return (\r\n <>\r\n <VirtualTable\r\n emptyRowsNodeGetter={ this.emptyRowsNodeGetter }\r\n rowClassNameGetter={ this.rowClassNameGetter }\r\n store={ FilelistViewStore }\r\n entityId={ session.id }\r\n viewId={ session.location!.path }\r\n sessionStore={ FilelistSessionStore }\r\n moduleId={ FilelistItemActions.moduleId }\r\n >\r\n <Column\r\n name=\"Name\"\r\n width={200}\r\n columnKey=\"name\"\r\n cell={\r\n <NameCell \r\n onClickDirectory={ this.onClickDirectory } \r\n session={ session }\r\n />\r\n }\r\n flexGrow={8}\r\n />\r\n <Column\r\n name=\"Size\"\r\n width={60}\r\n columnKey=\"size\"\r\n cell={ <SizeCell/> }\r\n flexGrow={1}\r\n />\r\n <Column\r\n name=\"Type\"\r\n width={70}\r\n columnKey=\"type\"\r\n flexGrow={1}\r\n hideWidth={ 500 }\r\n />\r\n <Column\r\n name=\"Last modified\"\r\n width={80}\r\n columnKey=\"time\"\r\n cell={ <DurationCell/> }\r\n flexGrow={1}\r\n />\r\n </VirtualTable>\r\n <FilelistItemInfoDialog\r\n session={ session }\r\n />\r\n </>\r\n );\r\n }\r\n}\r\n\r\nexport default FilelistItemTable;\r\n","import * as React from 'react';\r\nimport { Prompt } from 'react-router-dom';\r\n\r\nimport FilelistItemActions from 'actions/ui/FilelistItemActions';\r\n\r\nimport BrowserBar from 'components/browserbar/BrowserBar';\r\nimport { ActionMenu, DownloadMenu } from 'components/menu';\r\n\r\nimport History from 'utils/History';\r\nimport NotificationActions from 'actions/NotificationActions';\r\n\r\nimport DownloadDialog from 'components/download/DownloadDialog';\r\nimport { Location } from 'history';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { FilelistItemGetter } from './item-info-dialog';\r\nimport FilelistItemTable from './FilelistItemTable';\r\nimport { filelistDownloadHandler, changeFilelistDirectory } from 'services/api/FilelistApi';\r\nimport { runBackgroundSocketAction } from 'utils/ActionUtils';\r\nimport MenuConstants from 'constants/MenuConstants';\r\n\r\n\r\nexport type FilelistLocationState = { directory: string; } | undefined;\r\n\r\ninterface ListBrowserProps {\r\n session: API.FilelistSession;\r\n location: Location<FilelistLocationState>;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass ListBrowser extends React.Component<ListBrowserProps> {\r\n hasClickedDirectory: boolean = false;\r\n\r\n routerWillLeave = (nextLocation: Location, action: string) => {\r\n if (action === 'POP' && this.hasClickedDirectory && nextLocation.pathname !== this.props.location.pathname) {\r\n const { sessionT } = this.props;\r\n this.hasClickedDirectory = false;\r\n NotificationActions.info({\r\n title: sessionT.t('confirmLeave', 'Confirm action'),\r\n message: sessionT.t('confirmLeaveDesc', 'Click the back button again to leave this filelist'),\r\n });\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n handleClickDirectory = (path: string) => {\r\n this.hasClickedDirectory = true;\r\n\r\n // Handle it through location state data\r\n History.push({\r\n state: { \r\n directory: path\r\n }\r\n });\r\n }\r\n\r\n componentDidMount() {\r\n const { session, location } = this.props;\r\n\r\n const locationData = location.state;\r\n if (!locationData || !locationData.directory) {\r\n // We need an initial path for our history\r\n History.replace({\r\n state: { \r\n directory: session.location!.path \r\n } as FilelistLocationState\r\n });\r\n }\r\n }\r\n\r\n componentDidUpdate(prevProps: ListBrowserProps) {\r\n const newLocationData = this.props.location.state;\r\n if (!newLocationData || !newLocationData.directory) {\r\n return;\r\n }\r\n\r\n if (this.props.session.location!.path === newLocationData.directory) {\r\n // Nothing has changed\r\n return;\r\n }\r\n\r\n const oldLocationData = prevProps.location.state;\r\n if (!!oldLocationData && oldLocationData.directory !== newLocationData.directory) {\r\n // It's our change\r\n this.sendChangeDirectory(newLocationData.directory);\r\n } else {\r\n // Change initiated by another session/GUI, update our location\r\n History.replace({ \r\n state: {\r\n directory: this.props.session.location!.path \r\n }\r\n });\r\n }\r\n }\r\n\r\n sendChangeDirectory = (directory: string) => {\r\n runBackgroundSocketAction(\r\n () => changeFilelistDirectory(this.props.session, directory),\r\n this.props.sessionT.plainT\r\n );\r\n }\r\n\r\n getCurrentDirectory = () => {\r\n return this.props.session.location;\r\n }\r\n\r\n selectedNameFormatter = (caption: React.ReactNode) => {\r\n const { session } = this.props;\r\n return (\r\n <DownloadMenu \r\n caption={ caption }\r\n user={ session.user }\r\n itemInfoGetter={ this.getCurrentDirectory }\r\n downloadHandler={ filelistDownloadHandler }\r\n contextElement=\".session-container\"\r\n session={ session }\r\n remoteMenuId={ MenuConstants.FILELIST_ITEM }\r\n entityId={ session.id }\r\n >\r\n <ActionMenu\r\n itemData={{\r\n item: session.location,\r\n session,\r\n }}\r\n actions={ FilelistItemActions }\r\n />\r\n </DownloadMenu>\r\n );\r\n }\r\n\r\n userGetter = () => {\r\n return this.props.session.user;\r\n }\r\n\r\n filelistItemFetcher = FilelistItemGetter(this.props.session);\r\n\r\n render() {\r\n const { session, sessionT } = this.props;\r\n return (\r\n <div className=\"browser\">\r\n <Prompt\r\n message={ this.routerWillLeave as any }\r\n />\r\n\r\n <BrowserBar \r\n path={ session.location!.path }\r\n separator=\"/\"\r\n rootPath=\"/\"\r\n rootName={ sessionT.translate('Root') }\r\n itemClickHandler={ this.handleClickDirectory }\r\n selectedNameFormatter={ this.selectedNameFormatter }\r\n\r\n // Just to make sure that the bar gets re-rendered when the switching to a different session (due to dropdown)\r\n entityId={ session.id }\r\n />\r\n <FilelistItemTable\r\n session={ session }\r\n sessionT={ sessionT }\r\n onClickDirectory={ this.handleClickDirectory }\r\n />\r\n <DownloadDialog \r\n downloadHandler={ filelistDownloadHandler }\r\n itemDataGetter={ this.filelistItemFetcher }\r\n userGetter={ this.userGetter }\r\n session={ session }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ListBrowser;\r\n","import * as React from 'react';\r\n\r\nimport { formatSize } from 'utils/ValueFormat';\r\nimport { FooterItem, SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface FilelistFooterProps {\r\n session: API.FilelistSession;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FilelistFooter: React.FC<FilelistFooterProps> = ({ session, sessionT }) => {\r\n if (useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n let locationText = session.location!.type.str;\r\n if (locationText.length > 0) {\r\n locationText = `${formatSize(session.location!.size, sessionT.plainT)} (${locationText})`;\r\n }\r\n\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n label={ sessionT.translate('Directory size') } \r\n text={ locationText }\r\n />\r\n <FooterItem \r\n label={ sessionT.translate('Total list size') } \r\n text={ formatSize(session.total_size, sessionT.plainT) }\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default FilelistFooter;","import { Component } from 'react';\r\n\r\nimport ListBrowser, { FilelistLocationState } from 'routes/Sidebar/routes/Filelists/components/ListBrowser';\r\nimport FilelistFooter from 'routes/Sidebar/routes/Filelists/components/FilelistFooter';\r\n\r\nimport ActiveSessionDecorator from 'decorators/ActiveSessionDecorator';\r\n\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as API from 'types/api';\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport { Location } from 'history';\r\n\r\n\r\ninterface FilelistSessionProps extends SessionChildProps<API.FilelistSession> {\r\n\r\n}\r\n\r\nclass FilelistSession extends Component<FilelistSessionProps> {\r\n static displayName = 'FilelistSession';\r\n\r\n render() {\r\n const { session, sessionT } = this.props;\r\n const { user, location, state } = session;\r\n\r\n if (user.flags.indexOf('offline') !== -1 && user.flags.indexOf('self') === -1) {\r\n return (\r\n <div className=\"filelist session\">\r\n <Message \r\n title={ sessionT.t('userOffline', 'User offline') }\r\n description={ sessionT.t<string>(\r\n 'userOfflineDesc', \r\n 'You will be able to continue browsing when the user comes back online'\r\n ) }\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n if ((state.id !== 'loaded' && state.id !== 'download_failed') || !location) {\r\n return (\r\n <div className=\"filelist session\">\r\n <Loader text={ state.str }/>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"filelist session\">\r\n <ListBrowser\r\n location={ this.props.location as Location<FilelistLocationState> }\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n\r\n <FilelistFooter\r\n session={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ActiveSessionDecorator(FilelistSession);\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\nimport UserItemHandlerDecorator from 'routes/Sidebar/decorators/UserItemHandlerDecorator';\r\n\r\nimport FilelistSessionStore from 'stores/FilelistSessionStore';\r\nimport FilelistSessionUIActions from 'actions/ui/FilelistSessionActions';\r\nimport FilelistSessionAPIActions from 'actions/reflux/FilelistSessionActions';\r\n\r\nimport FilelistNew from 'routes/Sidebar/routes/Filelists/components/FilelistNew';\r\nimport FilelistSession from 'routes/Sidebar/routes/Filelists/components/FilelistSession';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecorator, 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 UserItemHandler = UserItemHandlerDecorator([ 'message' ]);\r\nconst ItemHandler: UI.SessionInfoGetter<API.FilelistSession> = {\r\n itemLabelGetter() {\r\n return null;\r\n },\r\n\r\n itemNameGetter(session) {\r\n return session.share_profile ? session.share_profile.str : UserItemHandler.itemNameGetter(session);\r\n },\r\n\r\n itemStatusGetter(session) {\r\n return session.share_profile ? 'blue' : UserItemHandler.itemStatusGetter!(session);\r\n },\r\n\r\n itemHeaderTitleGetter(session, location, actionMenu) {\r\n return session.share_profile ? actionMenu : UserItemHandler.itemHeaderTitleGetter!(session, location, actionMenu);\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return session.share_profile ? null : UserItemHandler.itemHeaderDescriptionGetter(session);\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return session.share_profile ? 'green server' : UserItemHandler.itemHeaderIconGetter(session);\r\n },\r\n};\r\n\r\nconst Filelists: React.FC<SessionProviderDecoratorChildProps<API.FilelistSession>> = props => {\r\n const { match, t, ...other } = props;\r\n return (\r\n <SessionLayout \r\n activeId={ match.params.id }\r\n baseUrl=\"filelists\"\r\n newCaption={ t(toI18nKey('new', UI.Modules.FILELISTS), 'Open filelist') }\r\n newDescription={ t(toI18nKey('newDesc', UI.Modules.FILELISTS), 'Start browsing a new filelist') } \r\n newIcon={ IconConstants.FILELISTS_PLAIN }\r\n disableSideMenu={ true }\r\n editAccess={ API.AccessEnum.FILELISTS_EDIT }\r\n uiActions={ FilelistSessionUIActions }\r\n sessionApi={ FilelistSessionAPIActions as UI.SessionActions<API.FilelistSession> }\r\n unreadInfoStore={ FilelistSessionStore }\r\n sessionItemLayout={ FilelistSession }\r\n newLayout={ FilelistNew }\r\n t={ t }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Filelists, FilelistSessionStore);\r\n","import LoginStore from 'stores/LoginStore';\r\nimport { fetchData } from 'utils/HttpUtils';\r\n\r\n\r\nexport const uploadTempFile = async (file: File): Promise<string> => {\r\n try {\r\n const res = await fetchData(`${getBasePath()}temp`, {\r\n method: 'POST',\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n \r\n 'Authorization': LoginStore.authToken,\r\n },\r\n body: file\r\n });\r\n\r\n return res.headers.get('Location')!;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\nconst toCorsSafeUrl = (url: string) => {\r\n const proxyUrl = `${window.location.origin}${getBasePath()}proxy?url=${encodeURIComponent(url)}`;\r\n return proxyUrl;\r\n};\r\n\r\nexport const fetchCorsSafeData = async (url: string, isJSON: boolean, options?: RequestInit) => {\r\n try {\r\n //console.log(`CORS HTTP request started (${url})`);\r\n\r\n const res = await fetchData(\r\n toCorsSafeUrl(url), \r\n {\r\n headers: {\r\n // https://github.com/airdcpp-web/airdcpp-webclient/issues/330\r\n 'X-Authorization': LoginStore.authToken,\r\n\r\n // Temp workaround for people upgrading from versions < 2.7.0\r\n // If the new UI was loaded before restarting the app, a cache expiration time of \r\n // one year would have been set for \"Not found\" errors...\r\n 'Cache-Control': 'no-store, must-revalidate, max-age=0'\r\n },\r\n ...options,\r\n }\r\n );\r\n\r\n const data = await isJSON ? res.json() : res.text();\r\n return data;\r\n } catch (e) {\r\n console.error(`CORS HTTP request failed (${url})`, e);\r\n throw e;\r\n }\r\n};\r\n","\r\nimport ShareConstants from 'constants/ShareConstants';\r\nimport SocketService from 'services/SocketService';\r\n\r\nimport { uploadTempFile } from '../HttpService';\r\n\r\nimport * as API from 'types/api';\r\n\r\n\r\nexport interface AddTempShareResponse { \r\n magnet: string; \r\n}\r\n\r\nexport const shareTempFile = async (\r\n file: File, hubUrl: string, cid: string | undefined\r\n): Promise<AddTempShareResponse> => {\r\n try {\r\n const fileId = await uploadTempFile(file);\r\n const res = await SocketService.post<AddTempShareResponse>(ShareConstants.TEMP_SHARES_URL, {\r\n name: file.name,\r\n file_id: fileId,\r\n hub_url: hubUrl,\r\n cid,\r\n });\r\n\r\n return res;\r\n } catch (e) {\r\n throw e;\r\n }\r\n};\r\n\r\n\r\nexport const refresh = (incoming: boolean) => {\r\n return SocketService.post(ShareConstants.REFRESH_URL, {\r\n incoming,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshPaths = (paths: string[]) => {\r\n return SocketService.post(ShareConstants.REFRESH_PATHS_URL, { \r\n paths,\r\n priority: API.RefreshPriorityTypeEnum.MANUAL,\r\n });\r\n};\r\n\r\nexport const refreshVirtual = (path: string) => {\r\n return SocketService.post(ShareConstants.REFRESH_VIRTUAL_URL, { \r\n path,\r\n });\r\n};\r\n\r\nexport const abortRefreshTask = (id: number) => {\r\n return SocketService.delete(`${ShareConstants.REFRESH_TASKS_URL}/${id}`);\r\n};\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","DupeStrings","DupePaths","paths","className","map","path","FileItemInfoGrid","session","fileItem","user","downloadHandler","showPath","t","useTranslation","gridT","text","Grid","columns","stackable","title","name","type","str","size","time","tth","dupe","caption","button","itemInfoGetter","contextElement","MODULE_URL","PROFILES_URL","PROFILE_ADDED","PROFILE_UPDATED","PROFILE_REMOVED","HIDDEN_PROFILE_ID","profileToEnumValue","profile","Component","listHidden","dataProviderDecoratorSettings","addSize","merge","urls","profiles","dataConverters","data","filter","p","convertProfile","onSocketConnected","addSocketListener","refetchData","entries","entryTitleRenderer","hasSession","entryIcon","length","entry","index","header","description","last_opened","defaultValue","replace","timeAgo","icon","entryType","socket","get","itemMenuIds","itemNameGetter","nicks","itemStatusGetter","flags","itemHeaderDescriptionGetter","hub_names","itemHeaderIconGetter","itemHeaderTitleGetter","location","actionMenu","ids","remoteMenuId","FilelistSessionActionsDecorated","SessionActionDecorator","FilelistConstants","moduleId","actions","ShareProfileSelector","onClick","this","props","onProfileChanged","getDropdownItem","MenuItemLink","render","sessionT","Dropdown","translate","triggerIcon","ShareProfileDecorator","FilelistNew","handleSubmit","FilelistSessionStore","profileId","recentUserRender","_","cid","onChange","offlineMessage","isClearable","autoFocus","RecentLayout","IconConstants","FilelistItemActions","reloadDirectory","displayName","access","partial_list","isPartialList","item","isDirectory","handler","SocketService","list_path","reload","refreshShare","indexOf","details","History","pathname","isRoot","subId","FilelistItemGetter","itemId","FilelistItemInfoDialog","Modal","closable","FileIcon","typeInfo","fullHeight","DownloadDialog","itemDataGetter","userGetter","Decorated","ModalRouteDecorator","DataProviderDecorator","match","params","_viewName","_apiUrl","_sessionStore","mixins","ViewStoreMixin","NameCell","rowDataGetter","onClickDirectory","other","useMemo","clickHandlerGetter","entityId","MenuConstants","itemData","FilelistItemTable","rowClassNameGetter","rowData","emptyRowsNodeGetter","state","Message","files","directories","Loader","complete","cellData","VirtualTable","store","FilelistViewStore","viewId","sessionStore","Column","width","columnKey","cell","flexGrow","hideWidth","ListBrowser","hasClickedDirectory","routerWillLeave","nextLocation","action","NotificationActions","message","handleClickDirectory","directory","sendChangeDirectory","plainT","getCurrentDirectory","selectedNameFormatter","filelistItemFetcher","componentDidMount","locationData","componentDidUpdate","prevProps","newLocationData","oldLocationData","BrowserBar","separator","rootPath","rootName","itemClickHandler","locationText","SessionFooter","label","total_size","FilelistSession","ActiveSessionDecorator","UserItemHandler","UserItemHandlerDecorator","ItemHandler","itemLabelGetter","share_profile","SessionProviderDecorator","SessionLayout","activeId","baseUrl","newCaption","newDescription","newIcon","disableSideMenu","editAccess","uiActions","sessionApi","unreadInfoStore","sessionItemLayout","newLayout","uploadTempFile","file","getBasePath","method","headers","body","e","fetchCorsSafeData","url","isJSON","res","window","origin","encodeURIComponent","toCorsSafeUrl","json","console","error","shareTempFile","hubUrl","fileId","file_id","hub_url","refreshPaths","priority","refreshVirtual","abortRefreshTask"],"sourceRoot":""}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[372],{95007:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(87537),r=n.n(s),i=n(23645),o=n.n(i)()(r());o.push([e.id,'.file.session {\r\n flex: 1 1 auto;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 100%;\r\n max-width: 100%;\r\n margin-top: 10px;\r\n}\r\n\r\n.file.session .content {\r\n flex: 1;\r\n overflow: auto;\r\n}\r\n\r\n.file.session .content pre {\r\n overflow: initial;\r\n}\r\n\r\n.file.session.nfo .file-content pre {\r\n font-family: "Courier New", "DejaVu Sans Mono", monospace;\r\n font-size: 11px;\r\n line-height: 12px;\r\n padding: 3px;\r\n margin: 0px;\r\n}\r\n\r\n.file.session img, \r\n.file.session video {\r\n max-width: 100%;\r\n max-height: 99%;\r\n}\r\n\r\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\r\n:-webkit-full-screen-ancestor:not(iframe) {\r\n max-width: inherit !important;\r\n overflow-x: initial;\r\n}\r\n\r\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\r\n visibility: hidden;\r\n}',"",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Files/style.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB",sourcesContent:['.file.session {\r\n flex: 1 1 auto;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 100%;\r\n max-width: 100%;\r\n margin-top: 10px;\r\n}\r\n\r\n.file.session .content {\r\n flex: 1;\r\n overflow: auto;\r\n}\r\n\r\n.file.session .content pre {\r\n overflow: initial;\r\n}\r\n\r\n.file.session.nfo .file-content pre {\r\n font-family: "Courier New", "DejaVu Sans Mono", monospace;\r\n font-size: 11px;\r\n line-height: 12px;\r\n padding: 3px;\r\n margin: 0px;\r\n}\r\n\r\n.file.session img, \r\n.file.session video {\r\n max-width: 100%;\r\n max-height: 99%;\r\n}\r\n\r\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\r\n:-webkit-full-screen-ancestor:not(iframe) {\r\n max-width: inherit !important;\r\n overflow-x: initial;\r\n}\r\n\r\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\r\n visibility: hidden;\r\n}'],sourceRoot:""}]);const a=o},87136:(e,t,n)=>{n.d(t,{Gj:()=>a,vf:()=>l,wR:()=>p,yi:()=>A});var s=n(85893),r=n(67294);const i=e=>{const t=e.target.error;switch(t.code){case t.MEDIA_ERR_NETWORK:return"A network error caused the media download to fail";case t.MEDIA_ERR_DECODE:return"The media playback was aborted due to a corruption problem or because the media used features your browser did not support";case t.MEDIA_ERR_SRC_NOT_SUPPORTED:return"The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser";default:return"An unknown media error occurred"}};function o(e){class t extends r.Component{constructor(){super(...arguments),this.state={error:null},this.onMediaError=e=>{this.setState({error:i(e)})},this.setMediaRef=e=>{this.media=e}}componentDidUpdate(e){e.url!==this.props.url&&(this.media&&this.media.load(),this.setState({error:null}))}render(){if(this.state.error)return(0,s.jsx)("div",{children:this.state.error},void 0);const{url:t,autoPlay:n}=this.props,r={onError:this.onMediaError,autoPlay:n,controls:!0,src:t};return(0,s.jsx)(e,Object.assign({},this.props,{mediaRef:this.setMediaRef,mediaProps:r}),void 0)}}return t}const a=o((({mediaRef:e,mediaProps:t})=>(0,s.jsx)("audio",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},t),void 0))),l=({url:e})=>(0,s.jsx)("img",{src:e,style:{maxWidth:"100%",maxHeight:"100%"}},void 0);var d=n(64935),c=n(27695),u=n(32347),m=n(8717),h=n(26793),f=n(54883);const p=({textGetter:e,url:t})=>{const[n,i]=(0,r.useState)(null),[o,a]=(0,r.useState)(null),{t:l}=(0,h.$)();return(0,r.useEffect)((()=>(e().then(i).catch(a),()=>{i(null),a(null)})),[t]),n?(0,s.jsx)("pre",{children:(0,s.jsx)(d.lB,{text:n},void 0)},void 0):o?(0,s.jsx)(c.Z,{title:(0,m.Iu)("Failed to fetch content",l,u.jv.COMMON),description:o.message},void 0):(0,s.jsx)(f.Z,{},void 0)},A=o((({mediaRef:e,mediaProps:t})=>(0,s.jsx)("video",Object.assign({ref:t=>e(t),style:{maxWidth:"100%",maxHeight:"100%"}},t),void 0)))},24101:(e,t,n)=>{n.d(t,{X2:()=>c,h4:()=>u,rj:()=>m});var s=n(85893),r=(n(67294),n(94184)),i=n.n(r),o=n(
|
|
2
|
-
//# sourceMappingURL=files.
|
|
1
|
+
"use strict";(self.webpackChunkairdcpp_webui=self.webpackChunkairdcpp_webui||[]).push([[372],{95007:(e,t,n)=>{n.d(t,{Z:()=>a});var s=n(87537),r=n.n(s),i=n(23645),o=n.n(i)()(r());o.push([e.id,'.file.session {\r\n flex: 1 1 auto;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 100%;\r\n max-width: 100%;\r\n margin-top: 10px;\r\n}\r\n\r\n.file.session .content {\r\n flex: 1;\r\n overflow: auto;\r\n}\r\n\r\n.file.session .content pre {\r\n overflow: initial;\r\n}\r\n\r\n.file.session.nfo .file-content pre {\r\n font-family: "Courier New", "DejaVu Sans Mono", monospace;\r\n font-size: 11px;\r\n line-height: 12px;\r\n padding: 3px;\r\n margin: 0px;\r\n}\r\n\r\n.file.session img, \r\n.file.session video {\r\n max-width: 100%;\r\n max-height: 99%;\r\n}\r\n\r\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\r\n:-webkit-full-screen-ancestor:not(iframe) {\r\n max-width: inherit !important;\r\n overflow-x: initial;\r\n}\r\n\r\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\r\n visibility: hidden;\r\n}',"",{version:3,sources:["webpack://./src/routes/Sidebar/routes/Files/style.css"],names:[],mappings:"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB",sourcesContent:['.file.session {\r\n flex: 1 1 auto;\r\n display: flex;\r\n flex-direction: column;\r\n max-height: 100%;\r\n max-width: 100%;\r\n margin-top: 10px;\r\n}\r\n\r\n.file.session .content {\r\n flex: 1;\r\n overflow: auto;\r\n}\r\n\r\n.file.session .content pre {\r\n overflow: initial;\r\n}\r\n\r\n.file.session.nfo .file-content pre {\r\n font-family: "Courier New", "DejaVu Sans Mono", monospace;\r\n font-size: 11px;\r\n line-height: 12px;\r\n padding: 3px;\r\n margin: 0px;\r\n}\r\n\r\n.file.session img, \r\n.file.session video {\r\n max-width: 100%;\r\n max-height: 99%;\r\n}\r\n\r\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\r\n:-webkit-full-screen-ancestor:not(iframe) {\r\n max-width: inherit !important;\r\n overflow-x: initial;\r\n}\r\n\r\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\r\n visibility: hidden;\r\n}'],sourceRoot:""}]);const a=o},87136:(e,t,n)=>{n.d(t,{Gj:()=>a,vf:()=>l,wR:()=>p,yi:()=>A});var s=n(85893),r=n(67294);const i=e=>{const t=e.target.error;switch(t.code){case t.MEDIA_ERR_NETWORK:return"A network error caused the media download to fail";case t.MEDIA_ERR_DECODE:return"The media playback was aborted due to a corruption problem or because the media used features your browser did not support";case t.MEDIA_ERR_SRC_NOT_SUPPORTED:return"The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser";default:return"An unknown media error occurred"}};function o(e){class t extends r.Component{constructor(){super(...arguments),this.state={error:null},this.onMediaError=e=>{this.setState({error:i(e)})},this.setMediaRef=e=>{this.media=e}}componentDidUpdate(e){e.url!==this.props.url&&(this.media&&this.media.load(),this.setState({error:null}))}render(){if(this.state.error)return(0,s.jsx)("div",{children:this.state.error},void 0);const{url:t,autoPlay:n}=this.props,r={onError:this.onMediaError,autoPlay:n,controls:!0,src:t};return(0,s.jsx)(e,Object.assign({},this.props,{mediaRef:this.setMediaRef,mediaProps:r}),void 0)}}return t}const a=o((({mediaRef:e,mediaProps:t})=>(0,s.jsx)("audio",Object.assign({ref:e,style:{maxWidth:"100%",maxHeight:"100%"}},t),void 0))),l=({url:e})=>(0,s.jsx)("img",{src:e,style:{maxWidth:"100%",maxHeight:"100%"}},void 0);var d=n(64935),c=n(27695),u=n(32347),m=n(8717),h=n(26793),f=n(54883);const p=({textGetter:e,url:t})=>{const[n,i]=(0,r.useState)(null),[o,a]=(0,r.useState)(null),{t:l}=(0,h.$)();return(0,r.useEffect)((()=>(e().then(i).catch(a),()=>{i(null),a(null)})),[t]),n?(0,s.jsx)("pre",{children:(0,s.jsx)(d.lB,{text:n},void 0)},void 0):o?(0,s.jsx)(c.Z,{title:(0,m.Iu)("Failed to fetch content",l,u.jv.COMMON),description:o.message},void 0):(0,s.jsx)(f.Z,{},void 0)},A=o((({mediaRef:e,mediaProps:t})=>(0,s.jsx)("video",Object.assign({ref:t=>e(t),style:{maxWidth:"100%",maxHeight:"100%"}},t),void 0)))},24101:(e,t,n)=>{n.d(t,{X2:()=>c,h4:()=>u,rj:()=>m});var s=n(85893),r=(n(67294),n(94184)),i=n.n(r),o=n(85444),a=n(8717),l=n(32347);const d=e=>e||(0,s.jsx)(o.c,Object.assign({i18nKey:(0,a.zS)("na",l.jv.COMMON)},{children:"N/A"}),void 0),c=({title:e,text:t,className:n,titleWidth:r="four",noText:o})=>(0,s.jsxs)("div",Object.assign({className:i()("ui row",n)},{children:[(0,s.jsx)("div",Object.assign({className:i()(o?"sixteen":r,"wide column title")},{children:(0,s.jsx)("div",Object.assign({className:"ui tiny header",style:{overflow:"hidden"}},{children:e}),void 0)}),void 0),!o&&(0,s.jsx)("div",Object.assign({className:"column value"},{children:d(t)}),void 0)]}),void 0),u=({title:e})=>(0,s.jsx)("div",Object.assign({className:"ui row"},{children:(0,s.jsx)("div",Object.assign({className:"sixteen wide column"},{children:(0,s.jsx)("div",Object.assign({className:"ui blue section header"},{children:e}),void 0)}),void 0)}),void 0),m=e=>{var{className:t,children:n,columns:r,stackable:o}=e,a=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["className","children","columns","stackable"]);return(0,s.jsx)("div",Object.assign({className:i()("ui grid",{[`${r} column`]:!!r},{stackable:o},t)},a,{children:n}),void 0)}},37354:(e,t,n)=>{n.d(t,{Z:()=>i});var s=n(85893),r=n(67294);function i(e,t=60){class n extends r.Component{constructor(){super(...arguments),this.scheduleComponentRefresh=()=>{this.redrawTimeout=window.setTimeout((()=>{this.forceUpdate(),this.scheduleComponentRefresh()}),1e3*t)}}componentDidMount(){this.scheduleComponentRefresh()}componentWillUnmount(){clearTimeout(this.redrawTimeout)}render(){return(0,s.jsx)(e,Object.assign({},this.props),void 0)}}return n}},76606:(e,t,n)=>{n.r(t),n.d(t,{default:()=>Q});var s=n(85893),r=n(67294),i=n(10907),o=n(62007),a=n(22862),l=n(38982),d=n(76249),c=n(32347);const u=(0,l.Z)({},a.Z.SESSIONS_URL,d.PS.VIEW_FILE_EDIT),m={moduleId:c.jv.VIEWED_FILES,actions:u};var h=n(85105),f=n(20368),p=n(27695),A=n(94184),x=n.n(A),v=n(48117),b=n(54883),j=n(8576),E=n(37354),w=n(2445),y=n(88998),g=n(10606);const O=(0,E.Z)((({item:e,sessionT:t})=>{if((0,g.wd)())return null;const n=e.download_state;return(0,s.jsx)(y.C,{children:(0,s.jsx)(y.o,{label:t.translate(n?"Downloaded":"Opened"),text:(0,w.SY)(n?n.time_finished:e.time_opened)},void 0)},void 0)}));var C=n(66883),_=n(87136),S=n(30381),B=n.n(S),I=n(37576),R=n(99311);const N=e=>B().duration(B()().diff(B().unix(e.time_opened))).asMinutes()<=1,Z=(0,r.memo)((({session:e,sessionT:t,scrollPositionHandler:n})=>{const{scrollable:r,restoreScrollPosition:i}=(0,R.r)(n,e),o=(e=>{if(e.text)return e=>(0,s.jsx)(_.wR,Object.assign({},e,{textGetter:()=>(0,I.r)(e.url).then((e=>e.text())).then((t=>(e.onReady(),t))),url:e.url}),void 0);switch(e.type.content_type){case"audio":return t=>(0,s.jsx)(_.Gj,Object.assign({autoPlay:N(e)},t),void 0);case"picture":return e=>(0,s.jsx)(_.vf,Object.assign({},e),void 0);case"video":return t=>(0,s.jsx)(_.yi,Object.assign({autoPlay:N(e)},t),void 0)}return null})(e);let a;var l;return a=o?(0,s.jsx)(o,{item:e,url:(l=e.tth,`${getBasePath()}view/${l}?auth_token=${C.Z.authToken}`),type:e.mime_type,extension:e.type.str,sessionT:t,onReady:i},void 0):t.translate("Unsupported format"),(0,s.jsx)("div",Object.assign({ref:r,className:"content"},{children:a}),void 0)}));class P extends r.Component{render(){const{session:e,sessionT:t}=this.props;return e.content_ready?(0,s.jsxs)("div",Object.assign({className:x()("file session",e.type.str,e.type.content_type)},{children:[(0,s.jsx)(Z,{session:e,sessionT:t,scrollPositionHandler:o.Z.scroll},void 0),(0,s.jsx)(O,{item:e,sessionT:t},void 0)]}),void 0):"download_failed"===e.download_state.id?(0,s.jsx)("div",Object.assign({className:"file session"},{children:(0,s.jsx)(p.Z,{icon:v.Z.ERROR,title:t.translate("Download failed"),description:e.download_state.str},void 0)}),void 0):(0,s.jsx)(b.Z,{text:e.download_state.str},void 0)}}const T=(0,j.Z)(P);var k=n(93379),D=n.n(k),M=n(7795),W=n.n(M),F=n(90569),G=n.n(F),L=n(3565),H=n.n(L),U=n(19216),V=n.n(U),z=n(44589),$=n.n(z),Y=n(95007),K={};K.styleTagTransform=$(),K.setAttributes=H(),K.insert=G().bind(null,"head"),K.domAPI=W(),K.insertStyleElement=V(),D()(Y.Z,K),Y.Z&&Y.Z.locals&&Y.Z.locals;var J=n(93101),X=n(8717);const q={itemNameGetter:e=>e.name,itemLabelGetter:e=>null,itemHeaderDescriptionGetter:e=>null,itemHeaderIconGetter:e=>(0,s.jsx)(f.Z,{typeInfo:e.type},void 0)},Q=(0,J.J)((e=>{const{match:t,t:n}=e,r=function(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(e);r<s.length;r++)t.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(e,s[r])&&(n[s[r]]=e[s[r]])}return n}(e,["match","t"]);return 0===e.items.length?(0,s.jsx)(p.Z,{title:n((0,X.zS)("noFiles",c.jv.VIEWED_FILES),"No files to view"),description:n((0,X.zS)("noFilesDesc",c.jv.VIEWED_FILES),"You may open text or media files to be viewed here from search or filelists")},void 0):(0,s.jsx)(i.Z,Object.assign({activeId:t.params.id,baseUrl:"files",disableSideMenu:!0,editAccess:d.PS.VIEW_FILE_EDIT,uiActions:m,sessionApi:h.Z,unreadInfoStore:o.Z,sessionItemLayout:T,t:n},q,r),void 0)}),o.Z)}}]);
|
|
2
|
+
//# sourceMappingURL=files.50c047ffc599c58eb13a.chunk.js.map
|
|
Binary file
|
package/dist/js/{files.9b2b25680e1e04de1931.chunk.js.map → files.50c047ffc599c58eb13a.chunk.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"js/files.9b2b25680e1e04de1931.chunk.js","mappings":"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","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/style.css","webpack://airdcpp-webui/./src/components/file-preview/decorators/MediaFileDecorator.tsx","webpack://airdcpp-webui/./src/components/file-preview/AudioFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/ImageFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/TextFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/VideoFile.tsx","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/decorators/RedrawDecorator.tsx","webpack://airdcpp-webui/./src/actions/ui/ViewFileActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileContent.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/style.css?5f3e","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/Files.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, \".file.session {\\r\\n flex: 1 1 auto;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n max-height: 100%;\\r\\n max-width: 100%;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.file.session .content {\\r\\n flex: 1;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.file.session .content pre {\\r\\n overflow: initial;\\r\\n}\\r\\n\\r\\n.file.session.nfo .file-content pre {\\r\\n font-family: \\\"Courier New\\\", \\\"DejaVu Sans Mono\\\", monospace;\\r\\n font-size: 11px;\\r\\n line-height: 12px;\\r\\n padding: 3px;\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.file.session img, \\r\\n.file.session video {\\r\\n max-width: 100%;\\r\\n max-height: 99%;\\r\\n}\\r\\n\\r\\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\\r\\n:-webkit-full-screen-ancestor:not(iframe) {\\r\\n max-width: inherit !important;\\r\\n overflow-x: initial;\\r\\n}\\r\\n\\r\\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\\r\\n visibility: hidden;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Files/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB\",\"sourcesContent\":[\".file.session {\\r\\n flex: 1 1 auto;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n max-height: 100%;\\r\\n max-width: 100%;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.file.session .content {\\r\\n flex: 1;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.file.session .content pre {\\r\\n overflow: initial;\\r\\n}\\r\\n\\r\\n.file.session.nfo .file-content pre {\\r\\n font-family: \\\"Courier New\\\", \\\"DejaVu Sans Mono\\\", monospace;\\r\\n font-size: 11px;\\r\\n line-height: 12px;\\r\\n padding: 3px;\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.file.session img, \\r\\n.file.session video {\\r\\n max-width: 100%;\\r\\n max-height: 99%;\\r\\n}\\r\\n\\r\\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\\r\\n:-webkit-full-screen-ancestor:not(iframe) {\\r\\n max-width: inherit !important;\\r\\n overflow-x: initial;\\r\\n}\\r\\n\\r\\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\\r\\n visibility: hidden;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import * as React from 'react';\r\n\r\n//import Moment from 'moment';\r\n\r\n\r\nconst formatMediaError = (event: React.SyntheticEvent<HTMLMediaElement>) => {\r\n const error: MediaError = (event.target as any).error;\r\n switch (error.code) {\r\n case error.MEDIA_ERR_NETWORK:\r\n return 'A network error caused the media download to fail';\r\n case error.MEDIA_ERR_DECODE:\r\n // tslint:disable-next-line:max-line-length\r\n return 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support';\r\n case error.MEDIA_ERR_SRC_NOT_SUPPORTED:\r\n // tslint:disable-next-line:max-line-length\r\n return 'The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser';\r\n default:\r\n return 'An unknown media error occurred';\r\n }\r\n};\r\n\r\n\r\nexport interface MediaFileDecoratorChildProps extends Pick<MediaFileDecoratorProps, 'url'> {\r\n mediaRef: (c: HTMLMediaElement) => void;\r\n mediaProps: {\r\n onError: (event: React.SyntheticEvent<HTMLMediaElement>) => void;\r\n autoPlay: boolean;\r\n controls: boolean;\r\n src: string;\r\n };\r\n}\r\n\r\nexport interface MediaFileDecoratorProps {\r\n url: string;\r\n autoPlay: boolean;\r\n}\r\n\r\nexport default function (\r\n Component: React.ComponentType<MediaFileDecoratorChildProps>\r\n) {\r\n class MediaFileDecorator extends React.Component<MediaFileDecoratorProps> {\r\n state = {\r\n error: null,\r\n };\r\n\r\n media: HTMLMediaElement;\r\n\r\n componentDidUpdate(prevProps: MediaFileDecoratorProps) {\r\n if (prevProps.url !== this.props.url) {\r\n if (this.media) {\r\n this.media.load();\r\n }\r\n\r\n // Reset the error when switching between items\r\n this.setState({ error: null });\r\n }\r\n }\r\n\r\n onMediaError = (event: React.SyntheticEvent<HTMLMediaElement>) => {\r\n this.setState({ \r\n error: formatMediaError(event) \r\n });\r\n }\r\n\r\n setMediaRef = (c: HTMLMediaElement) => {\r\n this.media = c;\r\n }\r\n\r\n render() {\r\n if (this.state.error) {\r\n return (\r\n <div>\r\n { this.state.error }\r\n </div>\r\n );\t\r\n }\r\n\r\n const { url, autoPlay } = this.props;\r\n const mediaProps = {\r\n onError: this.onMediaError,\r\n autoPlay,\r\n controls: true,\r\n src: url,\r\n };\r\n\r\n return (\r\n <Component \r\n { ...this.props } \r\n mediaRef={ this.setMediaRef }\r\n mediaProps={ mediaProps }\r\n />\r\n );\r\n }\r\n }\r\n\r\n return MediaFileDecorator;\r\n}\r\n","import * as React from 'react';\r\n\r\nimport MediaFileDecorator, { \r\n MediaFileDecoratorChildProps \r\n} from './decorators/MediaFileDecorator';\r\n\r\n\r\nconst AudioFile: React.FC<MediaFileDecoratorChildProps> = ({ mediaRef, mediaProps }) => (\r\n <audio \r\n ref={ mediaRef } \r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n { ...mediaProps }\r\n />\r\n);\r\n\r\nconst AudioFileDecorated = MediaFileDecorator(AudioFile);\r\n\r\nexport { AudioFileDecorated as AudioFile };\r\n","import * as React from 'react';\r\n\r\n\r\ninterface ImageFileProps extends React.ImgHTMLAttributes<HTMLImageElement> {\r\n url: string;\r\n}\r\n\r\nconst ImageFile: React.FC<ImageFileProps> = ({ url }) => (\r\n <img \r\n src={ url }\r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n />\r\n);\r\n\r\nexport { ImageFile };","import { useEffect, useState } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport { TextDecorator } from 'components/text';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport Loader from 'components/semantic/Loader';\r\n\r\n\r\ninterface TextFileProps {\r\n textGetter: () => Promise<string>;\r\n url?: string;\r\n}\r\n\r\nconst TextFile: React.FC<TextFileProps> = ({ textGetter, url }) => {\r\n const [ text, setText ] = useState<string | null>(null);\r\n const [ error, setError ] = useState<Error | null>(null);\r\n\r\n const { t } = useTranslation();\r\n useEffect(\r\n () => {\r\n textGetter()\r\n .then(setText)\r\n .catch(setError);\r\n\r\n return () => {\r\n setText(null);\r\n setError(null);\r\n };\r\n },\r\n [ url ]\r\n );\r\n\r\n if (!text) {\r\n if (error) {\r\n return (\r\n <Message\r\n title={ translate('Failed to fetch content', t, UI.Modules.COMMON) }\r\n description={ error.message }\r\n />\r\n );\r\n }\r\n\r\n return <Loader/>;\r\n }\r\n\r\n return (\r\n <pre>\r\n <TextDecorator\r\n text={ text }\r\n />\r\n </pre>\r\n );\r\n};\r\n\r\nexport { TextFile };\r\n","import * as React from 'react';\r\n\r\nimport MediaFileDecorator, { \r\n MediaFileDecoratorChildProps \r\n} from './decorators/MediaFileDecorator';\r\n\r\n\r\nconst VideoFile: React.FC<MediaFileDecoratorChildProps> = ({ mediaRef, mediaProps }) => (\r\n <video \r\n ref={ c => mediaRef(c!) } \r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n { ...mediaProps }\r\n />\r\n);\r\n\r\nconst VideoFileDecorated = MediaFileDecorator(VideoFile);\r\n\r\nexport { VideoFileDecorated as VideoFile };\r\n","\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nexport interface RowProps {\r\n title: React.ReactNode;\r\n text?: React.ReactNode;\r\n titleWidth?: string;\r\n className?: string;\r\n noText?: boolean;\r\n}\r\n\r\n\r\n\r\nconst formatText = (text: React.ReactNode) => {\r\n if (!!text) {\r\n return text;\r\n }\r\n \r\n return (\r\n <Trans \r\n i18nKey={ toI18nKey('na', UI.Modules.COMMON) }\r\n >\r\n N/A\r\n </Trans>\r\n );\r\n};\r\n\r\nexport const Row: React.FC<RowProps> = ({ title, text, className, titleWidth = 'four', noText }) => (\r\n <div className={ classNames('ui row', className) }>\r\n <div className={ classNames(noText ? 'sixteen' : titleWidth, 'wide column title') }>\r\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\r\n { title }\r\n </div>\r\n </div>\r\n { !noText && (\r\n <div className=\"column value\">\r\n { formatText(text) }\r\n </div> \r\n ) }\r\n </div>\r\n);\r\n\r\nexport interface HeaderProps {\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\r\n <div className=\"ui row\">\r\n <div className=\"sixteen wide column\">\r\n <div className=\"ui blue section header\">\r\n { title }\r\n </div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: string;\r\n stackable?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({ className, children, columns, stackable, ...other }) => (\r\n <div \r\n className={ classNames(\r\n 'ui grid', \r\n //`${columns} column`, \r\n { [`${columns} column`]: !!columns },\r\n { stackable: stackable },\r\n className\r\n ) }\r\n { ...other }\r\n >\r\n { children }\r\n </div>\r\n);\r\n","import * as React from 'react';\r\n\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT>, \r\n redrawIntervalSeconds: number = 60\r\n) {\r\n class RedrawDecorator extends React.Component<PropsT> {\r\n redrawTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.scheduleComponentRefresh();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.redrawTimeout);\r\n }\r\n\r\n scheduleComponentRefresh = () => {\r\n this.redrawTimeout = window.setTimeout(\r\n () => { \r\n this.forceUpdate();\r\n this.scheduleComponentRefresh();\r\n }, \r\n redrawIntervalSeconds * 1000\r\n );\r\n }\r\n\r\n render() {\r\n return <Component {...this.props}/>;\r\n }\r\n }\r\n\r\n return RedrawDecorator;\r\n}\r\n","import ViewFileConstants from 'constants/ViewFileConstants';\r\n\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst ViewFileActions: UI.ActionListType<API.ViewFile> = {};\r\n\r\nconst ViewFileActionsDecorated = SessionActionDecorator(\r\n ViewFileActions, \r\n ViewFileConstants.SESSIONS_URL, \r\n API.AccessEnum.VIEW_FILE_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.VIEWED_FILES,\r\n actions: ViewFileActionsDecorated,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\nimport { FooterItem, SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface FileFooterProps {\r\n item: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FileFooter: React.FC<FileFooterProps> = ({ item, sessionT }) => {\r\n if (useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n const downloadState = item.download_state;\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n label={ sessionT.translate(downloadState ? 'Downloaded' : 'Opened') } \r\n text={ formatRelativeTime(downloadState ? downloadState.time_finished : item.time_opened) }\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default RedrawDecorator(FileFooter);","import { memo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nimport { AudioFile, ImageFile, VideoFile, TextFile } from 'components/file-preview';\r\n\r\nimport Moment from 'moment';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { fetchData } from 'utils/HttpUtils';\r\nimport { useRestoreScroll } from 'effects';\r\n\r\n\r\nexport interface FileContentProps {\r\n session: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n scrollPositionHandler: UI.ScrollPositionHandler;\r\n}\r\n\r\ninterface ViewerElementProps {\r\n item: API.ViewFile;\r\n url: string;\r\n type: string;\r\n extension: string;\r\n sessionT: UI.ModuleTranslator;\r\n onReady: () => void;\r\n}\r\n\r\nconst useAutoPlay = (item: API.ViewFile) => {\r\n const diff = Moment.duration(Moment().diff(Moment.unix(item.time_opened)));\r\n return diff.asMinutes() <= 1;\r\n};\r\n\r\nconst getViewerElement = (item: API.ViewFile): React.ComponentType<ViewerElementProps> | null => {\r\n if (item.text) {\r\n return (props: ViewerElementProps) => (\r\n <TextFile\r\n {...props}\r\n textGetter={ () => {\r\n return fetchData(props.url)\r\n .then(data => data.text())\r\n .then(text => {\r\n props.onReady();\r\n return text;\r\n });\r\n }}\r\n url={ props.url }\r\n />\r\n );\r\n }\r\n\r\n switch (item.type.content_type) {\r\n case 'audio': return (props: ViewerElementProps) => (\r\n <AudioFile \r\n autoPlay={ useAutoPlay(item) }\r\n { ...props }\r\n />\r\n );\r\n case 'picture': return (props: ViewerElementProps) => (\r\n <ImageFile\r\n { ...props }\r\n />\r\n );\r\n case 'video': return (props: ViewerElementProps) => (\r\n <VideoFile\r\n autoPlay={ useAutoPlay(item) }\r\n { ...props }\r\n />\r\n );\r\n default:\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst getUrl = (tth: string) => {\r\n return `${getBasePath()}view/${tth}?auth_token=${LoginStore.authToken}`; \r\n};\r\n\r\nconst FileContent: React.FC<FileContentProps> = memo(({ session, sessionT, scrollPositionHandler }) => {\r\n const { scrollable, restoreScrollPosition } = useRestoreScroll(scrollPositionHandler, session);\r\n\r\n const ViewerElement = getViewerElement(session);\r\n\r\n let child;\r\n if (!ViewerElement) {\r\n child = sessionT.translate('Unsupported format');\r\n } else {\r\n child = (\r\n <ViewerElement \r\n item={ session }\r\n url={ getUrl(session.tth) }\r\n type={ session.mime_type }\r\n extension={ session.type.str }\r\n sessionT={ sessionT }\r\n onReady={restoreScrollPosition}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div \r\n ref={ scrollable } \r\n className=\"content\"\r\n >\r\n { child }\r\n </div>\r\n );\r\n});\r\n\r\nexport default FileContent;\r\n","import { Component } from 'react';\r\nimport cx from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport ActiveSessionDecorator from 'decorators/ActiveSessionDecorator';\r\nimport FileFooter from 'routes/Sidebar/routes/Files/components/FileFooter';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport FileContent from './FileContent';\r\nimport ViewFileStore from 'stores/ViewFileStore';\r\n\r\n\r\nexport interface FileSessionProps extends SessionChildProps<API.ViewFile> {\r\n session: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass FileSession extends Component<FileSessionProps> {\r\n render() {\r\n const { session, sessionT } = this.props;\r\n if (!session.content_ready) {\r\n if (session.download_state!.id === 'download_failed') {\r\n return (\r\n <div className=\"file session\">\r\n <Message \r\n icon={ IconConstants.ERROR }\r\n title={ sessionT.translate('Download failed') }\r\n description={ session.download_state!.str }\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return <Loader text={ session.download_state!.str }/>;\r\n }\r\n\r\n return (\r\n <div className={ cx('file session', session.type.str, session.type.content_type) }>\r\n <FileContent\r\n session={ session }\r\n sessionT={ sessionT }\r\n scrollPositionHandler={ ViewFileStore.scroll }\r\n />\r\n <FileFooter \r\n item={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ActiveSessionDecorator(FileSession);\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\n\r\nimport ViewFileStore from 'stores/ViewFileStore';\r\nimport ViewFileUIActions from 'actions/ui/ViewFileActions';\r\nimport ViewFileAPIActions from 'actions/reflux/ViewFileActions';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport FileSession from './FileSession';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecoratorChildProps, SessionProviderDecorator \r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\n\r\nconst ItemHandler: UI.SessionInfoGetter<API.ViewFile> = {\r\n itemNameGetter(session) {\r\n return session.name;\r\n },\r\n\r\n itemLabelGetter(session) {\r\n return null;\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return null;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <FileIcon typeInfo={ session.type }/>;\r\n },\r\n};\r\n\r\n\r\nconst Files: React.FC<SessionProviderDecoratorChildProps<API.ViewFile>> = props => {\r\n const { match, t, ...other } = props;\r\n if (props.items.length === 0) {\r\n return (\r\n <Message\r\n title={ t(toI18nKey('noFiles', UI.Modules.VIEWED_FILES), 'No files to view') }\r\n description={ t<string>(\r\n toI18nKey('noFilesDesc', UI.Modules.VIEWED_FILES), \r\n 'You may open text or media files to be viewed here from search or filelists'\r\n ) }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <SessionLayout\r\n activeId={ match.params.id }\r\n baseUrl=\"files\"\r\n disableSideMenu={ true }\r\n editAccess={ API.AccessEnum.VIEW_FILE_EDIT }\r\n uiActions={ ViewFileUIActions }\r\n sessionApi={ ViewFileAPIActions as UI.SessionActions<API.ViewFile> }\r\n unreadInfoStore={ ViewFileStore }\r\n sessionItemLayout={ FileSession }\r\n t={ t }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Files, ViewFileStore);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","formatMediaError","event","error","target","code","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","Component","MediaFileDecorator","state","onMediaError","this","setState","setMediaRef","c","media","componentDidUpdate","prevProps","url","props","load","render","autoPlay","mediaProps","onError","controls","src","mediaRef","AudioFileDecorated","ref","style","maxWidth","maxHeight","ImageFile","TextFile","textGetter","text","setText","useState","setError","t","useTranslation","useEffect","then","catch","Message","title","description","message","Loader","VideoFileDecorated","formatText","i18nKey","Row","className","titleWidth","noText","overflow","Header","Grid","children","columns","stackable","other","redrawIntervalSeconds","RedrawDecorator","scheduleComponentRefresh","redrawTimeout","window","setTimeout","forceUpdate","componentDidMount","componentWillUnmount","clearTimeout","ViewFileActionsDecorated","SessionActionDecorator","ViewFileConstants","moduleId","actions","item","sessionT","downloadState","download_state","SessionFooter","label","translate","time_finished","time_opened","useAutoPlay","diff","asMinutes","memo","session","scrollPositionHandler","scrollable","restoreScrollPosition","ViewerElement","data","onReady","type","content_type","getViewerElement","child","tth","getBasePath","LoginStore","mime_type","extension","str","FileSession","content_ready","ViewFileStore","icon","IconConstants","ActiveSessionDecorator","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","ItemHandler","itemNameGetter","name","itemLabelGetter","itemHeaderDescriptionGetter","itemHeaderIconGetter","FileIcon","typeInfo","SessionProviderDecorator","match","items","length","SessionLayout","activeId","params","baseUrl","disableSideMenu","editAccess","uiActions","sessionApi","unreadInfoStore","sessionItemLayout"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"js/files.50c047ffc599c58eb13a.chunk.js","mappings":"kKAGIA,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACC,EAAOC,GAAI,y3BAA83B,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,yDAAyD,MAAQ,GAAG,SAAW,uTAAuT,eAAiB,CAAC,03BAA83B,WAAa,MAEruE,W,uFCFA,MAAMC,EAAoBC,IACxB,MAAMC,EAAqBD,EAAME,OAAeD,MAChD,OAAQA,EAAME,MACZ,KAAKF,EAAMG,kBACT,MAAO,oDACT,KAAKH,EAAMI,iBAET,MAAO,6HACT,KAAKJ,EAAMK,4BAET,MAAO,8IACT,QACE,MAAO,oCAoBE,SAAS,EACtBC,GAEA,MAAMC,UAA2B,YAAjC,c,oBACE,KAAAC,MAAQ,CACNR,MAAO,MAgBT,KAAAS,aAAgBV,IACdW,KAAKC,SAAS,CACZX,MAAOF,EAAiBC,MAI5B,KAAAa,YAAeC,IACbH,KAAKI,MAAQD,GAlBfE,mBAAmBC,GACbA,EAAUC,MAAQP,KAAKQ,MAAMD,MAC3BP,KAAKI,OACPJ,KAAKI,MAAMK,OAIbT,KAAKC,SAAS,CAAEX,MAAO,QAc3BoB,SACE,GAAIV,KAAKF,MAAMR,MACb,OACE,yBACIU,KAAKF,MAAMR,YAAK,GAKxB,MAAM,IAAEiB,EAAG,SAAEI,GAAaX,KAAKQ,MACzBI,EAAa,CACjBC,QAASb,KAAKD,aACdY,SAAAA,EACAG,UAAU,EACVC,IAAKR,GAGP,OACE,SAACX,EAAS,iBACHI,KAAKQ,MAAK,CACfQ,SAAWhB,KAAKE,YAChBU,WAAaA,SAAU,IAM/B,OAAOf,ECxFT,MAWMoB,EAAqBpB,GAX+B,EAAGmB,SAAAA,EAAUJ,WAAAA,MACrE,gCACEM,IAAMF,EACNG,MAAO,CACLC,SAAU,OACVC,UAAW,SAERT,QAAU,KCPbU,EAAsC,EAAGf,IAAAA,MAC7C,gBACEQ,IAAMR,EACNY,MAAO,CACLC,SAAU,OACVC,UAAW,cACZ,G,qECIL,MAAME,EAAoC,EAAGC,WAAAA,EAAYjB,IAAAA,MACvD,MAAQkB,EAAMC,IAAY,IAAAC,UAAwB,OAC1CrC,EAAOsC,IAAa,IAAAD,UAAuB,OAE7C,EAAEE,IAAM,EAAAC,EAAA,KAed,OAdA,IAAAC,YACE,KACEP,IACGQ,KAAKN,GACLO,MAAML,GAEF,KACLF,EAAQ,MACRE,EAAS,SAGb,CAAErB,IAGCkB,GAcH,0BACE,SAAC,KAAa,CACZA,KAAOA,QAAI,SACX,GAhBAnC,GAEA,SAAC4C,EAAA,EAAO,CACNC,OAAQ,QAAU,0BAA2BN,EAAG,aAChDO,YAAc9C,EAAM+C,cAAO,IAK1B,SAACC,EAAA,EAAM,YC5BZC,EAAqB1C,GAX+B,EAAGmB,SAAAA,EAAUJ,WAAAA,MACrE,gCACEM,IAAMf,GAAKa,EAASb,GACpBgB,MAAO,CACLC,SAAU,OACVC,UAAW,SAERT,QAAU,M,kICMnB,MAAM4B,EAAcf,GACZA,IAKJ,SAAC,IAAK,eACJgB,SAAU,QAAU,KAAM,cAAkB,0BAOrCC,EAA0B,EAAGP,MAAAA,EAAOV,KAAAA,EAAMkB,UAAAA,EAAWC,WAAAA,EAAa,OAAQC,OAAAA,MACrF,+BAAKF,UAAY,IAAW,SAAUA,IAAU,YAC9C,8BAAKA,UAAY,IAAWE,EAAS,UAAYD,EAAY,sBAAoB,WAC/E,8BAAKD,UAAU,iBAAiBxB,MAAO,CAAE2B,SAAU,WAAU,UACzDX,SAAK,UACH,IAELU,IACD,8BAAKF,UAAU,gBAAc,UACzBH,EAAWf,UAAK,WAErB,GAQQsB,EAAgC,EAAGZ,MAAAA,MAC9C,8BAAKQ,UAAU,UAAQ,WACrB,8BAAKA,UAAU,uBAAqB,WAClC,8BAAKA,UAAU,0BAAwB,UACnCR,SAAK,UACH,UACF,GASGa,EAA6B,I,IAAA,UAAEL,EAAS,SAAEM,EAAQ,QAAEC,EAAO,UAAEC,GAAS,EAAKC,E,yUAAK,GAAnD,gDAA0D,OAClG,8BACET,UAAY,IACV,UAEA,CAAE,CAAC,GAAGO,cAAqBA,GAC3B,CAAEC,UAAWA,GACbR,IAEGS,EAAK,UAERH,SAAQ,K,2DC5EC,SAAS,EACtBrD,EACAyD,EAAgC,IAEhC,MAAMC,UAAwB,YAA9B,c,oBAWE,KAAAC,yBAA2B,KACzBvD,KAAKwD,cAAgBC,OAAOC,YAC1B,KACE1D,KAAK2D,cACL3D,KAAKuD,6BAEiB,IAAxBF,IAdJO,oBACE5D,KAAKuD,2BAGPM,uBACEC,aAAa9D,KAAKwD,eAapB9C,SACE,OAAO,SAACd,EAAS,iBAAKI,KAAKQ,YAAK,IAIpC,OAAO8C,I,0ICzBT,MAEMS,GAA2B,EAAAC,EAAA,GAFwB,GAIvDC,EAAA,eACA,qBAGF,GACEC,SAAU,kBACVC,QAASJ,G,oICFX,MAgBA,GAAe,EAAAT,EAAA,IAhB+B,EAAGc,KAAAA,EAAMC,SAAAA,MACrD,IAAI,UACF,OAAO,KAGT,MAAMC,EAAgBF,EAAKG,eAC3B,OACE,SAACC,EAAA,EAAa,WACZ,SAAC,IAAU,CACTC,MAAQJ,EAASK,UAAUJ,EAAgB,aAAe,UAC1D7C,MAAO,QAAmB6C,EAAgBA,EAAcK,cAAgBP,EAAKQ,mBAAY,SACzF,M,oECIR,MAAMC,EAAeT,GACN,aAAgB,MAASU,KAAK,SAAYV,EAAKQ,eAChDG,aAAe,EAgF7B,GA/BgD,IAAAC,OAAK,EAAGC,QAAAA,EAASZ,SAAAA,EAAUa,sBAAAA,MACzE,MAAM,WAAEC,EAAU,sBAAEC,IAA0B,OAAiBF,EAAuBD,GAEhFI,EAjDiB,CAACjB,IACxB,GAAIA,EAAK3C,KACP,OAAQjB,IACN,SAAC,KAAQ,iBACHA,EAAK,CACTgB,WAAa,KACJ,OAAUhB,EAAMD,KACpByB,MAAKsD,GAAQA,EAAK7D,SAClBO,MAAKP,IACJjB,EAAM+E,UACC9D,KAGblB,IAAMC,EAAMD,WAAG,GAKrB,OAAQ6D,EAAKoB,KAAKC,cAChB,IAAK,QAAS,OAAQjF,IACpB,SAAC,KAAS,eACRG,SAAWkE,EAAYT,IAClB5D,QAAK,GAGd,IAAK,UAAW,OAAQA,IACtB,SAAC,KAAS,iBACHA,QAAK,GAGd,IAAK,QAAS,OAAQA,IACpB,SAAC,KAAS,eACRG,SAAWkE,EAAYT,IAClB5D,QAAK,GAMhB,OAAO,MAUekF,CAAiBT,GAEvC,IAAIU,EATS,IAACC,EAyBd,OAZED,EAHGN,GAID,SAACA,EAAa,CACZjB,KAAOa,EACP1E,KAhBQqF,EAgBKX,EAAQW,IAfpB,GAAGC,qBAAqBD,gBAAkBE,EAAA,eAgB3CN,KAAOP,EAAQc,UACfC,UAAYf,EAAQO,KAAKS,IACzB5B,SAAWA,EACXkB,QAASH,QAAqB,GAT1Bf,EAASK,UAAU,uBAe3B,8BACExD,IAAMiE,EACNxC,UAAU,WAAS,UAEjBgD,SAAK,MCrFb,MAAMO,UAAoB,EAAAtG,UACxBc,SACE,MAAM,QAAEuE,EAAO,SAAEZ,GAAarE,KAAKQ,MACnC,OAAKyE,EAAQkB,eAiBX,+BAAKxD,UAAY,IAAG,eAAgBsC,EAAQO,KAAKS,IAAKhB,EAAQO,KAAKC,eAAa,YAC9E,SAAC,EAAW,CACVR,QAAUA,EACVZ,SAAWA,EACXa,sBAAwBkB,EAAA,eAAoB,IAE9C,SAAC,EAAU,CACThC,KAAOa,EACPZ,SAAWA,QAAQ,WACnB,GAzB+B,oBAA/BY,EAAQV,eAAgBpF,IAExB,8BAAKwD,UAAU,gBAAc,WAC3B,SAACT,EAAA,EAAO,CACNmE,KAAOC,EAAA,QACPnE,MAAQkC,EAASK,UAAU,mBAC3BtC,YAAc6C,EAAQV,eAAgB0B,UAAG,UACzC,IAKD,SAAC3D,EAAA,EAAM,CAACb,KAAOwD,EAAQV,eAAgB0B,UAAG,IAmBvD,SAAe,EAAAM,EAAA,GAAuBL,G,qIC/ClCM,EAAU,GAEdA,EAAQC,kBAAoB,IAC5BD,EAAQE,cAAgB,IAElBF,EAAQG,OAAS,SAAc,KAAM,QAE3CH,EAAQI,OAAS,IACjBJ,EAAQK,mBAAqB,IAEhB,IAAI,IAASL,GAKJ,KAAW,YAAiB,W,yBCHlD,MAAMM,EAAkD,CACtDC,eAAe9B,GACNA,EAAQ+B,KAGjBC,gBAAgBhC,GACP,KAGTiC,4BAA4BjC,GACnB,KAGTkC,qBAAqBlC,IACZ,SAACmC,EAAA,EAAQ,CAACC,SAAWpC,EAAQO,WAAI,IAoC5C,GAAe,EAAA8B,EAAA,IA/B2D9G,IACxE,MAAM,MAAE+G,EAAK,EAAE1F,GAAgBrB,EAAV4C,E,yUAAK,CAAK5C,EAAzB,eACN,OAA2B,IAAvBA,EAAMgH,MAAMC,QAEZ,SAACvF,EAAA,EAAO,CACNC,MAAQN,GAAE,QAAU,UAAW,mBAA0B,oBACzDO,YAAcP,GACZ,QAAU,cAAe,mBACzB,qFACD,IAML,SAAC6F,EAAA,EAAa,eACZC,SAAWJ,EAAMK,OAAOzI,GACxB0I,QAAQ,QACRC,iBAAkB,EAClBC,WAAa,oBACbC,UAAY,EACZC,WAAa,IACbC,gBAAkB9B,EAAA,EAClB+B,kBAAoB,EACpBtG,EAAIA,GACCiF,EACA1D,QAAK,KAK+BgD,EAAA","sources":["webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/style.css","webpack://airdcpp-webui/./src/components/file-preview/decorators/MediaFileDecorator.tsx","webpack://airdcpp-webui/./src/components/file-preview/AudioFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/ImageFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/TextFile.tsx","webpack://airdcpp-webui/./src/components/file-preview/VideoFile.tsx","webpack://airdcpp-webui/./src/components/semantic/Grid.tsx","webpack://airdcpp-webui/./src/decorators/RedrawDecorator.tsx","webpack://airdcpp-webui/./src/actions/ui/ViewFileActions.ts","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileFooter.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileContent.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/FileSession.tsx","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/style.css?5f3e","webpack://airdcpp-webui/./src/routes/Sidebar/routes/Files/components/Files.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, \".file.session {\\r\\n flex: 1 1 auto;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n max-height: 100%;\\r\\n max-width: 100%;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.file.session .content {\\r\\n flex: 1;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.file.session .content pre {\\r\\n overflow: initial;\\r\\n}\\r\\n\\r\\n.file.session.nfo .file-content pre {\\r\\n font-family: \\\"Courier New\\\", \\\"DejaVu Sans Mono\\\", monospace;\\r\\n font-size: 11px;\\r\\n line-height: 12px;\\r\\n padding: 3px;\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.file.session img, \\r\\n.file.session video {\\r\\n max-width: 100%;\\r\\n max-height: 99%;\\r\\n}\\r\\n\\r\\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\\r\\n:-webkit-full-screen-ancestor:not(iframe) {\\r\\n max-width: inherit !important;\\r\\n overflow-x: initial;\\r\\n}\\r\\n\\r\\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\\r\\n visibility: hidden;\\r\\n}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/routes/Sidebar/routes/Files/style.css\"],\"names\":[],\"mappings\":\"AAAA;EACE,cAAc;EACd,aAAa;EACb,sBAAsB;EACtB,gBAAgB;EAChB,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,OAAO;EACP,cAAc;AAChB;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,yDAAyD;EACzD,eAAe;EACf,iBAAiB;EACjB,YAAY;EACZ,WAAW;AACb;;AAEA;;EAEE,eAAe;EACf,eAAe;AACjB;;AAEA,8EAA8E;AAC9E;EACE,6BAA6B;EAC7B,mBAAmB;AACrB;;AAEA;EACE,kBAAkB;AACpB\",\"sourcesContent\":[\".file.session {\\r\\n flex: 1 1 auto;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n max-height: 100%;\\r\\n max-width: 100%;\\r\\n margin-top: 10px;\\r\\n}\\r\\n\\r\\n.file.session .content {\\r\\n flex: 1;\\r\\n overflow: auto;\\r\\n}\\r\\n\\r\\n.file.session .content pre {\\r\\n overflow: initial;\\r\\n}\\r\\n\\r\\n.file.session.nfo .file-content pre {\\r\\n font-family: \\\"Courier New\\\", \\\"DejaVu Sans Mono\\\", monospace;\\r\\n font-size: 11px;\\r\\n line-height: 12px;\\r\\n padding: 3px;\\r\\n margin: 0px;\\r\\n}\\r\\n\\r\\n.file.session img, \\r\\n.file.session video {\\r\\n max-width: 100%;\\r\\n max-height: 99%;\\r\\n}\\r\\n\\r\\n/* The fullscreen mode conflicts with layout styles in Webkit-based browsers */\\r\\n:-webkit-full-screen-ancestor:not(iframe) {\\r\\n max-width: inherit !important;\\r\\n overflow-x: initial;\\r\\n}\\r\\n\\r\\n:-webkit-full-screen-ancestor:not(iframe) #side-menu {\\r\\n visibility: hidden;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","import * as React from 'react';\r\n\r\n//import Moment from 'moment';\r\n\r\n\r\nconst formatMediaError = (event: React.SyntheticEvent<HTMLMediaElement>) => {\r\n const error: MediaError = (event.target as any).error;\r\n switch (error.code) {\r\n case error.MEDIA_ERR_NETWORK:\r\n return 'A network error caused the media download to fail';\r\n case error.MEDIA_ERR_DECODE:\r\n // tslint:disable-next-line:max-line-length\r\n return 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support';\r\n case error.MEDIA_ERR_SRC_NOT_SUPPORTED:\r\n // tslint:disable-next-line:max-line-length\r\n return 'The media could not be loaded, either because the file was not found, network failed or because the format is not supported by your browser';\r\n default:\r\n return 'An unknown media error occurred';\r\n }\r\n};\r\n\r\n\r\nexport interface MediaFileDecoratorChildProps extends Pick<MediaFileDecoratorProps, 'url'> {\r\n mediaRef: (c: HTMLMediaElement) => void;\r\n mediaProps: {\r\n onError: (event: React.SyntheticEvent<HTMLMediaElement>) => void;\r\n autoPlay: boolean;\r\n controls: boolean;\r\n src: string;\r\n };\r\n}\r\n\r\nexport interface MediaFileDecoratorProps {\r\n url: string;\r\n autoPlay: boolean;\r\n}\r\n\r\nexport default function (\r\n Component: React.ComponentType<MediaFileDecoratorChildProps>\r\n) {\r\n class MediaFileDecorator extends React.Component<MediaFileDecoratorProps> {\r\n state = {\r\n error: null,\r\n };\r\n\r\n media: HTMLMediaElement;\r\n\r\n componentDidUpdate(prevProps: MediaFileDecoratorProps) {\r\n if (prevProps.url !== this.props.url) {\r\n if (this.media) {\r\n this.media.load();\r\n }\r\n\r\n // Reset the error when switching between items\r\n this.setState({ error: null });\r\n }\r\n }\r\n\r\n onMediaError = (event: React.SyntheticEvent<HTMLMediaElement>) => {\r\n this.setState({ \r\n error: formatMediaError(event) \r\n });\r\n }\r\n\r\n setMediaRef = (c: HTMLMediaElement) => {\r\n this.media = c;\r\n }\r\n\r\n render() {\r\n if (this.state.error) {\r\n return (\r\n <div>\r\n { this.state.error }\r\n </div>\r\n );\t\r\n }\r\n\r\n const { url, autoPlay } = this.props;\r\n const mediaProps = {\r\n onError: this.onMediaError,\r\n autoPlay,\r\n controls: true,\r\n src: url,\r\n };\r\n\r\n return (\r\n <Component \r\n { ...this.props } \r\n mediaRef={ this.setMediaRef }\r\n mediaProps={ mediaProps }\r\n />\r\n );\r\n }\r\n }\r\n\r\n return MediaFileDecorator;\r\n}\r\n","import * as React from 'react';\r\n\r\nimport MediaFileDecorator, { \r\n MediaFileDecoratorChildProps \r\n} from './decorators/MediaFileDecorator';\r\n\r\n\r\nconst AudioFile: React.FC<MediaFileDecoratorChildProps> = ({ mediaRef, mediaProps }) => (\r\n <audio \r\n ref={ mediaRef } \r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n { ...mediaProps }\r\n />\r\n);\r\n\r\nconst AudioFileDecorated = MediaFileDecorator(AudioFile);\r\n\r\nexport { AudioFileDecorated as AudioFile };\r\n","import * as React from 'react';\r\n\r\n\r\ninterface ImageFileProps extends React.ImgHTMLAttributes<HTMLImageElement> {\r\n url: string;\r\n}\r\n\r\nconst ImageFile: React.FC<ImageFileProps> = ({ url }) => (\r\n <img \r\n src={ url }\r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n />\r\n);\r\n\r\nexport { ImageFile };","import { useEffect, useState } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport { TextDecorator } from 'components/text';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport * as UI from 'types/ui';\r\nimport { translate } from 'utils/TranslationUtils';\r\nimport { useTranslation } from 'react-i18next';\r\nimport Loader from 'components/semantic/Loader';\r\n\r\n\r\ninterface TextFileProps {\r\n textGetter: () => Promise<string>;\r\n url?: string;\r\n}\r\n\r\nconst TextFile: React.FC<TextFileProps> = ({ textGetter, url }) => {\r\n const [ text, setText ] = useState<string | null>(null);\r\n const [ error, setError ] = useState<Error | null>(null);\r\n\r\n const { t } = useTranslation();\r\n useEffect(\r\n () => {\r\n textGetter()\r\n .then(setText)\r\n .catch(setError);\r\n\r\n return () => {\r\n setText(null);\r\n setError(null);\r\n };\r\n },\r\n [ url ]\r\n );\r\n\r\n if (!text) {\r\n if (error) {\r\n return (\r\n <Message\r\n title={ translate('Failed to fetch content', t, UI.Modules.COMMON) }\r\n description={ error.message }\r\n />\r\n );\r\n }\r\n\r\n return <Loader/>;\r\n }\r\n\r\n return (\r\n <pre>\r\n <TextDecorator\r\n text={ text }\r\n />\r\n </pre>\r\n );\r\n};\r\n\r\nexport { TextFile };\r\n","import * as React from 'react';\r\n\r\nimport MediaFileDecorator, { \r\n MediaFileDecoratorChildProps \r\n} from './decorators/MediaFileDecorator';\r\n\r\n\r\nconst VideoFile: React.FC<MediaFileDecoratorChildProps> = ({ mediaRef, mediaProps }) => (\r\n <video \r\n ref={ c => mediaRef(c!) } \r\n style={{\r\n maxWidth: '100%',\r\n maxHeight: '100%',\r\n }}\r\n { ...mediaProps }\r\n />\r\n);\r\n\r\nconst VideoFileDecorated = MediaFileDecorator(VideoFile);\r\n\r\nexport { VideoFileDecorated as VideoFile };\r\n","\r\nimport * as React from 'react';\r\nimport classNames from 'classnames';\r\n\r\nimport { Trans } from 'react-i18next';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nexport interface RowProps {\r\n title: React.ReactNode;\r\n text?: React.ReactNode;\r\n titleWidth?: string;\r\n className?: string;\r\n noText?: boolean;\r\n}\r\n\r\n\r\n\r\nconst formatText = (text: React.ReactNode) => {\r\n if (!!text) {\r\n return text;\r\n }\r\n \r\n return (\r\n <Trans \r\n i18nKey={ toI18nKey('na', UI.Modules.COMMON) }\r\n >\r\n N/A\r\n </Trans>\r\n );\r\n};\r\n\r\nexport const Row: React.FC<RowProps> = ({ title, text, className, titleWidth = 'four', noText }) => (\r\n <div className={ classNames('ui row', className) }>\r\n <div className={ classNames(noText ? 'sixteen' : titleWidth, 'wide column title') }>\r\n <div className=\"ui tiny header\" style={{ overflow: 'hidden' }}>\r\n { title }\r\n </div>\r\n </div>\r\n { !noText && (\r\n <div className=\"column value\">\r\n { formatText(text) }\r\n </div> \r\n ) }\r\n </div>\r\n);\r\n\r\nexport interface HeaderProps {\r\n title: React.ReactNode;\r\n}\r\n\r\nexport const Header: React.FC<HeaderProps> = ({ title }) => (\r\n <div className=\"ui row\">\r\n <div className=\"sixteen wide column\">\r\n <div className=\"ui blue section header\">\r\n { title }\r\n </div>\r\n </div>\r\n </div>\r\n);\r\n\r\nexport interface GridProps extends React.HTMLAttributes<HTMLDivElement> {\r\n columns?: string;\r\n stackable?: boolean;\r\n}\r\n\r\nexport const Grid: React.FC<GridProps> = ({ className, children, columns, stackable, ...other }) => (\r\n <div \r\n className={ classNames(\r\n 'ui grid', \r\n //`${columns} column`, \r\n { [`${columns} column`]: !!columns },\r\n { stackable: stackable },\r\n className\r\n ) }\r\n { ...other }\r\n >\r\n { children }\r\n </div>\r\n);\r\n","import * as React from 'react';\r\n\r\n\r\nexport default function <PropsT>(\r\n Component: React.ComponentType<PropsT>, \r\n redrawIntervalSeconds: number = 60\r\n) {\r\n class RedrawDecorator extends React.Component<PropsT> {\r\n redrawTimeout: number | undefined;\r\n\r\n componentDidMount() {\r\n this.scheduleComponentRefresh();\r\n }\r\n\r\n componentWillUnmount() {\r\n clearTimeout(this.redrawTimeout);\r\n }\r\n\r\n scheduleComponentRefresh = () => {\r\n this.redrawTimeout = window.setTimeout(\r\n () => { \r\n this.forceUpdate();\r\n this.scheduleComponentRefresh();\r\n }, \r\n redrawIntervalSeconds * 1000\r\n );\r\n }\r\n\r\n render() {\r\n return <Component {...this.props}/>;\r\n }\r\n }\r\n\r\n return RedrawDecorator;\r\n}\r\n","import ViewFileConstants from 'constants/ViewFileConstants';\r\n\r\nimport SessionActionDecorator from './decorators/SessionActionDecorator';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\nconst ViewFileActions: UI.ActionListType<API.ViewFile> = {};\r\n\r\nconst ViewFileActionsDecorated = SessionActionDecorator(\r\n ViewFileActions, \r\n ViewFileConstants.SESSIONS_URL, \r\n API.AccessEnum.VIEW_FILE_EDIT\r\n);\r\n\r\nexport default {\r\n moduleId: UI.Modules.VIEWED_FILES,\r\n actions: ViewFileActionsDecorated,\r\n};\r\n","import * as React from 'react';\r\n\r\nimport RedrawDecorator from 'decorators/RedrawDecorator';\r\nimport { formatRelativeTime } from 'utils/ValueFormat';\r\nimport { FooterItem, SessionFooter } from 'routes/Sidebar/components/SessionFooter';\r\nimport { useMobileLayout } from 'utils/BrowserUtils';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\n\r\ninterface FileFooterProps {\r\n item: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nconst FileFooter: React.FC<FileFooterProps> = ({ item, sessionT }) => {\r\n if (useMobileLayout()) {\r\n return null;\r\n }\r\n\r\n const downloadState = item.download_state;\r\n return (\r\n <SessionFooter>\r\n <FooterItem \r\n label={ sessionT.translate(downloadState ? 'Downloaded' : 'Opened') } \r\n text={ formatRelativeTime(downloadState ? downloadState.time_finished : item.time_opened) }\r\n />\r\n </SessionFooter>\r\n );\r\n};\r\n\r\nexport default RedrawDecorator(FileFooter);","import { memo } from 'react';\r\nimport * as React from 'react';\r\n\r\nimport LoginStore from 'stores/LoginStore';\r\n\r\nimport { AudioFile, ImageFile, VideoFile, TextFile } from 'components/file-preview';\r\n\r\nimport Moment from 'moment';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { fetchData } from 'utils/HttpUtils';\r\nimport { useRestoreScroll } from 'effects';\r\n\r\n\r\nexport interface FileContentProps {\r\n session: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n scrollPositionHandler: UI.ScrollPositionHandler;\r\n}\r\n\r\ninterface ViewerElementProps {\r\n item: API.ViewFile;\r\n url: string;\r\n type: string;\r\n extension: string;\r\n sessionT: UI.ModuleTranslator;\r\n onReady: () => void;\r\n}\r\n\r\nconst useAutoPlay = (item: API.ViewFile) => {\r\n const diff = Moment.duration(Moment().diff(Moment.unix(item.time_opened)));\r\n return diff.asMinutes() <= 1;\r\n};\r\n\r\nconst getViewerElement = (item: API.ViewFile): React.ComponentType<ViewerElementProps> | null => {\r\n if (item.text) {\r\n return (props: ViewerElementProps) => (\r\n <TextFile\r\n {...props}\r\n textGetter={ () => {\r\n return fetchData(props.url)\r\n .then(data => data.text())\r\n .then(text => {\r\n props.onReady();\r\n return text;\r\n });\r\n }}\r\n url={ props.url }\r\n />\r\n );\r\n }\r\n\r\n switch (item.type.content_type) {\r\n case 'audio': return (props: ViewerElementProps) => (\r\n <AudioFile \r\n autoPlay={ useAutoPlay(item) }\r\n { ...props }\r\n />\r\n );\r\n case 'picture': return (props: ViewerElementProps) => (\r\n <ImageFile\r\n { ...props }\r\n />\r\n );\r\n case 'video': return (props: ViewerElementProps) => (\r\n <VideoFile\r\n autoPlay={ useAutoPlay(item) }\r\n { ...props }\r\n />\r\n );\r\n default:\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst getUrl = (tth: string) => {\r\n return `${getBasePath()}view/${tth}?auth_token=${LoginStore.authToken}`; \r\n};\r\n\r\nconst FileContent: React.FC<FileContentProps> = memo(({ session, sessionT, scrollPositionHandler }) => {\r\n const { scrollable, restoreScrollPosition } = useRestoreScroll(scrollPositionHandler, session);\r\n\r\n const ViewerElement = getViewerElement(session);\r\n\r\n let child;\r\n if (!ViewerElement) {\r\n child = sessionT.translate('Unsupported format');\r\n } else {\r\n child = (\r\n <ViewerElement \r\n item={ session }\r\n url={ getUrl(session.tth) }\r\n type={ session.mime_type }\r\n extension={ session.type.str }\r\n sessionT={ sessionT }\r\n onReady={restoreScrollPosition}\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <div \r\n ref={ scrollable } \r\n className=\"content\"\r\n >\r\n { child }\r\n </div>\r\n );\r\n});\r\n\r\nexport default FileContent;\r\n","import { Component } from 'react';\r\nimport cx from 'classnames';\r\n\r\nimport IconConstants from 'constants/IconConstants';\r\nimport Loader from 'components/semantic/Loader';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport ActiveSessionDecorator from 'decorators/ActiveSessionDecorator';\r\nimport FileFooter from 'routes/Sidebar/routes/Files/components/FileFooter';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\n\r\nimport { SessionChildProps } from 'routes/Sidebar/components/SessionLayout';\r\nimport FileContent from './FileContent';\r\nimport ViewFileStore from 'stores/ViewFileStore';\r\n\r\n\r\nexport interface FileSessionProps extends SessionChildProps<API.ViewFile> {\r\n session: API.ViewFile;\r\n sessionT: UI.ModuleTranslator;\r\n}\r\n\r\nclass FileSession extends Component<FileSessionProps> {\r\n render() {\r\n const { session, sessionT } = this.props;\r\n if (!session.content_ready) {\r\n if (session.download_state!.id === 'download_failed') {\r\n return (\r\n <div className=\"file session\">\r\n <Message \r\n icon={ IconConstants.ERROR }\r\n title={ sessionT.translate('Download failed') }\r\n description={ session.download_state!.str }\r\n />\r\n </div>\r\n );\r\n }\r\n\r\n return <Loader text={ session.download_state!.str }/>;\r\n }\r\n\r\n return (\r\n <div className={ cx('file session', session.type.str, session.type.content_type) }>\r\n <FileContent\r\n session={ session }\r\n sessionT={ sessionT }\r\n scrollPositionHandler={ ViewFileStore.scroll }\r\n />\r\n <FileFooter \r\n item={ session }\r\n sessionT={ sessionT }\r\n />\r\n </div>\r\n );\r\n }\r\n}\r\n\r\nexport default ActiveSessionDecorator(FileSession);\r\n","\n import API from \"!../../../../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../../../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../../../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../../../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../../../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../../../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../../../../node_modules/css-loader/dist/cjs.js!./style.css\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\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 * as React from 'react';\r\n\r\nimport SessionLayout from 'routes/Sidebar/components/SessionLayout';\r\n\r\nimport ViewFileStore from 'stores/ViewFileStore';\r\nimport ViewFileUIActions from 'actions/ui/ViewFileActions';\r\nimport ViewFileAPIActions from 'actions/reflux/ViewFileActions';\r\n\r\nimport FileIcon from 'components/icon/FileIcon';\r\nimport Message from 'components/semantic/Message';\r\n\r\nimport FileSession from './FileSession';\r\n\r\nimport '../style.css';\r\n\r\nimport * as API from 'types/api';\r\nimport * as UI from 'types/ui';\r\nimport { \r\n SessionProviderDecoratorChildProps, SessionProviderDecorator \r\n} from 'routes/Sidebar/decorators/SessionProviderDecorator';\r\nimport { toI18nKey } from 'utils/TranslationUtils';\r\n\r\n\r\nconst ItemHandler: UI.SessionInfoGetter<API.ViewFile> = {\r\n itemNameGetter(session) {\r\n return session.name;\r\n },\r\n\r\n itemLabelGetter(session) {\r\n return null;\r\n },\r\n\r\n itemHeaderDescriptionGetter(session) {\r\n return null;\r\n },\r\n\r\n itemHeaderIconGetter(session) {\r\n return <FileIcon typeInfo={ session.type }/>;\r\n },\r\n};\r\n\r\n\r\nconst Files: React.FC<SessionProviderDecoratorChildProps<API.ViewFile>> = props => {\r\n const { match, t, ...other } = props;\r\n if (props.items.length === 0) {\r\n return (\r\n <Message\r\n title={ t(toI18nKey('noFiles', UI.Modules.VIEWED_FILES), 'No files to view') }\r\n description={ t<string>(\r\n toI18nKey('noFilesDesc', UI.Modules.VIEWED_FILES), \r\n 'You may open text or media files to be viewed here from search or filelists'\r\n ) }\r\n />\r\n );\r\n }\r\n\r\n return (\r\n <SessionLayout\r\n activeId={ match.params.id }\r\n baseUrl=\"files\"\r\n disableSideMenu={ true }\r\n editAccess={ API.AccessEnum.VIEW_FILE_EDIT }\r\n uiActions={ ViewFileUIActions }\r\n sessionApi={ ViewFileAPIActions as UI.SessionActions<API.ViewFile> }\r\n unreadInfoStore={ ViewFileStore }\r\n sessionItemLayout={ FileSession }\r\n t={ t }\r\n { ...ItemHandler }\r\n { ...other }\r\n />\r\n );\r\n};\r\n\r\nexport default SessionProviderDecorator(Files, ViewFileStore);\r\n"],"names":["___CSS_LOADER_EXPORT___","push","module","id","formatMediaError","event","error","target","code","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","Component","MediaFileDecorator","state","onMediaError","this","setState","setMediaRef","c","media","componentDidUpdate","prevProps","url","props","load","render","autoPlay","mediaProps","onError","controls","src","mediaRef","AudioFileDecorated","ref","style","maxWidth","maxHeight","ImageFile","TextFile","textGetter","text","setText","useState","setError","t","useTranslation","useEffect","then","catch","Message","title","description","message","Loader","VideoFileDecorated","formatText","i18nKey","Row","className","titleWidth","noText","overflow","Header","Grid","children","columns","stackable","other","redrawIntervalSeconds","RedrawDecorator","scheduleComponentRefresh","redrawTimeout","window","setTimeout","forceUpdate","componentDidMount","componentWillUnmount","clearTimeout","ViewFileActionsDecorated","SessionActionDecorator","ViewFileConstants","moduleId","actions","item","sessionT","downloadState","download_state","SessionFooter","label","translate","time_finished","time_opened","useAutoPlay","diff","asMinutes","memo","session","scrollPositionHandler","scrollable","restoreScrollPosition","ViewerElement","data","onReady","type","content_type","getViewerElement","child","tth","getBasePath","LoginStore","mime_type","extension","str","FileSession","content_ready","ViewFileStore","icon","IconConstants","ActiveSessionDecorator","options","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","ItemHandler","itemNameGetter","name","itemLabelGetter","itemHeaderDescriptionGetter","itemHeaderIconGetter","FileIcon","typeInfo","SessionProviderDecorator","match","items","length","SessionLayout","activeId","params","baseUrl","disableSideMenu","editAccess","uiActions","sessionApi","unreadInfoStore","sessionItemLayout"],"sourceRoot":""}
|