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>
  );
};