"use client";
import Link from "next/link";
import { useState } from "react";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import {
ChevronLeft,
Plus,
Calendar,
MoreHorizontal,
Video,
Loader2,
} from "lucide-react";
import { TProject } from "@/types/project";
import Image from "next/image";
import {
DropdownMenu,
DropdownMenuItem,
DropdownMenuContent,
DropdownMenuTrigger,
DropdownMenuSeparator,
} from "@/components/ui/dropdown-menu";
import { useProjectStore } from "@/stores/project-store";
import { useRouter } from "next/navigation";
import { DeleteProjectDialog } from "@/components/delete-project-dialog";
import { RenameProjectDialog } from "@/components/rename-project-dialog";
export default function ProjectsPage() {
const { createNewProject, savedProjects, isLoading, isInitialized } =
useProjectStore();
const router = useRouter();
const handleCreateProject = async () => {
const projectId = await createNewProject("New Project");
console.log("projectId", projectId);
router.push(`/editor/${projectId}`);
};
return (
Your Projects
{savedProjects.length}{" "}
{savedProjects.length === 1 ? "project" : "projects"}
{isLoading || !isInitialized ? (
) : savedProjects.length === 0 ? (
) : (
{savedProjects.map((project) => (
))}
)}
);
}
function ProjectCard({ project }: { project: TProject }) {
const [isDropdownOpen, setIsDropdownOpen] = useState(false);
const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false);
const [isRenameDialogOpen, setIsRenameDialogOpen] = useState(false);
const { deleteProject, renameProject, duplicateProject } = useProjectStore();
const formatDate = (date: Date): string => {
return date.toLocaleDateString("en-US", {
month: "short",
day: "numeric",
year: "numeric",
});
};
const handleDeleteProject = async () => {
await deleteProject(project.id);
setIsDropdownOpen(false);
};
const handleRenameProject = async (newName: string) => {
await renameProject(project.id, newName);
setIsRenameDialogOpen(false);
};
const handleDuplicateProject = async () => {
setIsDropdownOpen(false);
await duplicateProject(project.id);
};
return (
<>
{/* Thumbnail preview or placeholder */}
{project.thumbnail ? (
) : (
)}
{project.name}
{
e.preventDefault();
e.stopPropagation();
}}
>
{
e.preventDefault();
e.stopPropagation();
setIsDropdownOpen(false);
setIsRenameDialogOpen(true);
}}
>
Rename
{
e.preventDefault();
e.stopPropagation();
handleDuplicateProject();
}}
>
Duplicate
{
e.preventDefault();
e.stopPropagation();
setIsDropdownOpen(false);
setIsDeleteDialogOpen(true);
}}
>
Delete
Created {formatDate(project.createdAt)}
>
);
}
function CreateButton({ onClick }: { onClick?: () => void }) {
return (
);
}
function NoProjects({ onCreateProject }: { onCreateProject: () => void }) {
return (
No projects yet
Start creating your first video project. Import media, edit, and export
professional videos.
);
}