mirror of
https://github.com/lumina-rocks/lumina.git
synced 2026-04-07 22:16:46 +02:00
70 lines
1.7 KiB
TypeScript
70 lines
1.7 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { useProfile } from "nostr-react";
|
|
import {
|
|
nip19,
|
|
} from "nostr-tools";
|
|
import {
|
|
Card,
|
|
SmallCardContent,
|
|
} from "@/components/ui/card"
|
|
import Link from 'next/link';
|
|
import Image from 'next/image';
|
|
import { extractDimensions } from '@/utils/utils';
|
|
|
|
interface QuickViewKind20NoteCardProps {
|
|
pubkey: string;
|
|
text: string;
|
|
image: string;
|
|
eventId: string;
|
|
tags: string[][];
|
|
event: any;
|
|
linkToNote: boolean;
|
|
}
|
|
|
|
const QuickViewKind20NoteCard: React.FC<QuickViewKind20NoteCardProps> = ({ pubkey, text, image, eventId, tags, event, linkToNote }) => {
|
|
const {data, isLoading} = useProfile({
|
|
pubkey,
|
|
});
|
|
const [imageError, setImageError] = useState(false);
|
|
|
|
if (!image || !image.startsWith("http") || imageError) return null;
|
|
|
|
text = text.replaceAll('\n', ' ');
|
|
const encodedNoteId = nip19.noteEncode(event.id)
|
|
|
|
const { width, height } = extractDimensions(event);
|
|
|
|
const card = (
|
|
<Card className="aspect-square">
|
|
<SmallCardContent className="h-full p-0">
|
|
<div className="h-full w-full">
|
|
<div className='relative w-full h-full'>
|
|
<Image
|
|
src={image || "/placeholder.svg"}
|
|
alt={text}
|
|
fill
|
|
sizes="(max-width: 768px) 100vw, 300px"
|
|
className='rounded lg:rounded-lg object-cover'
|
|
priority
|
|
onError={() => setImageError(true)}
|
|
/>
|
|
</div>
|
|
</div>
|
|
</SmallCardContent>
|
|
</Card>
|
|
);
|
|
|
|
return (
|
|
<>
|
|
{linkToNote ? (
|
|
<Link href={`/note/${encodedNoteId}`} className="block w-full aspect-square">
|
|
{card}
|
|
</Link>
|
|
) : (
|
|
card
|
|
)}
|
|
</>
|
|
);
|
|
}
|
|
|
|
export default QuickViewKind20NoteCard; |