diff --git a/src/components/AddProductToRocket.svelte b/src/components/AddProductToRocket.svelte index 6937057..3ee9a27 100644 --- a/src/components/AddProductToRocket.svelte +++ b/src/components/AddProductToRocket.svelte @@ -11,16 +11,17 @@ import { NDKEvent } from '@nostr-dev-kit/ndk'; import { Terminal } from 'lucide-svelte'; import Todo from './Todo.svelte'; - import { Rocket } from '@/event_helpers/rockets'; + import { Product, Rocket } from '@/event_helpers/rockets'; - export let product: NDKEvent; - export let rocket: NDKEvent; + export let product: Product; + export let rocket: Rocket; - let parsedRocket: Rocket = new Rocket(rocket); let price: number = 0; let max: number = 0; + let o = false; + function publish() { if (!$ndk.signer) { throw new Error('no ndk signer found'); @@ -29,20 +30,19 @@ if (!author) { throw new Error('no current user'); } - if (rocket.author.pubkey != author.pubkey) { - console.log(rocket.author, author); - throw new Error('you are not the creator of this rocket'); + if (rocket.Event.author.pubkey != author.pubkey) { + throw new Error(`${author.pubkey} is not the creator of this rocket`); } - let event = parsedRocket.UpsertProduct(product.id, price, max); + let event = rocket.UpsertProduct(product.ID(), price, max); event.ndk = $ndk event.publish().then((x) => { console.log(x); - goto(`${base}/products`); + o = false }).catch(()=>{ console.log("failed to publish", event.rawEvent())}); } - + Make Available for Purchase diff --git a/src/components/PayNow.svelte b/src/components/PayNow.svelte index 3a97f40..53aa8c8 100644 --- a/src/components/PayNow.svelte +++ b/src/components/PayNow.svelte @@ -11,21 +11,21 @@ import { requestProvider } from 'webln'; import QrCodeSvg from './QrCodeSvg.svelte'; import CopyButton from './CopyButton.svelte'; - import type { RocketProduct } from '@/event_helpers/rockets'; + import type { Product, Rocket, RocketProduct } from '@/event_helpers/rockets'; - export let product: NDKEvent; + export let product: Product; export let rocketProduct: RocketProduct | undefined; - export let rocket: NDKEvent; + export let rocket: Rocket; let invoice: string | null; async function zap() { if (rocketProduct) { - const z = new NDKZap({ ndk: $ndk, zappedEvent: rocket, zappedUser: rocket.author }); + const z = new NDKZap({ ndk: $ndk, zappedEvent: rocket.Event, zappedUser: rocket.Event.author }); invoice = await z.createZapRequest( rocketProduct.Price * 1000, - `Purchase of ${product.getMatchingTags('name')[0][1]} from ${rocket.dTag}`, - [['product', product.id]] + `Purchase of ${product.Name()} from ${rocket.Event.dTag}`, + [['product', product.ID()]] ); } } @@ -56,7 +56,7 @@ Buy {product.getMatchingTags('name')[0][1]} from {rocket.dTag} now!Buy {product.Name()} from {rocket.Name()} now! {#if !currentUser} @@ -67,7 +67,7 @@ > {/if} - Pay now with Lightning + Pay {rocketProduct.Price} sats now with Lightning {#if invoice} diff --git a/src/components/ProductCard.svelte b/src/components/ProductCard.svelte index e72c056..9e2455e 100644 --- a/src/components/ProductCard.svelte +++ b/src/components/ProductCard.svelte @@ -1,57 +1,25 @@ -{#if validate(product)} +{#if product.Validate()} - {product.getMatchingTags('name')[0][1]} - {product.getMatchingTags('description')[0][1]} + {product.Group()} {#if product.Option().length > 0}(variant: {product.Option()}){/if} + {product.Description()} {#if $$slots.default}
cover @@ -59,17 +27,13 @@
{:else} - cover + cover {/if} - {#if !includedInRocket(new Rocket(rocket), product)} + {#if !rocket.Products().get(product.ID())} {:else} - + {/if}
diff --git a/src/components/ProductCardFromID.svelte b/src/components/ProductCardFromID.svelte index 632d198..59823e2 100644 --- a/src/components/ProductCardFromID.svelte +++ b/src/components/ProductCardFromID.svelte @@ -3,30 +3,22 @@ import { ndk } from '@/ndk'; import type { NDKEvent } from '@nostr-dev-kit/ndk'; import ProductCard from './ProductCard.svelte'; - export let productID: string; - export let rocket: NDKEvent; - let productEvent: NDKEvent | undefined; + import { fetchEvent } from '@/event_helpers/products'; + import { Product, type Rocket } from '@/event_helpers/rockets'; + export let productID: string | undefined = undefined; + export let rocket: Rocket; + export let product:Product | undefined = undefined; onMount(() => { - $ndk.fetchEvent(productID).then((e) => { - if (e) { - productEvent = e; - } else { - let _p = $ndk.storeSubscribe([{ids:[productID] }], { subId: productID }); - _p.subscribe(x=>{ - if (x[0]) { - productEvent = x[0] - _p.unsubscribe() - } - }) - } - }); + if (!product && productID) { + fetchEvent(productID, $ndk).then(e => product = new Product(e)) + } }); -{#if productEvent} - +{#if product} + {/if} diff --git a/src/components/ProductFomo.svelte b/src/components/ProductFomo.svelte index f660b45..afe34a9 100644 --- a/src/components/ProductFomo.svelte +++ b/src/components/ProductFomo.svelte @@ -1,13 +1,48 @@ @@ -16,13 +51,54 @@ - {#each new Rocket(rocket).Products() as [id, product] (id)} + {#each $groups as [identifier, products] (identifier)} + + {#if currentPage} + + + {/if} + {#if products.length > 1} + + + + + + + + {#each pages as page (page.key)} + {#if page.type === "ellipsis"} + + + + {:else} + + + {page.value} + + + {/if} + {/each} + + + + + + + + {/if} + + + + {/each} + diff --git a/src/components/ProductPurchases.svelte b/src/components/ProductPurchases.svelte index 683a5bf..e65d0d0 100644 --- a/src/components/ProductPurchases.svelte +++ b/src/components/ProductPurchases.svelte @@ -1,6 +1,6 @@ - -{#if rocketEvent && rocketProducts.size > 0} - {#each rocketProducts as [id, product] (id)} - - {/each} -{/if} diff --git a/src/components/RocketDashboard.svelte b/src/components/RocketDashboard.svelte index 5bd9737..0721736 100644 --- a/src/components/RocketDashboard.svelte +++ b/src/components/RocketDashboard.svelte @@ -39,7 +39,7 @@ > - + diff --git a/src/lib/event_helpers/products.ts b/src/lib/event_helpers/products.ts new file mode 100644 index 0000000..c77cb75 --- /dev/null +++ b/src/lib/event_helpers/products.ts @@ -0,0 +1,23 @@ +import type { NDKEvent } from "@nostr-dev-kit/ndk"; +import type NDKSvelte from "@nostr-dev-kit/ndk-svelte"; + +export async function fetchEvent(id:string, ndk:NDKSvelte):Promise { + return new Promise((resolve)=>{ + ndk.fetchEvent(id).then((e) => { + if (e) { + resolve(e) + } else { + let _p = ndk.storeSubscribe([{ ids: [id] }], { subId: id, closeOnEose: true }); + _p.subscribe((x) => { + if (x[0]) { + let e = x[0] + _p.unsubscribe(); + resolve(e) + } + }); + } + }); + }) +} + + diff --git a/src/lib/event_helpers/rockets.ts b/src/lib/event_helpers/rockets.ts index 87a95f5..3f4f9af 100644 --- a/src/lib/event_helpers/rockets.ts +++ b/src/lib/event_helpers/rockets.ts @@ -777,3 +777,70 @@ export class BitcoinAssociation { } } } + +export class Product { + Event: NDKEvent; + Group():string { + let s = this.Name() + //let regex = /\[\w+\]/i; + //if (regex.test(this.Name())) { + let g = this.Name().substring(this.Name().indexOf("[")+1, this.Name().lastIndexOf("]")) + if (g.length > 0) { + s = g + } + //} + return s + } + Option():string { + let result = "" + let group = this.Name().substring(this.Name().indexOf("["), this.Name().lastIndexOf("]")+1) + if (group.length > 0) { + for (let s of this.Name().trim().split(group)) { + if (s.trim().length > 0) { + result = s.trim() + } + } + } + return result + } + ID():string { + return this.Event.id + } + Name():string { + return this.Event.getMatchingTags('name')[0][1] + } + Description():string { + return this.Event.getMatchingTags('description')[0][1] + } + CoverImage():string { + return this.Event.getMatchingTags('cover')[0][1] + } + Validate(): boolean { + let test = 0; + if ( + this.Event.getMatchingTags('name') && + this.Event.getMatchingTags('name')[0] && + this.Event.getMatchingTags('name')[0][1] + ) { + test++; + } + if ( + this.Event.getMatchingTags('description') && + this.Event.getMatchingTags('description')[0] && + this.Event.getMatchingTags('description')[0][1] + ) { + test++; + } + if ( + this.Event.getMatchingTags('cover') && + this.Event.getMatchingTags('cover')[0] && + this.Event.getMatchingTags('cover')[0][1] + ) { + test++; + } + return test == 3; + } + constructor(event: NDKEvent) { + this.Event = event + } +} \ No newline at end of file diff --git a/src/routes/products/+page.svelte b/src/routes/products/+page.svelte index ec44f8b..c202c69 100644 --- a/src/routes/products/+page.svelte +++ b/src/routes/products/+page.svelte @@ -6,6 +6,7 @@ import { derived } from 'svelte/store'; import Heading from '../../components/Heading.svelte'; import ProductCard from '../../components/ProductCard.svelte'; + import { Product, Rocket } from '@/event_helpers/rockets'; let rockets: NDKEventStore | undefined; let products: NDKEventStore | undefined; @@ -48,7 +49,7 @@
{#each p as product (product.id)} - + {/each}
{/each}