11import { memo , useMemo } from 'react' ;
2- import { Star } from 'lucide-react' ;
3- import type { Note } from '@/types/note.ts' ;
2+ import { Star , Folder } from 'lucide-react' ;
3+ import type { Note , Folder as FolderType } from '@/types/note.ts' ;
44
55interface NoteCardProps {
66 note : Note ;
77 isSelected : boolean ;
88 onSelect : ( note : Note ) => void ;
99 onToggleStar : ( noteId : string ) => void ;
10+ folders ?: FolderType [ ] ;
1011}
1112
12- function NoteCard ( { note, isSelected, onSelect, onToggleStar } : NoteCardProps ) {
13+ function NoteCard ( { note, isSelected, onSelect, onToggleStar, folders } : NoteCardProps ) {
1314 const formatDateTime = ( date : Date ) => {
1415 try {
1516 const noteDate = new Date ( date ) ;
@@ -49,6 +50,17 @@ function NoteCard({ note, isSelected, onSelect, onToggleStar }: NoteCardProps) {
4950 return note ?. updatedAt ? formatDateTime ( note . updatedAt ) : 'No date' ;
5051 } , [ note ?. updatedAt ] ) ;
5152
53+ const folder = useMemo ( ( ) => {
54+ // First check if note has embedded folder data
55+ if ( note ?. folder ) {
56+ return note . folder ;
57+ }
58+
59+ // Fallback to looking up in folders array
60+ if ( ! note ?. folderId || ! folders || folders . length === 0 ) return null ;
61+ return folders . find ( f => f . id === note . folderId ) || null ;
62+ } , [ note ?. folder , note ?. folderId , folders ] ) ;
63+
5264 if ( ! note ) {
5365 return null ;
5466 }
@@ -100,17 +112,35 @@ function NoteCard({ note, isSelected, onSelect, onToggleStar }: NoteCardProps) {
100112 { previewText }
101113 </ p >
102114
103- < div className = "flex items-center justify-between" >
104- < span
105- className = { `text-xs ${
106- isSelected ? 'text-accent-foreground/70' : 'text-muted-foreground'
107- } `}
108- >
109- { formattedDate }
110- </ span >
111-
115+ < div className = "space-y-1" >
116+ { /* Date and Folder */ }
117+ < div className = "flex flex-col gap-1" >
118+ < span
119+ className = { `text-xs ${
120+ isSelected ? 'text-accent-foreground/70' : 'text-muted-foreground'
121+ } `}
122+ >
123+ { formattedDate }
124+ </ span >
125+
126+ { folder && (
127+ < div
128+ className = { `flex items-center gap-1.5 text-xs ${
129+ isSelected ? 'text-accent-foreground/60' : 'text-muted-foreground/80'
130+ } `}
131+ >
132+ < div
133+ className = "h-2 w-2 rounded-sm shrink-0"
134+ style = { { backgroundColor : folder . color || '#6b7280' } }
135+ />
136+ < span className = "truncate" > { folder . name } </ span >
137+ </ div >
138+ ) }
139+ </ div >
140+
141+ { /* Tags */ }
112142 { note . tags && note . tags . length > 0 && (
113- < div className = "flex gap-1" >
143+ < div className = "flex gap-1 pt-1 " >
114144 { note . tags . slice ( 0 , 1 ) . map ( ( tag ) => (
115145 < span
116146 key = { tag }
@@ -149,6 +179,8 @@ export default memo(NoteCard, (prevProps, nextProps) => {
149179 prevProps . note . content === nextProps . note . content &&
150180 prevProps . note . starred === nextProps . note . starred &&
151181 prevProps . note . updatedAt === nextProps . note . updatedAt &&
152- prevProps . isSelected === nextProps . isSelected
182+ prevProps . note . folderId === nextProps . note . folderId &&
183+ prevProps . isSelected === nextProps . isSelected &&
184+ prevProps . folders === nextProps . folders
153185 ) ;
154- } ) ;
186+ } ) ;
0 commit comments