75 lines
1.9 KiB
TypeScript
75 lines
1.9 KiB
TypeScript
import {
|
|
useDeleteProject,
|
|
useProjects,
|
|
useUpdateProject,
|
|
} from "@/hooks/queries/useProjects";
|
|
import { useState } from "react";
|
|
|
|
import { T_projects } from "@/types/projects.type";
|
|
import { EditProjectModal } from "./EditProjectModal";
|
|
import { ProjectCard } from "./ProjectCard";
|
|
|
|
export default function ManageProject() {
|
|
const { data: projectsData, isLoading } = useProjects();
|
|
const updateMutation = useUpdateProject();
|
|
const deleteMutation = useDeleteProject();
|
|
|
|
const [selectedProject, setSelectedProject] = useState<T_projects | null>(
|
|
null,
|
|
);
|
|
|
|
const projects: T_projects[] = projectsData?.data?.data?.result || [];
|
|
|
|
const handleUpdate = (data: Partial<T_projects>) => {
|
|
if (selectedProject) {
|
|
updateMutation.mutate(
|
|
{ id: selectedProject._id, data },
|
|
{
|
|
onSuccess: () => setSelectedProject(null),
|
|
},
|
|
);
|
|
}
|
|
};
|
|
|
|
const handleDelete = (id: string) => {
|
|
if (window.confirm("Are you sure you want to delete this project?")) {
|
|
deleteMutation.mutate(id);
|
|
}
|
|
};
|
|
|
|
if (isLoading)
|
|
return (
|
|
<div className="p-10 text-center animate-pulse">Loading Projects...</div>
|
|
);
|
|
|
|
return (
|
|
<div className="p-8 max-w-5xl mx-auto">
|
|
<header className="mb-10">
|
|
<h1 className="text-4xl font-extrabold">Manage Projects</h1>
|
|
<p className="text-muted-foreground">
|
|
Edit, update or remove your portfolio items.
|
|
</p>
|
|
</header>
|
|
|
|
<div className="grid grid-cols-1 gap-6">
|
|
{projects.map((item) => (
|
|
<ProjectCard
|
|
key={item._id}
|
|
project={item}
|
|
onEdit={setSelectedProject}
|
|
onDelete={handleDelete}
|
|
/>
|
|
))}
|
|
</div>
|
|
|
|
{selectedProject && (
|
|
<EditProjectModal
|
|
project={selectedProject}
|
|
onClose={() => setSelectedProject(null)}
|
|
onSave={handleUpdate}
|
|
/>
|
|
)}
|
|
</div>
|
|
);
|
|
}
|