mirror of
https://github.com/OpenCut-app/OpenCut.git
synced 2026-07-13 21:52:53 +02:00
refactor: move sorting logic to project store
This commit is contained in:
@@ -45,6 +45,7 @@ export default function ProjectsPage() {
|
|||||||
isLoading,
|
isLoading,
|
||||||
isInitialized,
|
isInitialized,
|
||||||
deleteProject,
|
deleteProject,
|
||||||
|
getFilteredAndSortedProjects,
|
||||||
} = useProjectStore();
|
} = useProjectStore();
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const [isSelectionMode, setIsSelectionMode] = useState(false);
|
const [isSelectionMode, setIsSelectionMode] = useState(false);
|
||||||
@@ -73,7 +74,7 @@ export default function ProjectsPage() {
|
|||||||
|
|
||||||
const handleSelectAll = (checked: boolean) => {
|
const handleSelectAll = (checked: boolean) => {
|
||||||
if (checked) {
|
if (checked) {
|
||||||
setSelectedProjects(new Set(filteredProjects.map((p) => p.id)));
|
setSelectedProjects(new Set(sortedProjects.map((p) => p.id)));
|
||||||
} else {
|
} else {
|
||||||
setSelectedProjects(new Set());
|
setSelectedProjects(new Set());
|
||||||
}
|
}
|
||||||
@@ -93,40 +94,13 @@ export default function ProjectsPage() {
|
|||||||
setIsBulkDeleteDialogOpen(false);
|
setIsBulkDeleteDialogOpen(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
const filteredProjects = savedProjects.filter((project) =>
|
const sortedProjects = getFilteredAndSortedProjects(searchQuery, sortOption);
|
||||||
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 allSelected =
|
const allSelected =
|
||||||
sortedProjects.length > 0 &&
|
sortedProjects.length > 0 &&
|
||||||
selectedProjects.size === sortedProjects.length;
|
selectedProjects.size === sortedProjects.length;
|
||||||
const someSelected =
|
const someSelected =
|
||||||
selectedProjects.size > 0 &&
|
selectedProjects.size > 0 && selectedProjects.size < sortedProjects.length;
|
||||||
selectedProjects.size < sortedProjects.length;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-background">
|
<div className="min-h-screen bg-background">
|
||||||
|
|||||||
@@ -27,6 +27,11 @@ interface ProjectStore {
|
|||||||
options?: { backgroundColor?: string; blurIntensity?: number }
|
options?: { backgroundColor?: string; blurIntensity?: number }
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
updateProjectFps: (fps: number) => Promise<void>;
|
updateProjectFps: (fps: number) => Promise<void>;
|
||||||
|
|
||||||
|
getFilteredAndSortedProjects: (
|
||||||
|
searchQuery: string,
|
||||||
|
sortOption: string
|
||||||
|
) => TProject[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export const useProjectStore = create<ProjectStore>((set, get) => ({
|
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;
|
||||||
|
},
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user