diff --git a/README.md b/README.md
index c0bccca..54649a9 100644
--- a/README.md
+++ b/README.md
@@ -103,6 +103,6 @@ Just finished up the database connection, next steps:
The database and UI are now connected, some improvements to make:
-- [ ] Change folders to link components, remove all client state
+- [x] Change folders to link components, remove all client state
- [ ] Clean up the database and data fetching patterns
- [ ] Real homepage
diff --git a/src/app/drive-contents.tsx b/src/app/drive-contents.tsx
index c7e3d71..c1fa4da 100644
--- a/src/app/drive-contents.tsx
+++ b/src/app/drive-contents.tsx
@@ -1,39 +1,18 @@
"use client";
import { ChevronRight, Upload } from "lucide-react";
-import { useMemo, useState } from "react";
+import Link from "next/link";
import { Button } from "~/components/ui/button";
import type { files, folders } from "~/server/db/schema";
+
import { FileRow, FolderRow } from "./file-row";
export default function DriveContents(props: {
files: (typeof files.$inferSelect)[];
folders: (typeof folders.$inferSelect)[];
+ parents: (typeof folders.$inferSelect)[];
}) {
- const [currentFolder, setCurrentFolder] = useState(1);
-
- const handleFolderClick = (folderId: number) => {
- setCurrentFolder(folderId);
- };
-
- const breadcrumbs = useMemo(() => {
- const breadcrumbs = [];
- let currentId = currentFolder;
-
- while (currentId !== 1) {
- const folder = props.folders.find((file) => file.id === currentId);
- if (folder) {
- breadcrumbs.unshift(folder);
- currentId = folder.parent ?? 1;
- } else {
- break;
- }
- }
-
- return breadcrumbs;
- }, [currentFolder, props.folders]);
-
const handleUpload = () => {
alert("Upload functionality would be implemented here");
};
@@ -43,23 +22,18 @@ export default function DriveContents(props: {
-
- {breadcrumbs.map((folder) => (
+
+ {props.parents.map((folder) => (
-
+
))}
@@ -81,11 +55,7 @@ export default function DriveContents(props: {
{props.folders.map((folder) => (
- handleFolderClick(folder.id)}
- />
+
))}
{props.files.map((file) => (
diff --git a/src/app/f/[folderId]/page.tsx b/src/app/f/[folderId]/page.tsx
index 19392fe..58d88f6 100644
--- a/src/app/f/[folderId]/page.tsx
+++ b/src/app/f/[folderId]/page.tsx
@@ -9,6 +9,24 @@ import {
import DriveContents from "../../drive-contents";
+async function getAllParents(folderId: number) {
+ const parents = [];
+ let currentId: number | null = folderId;
+ while (currentId != null) {
+ const folders = await db
+ .selectDistinct()
+ .from(folderSchema)
+ .where(eq(folderSchema.id, currentId));
+
+ if (!folders[0]) throw new Error("parent folder not found");
+
+ parents.unshift(folders[0]);
+ currentId = folders[0]?.parent; // parent can be null
+ }
+
+ return parents;
+}
+
export default async function GoogleDriveClone(props: {
params: Promise<{ folderId: number }>;
}) {
@@ -20,16 +38,22 @@ export default async function GoogleDriveClone(props: {
if (!success) return Invalid Folder ID
;
const folderId = data.folderId;
- console.log(folderId);
+ const parentsPromise = getAllParents(folderId);
- const folders = await db
+ const foldersPromise = db
.select()
.from(folderSchema)
.where(eq(folderSchema.parent, folderId));
- const files = await db
+ const filesPromise = db
.select()
.from(fileSchema)
.where(eq(fileSchema.parent, folderId));
- return ;
+ const [folders, files, parents] = await Promise.all([
+ foldersPromise,
+ filesPromise,
+ parentsPromise,
+ ]);
+
+ return ;
}
diff --git a/src/app/file-row.tsx b/src/app/file-row.tsx
index 10cf885..5138410 100644
--- a/src/app/file-row.tsx
+++ b/src/app/file-row.tsx
@@ -1,4 +1,5 @@
import { FileIcon, Folder as FolderIcon } from "lucide-react";
+import Link from "next/link";
import type { files, folders } from "~/server/db/schema";
@@ -28,11 +29,8 @@ export function FileRow(props: { file: typeof files.$inferSelect }) {
);
}
-export function FolderRow(props: {
- folder: typeof folders.$inferSelect;
- onFolderClick: () => void;
-}) {
- const { folder, onFolderClick } = props;
+export function FolderRow(props: { folder: typeof folders.$inferSelect }) {
+ const { folder } = props;
return (
-