2024-08-04 19:00:26 -05:00
|
|
|
import React, { useEffect, useState } from "react";
|
2024-03-26 18:14:32 -05:00
|
|
|
import Image from "next/image";
|
|
|
|
import { useRouter } from "next/router";
|
|
|
|
import { formatTimestampToHowLongAgo } from "@/utils/time";
|
|
|
|
import { useImageProxy } from "@/hooks/useImageProxy";
|
2024-08-13 14:42:36 -05:00
|
|
|
import { getTotalFromZaps } from "@/utils/lightning";
|
2024-08-25 14:58:25 -05:00
|
|
|
import { Tag } from "primereact/tag";
|
2024-08-04 17:02:34 -05:00
|
|
|
import ZapDisplay from "@/components/zaps/ZapDisplay";
|
2024-08-13 14:42:36 -05:00
|
|
|
import { useZapsSubscription } from "@/hooks/nostrQueries/zaps/useZapsSubscription";
|
2024-08-04 17:02:34 -05:00
|
|
|
|
|
|
|
const ResourceTemplate = ({ resource }) => {
|
2024-08-13 14:42:36 -05:00
|
|
|
const { zaps, zapsLoading, zapsError } = useZapsSubscription({ event: resource });
|
2024-08-25 18:15:45 -05:00
|
|
|
const [zapAmount, setZapAmount] = useState(0);
|
2024-03-26 18:14:32 -05:00
|
|
|
|
2024-04-22 10:45:52 -05:00
|
|
|
const router = useRouter();
|
|
|
|
const { returnImageProxy } = useImageProxy();
|
2024-04-21 18:06:23 -05:00
|
|
|
|
2024-04-22 10:45:52 -05:00
|
|
|
useEffect(() => {
|
2024-08-25 18:15:45 -05:00
|
|
|
if (zaps.length > 0) {
|
|
|
|
const total = getTotalFromZaps(zaps, resource);
|
|
|
|
setZapAmount(total);
|
|
|
|
}
|
|
|
|
}, [zaps, resource]);
|
2024-08-04 18:16:56 -05:00
|
|
|
|
2024-08-04 19:00:26 -05:00
|
|
|
if (zapsError) return <div>Error: {zapsError}</div>;
|
2024-04-21 18:06:23 -05:00
|
|
|
|
2024-04-22 10:45:52 -05:00
|
|
|
return (
|
|
|
|
<div
|
2024-04-22 15:46:52 -05:00
|
|
|
className="flex flex-col items-center mx-auto px-4 mt-8 rounded-md"
|
2024-04-22 10:45:52 -05:00
|
|
|
>
|
2024-08-04 17:02:34 -05:00
|
|
|
{/* Wrap the image in a div with a relative class with a padding-bottom of 56.25% representing the aspect ratio of 16:9 */}
|
|
|
|
<div
|
2024-08-25 18:15:45 -05:00
|
|
|
onClick={() => router.replace(`/details/${resource.id}`)}
|
2024-04-22 19:09:46 -05:00
|
|
|
className="relative w-full h-0 hover:opacity-80 transition-opacity duration-300 cursor-pointer"
|
2024-08-04 17:02:34 -05:00
|
|
|
style={{ paddingBottom: "56.25%" }}
|
2024-04-22 11:59:20 -05:00
|
|
|
>
|
2024-04-22 10:45:52 -05:00
|
|
|
<Image
|
|
|
|
alt="resource thumbnail"
|
|
|
|
src={returnImageProxy(resource.image)}
|
|
|
|
quality={100}
|
|
|
|
layout="fill"
|
|
|
|
objectFit="cover"
|
|
|
|
className="rounded-md"
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
<div className="flex flex-col justify-start w-full mt-4">
|
|
|
|
<h4 className="mb-1 font-bold text-lg font-blinker line-clamp-2">
|
|
|
|
{resource.title}
|
|
|
|
</h4>
|
2024-08-25 14:58:25 -05:00
|
|
|
<p className="text-sm text-gray-500 line-clamp-2">{resource.summary}</p>
|
|
|
|
{resource.price && resource.price > 0 ? (
|
|
|
|
<p className="text-sm text-gray-500 line-clamp-2">Price: {resource.price} sats</p>
|
|
|
|
) : (
|
|
|
|
<p className="text-sm text-gray-500 line-clamp-2">Free</p>
|
|
|
|
)}
|
2024-04-22 10:45:52 -05:00
|
|
|
<div className="flex flex-row justify-between items-center mt-2">
|
|
|
|
<p className="text-xs text-gray-400">
|
|
|
|
{formatTimestampToHowLongAgo(resource.published_at)}
|
|
|
|
</p>
|
2024-08-25 18:15:45 -05:00
|
|
|
<ZapDisplay
|
|
|
|
zapAmount={zapAmount}
|
|
|
|
event={resource}
|
|
|
|
zapsLoading={zapsLoading && zapAmount === 0}
|
|
|
|
/>
|
2024-03-26 18:14:32 -05:00
|
|
|
</div>
|
2024-08-25 14:58:25 -05:00
|
|
|
{resource?.topics && resource?.topics.length > 0 && (
|
|
|
|
<div className="flex flex-row justify-start items-center mt-2">
|
|
|
|
{resource.topics.map((topic, index) => (
|
|
|
|
<Tag key={index} value={topic} className="mr-2 text-white" />
|
|
|
|
))}
|
|
|
|
</div>
|
|
|
|
)}
|
2024-04-22 10:45:52 -05:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
2024-03-26 18:14:32 -05:00
|
|
|
};
|
|
|
|
|
2024-08-25 18:15:45 -05:00
|
|
|
export default ResourceTemplate;
|