Skip to content

Commit 321f4e8

Browse files
authored
Add ability to export multiple .torrents at once (#8230)
2 parents f377d1a + 4d42f97 commit 321f4e8

File tree

5 files changed

+219
-28
lines changed

5 files changed

+219
-28
lines changed

src/tribler/ui/package-lock.json

Lines changed: 165 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/tribler/ui/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"i18next": "^23.11.4",
3333
"javascript-time-ago": "^2.5.10",
3434
"js-cookie": "^3.0.5",
35+
"jszip": "^3.10.1",
3536
"lucide-react": "^0.292.0",
3637
"react": "^18.2.0",
3738
"react-dom": "^18.2.0",

src/tribler/ui/src/lib/utils.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@ import zh from 'javascript-time-ago/locale/zh'
1010
import Cookies from "js-cookie";
1111
import { useTranslation } from "react-i18next";
1212
import { triblerService } from "@/services/tribler.service";
13-
import { FileTreeItem } from "@/models/file.model";
13+
import { FileLink, FileTreeItem } from "@/models/file.model";
1414
import { CheckedState } from "@radix-ui/react-checkbox";
15+
import JSZip from "jszip";
1516

1617
TimeAgo.setDefaultLocale(en.locale)
1718
TimeAgo.addLocale(en)
@@ -225,3 +226,29 @@ export const getSelectedFilesFromTree = (tree: FileTreeItem, included: boolean =
225226
selectedFiles.push(tree.index);
226227
return selectedFiles;
227228
}
229+
230+
export function downloadFile(file: FileLink) {
231+
var link = document.createElement("a");
232+
link.download = file.name;
233+
link.href = file.uri;
234+
link.click();
235+
}
236+
237+
export async function downloadFilesAsZip(files: FileLink[], zipName: string) {
238+
const zip = new JSZip();
239+
for (let i = 0; i < files.length; i++) {
240+
const response = await fetch(files[i].uri);
241+
if (response.status != 200) continue;
242+
const blob = await response.blob();
243+
244+
zip.file(files[i].name, blob);
245+
246+
if (i == files.length - 1) {
247+
const zipData = await zip.generateAsync({ type: "blob" });
248+
const link = document.createElement("a");
249+
link.href = window.URL.createObjectURL(zipData);
250+
link.download = zipName;
251+
link.click();
252+
}
253+
}
254+
}

src/tribler/ui/src/models/file.model.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,8 @@ export interface FileTreeItem {
1919
included?: CheckedState;
2020
subRows?: FileTreeItem[];
2121
}
22+
23+
export interface FileLink {
24+
uri: string;
25+
name: string;
26+
}

0 commit comments

Comments
 (0)