Skip to content

Commit 5c02638

Browse files
committed
Extract File Fow Components
1 parent 532bcda commit 5c02638

3 files changed

Lines changed: 89 additions & 17 deletions

File tree

src/app/file-row.tsx

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { FileIcon, Folder as FolderIcon } from "lucide-react";
2+
3+
import type { File, Folder } from "~/lib/mock-data";
4+
5+
export function FileRow(props: { file: File }) {
6+
const { file } = props;
7+
8+
return (
9+
<li
10+
key={file.id}
11+
className="hover:bg-gray-750 border-b border-gray-700 px-6 py-4"
12+
>
13+
<div className="grid grid-cols-12 items-center gap-4">
14+
<div className="col-span-6 flex items-center">
15+
<a
16+
href={file.url}
17+
className="flex items-center text-gray-100 hover:text-blue-400"
18+
target="_blank"
19+
>
20+
<FileIcon className="mr-3" size={20} />
21+
{file.name}
22+
</a>
23+
</div>
24+
<div className="col-span-3 text-gray-400">{"file"}</div>
25+
<div className="col-span-3 text-gray-400">{file.size}</div>
26+
</div>
27+
</li>
28+
);
29+
}
30+
31+
export function FolderRow(props: {
32+
folder: Folder;
33+
handleFolderClick: () => void;
34+
}) {
35+
const { folder, handleFolderClick } = props;
36+
37+
return (
38+
<li
39+
key={folder.id}
40+
className="hover:bg-gray-750 border-b border-gray-700 px-6 py-4"
41+
>
42+
<div className="grid grid-cols-12 items-center gap-4">
43+
<div className="col-span-6 flex items-center">
44+
<button
45+
onClick={handleFolderClick}
46+
className="flex items-center text-gray-100 hover:text-blue-400"
47+
>
48+
<FolderIcon className="mr-3" size={20} />
49+
{folder.name}
50+
</button>
51+
</div>
52+
<div className="col-span-3 text-gray-400"></div>
53+
<div className="col-span-3 text-gray-400"></div>
54+
</div>
55+
</li>
56+
);
57+
}

src/app/page.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,19 @@ import Link from "next/link";
55
import { useState } from "react";
66

77
import { Button } from "~/components/ui/button";
8-
import { mockFiles } from "~/lib/mock-data";
8+
import { mockFiles, mockFolders } from "~/lib/mock-data";
99

1010
export default function GoogleDriveClone() {
11-
const [currentFolder, setCurrentFolder] = useState<string | null>(null);
11+
const [currentFolder, setCurrentFolder] = useState("root");
1212

1313
const getCurrentFiles = () => {
1414
return mockFiles.filter((file) => file.parent === currentFolder);
1515
};
1616

17+
const getCurrentFolders = () => {
18+
return mockFolders.filter((folder) => folder.parent === currentFolder);
19+
};
20+
1721
const handleFolderClick = (folderId: string) => {
1822
setCurrentFolder(folderId);
1923
};
@@ -45,7 +49,7 @@ export default function GoogleDriveClone() {
4549
<div className="mb-6 flex items-center justify-between">
4650
<div className="flex items-center">
4751
<Button
48-
onClick={() => setCurrentFolder(null)}
52+
onClick={() => setCurrentFolder("root")}
4953
variant="ghost"
5054
className="mr-2 text-gray-300 hover:text-white"
5155
>

src/lib/mock-data.ts

Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,33 @@
1-
export interface File {
2-
id: string
3-
name: string
4-
type: "file" | "folder"
5-
url?: string
6-
parent: string | null
7-
size?: string
8-
}
1+
export type File = {
2+
id: string;
3+
name: string;
4+
type: "file";
5+
url: string;
6+
parent: string;
7+
size: string;
8+
};
99

10+
export type Folder = {
11+
id: string;
12+
name: string;
13+
type: "folder";
14+
parent: string | null;
15+
};
16+
17+
// prettier-ignore
18+
export const mockFolders: Folder[] = [
19+
{ id: "root", name: "root", type: "folder", parent: null }, // the root folder
20+
{ id: "1", name: "Documents", type: "folder", parent: "root" },
21+
{ id: "2", name: "Images", type: "folder", parent: "root" },
22+
{ id: "3", name: "Work", type: "folder", parent: "root" },
23+
{ id: "8", name: "Presentations", type: "folder", parent: "3" },
24+
];
25+
26+
// prettier-ignore
1027
export const mockFiles: File[] = [
11-
{ id: "1", name: "Documents", type: "folder", parent: null },
12-
{ id: "2", name: "Images", type: "folder", parent: null },
13-
{ id: "3", name: "Work", type: "folder", parent: null },
14-
{ id: "4", name: "Resume.pdf", type: "file", url: "/files/resume.pdf", parent: "1", size: "1.2 MB" },
1528
{ id: "5", name: "Project Proposal.docx", type: "file", url: "/files/proposal.docx", parent: "1", size: "2.5 MB" },
1629
{ id: "6", name: "Vacation.jpg", type: "file", url: "/files/vacation.jpg", parent: "2", size: "3.7 MB" },
1730
{ id: "7", name: "Profile Picture.png", type: "file", url: "/files/profile.png", parent: "2", size: "1.8 MB" },
18-
{ id: "8", name: "Presentations", type: "folder", parent: "3" },
1931
{ id: "9", name: "Q4 Report.pptx", type: "file", url: "/files/q4-report.pptx", parent: "8", size: "5.2 MB" },
2032
{ id: "10", name: "Budget.xlsx", type: "file", url: "/files/budget.xlsx", parent: "3", size: "1.5 MB" },
2133
]
22-

0 commit comments

Comments
 (0)