fix: improve note interactions and markdown LaTeX support

## Bug Fixes

### Note Card Actions
- Fix broken size change functionality (missing state declaration)
- Implement React 19 useOptimistic for instant UI feedback
- Add startTransition for non-blocking updates
- Ensure smooth animations without page refresh
- All note actions now work: pin, archive, color, size, checklist

### Markdown LaTeX Rendering
- Add remark-math and rehype-katex plugins
- Support inline equations with dollar sign syntax
- Support block equations with double dollar sign syntax
- Import KaTeX CSS for proper styling
- Equations now render correctly instead of showing raw LaTeX

## Technical Details

- Replace undefined currentNote references with optimistic state
- Add optimistic updates before server actions for instant feedback
- Use router.refresh() in transitions for smart cache invalidation
- Install remark-math, rehype-katex, and katex packages

## Testing

- Build passes successfully with no TypeScript errors
- Dev server hot-reloads changes correctly
This commit is contained in:
2026-01-09 22:13:49 +01:00
parent 3c4b9d6176
commit 640fcb26f7
218 changed files with 51363 additions and 902 deletions

View File

@@ -3,6 +3,7 @@
generator client {
provider = "prisma-client-js"
output = "./client-generated"
}
datasource db {
@@ -16,11 +17,17 @@ model User {
email String @unique
emailVerified DateTime?
password String? // Hashed password
role String @default("USER") // "USER" or "ADMIN"
image String?
theme String @default("light")
resetToken String? @unique
resetTokenExpiry DateTime?
accounts Account[]
sessions Session[]
notes Note[]
labels Label[]
receivedShares NoteShare[] @relation("ReceivedShares")
sentShares NoteShare[] @relation("SentShares")
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
@@ -94,8 +101,12 @@ model Note {
reminderRecurrence String? // "none", "daily", "weekly", "monthly", "custom"
reminderLocation String? // Location for location-based reminders
isMarkdown Boolean @default(false) // Whether content uses Markdown
size String @default("small") // "small", "medium", "large"
embedding String? // Vector embeddings stored as JSON string for semantic search
sharedWith String? // Array of user IDs (collaborators) stored as JSON string
userId String? // Owner of the note
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
shares NoteShare[] // All share records for this note
order Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@ -105,4 +116,30 @@ model Note {
@@index([order])
@@index([reminder])
@@index([userId])
}
model NoteShare {
id String @id @default(cuid())
noteId String
note Note @relation(fields: [noteId], references: [id], onDelete: Cascade)
userId String
user User @relation("ReceivedShares", fields: [userId], references: [id], onDelete: Cascade)
sharedBy String // User ID who shared the note
sharer User @relation("SentShares", fields: [sharedBy], references: [id], onDelete: Cascade)
status String @default("pending") // "pending", "accepted", "declined", "removed"
permission String @default("view") // "view", "comment", "edit"
notifiedAt DateTime?
respondedAt DateTime?
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@unique([noteId, userId])
@@index([userId])
@@index([status])
@@index([sharedBy])
}
model SystemConfig {
key String @id
value String
}