Spaces:
Runtime error
Runtime error
File size: 2,456 Bytes
4f2c36e 5881efa 848e268 02b9873 5240c42 4f2c36e 5881efa 848e268 5881efa 0891679 4f2c36e 5881efa 5240c42 5881efa 02b9873 4f2c36e 5240c42 4f2c36e 5881efa 4a320f9 5240c42 5881efa 4a320f9 5881efa 5240c42 5881efa 02b9873 5240c42 02b9873 5881efa 5240c42 5881efa 4f2c36e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
import { useMemo } from "react";
import { motion } from "framer-motion";
import { Collection as CollectionType, Image } from "@/utils/type";
import { useInputGeneration } from "@/components/main/hooks/useInputGeneration";
import { arrayBufferToBase64 } from "@/utils";
interface Props {
index: number;
collection: Image;
className?: string;
onOpen: (id: string) => void;
}
export const Collection: React.FC<Props> = ({
collection,
index,
className,
onOpen,
}) => {
const { setPrompt } = useInputGeneration();
const bufferToBase64 = useMemo(() => {
const base64Flag = "data:image/jpeg;base64,";
const imageStr = arrayBufferToBase64(collection.blob.data);
return base64Flag + imageStr;
}, [collection]);
const formatDate = useMemo(() => {
const date = new Date(collection.createdAt);
return date.toLocaleDateString();
}, [collection.createdAt]);
return (
<div className={`h-[377px] w-full relative ${className}`}>
<motion.div
initial={{ y: 100, opacity: 0 }}
animate={{ y: 0, opacity: 1 }}
transition={{ duration: 0.35, delay: index * 0.1 }}
className="rounded-[33px] h-[377px] cursor-pointer group overflow-hidden relative z-[1] group"
onClick={() => onOpen(collection.id)}
>
<div className="absolute top-0 left-0 w-full h-full translate-y-full opacity-0 transition-all duration-300 group-hover:translate-y-0 group-hover:opacity-100 flex items-end p-3">
<div className="bg-[#292424] backdrop-blur-sm bg-opacity-60 rounded-xl p-3 border-white/20 border w-full">
<p className="text-xs font-semibold text-white/60 mb-0.5">
{formatDate}
</p>
<p className="text-lg font-medium text-white lowercase leading-snug">
{collection.prompt}
</p>
<p
className="text-white text-sm text-right font-semibold mt-2"
onClick={(e) => {
e.stopPropagation();
setPrompt(collection.prompt);
}}
>
Try it now
</p>
</div>
</div>
<div
style={{
backgroundImage: `url(${bufferToBase64})`,
}}
className="rounded-[33px] bg-red-400 bg-cover absolute top-0 left-0 w-full h-full z-[-1] transition-all duration-200 group-hover:scale-110 bg-center"
/>
</motion.div>
</div>
);
};
|