From 77ed913e1b319422fa3be158a6f1b90b498fb457 Mon Sep 17 00:00:00 2001 From: padreug Date: Tue, 16 Sep 2025 22:58:44 +0200 Subject: [PATCH] Add MarketProduct component and integrate into NostrFeed - Introduced MarketProduct.vue to display market product details, including images, pricing, and availability status. - Enhanced NostrFeed.vue to render MarketProduct components for market events, allowing users to view and share products. - Implemented market data parsing in marketParser.ts to handle Nostr market events, ensuring structured data representation. These changes improve the marketplace functionality within the feed, enhancing user engagement with market products. --- .../nostr-feed/components/MarketProduct.vue | 171 ++++++++++++++++++ .../nostr-feed/components/NostrFeed.vue | 144 +++++++++++---- src/modules/nostr-feed/utils/marketParser.ts | 101 +++++++++++ 3 files changed, 382 insertions(+), 34 deletions(-) create mode 100644 src/modules/nostr-feed/components/MarketProduct.vue create mode 100644 src/modules/nostr-feed/utils/marketParser.ts diff --git a/src/modules/nostr-feed/components/MarketProduct.vue b/src/modules/nostr-feed/components/MarketProduct.vue new file mode 100644 index 0000000..e80b842 --- /dev/null +++ b/src/modules/nostr-feed/components/MarketProduct.vue @@ -0,0 +1,171 @@ + + + + + \ No newline at end of file diff --git a/src/modules/nostr-feed/components/NostrFeed.vue b/src/modules/nostr-feed/components/NostrFeed.vue index a4a04f9..5472ffe 100644 --- a/src/modules/nostr-feed/components/NostrFeed.vue +++ b/src/modules/nostr-feed/components/NostrFeed.vue @@ -9,6 +9,8 @@ import { Megaphone, RefreshCw, AlertCircle } from 'lucide-vue-next' import { useFeed } from '../composables/useFeed' import appConfig from '@/app.config' import type { ContentFilter } from '../services/FeedService' +import MarketProduct from './MarketProduct.vue' +import { parseMarketProduct, isMarketEvent, getMarketEventType } from '../utils/marketParser' const props = defineProps<{ relays?: string[] @@ -62,6 +64,34 @@ const feedDescription = computed(() => { function isAdminPost(pubkey: string): boolean { return adminPubkeys.includes(pubkey) } + +// Get market product data for market events +function getMarketProductData(note: any) { + if (note.kind === 30018) { + // Create a mock NostrEvent from our FeedPost + const mockEvent = { + id: note.id, + pubkey: note.pubkey, + content: note.content, + created_at: note.created_at, + kind: note.kind, + tags: note.tags + } + return parseMarketProduct(mockEvent) + } + return null +} + +// Handle market product actions +function onViewProduct(productId: string) { + console.log('View product:', productId) + // TODO: Navigate to product detail page or open modal +} + +function onShareProduct(productId: string) { + console.log('Share product:', productId) + // TODO: Implement sharing functionality +}