Skip to content

Commit 7d7c0e1

Browse files
committed
Merge remote-tracking branch 'origin/main' into tofik/security-questionnaire-UI
2 parents 576aec5 + 4caed2a commit 7d7c0e1

File tree

1 file changed

+30
-4
lines changed

1 file changed

+30
-4
lines changed

apps/app/src/app/(app)/[orgId]/tasks/components/TaskList.tsx

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Check, Circle, FolderTree, List, Plus, XCircle } from 'lucide-react';
77
import Image from 'next/image';
88
import { useParams } from 'next/navigation';
99
import { useQueryState } from 'nuqs';
10-
import { useMemo, useState } from 'react';
10+
import { useEffect, useMemo, useRef, useState } from 'react';
1111
import { CreateTaskSheet } from './CreateTaskSheet';
1212
import { ModernTaskList } from './ModernTaskList';
1313
import { 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

Comments
 (0)