Facing Error after adding Collection component in the home page
Swapnanil44 opened this issue · 0 comments
Swapnanil44 commented
I am facing this Error after adding the Collection component in the Home page
page.tsx Code
import { Collection } from "@/components/shared/Collection"
import { navLinks } from "@/constants"
import { getAllImages } from "@/lib/actions/image.actions"
import Image from "next/image"
import Link from "next/link"
const Home = async ({ searchParams }: SearchParamProps) => {
const page = Number(searchParams?.page) || 1;
const searchQuery = (searchParams?.query as string) || '';
const images = await getAllImages({ page, searchQuery})
return (
<>
<section className="home">
<h1 className="home-heading">
Unleash Your Creative Vision with Imaginify
</h1>
<ul className="flex-center w-full gap-20">
{navLinks.slice(1, 5).map((link) => (
<Link
key={link.route}
href={link.route}
className="flex-center flex-col gap-2"
>
<li className="flex-center w-fit rounded-full bg-white p-4">
<Image src={link.icon} alt="image" width={24} height={24} />
</li>
<p className="p-14-medium text-center text-white">{link.label}</p>
</Link>
))}
</ul>
</section>
<section className="sm:mt-12">
<Collection
hasSearch={true}
images={images?.data}
totalPages={images?.totalPage}
page={page}
/>
</section>
</>
)
}
export default Home
Collection.tsx
'use client'
import Image from 'next/image'
import Link from 'next/link'
import { useSearchParams, useRouter } from 'next/navigation'
import { CldImage } from 'next-cloudinary'
import {
Pagination,
PaginationContent,
PaginationNext,
PaginationPrevious,
} from '@/components/ui/pagination'
import { transformationTypes } from '@/constants'
import { IImage } from '@/lib/database/models/image.model'
import { formUrlQuery } from '@/lib/utils'
import { Button } from '../ui/button'
import { Search } from './Search'
export const Collection = ({
hasSearch = false,
images,
totalPages = 1,
page,
}: {
images: IImage[]
totalPages?: number
page: number
hasSearch?: boolean
}) => {
const router = useRouter()
const searchParams = useSearchParams()
// PAGINATION HANDLER
const onPageChange = (action: string) => {
const pageValue = action === 'next' ? Number(page) + 1 : Number(page) - 1
const newUrl = formUrlQuery({
searchParams: searchParams.toString(),
key: 'page',
value: pageValue,
})
router.push(newUrl, { scroll: false })
}
return (
<>
<div className="collection-heading">
<h2 className="h2-bold text-dark-600">Recent Edits</h2>
{hasSearch && <Search />}
</div>
{images.length > 0 ? (
<ul className="collection-list">
{images.map((image) => (
<Card image={image} key={image._id as string} />
))}
</ul>
) : (
<div className="collection-empty">
<p className="p-20-semibold">Empty List</p>
</div>
)}
{totalPages > 1 && (
<Pagination className="mt-10">
<PaginationContent className="flex w-full">
<Button
disabled={Number(page) <= 1}
className="collection-btn"
onClick={() => onPageChange('prev')}
>
<PaginationPrevious className="hover:bg-transparent hover:text-white" />
</Button>
<p className="flex-center p-16-medium w-fit flex-1">
{page} / {totalPages}
</p>
<Button
className="button w-32 bg-purple-gradient bg-cover text-white"
onClick={() => onPageChange('next')}
disabled={Number(page) >= totalPages}
>
<PaginationNext className="hover:bg-transparent hover:text-white" />
</Button>
</PaginationContent>
</Pagination>
)}
</>
)
}
const Card = ({ image }: { image: IImage }) => {
return (
<li>
<Link href={`/transformations/${image._id}`} className="collection-card">
<CldImage
src={image.publicId}
alt={image.title}
width={image.width}
height={image.height}
{...image.config}
loading="lazy"
className="h-52 w-full rounded-[10px] object-cover"
sizes="(max-width: 767px) 100vw, (max-width: 1279px) 50vw, 33vw"
/>
<div className="flex-between">
<p className="p-20-semibold mr-3 line-clamp-1 text-dark-600">
{image.title}
</p>
<Image
src={`/assets/icons/${
transformationTypes[
image.transformationType as TransformationTypeKey
].icon
}`}
alt={image.title}
width={24}
height={24}
/>
</div>
</Link>
</li>
)
}
getAllImages Action
export async function getAllImages({ limit = 9, page = 1, searchQuery = '' }: {
limit?: number;
page: number;
searchQuery?: string;
}) {
try {
await connectToDatabase();
cloudinary.config({
cloud_name: process.env.NEXT_PUBLIC_CLOUDINARY_CLOUD_NAME,
api_key: process.env.CLOUDINARY_API_KEY,
api_secret: process.env.CLOUDINARY_API_SECRET,
secure: true,
})
let expression = 'folder=imaginify';
if (searchQuery) {
expression += ` AND ${searchQuery}`
}
const { resources } = await cloudinary.search
.expression(expression)
.execute();
const resourceIds = resources.map((resource: any) => resource.public_id);
let query = {};
if(searchQuery) {
query = {
publicId: {
$in: resourceIds
}
}
}
const skipAmount = (Number(page) -1) * limit;
const images = await populateUser(Image.find(query))
.sort({ updatedAt: -1 })
.skip(skipAmount)
.limit(limit);
const totalImages = await Image.find(query).countDocuments();
const savedImages = await Image.find().countDocuments();
return {
data: JSON.parse(JSON.stringify(images)),
totalPage: Math.ceil(totalImages / limit),
savedImages,
}
} catch (error) {
handleError(error)
}
}