@@ -7,7 +7,7 @@ import { Check, Circle, FolderTree, List, Plus, XCircle } from 'lucide-react';
77import Image from 'next/image' ;
88import { useParams } from 'next/navigation' ;
99import { useQueryState } from 'nuqs' ;
10- import { useMemo , useState } from 'react' ;
10+ import { useEffect , useMemo , useRef , useState } from 'react' ;
1111import { CreateTaskSheet } from './CreateTaskSheet' ;
1212import { ModernTaskList } from './ModernTaskList' ;
1313import { SearchInput } from './SearchInput' ;
@@ -51,7 +51,31 @@ export function TaskList({
5151 const [ statusFilter , setStatusFilter ] = useQueryState ( 'status' ) ;
5252 const [ assigneeFilter , setAssigneeFilter ] = useQueryState ( 'assignee' ) ;
5353 const [ createTaskOpen , setCreateTaskOpen ] = useQueryState ( 'create-task' ) ;
54+
55+ // Initialize with default, load from localStorage after hydration
5456 const [ activeTab , setActiveTab ] = useState < 'categories' | 'list' > ( 'categories' ) ;
57+ const lastLoadedOrgId = useRef < string | null > ( null ) ;
58+
59+ // Load saved preference from localStorage after client-side hydration
60+ useEffect ( ( ) => {
61+ // Reset and load preference when orgId changes or on initial load
62+ if ( lastLoadedOrgId . current !== orgId ) {
63+ const saved = localStorage . getItem ( `task-view-preference-${ orgId } ` ) ;
64+ if ( saved === 'categories' || saved === 'list' ) {
65+ setActiveTab ( saved ) ;
66+ } else {
67+ // Reset to default if no saved preference exists for this org
68+ setActiveTab ( 'categories' ) ;
69+ }
70+ lastLoadedOrgId . current = orgId ;
71+ }
72+ } , [ orgId ] ) ;
73+
74+ // Save preference to localStorage when user changes it (not on initial load)
75+ const handleTabChange = ( tab : 'categories' | 'list' ) => {
76+ setActiveTab ( tab ) ;
77+ localStorage . setItem ( `task-view-preference-${ orgId } ` , tab ) ;
78+ } ;
5579
5680 const eligibleAssignees = useMemo ( ( ) => {
5781 return members
@@ -88,7 +112,9 @@ export function TaskList({
88112 // Calculate overall stats from all tasks (not filtered)
89113 const overallStats = useMemo ( ( ) => {
90114 const total = initialTasks . length ;
91- const done = initialTasks . filter ( ( t ) => t . status === 'done' || t . status === 'not_relevant' ) . length ;
115+ const done = initialTasks . filter (
116+ ( t ) => t . status === 'done' || t . status === 'not_relevant' ,
117+ ) . length ;
92118 const inProgress = initialTasks . filter ( ( t ) => t . status === 'in_progress' ) . length ;
93119 const todo = initialTasks . filter ( ( t ) => t . status === 'todo' ) . length ;
94120 const completionRate = total > 0 ? Math . round ( ( done / total ) * 100 ) : 0 ;
@@ -621,7 +647,7 @@ export function TaskList({
621647 { /* View Toggle */ }
622648 < div className = "flex items-center gap-0 rounded-md border border-border bg-card p-0.5" >
623649 < button
624- onClick = { ( ) => setActiveTab ( 'categories' ) }
650+ onClick = { ( ) => handleTabChange ( 'categories' ) }
625651 className = { `flex items-center gap-1.5 rounded-sm px-3 py-1.5 text-xs font-medium transition-colors ${
626652 activeTab === 'categories'
627653 ? 'bg-primary text-primary-foreground'
@@ -632,7 +658,7 @@ export function TaskList({
632658 < span > Categories</ span >
633659 </ button >
634660 < button
635- onClick = { ( ) => setActiveTab ( 'list' ) }
661+ onClick = { ( ) => handleTabChange ( 'list' ) }
636662 className = { `flex items-center gap-1.5 rounded-sm px-3 py-1.5 text-xs font-medium transition-colors ${
637663 activeTab === 'list'
638664 ? 'bg-primary text-primary-foreground'
0 commit comments