diff --git a/README.md b/README.md
index 8c27ff7..299c42a 100644
--- a/README.md
+++ b/README.md
@@ -35,4 +35,8 @@
- [ ] real homepage
## notes 2:40.44
-- [ ] Real homepage + onboarding
\ No newline at end of file
+- [ ] Real homepage + onboarding
+
+## followup
+
+[ ] folder deletion - make sure to recursively delete all files and folders.
\ No newline at end of file
diff --git a/src/app/folder/[folderId]/drive-contents.tsx b/src/app/folder/[folderId]/drive-contents.tsx
index 3d05ed9..f88ae01 100644
--- a/src/app/folder/[folderId]/drive-contents.tsx
+++ b/src/app/folder/[folderId]/drive-contents.tsx
@@ -48,8 +48,9 @@ export default function DriveContents(props: {
Name
-
Type
+
Type
Size
+
diff --git a/src/app/folder/[folderId]/file-row.tsx b/src/app/folder/[folderId]/file-row.tsx
index f316072..5b5a2eb 100644
--- a/src/app/folder/[folderId]/file-row.tsx
+++ b/src/app/folder/[folderId]/file-row.tsx
@@ -1,5 +1,7 @@
-import { Folder as FolderIcon, FileIcon } from "lucide-react";
+import { Folder as FolderIcon, FileIcon, Trash2Icon } from "lucide-react";
import Link from "next/link";
+import { Button } from "~/components/ui/button";
+import { deleteFile } from "~/server/db/actions";
import type { files_table, folders_table } from "~/server/db/schema";
export function FileRow(props: { file: typeof files_table.$inferSelect }) {
@@ -34,10 +36,21 @@ export function FileRow(props: { file: typeof files_table.$inferSelect }) {
{file.name}
-
File
+
File
{" "}
+ {/* TODO: add file type */}
{getFileSizes(file.size)}
+
+
+
);
diff --git a/src/server/db/actions.ts b/src/server/db/actions.ts
new file mode 100644
index 0000000..5ab2670
--- /dev/null
+++ b/src/server/db/actions.ts
@@ -0,0 +1,43 @@
+"use server";
+
+import { db } from "~/server/db";
+import { eq, and } from "drizzle-orm";
+import { files_table as fileSchema, folders_table as foldersSchema } from "~/server/db/schema";
+import { auth } from "@clerk/nextjs/server";
+import { UTApi } from "uploadthing/server";
+import { cookies } from "next/headers";
+const utApi = new UTApi();
+
+export async function deleteFile(fileId: number) {
+ const session = await auth();
+ if (!session.userId) {
+ return { error: "Unauthorized"}
+ }
+
+ const [file] = await db
+ .select()
+ .from(fileSchema)
+ .where(
+ and(eq(fileSchema.id, fileId), eq(fileSchema.ownerId, session.userId))
+ );
+
+ if (!file) {
+ return { error: "File not found"}
+ }
+
+ const utApiResult = await utApi.deleteFiles([file.url.replace("https://utfs.io/f/", "")]);
+
+ if (!utApiResult.success) {
+ return { error: "Failed deleting file from Uploadthing"}
+ }
+
+ await db.delete(fileSchema).where(eq(fileSchema.id, fileId));
+
+ const c = await cookies();
+
+ c.set("force-refresh", JSON.stringify(Math.random()));
+
+ return { success: true };
+
+}
+
diff --git a/src/server/db/schema.ts b/src/server/db/schema.ts
index 34e8fa3..e899f1b 100644
--- a/src/server/db/schema.ts
+++ b/src/server/db/schema.ts
@@ -49,6 +49,7 @@ export const files_table = createTable(
ownerId: text("owner_id").notNull(),
name: text("name").notNull(),
size: int("size").notNull(),
+ // add file key
url: text("url").notNull(),
parent: bigint("parent", { mode: "number", unsigned: true }).notNull(),
updatedAt: timestamp("updated_at").notNull().defaultNow(),