김재형

Implement file download

1 -import React, { Fragment } from "react"; 1 +import React from "react";
2 import { FileItem } from "./useFileList"; 2 import { FileItem } from "./useFileList";
3 import { Link } from "react-router-dom"; 3 import { Link } from "react-router-dom";
4 +import { Button } from "antd";
4 5
5 import { FolderFilled, FileFilled } from "@ant-design/icons"; 6 import { FolderFilled, FileFilled } from "@ant-design/icons";
7 +import { useDownload } from "./useDownload";
6 8
7 export function FileListItem({ item }: { item: FileItem }) { 9 export function FileListItem({ item }: { item: FileItem }) {
10 + const download = useDownload();
8 return item.is_folder ? ( 11 return item.is_folder ? (
9 - <Fragment>
10 <Link to={`/folder/${item.id}`}> 12 <Link to={`/folder/${item.id}`}>
11 <FolderFilled /> {item.name} 13 <FolderFilled /> {item.name}
12 </Link> 14 </Link>
13 - </Fragment>
14 ) : ( 15 ) : (
15 - <Fragment> 16 + <Button
17 + type="link"
18 + size="small"
19 + onClick={() => download(item.id)}
20 + style={{ padding: 0 }}
21 + >
16 <FileFilled /> {item.name} 22 <FileFilled /> {item.name}
17 - </Fragment> 23 + </Button>
18 ); 24 );
19 } 25 }
......
1 +import { useApi } from "util/useApi";
2 +import { useCallback } from "react";
3 +
4 +function downloadURL(url: string, name: string) {
5 + const link = document.createElement("a");
6 + link.setAttribute("download", name);
7 + link.href = url;
8 + link.target = "_blank";
9 + link.click();
10 +}
11 +
12 +export function useDownload() {
13 + const api = useApi();
14 + const download = useCallback(
15 + async (id: number) => {
16 + const response = await api.get(`/items/${id}/`).json<any>();
17 + const { signed_url, name } = response.data;
18 + downloadURL(signed_url, name);
19 + },
20 + [api]
21 + );
22 + return download;
23 +}