import Image from "next/image"; import Link from "next/link"; import ReactMarkdown from "react-markdown"; import * as Tabs from "@radix-ui/react-tabs"; import { Button } from "@/components/ui/button"; import { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from "@/components/ui/carousel"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; import { Progress } from "@/components/ui/progress"; import { Separator } from "@/components/ui/separator"; import { createSupabaseClient } from "@/lib/supabase/serverComponentClient"; import FollowShareButtons from "./followShareButton"; import { getProjectData } from "@/lib/data/projectQuery"; import { getDealList } from "@/app/api/dealApi"; import { sumByKey, toPercentage } from "@/lib/utils"; export default async function ProjectDealPage({ params }: { params: { id: number } }) { const supabase = createSupabaseClient(); const { data: projectData, error: projectDataError } = await getProjectData(supabase, params.id); if (!projectData) { return
No data available
; } if (projectDataError) { return
Error
; } const projectBusinessOwnerId = projectData.user_id; const dealList = await getDealList(projectBusinessOwnerId); const totalDealAmount = sumByKey(dealList, "deal_amount"); // timeDiff, if negative convert to zero const timeDiff = Math.max((new Date(projectData.investment_deadline)).getTime() - new Date().getTime(), 0) const hourLeft = Math.floor(timeDiff / (1000 * 60 * 60)); const carouselData = Array(5).fill({ src: projectData.card_image_url || "/boiler1.jpg", alt: `${projectData.project_name} Image`, }); return (
{/* Name, star and share button packed */}
{/* image carousel */}
{carouselData.map((item, index) => ( {item.alt} ))} {carouselData.map((item, index) => ( {item.alt} ))}

${totalDealAmount}

{toPercentage(totalDealAmount, projectData?.target_investment)}% raised of ${projectData?.target_investment} max goal

{dealList.length}

Investors

{projectData?.investment_deadline ? ( <>

{Math.floor(hourLeft)} hours

Left to invest

) : (

No deadline

)}
{/* menu */}
Pitch General Data Updates {projectData.project_name}
{projectData?.project_description || "No pitch available."}
general general Description

general Content

update update Description

update Content

); }