summaryrefslogtreecommitdiff
path: root/apps/web/src
diff options
context:
space:
mode:
authorMaze Winther <mazewinther@gmail.com>2025-07-17 13:45:12 +0200
committerMaze Winther <mazewinther@gmail.com>2025-07-17 13:45:12 +0200
commitb18a48b58675c0b9b7542ee045215b235517bed2 (patch)
tree5306a1368bd4f7430c270b0da2d12ae5debe6d3e /apps/web/src
parent9d5707d5fdd0e6a47622df6d9dda6db2e88f266f (diff)
downloadopencut-b18a48b58675c0b9b7542ee045215b235517bed2.tar.gz
refactor: move sorting logic to project store
Diffstat (limited to 'apps/web/src')
-rw-r--r--apps/web/src/app/projects/page.tsx34
-rw-r--r--apps/web/src/stores/project-store.ts41
2 files changed, 45 insertions, 30 deletions
diff --git a/apps/web/src/app/projects/page.tsx b/apps/web/src/app/projects/page.tsx
index e68c70c4..04270aee 100644
--- a/apps/web/src/app/projects/page.tsx
+++ b/apps/web/src/app/projects/page.tsx
@@ -45,6 +45,7 @@ export default function ProjectsPage() {
isLoading,
isInitialized,
deleteProject,
+ getFilteredAndSortedProjects,
} = useProjectStore();
const router = useRouter();
const [isSelectionMode, setIsSelectionMode] = useState(false);
@@ -73,7 +74,7 @@ export default function ProjectsPage() {
const handleSelectAll = (checked: boolean) => {
if (checked) {
- setSelectedProjects(new Set(filteredProjects.map((p) => p.id)));
+ setSelectedProjects(new Set(sortedProjects.map((p) => p.id)));
} else {
setSelectedProjects(new Set());
}
@@ -93,40 +94,13 @@ export default function ProjectsPage() {
setIsBulkDeleteDialogOpen(false);
};
- const filteredProjects = savedProjects.filter((project) =>
- project.name.toLowerCase().includes(searchQuery.toLowerCase())
- );
-
- const sortedProjects = [...filteredProjects].sort((a, b) => {
- const [key, order] = sortOption.split("-");
-
- if (key !== "createdAt" && key !== "name") {
- console.warn(`Invalid sort key: ${key}`);
- return 0;
- }
-
- const aValue = a[key];
- const bValue = b[key];
-
- if (aValue === undefined || bValue === undefined) return 0;
-
- if (order === "asc") {
- if (aValue < bValue) return -1;
- if (aValue > bValue) return 1;
- return 0;
- } else {
- if (aValue > bValue) return -1;
- if (aValue < bValue) return 1;
- return 0;
- }
- });
+ const sortedProjects = getFilteredAndSortedProjects(searchQuery, sortOption);
const allSelected =
sortedProjects.length > 0 &&
selectedProjects.size === sortedProjects.length;
const someSelected =
- selectedProjects.size > 0 &&
- selectedProjects.size < sortedProjects.length;
+ selectedProjects.size > 0 && selectedProjects.size < sortedProjects.length;
return (
<div className="min-h-screen bg-background">
diff --git a/apps/web/src/stores/project-store.ts b/apps/web/src/stores/project-store.ts
index efb9cc71..a8833982 100644
--- a/apps/web/src/stores/project-store.ts
+++ b/apps/web/src/stores/project-store.ts
@@ -27,6 +27,11 @@ interface ProjectStore {
options?: { backgroundColor?: string; blurIntensity?: number }
) => Promise<void>;
updateProjectFps: (fps: number) => Promise<void>;
+
+ getFilteredAndSortedProjects: (
+ searchQuery: string,
+ sortOption: string
+ ) => TProject[];
}
export const useProjectStore = create<ProjectStore>((set, get) => ({
@@ -317,4 +322,40 @@ export const useProjectStore = create<ProjectStore>((set, get) => ({
});
}
},
+
+ getFilteredAndSortedProjects: (searchQuery: string, sortOption: string) => {
+ const { savedProjects } = get();
+
+ // Filter projects by search query
+ const filteredProjects = savedProjects.filter((project) =>
+ project.name.toLowerCase().includes(searchQuery.toLowerCase())
+ );
+
+ // Sort filtered projects
+ const sortedProjects = [...filteredProjects].sort((a, b) => {
+ const [key, order] = sortOption.split("-");
+
+ if (key !== "createdAt" && key !== "name") {
+ console.warn(`Invalid sort key: ${key}`);
+ return 0;
+ }
+
+ const aValue = a[key];
+ const bValue = b[key];
+
+ if (aValue === undefined || bValue === undefined) return 0;
+
+ if (order === "asc") {
+ if (aValue < bValue) return -1;
+ if (aValue > bValue) return 1;
+ return 0;
+ } else {
+ if (aValue > bValue) return -1;
+ if (aValue < bValue) return 1;
+ return 0;
+ }
+ });
+
+ return sortedProjects;
+ },
}));