@@ -95,6 +95,13 @@ export default function BrowseLessonPlan() {
9595 setExpandedSections ( newExpanded ) ;
9696 } ;
9797
98+ const handleKeyDown = ( e , section ) => {
99+ if ( e . key === 'Enter' || e . key === ' ' ) {
100+ e . preventDefault ( ) ;
101+ toggleSection ( section ) ;
102+ }
103+ } ;
104+
98105 function handleToggleSave ( plan ) {
99106 if ( ! userId ) {
100107 return ;
@@ -113,6 +120,86 @@ export default function BrowseLessonPlan() {
113120 // Navigate to lesson plan detail page
114121 }
115122
123+ const renderPlanCard = ( plan , isSaved , showFooter = true ) => {
124+ const planId = plan . _id || plan . id ;
125+ const cardClass = isSaved ? `${ styles . atomCard } ${ styles . savedCard } ` : styles . atomCard ;
126+
127+ return (
128+ < div key = { planId } className = { cardClass } >
129+ < div className = { styles . cardHeader } >
130+ < h4 className = { styles . cardTitle } > { plan . title } </ h4 >
131+ < div className = { styles . cardActions } >
132+ { isSaved ? (
133+ < >
134+ < button className = { styles . iconBtn } title = "Star" >
135+ ⭐
136+ </ button >
137+ < button
138+ className = { styles . iconBtn }
139+ title = "View"
140+ onClick = { ( ) => handleViewDetails ( plan ) }
141+ >
142+ 👁️
143+ </ button >
144+ < button
145+ className = { styles . iconBtn }
146+ title = "Remove"
147+ onClick = { ( ) => handleToggleSave ( plan ) }
148+ >
149+ ×
150+ </ button >
151+ </ >
152+ ) : (
153+ < >
154+ < button
155+ className = { `${ styles . iconBtn } ${ styles . saveBtn } ` }
156+ title = "Save"
157+ onClick = { ( ) => handleToggleSave ( plan ) }
158+ >
159+ ☆
160+ </ button >
161+ < button
162+ className = { styles . iconBtn }
163+ title = "View"
164+ onClick = { ( ) => handleViewDetails ( plan ) }
165+ >
166+ 👁️
167+ </ button >
168+ </ >
169+ ) }
170+ </ div >
171+ </ div >
172+ < div className = { styles . cardTags } >
173+ { plan . subjects ?. map ( subj => (
174+ < span key = { subj } className = { styles . subjectTag } >
175+ { subj }
176+ </ span >
177+ ) ) }
178+ < span className = { `${ styles . difficultyBadge } ${ styles [ plan . difficulty || 'beginner' ] } ` } >
179+ { plan . difficulty || 'beginner' }
180+ </ span >
181+ </ div >
182+ < p className = { styles . cardDescription } >
183+ { plan . description
184+ ? plan . description . length > ( showFooter ? 120 : 100 )
185+ ? `${ plan . description . slice ( 0 , showFooter ? 120 : 100 ) } ...`
186+ : plan . description
187+ : showFooter
188+ ? 'No description available.'
189+ : 'No description.' }
190+ </ p >
191+ { showFooter && (
192+ < div className = { styles . cardFooter } >
193+ < span className = { styles . addedDate } >
194+ Added: { new Date ( plan . createdAt || Date . now ( ) ) . toLocaleDateString ( ) }
195+ </ span >
196+ { isSaved && < button className = { styles . priorityBtn } > ★ Priority</ button > }
197+ </ div >
198+ ) }
199+ </ div >
200+ ) ;
201+ } ;
202+
116203 return (
117204 < div className = { `${ styles . container } ${ darkMode ? styles . dark : '' } ` } >
118205 < h1 className = { styles . mainTitle } > My Saved Interests</ h1 >
@@ -151,7 +238,6 @@ export default function BrowseLessonPlan() {
151238 { loading && < div className = { styles . loadingMsg } > Loading...</ div > }
152239 { error && < div className = { styles . errorMsg } > { error } </ div > }
153240
154- { /* Display all subjects with saved items at top */ }
155241 < div className = { styles . sectionsContainer } >
156242 { Object . entries ( groupedAllPlans ) . map ( ( [ subject , allItems ] ) => {
157243 const savedInSubject = ( groupedSaved [ subject ] || [ ] ) . filter ( plan =>
@@ -183,61 +269,12 @@ export default function BrowseLessonPlan() {
183269
184270 { expandedSections . has ( sectionKey ) && (
185271 < >
186- { /* Top 3 Priority (if any saved) */ }
187272 { savedInSubject . length > 0 && (
188273 < div className = { styles . priorityBox } >
189274 < h3 className = { styles . priorityTitle } > My Top 3 for { subject } (Next Focus)</ h3 >
190275 { savedInSubject . slice ( 0 , 3 ) . map ( plan => (
191276 < div key = { plan . _id || plan . id } className = { styles . priorityCard } >
192- < div className = { styles . cardHeader } >
193- < h4 className = { styles . cardTitle } > { plan . title } </ h4 >
194- < div className = { styles . cardActions } >
195- < button className = { styles . iconBtn } title = "Star" >
196- ⭐
197- </ button >
198- < button
199- className = { styles . iconBtn }
200- title = "View"
201- onClick = { ( ) => handleViewDetails ( plan ) }
202- >
203- 👁️
204- </ button >
205- < button
206- className = { styles . iconBtn }
207- title = "Remove"
208- onClick = { ( ) => handleToggleSave ( plan ) }
209- >
210- ×
211- </ button >
212- </ div >
213- </ div >
214- < div className = { styles . cardTags } >
215- { plan . subjects ?. map ( subj => (
216- < span key = { subj } className = { styles . subjectTag } >
217- { subj }
218- </ span >
219- ) ) }
220- < span
221- className = { `${ styles . difficultyBadge } ${
222- styles [ plan . difficulty || 'beginner' ]
223- } `}
224- >
225- { plan . difficulty || 'beginner' }
226- </ span >
227- </ div >
228- < p className = { styles . cardDescription } >
229- { plan . description
230- ? plan . description . length > 120
231- ? `${ plan . description . slice ( 0 , 120 ) } ...`
232- : plan . description
233- : 'No description available.' }
234- </ p >
235- < div className = { styles . cardFooter } >
236- < span className = { styles . addedDate } >
237- Added: { new Date ( plan . createdAt || Date . now ( ) ) . toLocaleDateString ( ) }
238- </ span >
239- < button className = { styles . priorityBtn } > ★ Priority</ button >
240- </ div >
277+ { renderPlanCard ( plan , true , true ) }
241278 </ div >
242279 ) ) }
243280 { savedInSubject . length > 3 && (
@@ -248,112 +285,11 @@ export default function BrowseLessonPlan() {
248285 </ div >
249286 ) }
250287
251- { /* All Items in Subject (Saved + Available) */ }
252288 < div className = { styles . allAtomsSection } >
253289 < h3 className = { styles . allAtomsTitle } > All { subject } Atoms</ h3 >
254290 < div className = { styles . atomsList } >
255- { /* Saved items first */ }
256- { savedInSubject . map ( plan => (
257- < div
258- key = { plan . _id || plan . id }
259- className = { `${ styles . atomCard } ${ styles . savedCard } ` }
260- >
261- < div className = { styles . cardHeader } >
262- < h4 className = { styles . cardTitle } > { plan . title } </ h4 >
263- < div className = { styles . cardActions } >
264- < button className = { styles . iconBtn } title = "Star" >
265- ⭐
266- </ button >
267- < button
268- className = { styles . iconBtn }
269- title = "View"
270- onClick = { ( ) => handleViewDetails ( plan ) }
271- >
272- 👁️
273- </ button >
274- < button
275- className = { styles . iconBtn }
276- title = "Remove"
277- onClick = { ( ) => handleToggleSave ( plan ) }
278- >
279- ×
280- </ button >
281- </ div >
282- </ div >
283- < div className = { styles . cardTags } >
284- { plan . subjects ?. map ( subj => (
285- < span key = { subj } className = { styles . subjectTag } >
286- { subj }
287- </ span >
288- ) ) }
289- < span
290- className = { `${ styles . difficultyBadge } ${
291- styles [ plan . difficulty || 'beginner' ]
292- } `}
293- >
294- { plan . difficulty || 'beginner' }
295- </ span >
296- </ div >
297- < p className = { styles . cardDescription } >
298- { plan . description
299- ? plan . description . length > 100
300- ? `${ plan . description . slice ( 0 , 100 ) } ...`
301- : plan . description
302- : 'No description.' }
303- </ p >
304- < div className = { styles . cardFooter } >
305- < span className = { styles . addedDate } >
306- Added: { new Date ( plan . createdAt || Date . now ( ) ) . toLocaleDateString ( ) }
307- </ span >
308- </ div >
309- </ div >
310- ) ) }
311-
312- { /* Available items */ }
313- { availableInSubject . map ( plan => (
314- < div key = { plan . _id || plan . id } className = { styles . atomCard } >
315- < div className = { styles . cardHeader } >
316- < h4 className = { styles . cardTitle } > { plan . title } </ h4 >
317- < div className = { styles . cardActions } >
318- < button
319- className = { `${ styles . iconBtn } ${ styles . saveBtn } ` }
320- title = "Save"
321- onClick = { ( ) => handleToggleSave ( plan ) }
322- >
323- ☆
324- </ button >
325- < button
326- className = { styles . iconBtn }
327- title = "View"
328- onClick = { ( ) => handleViewDetails ( plan ) }
329- >
330- 👁️
331- </ button >
332- </ div >
333- </ div >
334- < div className = { styles . cardTags } >
335- { plan . subjects ?. map ( subj => (
336- < span key = { subj } className = { styles . subjectTag } >
337- { subj }
338- </ span >
339- ) ) }
340- < span
341- className = { `${ styles . difficultyBadge } ${
342- styles [ plan . difficulty || 'beginner' ]
343- } `}
344- >
345- { plan . difficulty || 'beginner' }
346- </ span >
347- </ div >
348- < p className = { styles . cardDescription } >
349- { plan . description
350- ? plan . description . length > 100
351- ? `${ plan . description . slice ( 0 , 100 ) } ...`
352- : plan . description
353- : 'No description.' }
354- </ p >
355- </ div >
356- ) ) }
291+ { savedInSubject . map ( plan => renderPlanCard ( plan , true , false ) ) }
292+ { availableInSubject . map ( plan => renderPlanCard ( plan , false , false ) ) }
357293 </ div >
358294 </ div >
359295 </ >
0 commit comments