From 753fb225e11f4e6899630836b18acb5b3746ec7e Mon Sep 17 00:00:00 2001 From: misterkirill Date: Tue, 15 Jul 2025 15:47:52 +0500 Subject: [PATCH] feat: note line management --- src/app/actions/blocks.ts | 50 +++++++++++++++++++++++++++++---- src/components/editor/Block.tsx | 21 +++++++++----- 2 files changed, 58 insertions(+), 13 deletions(-) diff --git a/src/app/actions/blocks.ts b/src/app/actions/blocks.ts index 0ff79f8..0b6d5bb 100644 --- a/src/app/actions/blocks.ts +++ b/src/app/actions/blocks.ts @@ -1,23 +1,27 @@ "use server"; import { revalidatePath } from "next/cache"; -import { eq } from "drizzle-orm"; +import { eq, asc } from "drizzle-orm"; import { db } from "@/lib/db"; import { blocksTable, IBlock } from "@/lib/db/schema"; export async function createBlock(formData: FormData) { const noteId = formData.get("noteId") as string; + const blocks = await getBlocks(noteId); + const lastBlock = blocks.pop(); + const order = lastBlock === undefined ? 1 : lastBlock.order + 1; await db .insert(blocksTable) - .values({ noteId }); - revalidatePath("/notes/[id]"); + .values({ noteId, order }); + revalidatePath("/notes/[id]", "page"); } export async function getBlocks(noteId: string): Promise { return db .select() .from(blocksTable) - .where(eq(blocksTable.noteId, noteId)); + .where(eq(blocksTable.noteId, noteId)) + .orderBy(asc(blocksTable.order)); } export async function deleteBlock(formData: FormData) { @@ -25,7 +29,7 @@ export async function deleteBlock(formData: FormData) { await db .delete(blocksTable) .where(eq(blocksTable.id, blockId)); - revalidatePath("/notes/[id]"); + revalidatePath("/notes/[id]", "page"); } export async function changeLock(formData: FormData) { @@ -35,5 +39,39 @@ export async function changeLock(formData: FormData) { .update(blocksTable) .set({ isLocked }) .where(eq(blocksTable.id, blockId)); - revalidatePath("/notes/[id]"); + revalidatePath("/notes/[id]", "page"); +} + +export async function addLine(formData: FormData) { + const blockId = formData.get("blockId") as string; + const blocks = await db + .select() + .from(blocksTable) + .where(eq(blocksTable.id, blockId)); + if (blocks.length === 0) { + return; + } + const block = blocks[0]; + await db + .update(blocksTable) + .set({ lines: [...block.lines, ""] }) + .where(eq(blocksTable.id, blockId)); + revalidatePath("/notes/[id]", "page"); +} + +export async function deleteLine(formData: FormData) { + const blockId = formData.get("blockId") as string; + const blocks = await db + .select() + .from(blocksTable) + .where(eq(blocksTable.id, blockId)); + if (blocks.length === 0) { + return; + } + const block = blocks[0]; + await db + .update(blocksTable) + .set({ lines: block.lines.slice(0, -1) }) + .where(eq(blocksTable.id, blockId)); + revalidatePath("/notes/[id]", "page"); } diff --git a/src/components/editor/Block.tsx b/src/components/editor/Block.tsx index f49679d..e68d6e8 100644 --- a/src/components/editor/Block.tsx +++ b/src/components/editor/Block.tsx @@ -1,5 +1,5 @@ import { ArrowDown, ArrowUp, LockOpen, Lock, Minus, Plus, X } from "lucide-react"; -import { changeLock, deleteBlock } from "@/app/actions/blocks"; +import { addLine, changeLock, deleteBlock, deleteLine } from "@/app/actions/blocks"; import { IBlock } from "@/lib/db/schema"; import IconOnlyButton from "../ui/IconOnlyButton"; import LineInput from "./LineInput"; @@ -20,26 +20,33 @@ export default function Block({ block }: { block: IBlock }) { ))}
- } disabled={block.isLocked} /> - } disabled={block.isLocked} /> +
+ + } disabled={block.isLocked} /> + +
+ + } disabled={block.isLocked} /> +
} /> } />
-
- - } type="submit" /> -
{!block.isLocked && } : } /> +
+ + } /> +