Skip to content

Commit 804c021

Browse files
committed
feat: save filters to local storage
1 parent d59518b commit 804c021

File tree

3 files changed

+97
-31
lines changed

3 files changed

+97
-31
lines changed

apps/client/pages/issues/closed.tsx

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
11
import useTranslation from "next-translate/useTranslation";
22
import { useRouter } from "next/router";
3+
import { useEffect, useMemo, useState } from "react";
34
import Loader from "react-spinners/ClipLoader";
4-
import { useState, useMemo, useEffect } from "react";
55

6+
import { toast } from "@/shadcn/hooks/use-toast";
7+
import { cn } from "@/shadcn/lib/utils";
8+
import { Button } from "@/shadcn/ui/button";
9+
import {
10+
Command,
11+
CommandEmpty,
12+
CommandGroup,
13+
CommandInput,
14+
CommandItem,
15+
CommandList,
16+
CommandSeparator,
17+
} from "@/shadcn/ui/command";
618
import {
719
ContextMenu,
820
ContextMenuContent,
921
ContextMenuItem,
1022
ContextMenuSeparator,
11-
ContextMenuTrigger,
1223
ContextMenuSub,
13-
ContextMenuSubTrigger,
1424
ContextMenuSubContent,
25+
ContextMenuSubTrigger,
26+
ContextMenuTrigger,
1527
} from "@/shadcn/ui/context-menu";
28+
import { Popover, PopoverContent, PopoverTrigger } from "@/shadcn/ui/popover";
1629
import { getCookie } from "cookies-next";
30+
import { CheckIcon, Filter, X } from "lucide-react";
1731
import moment from "moment";
1832
import Link from "next/link";
1933
import { useQuery } from "react-query";
2034
import { useUser } from "../../store/session";
21-
import { Popover, PopoverContent, PopoverTrigger } from "@/shadcn/ui/popover";
22-
import { CheckIcon, Filter, X } from "lucide-react";
23-
import { Button } from "@/shadcn/ui/button";
24-
import {
25-
Command,
26-
CommandEmpty,
27-
CommandGroup,
28-
CommandInput,
29-
CommandItem,
30-
CommandList,
31-
CommandSeparator,
32-
} from "@/shadcn/ui/command";
33-
import { cn } from "@/shadcn/lib/utils";
34-
import { toast } from "@/shadcn/hooks/use-toast";
3535

