Spaces:
Sleeping
Sleeping
'use client'; | |
import { Message } from '@prisma/client'; | |
import React from 'react'; | |
import { Card } from '@/components/ui/Card'; | |
import Img from '@/components/ui/Img'; | |
import { Dialog, DialogContent, DialogTrigger } from '@/components/ui/Dialog'; | |
import { Button } from '@/components/ui/Button'; | |
import { IconArrowUpRight } from '@/components/ui/Icons'; | |
import { FixedSizeGrid } from 'react-window'; | |
import { useRouter } from 'next/navigation'; | |
import Link from 'next/link'; | |
export interface MessageGridProps { | |
messages: Pick<Message, 'chatId' | 'id' | 'mediaUrl' | 'prompt'>[]; | |
} | |
const MessageGrid: React.FC<MessageGridProps> = ({ messages }) => { | |
return ( | |
<FixedSizeGrid | |
columnCount={2} | |
columnWidth={590} | |
height={1200} | |
rowCount={Math.round(messages.length / 2 + 1)} | |
rowHeight={120} | |
width={1200} | |
> | |
{({ columnIndex, rowIndex, style }) => { | |
const messageIndex = rowIndex * 2 + columnIndex; | |
if (messageIndex > messages.length - 1) return null; | |
const message = messages[rowIndex * 2 + columnIndex]; | |
const { mediaUrl, prompt, id, chatId } = message; | |
return ( | |
<div style={style} className="p-2 relative"> | |
<Card className="relative flex size-full" key={id}> | |
<div className="h-full w-48 min-w-48 relative"> | |
<Dialog> | |
<DialogTrigger asChild> | |
<Img | |
src={mediaUrl} | |
alt={prompt} | |
className="object-cover size-full cursor-pointer" | |
/> | |
</DialogTrigger> | |
<DialogContent className="max-w-5xl"> | |
<> | |
{mediaUrl?.endsWith('.mp4') ? ( | |
<video | |
src={mediaUrl} | |
controls | |
width={1200} | |
height={800} | |
/> | |
) : ( | |
<Img | |
src={mediaUrl} | |
alt={prompt} | |
quality={100} | |
width={1200} | |
height={800} | |
/> | |
)} | |
</> | |
</DialogContent> | |
</Dialog> | |
</div> | |
<div className="m-2 grow-1 flex flex-col overflow-hidden"> | |
<p className="text-sm">{prompt}</p> | |
</div> | |
<Link | |
className="size-6 absolute right-1 bottom-1" | |
href={`/chat/${chatId}`} | |
target="_blank" | |
> | |
<IconArrowUpRight className="size-3" /> | |
</Link> | |
</Card> | |
</div> | |
); | |
}} | |
</FixedSizeGrid> | |
); | |
}; | |
export default MessageGrid; | |