@@ -352,6 +352,9 @@ const StatementList: React.FC<StatementListProps> = ({ username }) => {
352352 isSnoozedQuestionsSectionExpanded ,
353353 setIsSnoozedQuestionsSectionExpanded ,
354354 ] = useState ( true ) ;
355+
356+ // State for managing the visibility of category sections
357+ const [ collapsedCategories , setCollapsedCategories ] = useState < Record < string , boolean > > ( { } ) ;
355358
356359 // Move the hook call to the top level
357360 const { categoryCounts } = useAnsweredCountByCategory ( ) ;
@@ -377,106 +380,132 @@ const StatementList: React.FC<StatementListProps> = ({ username }) => {
377380 const isComplete =
378381 categoryStatus . total > 0 &&
379382 categoryStatus . answered === categoryStatus . total ;
383+
384+ // Check if category is collapsed
385+ const isCollapsed = collapsedCategories [ catId ] || false ;
386+
387+ // Toggle collapsed state for this category
388+ const toggleCollapsed = ( ) => {
389+ setCollapsedCategories ( prev => ( {
390+ ...prev ,
391+ [ catId ] : ! prev [ catId ]
392+ } ) ) ;
393+ } ;
380394
381395 return (
382396 < div key = { catId } className = 'mb-4 md:mb-8 category-section' >
383397 { /* Folder Tab Design */ }
384398 < div className = { `relative z-10` } >
385399 < div
386- className = { `inline-block px-4 py-1 md:py-2 rounded-t-lg ${
400+ className = { `${ isCollapsed ? 'w-full' : 'inline-block' } px-4 py-1 md:py-2 ${
401+ isCollapsed ? 'rounded-lg' : 'rounded-t-lg'
402+ } ${
387403 isComplete
388404 ? 'bg-green-200 border-green-500'
389405 : 'bg-slate-100 border-slate-300'
390- } border-t border-l border-r border-b-0`}
406+ } border ${ isCollapsed ? '' : 'border-b-0' } cursor-pointer`}
407+ onClick = { toggleCollapsed }
408+ aria-expanded = { ! isCollapsed }
409+ aria-controls = { `category-content-${ catId } ` }
391410 >
392- < div className = 'flex items-center space-x-2' >
393- < h3 className = 'text-lg font-semibold' >
394- { formatCategoryName ( catLabel ) }
395- </ h3 >
396- < SmallCircularQuestionCounter size = { 18 } categoryId = { catId } />
411+ < div className = 'flex items-center justify-between' >
412+ < div className = 'flex items-center space-x-2' >
413+ < h3 className = 'text-lg font-semibold' >
414+ { formatCategoryName ( catLabel ) }
415+ </ h3 >
416+ < SmallCircularQuestionCounter size = { 18 } categoryId = { catId } />
417+ </ div >
418+ { isCollapsed ? (
419+ < ChevronDown className = 'h-5 w-5' />
420+ ) : (
421+ < ChevronUp className = 'h-5 w-5' />
422+ ) }
397423 </ div >
398424 </ div >
399425 </ div >
400426
401427 { /* Folder Content */ }
402- < div
403- className = { `border rounded-tr-lg rounded-b-lg p-2 md:p-4 -mt-[1px] ${
404- isComplete
405- ? 'bg-white border-green-500'
406- : 'bg-white border-slate-300'
407- } `}
408- >
409- { presetForCat . length > 0 && (
410- < ul className = 'space-y-2' >
411- { presetForCat . map ( ( presetQuestion ) => (
412- < li key = { `preset-${ presetQuestion . id } ` } >
413- < QuestionCard
414- presetQuestion = { presetQuestion }
415- onSelect = { handlePresetQuestionSelect }
416- onToggleSnooze = { handleToggleQuestionSnooze }
417- />
418- </ li >
419- ) ) }
420- </ ul >
421- ) }
422- { statementsForCat . length > 0 && (
423- < ul className = 'space-y-4 mt-4' >
424- { statementsForCat . map ( ( statement ) => (
425- < li key = { statement . id } >
426- < StatementItem
427- statement = { statement }
428- isEditing = { statement . id === editingStatementId }
429- editingPart = { null }
430- originalCategory = { originalCategories [ statement . id ] }
431- onPartClick = { handlePartClick }
432- onLocalSave = { handleLocalSave }
433- onCancel = { ( ) => {
434- // If we have the original, restore it
435- if ( originalEntries [ statement . id ] ) {
436- // Restore the original entry from our backup
437- setData ( {
438- type : 'UPDATE_ENTRY' ,
439- payload : originalEntries [ statement . id ] ,
440- } ) ;
441-
442- // Remove from originalEntries and originalCategories
443- setOriginalEntries ( ( prev ) => {
444- const newEntries = { ...prev } ;
445- delete newEntries [ statement . id ] ;
446- return newEntries ;
447- } ) ;
448-
449- // Also clear from original categories
450- setOriginalCategories ( ( prev ) => {
451- const newCategories = { ...prev } ;
452- delete newCategories [ statement . id ] ;
453- return newCategories ;
454- } ) ;
428+ { ! isCollapsed && (
429+ < div
430+ id = { `category-content-${ catId } ` }
431+ className = { `border rounded-tr-lg rounded-b-lg p-2 md:p-4 -mt-[1px] ${
432+ isComplete
433+ ? 'bg-white border-green-500'
434+ : 'bg-white border-slate-300'
435+ } `}
436+ >
437+ { presetForCat . length > 0 && (
438+ < ul className = 'space-y-2' >
439+ { presetForCat . map ( ( presetQuestion ) => (
440+ < li key = { `preset-${ presetQuestion . id } ` } >
441+ < QuestionCard
442+ presetQuestion = { presetQuestion }
443+ onSelect = { handlePresetQuestionSelect }
444+ onToggleSnooze = { handleToggleQuestionSnooze }
445+ />
446+ </ li >
447+ ) ) }
448+ </ ul >
449+ ) }
450+ { statementsForCat . length > 0 && (
451+ < ul className = 'space-y-4 mt-4' >
452+ { statementsForCat . map ( ( statement ) => (
453+ < li key = { statement . id } >
454+ < StatementItem
455+ statement = { statement }
456+ isEditing = { statement . id === editingStatementId }
457+ editingPart = { null }
458+ originalCategory = { originalCategories [ statement . id ] }
459+ onPartClick = { handlePartClick }
460+ onLocalSave = { handleLocalSave }
461+ onCancel = { ( ) => {
462+ // If we have the original, restore it
463+ if ( originalEntries [ statement . id ] ) {
464+ // Restore the original entry from our backup
465+ setData ( {
466+ type : 'UPDATE_ENTRY' ,
467+ payload : originalEntries [ statement . id ] ,
468+ } ) ;
469+
470+ // Remove from originalEntries and originalCategories
471+ setOriginalEntries ( ( prev ) => {
472+ const newEntries = { ...prev } ;
473+ delete newEntries [ statement . id ] ;
474+ return newEntries ;
475+ } ) ;
476+
477+ // Also clear from original categories
478+ setOriginalCategories ( ( prev ) => {
479+ const newCategories = { ...prev } ;
480+ delete newCategories [ statement . id ] ;
481+ return newCategories ;
482+ } ) ;
483+ }
484+
485+ // Exit edit mode
486+ setEditingStatementId ( null ) ;
487+ } }
488+ onDelete = { handleDeleteClick }
489+ onEditClick = { handleEditClick }
490+ onAddAction = { handleAddAction }
491+ onEditAction = { handleEditAction }
492+ onDeleteAction = { handleDeleteAction }
493+ onReset = {
494+ statement . presetId
495+ ? ( ) => handleResetClick ( statement . id )
496+ : undefined
455497 }
456-
457- // Exit edit mode
458- setEditingStatementId ( null ) ;
459- } }
460- onDelete = { handleDeleteClick }
461- onEditClick = { handleEditClick }
462- onAddAction = { handleAddAction }
463- onEditAction = { handleEditAction }
464- onDeleteAction = { handleDeleteAction }
465- onReset = {
466- statement . presetId
467- ? ( ) => handleResetClick ( statement . id )
468- : undefined
469- }
470- onToggleArchived = { handleToggleArchived }
471- onToggleActionResolved = { ( actionId : string ) =>
472- handleToggleActionResolved ( statement . id , actionId )
473- }
474- />
475- </ li >
476- ) ) }
477- </ ul >
478- ) }
479- </ div >
498+ onToggleArchived = { handleToggleArchived }
499+ onToggleActionResolved = { ( actionId : string ) =>
500+ handleToggleActionResolved ( statement . id , actionId )
501+ }
502+ />
503+ </ li >
504+ ) ) }
505+ </ ul >
506+ ) }
507+ </ div >
508+ ) }
480509 </ div >
481510 ) ;
482511 } ;
0 commit comments