refactor: use ProjectSection component

This commit is contained in:
Sosokker 2024-11-07 01:53:30 +07:00
parent 6ca933c47c
commit 01eb6c40cc
6 changed files with 86 additions and 81 deletions

View File

@ -1,57 +0,0 @@
import React from "react";
import { ProjectCard } from "@/components/projectCard";
import { Separator } from "@/components/ui/separator";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { ProjectCardProps } from "@/types/ProjectCard";
import Link from "next/link";
export function ProjectSection({ projectsData }: { projectsData: ProjectCardProps[] | null }) {
if (!projectsData || projectsData.length === 0) {
return (
<Card className="text-center">
<CardHeader>
<CardTitle>No Project Found</CardTitle>
</CardHeader>
<CardContent>
<p>Sorry, we could not find any projects matching your search criteria.</p>
</CardContent>
</Card>
);
}
return (
<div className="space-y-6">
<div id="project-card">
<Card>
<CardHeader>
<CardTitle>Projects</CardTitle>
<CardDescription>Found {projectsData.length} projects!</CardDescription>
</CardHeader>
<Separator className="my-3" />
<CardContent>
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6">
{projectsData.map((project) => (
<div key={project.id}>
<Link href={`/deals/${project.id}`}>
<ProjectCard
name={project.project_name}
description={project.short_description}
imageUri={project.image_url}
joinDate={new Date(project.join_date).toLocaleDateString()}
location={project.location}
tags={project.tags}
minInvestment={project.min_investment}
totalInvestor={project.total_investor}
totalRaised={project.total_raise}
/>
</Link>
<Separator />
</div>
))}
</div>
</CardContent>
</Card>
</div>
</div>
);
}

View File