3636
async function getUserTickets(token: any) {
3737
const res = await fetch(`/api/v1/tickets/completed`, {
@@ -83,11 +83,32 @@ export default function Tickets() {
8383
const normal = "bg-green-100 text-green-800";
8484

8585
const [filterSelected, setFilterSelected] = useState();
86-
const [selectedPriorities, setSelectedPriorities] = useState<string[]>([]);
87-
const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);
88-
const [selectedAssignees, setSelectedAssignees] = useState<string[]>([]);
86+
const [selectedPriorities, setSelectedPriorities] = useState<string[]>(() => {
87+
const saved = localStorage.getItem('closed_selectedPriorities');
88+
return saved ? JSON.parse(saved) : [];
89+
});
90+
const [selectedStatuses, setSelectedStatuses] = useState<string[]>(() => {
91+
const saved = localStorage.getItem('closed_selectedStatuses');
92+
return saved ? JSON.parse(saved) : [];
93+
});
94+
const [selectedAssignees, setSelectedAssignees] = useState<string[]>(() => {
95+
const saved = localStorage.getItem('closed_selectedAssignees');
96+
return saved ? JSON.parse(saved) : [];
97+
});
8998
const [users, setUsers] = useState<any[]>([]);
9099

100+
useEffect(() => {
101+
localStorage.setItem('closed_selectedPriorities', JSON.stringify(selectedPriorities));
102+
}, [selectedPriorities]);
103+
104+
useEffect(() => {
105+
localStorage.setItem('closed_selectedStatuses', JSON.stringify(selectedStatuses));
106+
}, [selectedStatuses]);
107+
108+
useEffect(() => {
109+
localStorage.setItem('closed_selectedAssignees', JSON.stringify(selectedAssignees));
110+
}, [selectedAssignees]);
111+
91112
const handlePriorityToggle = (priority: string) => {
92113
setSelectedPriorities((prev) =>
93114
prev.includes(priority)

apps/client/pages/issues/index.tsx

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,28 @@ export default function Tickets() {
8282
const low = "bg-blue-100 text-blue-800";
8383
const normal = "bg-green-100 text-green-800";
8484

85-
const [selectedPriorities, setSelectedPriorities] = useState<string[]>([]);
86-
const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);
87-
const [selectedAssignees, setSelectedAssignees] = useState<string[]>([]);
85+
const [selectedPriorities, setSelectedPriorities] = useState<string[]>(() => {
86+
const saved = localStorage.getItem('all_selectedPriorities');
87+
return saved ? JSON.parse(saved) : [];
88+
});
89+
90+
const [selectedStatuses, setSelectedStatuses] = useState<string[]>(() => {
91+
const saved = localStorage.getItem('all_selectedStatuses');
92+
return saved ? JSON.parse(saved) : [];
93+
});
94+
95+
const [selectedAssignees, setSelectedAssignees] = useState<string[]>(() => {
96+
const saved = localStorage.getItem('all_selectedAssignees');
97+
return saved ? JSON.parse(saved) : [];
98+
});
99+
100+
// Update local storage when filters change
101+
useEffect(() => {
102+
localStorage.setItem('all_selectedPriorities', JSON.stringify(selectedPriorities));
103+
localStorage.setItem('all_selectedStatuses', JSON.stringify(selectedStatuses));
104+
localStorage.setItem('all_selectedAssignees', JSON.stringify(selectedAssignees));
105+
}, [selectedPriorities, selectedStatuses, selectedAssignees]);
106+
88107
const [users, setUsers] = useState<any[]>([]);
89108

90109
const handlePriorityToggle = (priority: string) => {

apps/client/pages/issues/open.tsx

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,41 @@ export default function Tickets() {
8383
const normal = "bg-green-100 text-green-800";
8484

8585
const [filterSelected, setFilterSelected] = useState();
86-
const [selectedPriorities, setSelectedPriorities] = useState<string[]>([]);
87-
const [selectedStatuses, setSelectedStatuses] = useState<string[]>([]);
88-
const [selectedAssignees, setSelectedAssignees] = useState<string[]>([]);
86+
const [selectedPriorities, setSelectedPriorities] = useState<string[]>(() => {
87+
const saved = localStorage.getItem('open_selectedPriorities');
88+
return saved ? JSON.parse(saved) : [];
89+
});
90+
const [selectedStatuses, setSelectedStatuses] = useState<string[]>(() => {
91+
const saved = localStorage.getItem('open_selectedStatuses');
92+
return saved ? JSON.parse(saved) : [];
93+
});
94+
const [selectedAssignees, setSelectedAssignees] = useState<string[]>(() => {
95+
const saved = localStorage.getItem('open_selectedAssignees');
96+
return saved ? JSON.parse(saved) : [];
97+
});
8998
const [users, setUsers] = useState<any[]>([]);
9099

100+
useEffect(() => {
101+
localStorage.setItem('open_selectedPriorities', JSON.stringify(selectedPriorities));
102+
}, [selectedPriorities]);
103+
104+
useEffect(() => {
105+
localStorage.setItem('open_selectedStatuses', JSON.stringify(selectedStatuses));
106+
}, [selectedStatuses]);
107+
108+
useEffect(() => {
109+
localStorage.setItem('open_selectedAssignees', JSON.stringify(selectedAssignees));
110+
}, [selectedAssignees]);
111+
112+
const clearAllFilters = () => {
113+
setSelectedPriorities([]);
114+
setSelectedStatuses([]);
115+
setSelectedAssignees([]);
116+
localStorage.removeItem('open_selectedPriorities');
117+
localStorage.removeItem('open_selectedStatuses');
118+
localStorage.removeItem('open_selectedAssignees');
119+
};
120+
91121
const handlePriorityToggle = (priority: string) => {
92122
setSelectedPriorities((prev) =>
93123
prev.includes(priority)
@@ -480,11 +510,7 @@ export default function Tickets() {
480510
variant="ghost"
481511
size="sm"
482512
className="h-6 px-2 text-xs"
483-
onClick={() => {
484-
setSelectedPriorities([]);
485-
setSelectedStatuses([]);
486-
setSelectedAssignees([]);
487-
}}
513+
onClick={clearAllFilters}
488514
>
489515
Clear all
490516
</Button>

0 commit comments

Comments
 (0)