From 4eb44422d2c2d2c82e2953f7d7c883f0d1bb0e4f Mon Sep 17 00:00:00 2001 From: goddonebianu Date: Thu, 20 Nov 2025 10:23:22 +0800 Subject: [PATCH] ... --- .../(features)/memorize/FolderSelector.tsx | 44 +++++----- src/app/folders/FoldersClient.tsx | 84 ++++++++++++------- src/app/folders/[folder_id]/InFolder.tsx | 27 +++--- src/lib/actions/services/folderService.ts | 25 ++++-- 4 files changed, 108 insertions(+), 72 deletions(-) diff --git a/src/app/(features)/memorize/FolderSelector.tsx b/src/app/(features)/memorize/FolderSelector.tsx index 353d639..0286e97 100644 --- a/src/app/(features)/memorize/FolderSelector.tsx +++ b/src/app/(features)/memorize/FolderSelector.tsx @@ -21,7 +21,9 @@ const FolderSelector: React.FC = ({ folders }) => { {(folders.length === 0 && (

{t("noFolders")} - folders + + folders +

)) || ( <> @@ -29,26 +31,28 @@ const FolderSelector: React.FC = ({ folders }) => { {t("selectFolder")}
- {folders.map((folder) => ( -
- router.push(`/memorize?folder_id=${folder.id}`) - } - className="flex flex-row justify-center items-center group p-2 gap-2 hover:cursor-pointer hover:bg-gray-50" - > - -
- - {t("folderInfo", { - id: folder.id, - name: folder.name, - count: folder.total_pairs, - })} - + {folders + .toSorted((a, b) => a.id - b.id) + .map((folder) => ( +
+ router.push(`/memorize?folder_id=${folder.id}`) + } + className="flex flex-row justify-center items-center group p-2 gap-2 hover:cursor-pointer hover:bg-gray-50" + > + +
+ + {t("folderInfo", { + id: folder.id, + name: folder.name, + count: folder.total_pairs, + })} + +
-
- ))} + ))}
)} diff --git a/src/app/folders/FoldersClient.tsx b/src/app/folders/FoldersClient.tsx index ddc6d29..9b1892d 100644 --- a/src/app/folders/FoldersClient.tsx +++ b/src/app/folders/FoldersClient.tsx @@ -1,6 +1,12 @@ "use client"; -import { ChevronRight, Folder, FolderPlus, Trash2 } from "lucide-react"; +import { + ChevronRight, + Folder, + FolderPen, + FolderPlus, + Trash2, +} from "lucide-react"; import { useEffect, useState } from "react"; import { Center } from "@/components/Center"; import { useRouter } from "next/navigation"; @@ -9,21 +15,26 @@ import { createFolder, deleteFolderById, getFoldersWithTotalPairsByOwner, + renameFolderById, } from "@/lib/actions/services/folderService"; import { useTranslations } from "next-intl"; +import { toast } from "sonner"; interface FolderProps { folder: folder & { total_pairs: number }; - deleteCallback: () => void; - openCallback: () => void; + refresh: () => void; } -const FolderCard = ({ folder, deleteCallback, openCallback }: FolderProps) => { +const FolderCard = ({ folder, refresh }: FolderProps) => { + const router = useRouter(); + const t = useTranslations("folders"); return (
{ + router.push(`/folders/${folder.id}`); + }} >
@@ -38,7 +49,6 @@ const FolderCard = ({ folder, deleteCallback, openCallback }: FolderProps) => { totalPairs: folder.total_pairs, })} - {/*

{} items

*/}
#{folder.id}
@@ -48,7 +58,22 @@ const FolderCard = ({ folder, deleteCallback, openCallback }: FolderProps) => { +
) : (
- {folders.map((folder) => ( - { - const confirm = prompt( - t("confirmDelete", { name: folder.name }), - ); - if (confirm === folder.name) { - deleteFolderById(folder.id).then(updateFolders); - } - }} - openCallback={() => { - router.push(`/folders/${folder.id}`); - }} - /> - ))} + {folders + .toSorted((a, b) => a.id - b.id) + .map((folder) => ( + + ))}
)}
diff --git a/src/app/folders/[folder_id]/InFolder.tsx b/src/app/folders/[folder_id]/InFolder.tsx index 6e6f202..f46004d 100644 --- a/src/app/folders/[folder_id]/InFolder.tsx +++ b/src/app/folders/[folder_id]/InFolder.tsx @@ -46,14 +46,11 @@ export default function InFolder({ folderId }: { folderId: number }) { }, [folderId]); const refreshTextPairs = async () => { - setLoading(true); try { const data = await getTextPairsByFolderId(folderId); setTextPairs(data as TextPair[]); } catch (error) { console.error("Failed to fetch text pairs:", error); - } finally { - setLoading(false); } }; @@ -114,17 +111,19 @@ export default function InFolder({ folderId }: { folderId: number }) {
) : (
- {textPairs.map((textPair) => ( - { - deleteTextPairById(textPair.id); - refreshTextPairs(); - }} - refreshTextPairs={refreshTextPairs} - /> - ))} + {textPairs + .toSorted((a, b) => a.id - b.id) + .map((textPair) => ( + { + deleteTextPairById(textPair.id); + refreshTextPairs(); + }} + refreshTextPairs={refreshTextPairs} + /> + ))}
)} diff --git a/src/lib/actions/services/folderService.ts b/src/lib/actions/services/folderService.ts index 7d51d6d..8f3d4f8 100644 --- a/src/lib/actions/services/folderService.ts +++ b/src/lib/actions/services/folderService.ts @@ -15,23 +15,34 @@ export async function getFoldersByOwner(owner: string) { return folders; } +export async function renameFolderById(id: number, newName: string) { + await prisma.folder.update({ + where: { + id: id, + }, + data: { + name: newName, + }, + }); +} + export async function getFoldersWithTotalPairsByOwner(owner: string) { const folders = await prisma.folder.findMany({ where: { - owner: owner + owner: owner, }, include: { text_pair: { select: { - id: true - } - } - } + id: true, + }, + }, + }, }); - return folders.map(folder => ({ + return folders.map((folder) => ({ ...folder, - total_pairs: folder.text_pair.length + total_pairs: folder.text_pair.length, })); }