@ -2,9 +2,10 @@ import React, { Suspense } from "react";
import { getBusinessByName } from "@/lib/data/businessQuery"; import { getBusinessByName } from "@/lib/data/businessQuery";
import { createSupabaseClient } from "@/lib/supabase/serverComponentClient"; import { createSupabaseClient } from "@/lib/supabase/serverComponentClient";
import { BusinessSection } from "./BusinessSection"; import { BusinessSection } from "./BusinessSection";
import { ProjectSection } from "./ProjectSection"; import { ProjectSection } from "@/components/ProjectSection";
import { getProjectCardData } from "@/lib/data/projectQuery"; import { getProjectCardData } from "@/lib/data/projectQuery";
import { Separator } from "@/components/ui/separator"; import { Separator } from "@/components/ui/separator";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
export default async function FindContent({ searchParams }: { searchParams: { query: string } }) { export default async function FindContent({ searchParams }: { searchParams: { query: string } }) {
const query = searchParams.query; const query = searchParams.query;
@ -36,7 +37,20 @@ export default async function FindContent({ searchParams }: { searchParams: { qu
</Suspense> </Suspense>
<Separator className="my-3" /> <Separator className="my-3" />
<Suspense fallback={<div>Loading Projects...</div>}> <Suspense fallback={<div>Loading Projects...</div>}>
<ProjectSection projectsData={projectsData} /> <div className="space-y-6">
<div id="project-card">
<Card>
<CardHeader>
<CardTitle>Projects</CardTitle>
<CardDescription>Found {projectsData?.length ?? 0} projects!</CardDescription>
</CardHeader>
<Separator className="my-3" />
<CardContent>
<ProjectSection projectsData={projectsData} />
</CardContent>
</Card>
</div>
</div>
</Suspense> </Suspense>
</div> </div>
); );

View File

@ -9,6 +9,7 @@ import { createSupabaseClient } from "@/lib/supabase/serverComponentClient";
import { Suspense } from "react"; import { Suspense } from "react";
import { FC } from "react"; import { FC } from "react";
import { ProjectCardProps } from "@/types/ProjectCard"; import { ProjectCardProps } from "@/types/ProjectCard";
import { ProjectSection } from "@/components/ProjectSection";
interface TopProjectsProps { interface TopProjectsProps {
projects: ProjectCardProps[] | null; projects: ProjectCardProps[] | null;
@ -134,7 +135,7 @@ export default async function Home() {
</div> </div>
) : ( ) : (
<Suspense fallback={<ProjectsLoader />}> <Suspense fallback={<ProjectsLoader />}>
<TopProjects projects={topProjectsData} /> <ProjectSection projectsData={topProjectsData} />
</Suspense> </Suspense>
)} )}
<div className="self-center py-5 scale-75 md:scale-100"> <div className="self-center py-5 scale-75 md:scale-100">

View File

@ -0,0 +1,44 @@
import React from "react";
import { ProjectCard } from "@/components/projectCard";
import { Separator } from "@/components/ui/separator";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
import { ProjectCardProps } from "@/types/ProjectCard";
import Link from "next/link";
export function ProjectSection({ projectsData }: { projectsData: ProjectCardProps[] | null }) {
if (!projectsData || projectsData.length === 0) {
return (
<Card className="text-center">
<CardHeader>
<CardTitle>No Project Found</CardTitle>
</CardHeader>
<CardContent>
<p>Sorry, we could not find any projects.</p>
</CardContent>
</Card>
);
}
return (
<div className="grid grid-cols-4 gap-6">
{projectsData.map((project) => (
<div key={project.id}>
<Link href={`/deals/${project.id}`}>
<ProjectCard
name={project.project_name}
description={project.short_description}
imageUri={project.image_url}
joinDate={new Date(project.join_date).toLocaleDateString()}
location={project.location}
tags={project.tags}
minInvestment={project.min_investment}
totalInvestor={project.total_investor}
totalRaised={project.total_raise}
/>
</Link>
<Separator />
</div>
))}
</div>
);
}

View File

@ -3,6 +3,7 @@
import { CalendarDaysIcon } from "lucide-react"; import { CalendarDaysIcon } from "lucide-react";
import { cn } from "@/lib/utils"; import { cn } from "@/lib/utils";
import Image from "next/image"; import Image from "next/image";
import { Separator } from "./ui/separator";
interface XMap { interface XMap {
[tag: string]: string; [tag: string]: string;
@ -13,7 +14,7 @@ interface ProjectCardProps {
description: string; description: string;
joinDate: string; joinDate: string;
location: string; location: string;
tags: XMap | null | never[] | string[]; tags?: XMap | null | never[] | string[];
imageUri: string | null; imageUri: string | null;
minInvestment: number; minInvestment: number;
totalInvestor: number; totalInvestor: number;
@ -22,18 +23,6 @@ interface ProjectCardProps {
} }
export function ProjectCard(props: ProjectCardProps) { export function ProjectCard(props: ProjectCardProps) {
if (props.minInvestment === null) {
props.minInvestment = 0;
}
if (props.totalInvestor === null) {
props.minInvestment = 0;
}
if (props.totalRaised === null) {
props.minInvestment = 0;
}
return ( return (
<div <div
className={cn( className={cn(
@ -98,18 +87,32 @@ export function ProjectCard(props: ProjectCardProps) {
{/* Info 2 */} {/* Info 2 */}
<div className="hidden group-hover:flex group-hover:absolute group-hover:bottom-4 p-4 "> <div className="hidden group-hover:flex group-hover:absolute group-hover:bottom-4 p-4 ">
{/* Info 2 (Visible on hover) */} {/* Info 2 (Visible on hover) */}
<div className="transition-transform duration-500 transform translate-y-6 opacity-0 group-hover:translate-y-0 group-hover:opacity-100"> <div className="transition-transform duration-500 transform translate-y-6 opacity-0 group-hover:translate-y-0 group-hover:opacity-100 w-full">
<hr className="-ml-4 mb-2" /> <Separator className="-ml-4 mb-2" />
<p className="text-base"> <p className="text-base">
<strong>${props.totalRaised.toLocaleString()}</strong> committed and reserved <strong>
${isNaN(props.totalRaised) || props.totalRaised == null ? "N/A" : props.totalRaised.toLocaleString()}
</strong>{" "}
committed and reserved
</p> </p>
<hr className="-ml-4 mb-2 mt-2" /> <Separator className="-ml-4 mb-2 mt-2" />
<p className="mb-2 text-base"> <p className="mb-2 text-base">
<strong>{props.totalInvestor.toLocaleString()}</strong> investors <strong>
{isNaN(props.totalInvestor) || props.totalInvestor == null
? "N/A "
: props.totalInvestor.toLocaleString()}
</strong>{" "}
investors
</p> </p>
<hr className="-ml-4 mb-2" /> <Separator className="-ml-4 mb-2" />
<p className="text-base"> <p className="text-base">
<strong>${props.minInvestment.toLocaleString()}</strong> min. investment <strong>
$
{isNaN(props.minInvestment) || props.minInvestment == null
? "N/A"
: props.minInvestment.toLocaleString()}
</strong>{" "}
min. investment
</p> </p>
</div> </div>
</div> </div>

View File

@ -5,7 +5,7 @@ export interface ProjectCardProps {
image_url: string; image_url: string;
join_date: string; join_date: string;
location: string; location: string;
tags: string[] | null; tags?: string[] | null;
min_investment: number; min_investment: number;
total_investor: number; total_investor: number;
total_raise: number; total_raise: number;