김재형

Implement file delete

1 -import React from "react"; 1 +import React, { useCallback } from "react";
2 -import { Table } from "antd"; 2 +import { Table, Popconfirm, message } from "antd";
3 import { ColumnsType } from "antd/lib/table"; 3 import { ColumnsType } from "antd/lib/table";
4 import filesize from "filesize"; 4 import filesize from "filesize";
5 5
6 import { useParams } from "react-router-dom"; 6 import { useParams } from "react-router-dom";
7 import { useFileList, FileItem } from "./useFileList"; 7 import { useFileList, FileItem } from "./useFileList";
8 +import { useApi } from "util/useApi";
8 import { FileListItem } from "./FileListItem"; 9 import { FileListItem } from "./FileListItem";
9 10
10 import styles from "./FileList.module.scss"; 11 import styles from "./FileList.module.scss";
11 12
12 -const columns: ColumnsType<FileItem> = [ 13 +export function FileList() {
14 + const id = useParams<{ id: string }>().id;
15 + const { data, reload } = useFileList(id);
16 +
17 + const api = useApi();
18 +
19 + const handleDelete = useCallback(
20 + async (id: number) => {
21 + await api.delete(`/items/${id}/`);
22 + await reload();
23 + message.info("삭제되었습니다");
24 + },
25 + [api, reload]
26 + );
27 +
28 + if (!data) {
29 + return null;
30 + }
31 +
32 + const list = [...data.list].sort((itemA, itemB) =>
33 + itemA.is_folder === itemB.is_folder ? 0 : itemA.is_folder ? -1 : 1
34 + );
35 +
36 + if (data.parent !== null) {
37 + list.unshift(({
38 + id: data.parent,
39 + is_folder: true,
40 + name: "..",
41 + file_type: "folder",
42 + } as unknown) as FileItem);
43 + }
44 +
45 + return (
46 + <div>
47 + {data.parent !== null && <h3>{data.name}</h3>}
48 + <Table
49 + rowKey="id"
50 + columns={getColumns({
51 + handleDelete,
52 + })}
53 + dataSource={list}
54 + pagination={false}
55 + />
56 + </div>
57 + );
58 +}
59 +
60 +type GetColumnsParams = {
61 + handleDelete: (id: number) => void;
62 +};
63 +
64 +function getColumns({ handleDelete }: GetColumnsParams): ColumnsType<FileItem> {
65 + return [
13 { 66 {
14 title: "파일명", 67 title: "파일명",
68 + key: "name",
15 dataIndex: "name", 69 dataIndex: "name",
16 render: (_name: string, item) => <FileListItem item={item} />, 70 render: (_name: string, item) => <FileListItem item={item} />,
17 }, 71 },
18 { 72 {
19 title: "크기", 73 title: "크기",
74 + key: "size",
20 dataIndex: "size", 75 dataIndex: "size",
21 width: 120, 76 width: 120,
22 render: (bytes: number, item) => 77 render: (bytes: number, item) =>
...@@ -24,6 +79,7 @@ const columns: ColumnsType<FileItem> = [ ...@@ -24,6 +79,7 @@ const columns: ColumnsType<FileItem> = [
24 }, 79 },
25 { 80 {
26 title: "", 81 title: "",
82 + key: "action",
27 dataIndex: "", 83 dataIndex: "",
28 width: 200, 84 width: 200,
29 render: (__: any, item) => 85 render: (__: any, item) =>
...@@ -32,37 +88,16 @@ const columns: ColumnsType<FileItem> = [ ...@@ -32,37 +88,16 @@ const columns: ColumnsType<FileItem> = [
32 <a>공유</a> 88 <a>공유</a>
33 <a>이동</a> 89 <a>이동</a>
34 <a>복사</a> 90 <a>복사</a>
91 + <Popconfirm
92 + title="정말로 삭제하시겠습니까?"
93 + onConfirm={() => handleDelete(item.id)}
94 + okText="삭제"
95 + cancelText="취소"
96 + >
35 <a>삭제</a> 97 <a>삭제</a>
98 + </Popconfirm>
36 </div> 99 </div>
37 ), 100 ),
38 }, 101 },
39 -]; 102 + ];
40 -
41 -export function FileList() {
42 - const id = useParams<{ id: string }>().id;
43 - const { data } = useFileList(id);
44 -
45 - if (!data) {
46 - return null;
47 - }
48 -
49 - const list = [...data.list].sort((itemA, itemB) =>
50 - itemA.is_folder === itemB.is_folder ? 0 : itemA.is_folder ? -1 : 1
51 - );
52 -
53 - if (data.parent !== null) {
54 - list.unshift(({
55 - id: data.parent,
56 - is_folder: true,
57 - name: "..",
58 - file_type: "folder",
59 - } as unknown) as FileItem);
60 - }
61 -
62 - return (
63 - <div>
64 - {data.parent !== null && <h3>{data.name}</h3>}
65 - <Table columns={columns} dataSource={list} pagination={false} />
66 - </div>
67 - );
68 } 103 }
......
1 +import { useMemo } from "react";
2 +import ky from "ky";
3 +
4 +// TODO: Implement Auth
5 +export function useApi() {
6 + return useMemo(() => {
7 + return ky.extend({
8 + hooks: {
9 + beforeRequest: [],
10 + },
11 + });
12 + }, []);
13 +}