diff --git a/src/app/components/CalendarEventActions.svelte b/src/app/components/CalendarEventActions.svelte index 92d094ff..d6582cac 100644 --- a/src/app/components/CalendarEventActions.svelte +++ b/src/app/components/CalendarEventActions.svelte @@ -2,6 +2,7 @@ import type {TrustedEvent, EventContent} from "@welshman/util" import {getTagValue} from "@welshman/util" import {pubkey} from "@welshman/app" + import Pen2 from "@assets/icons/pen-2.svg?dataurl" import Icon from "@lib/components/Icon.svelte" import Button from "@lib/components/Button.svelte" import Link from "@lib/components/Link.svelte" @@ -14,7 +15,6 @@ import {publishDelete, publishReaction, canEnforceNip70} from "@app/core/commands" import {makeCalendarPath, makeSpacePath} from "@app/util/routes" import {pushModal} from "@app/util/modal" - import Pen2 from "@assets/icons/pen-2.svg?dataurl" type Props = { url: string @@ -26,7 +26,7 @@ const {url, event, showRoom, showActivity}: Props = $props() const h = getTagValue("h", event.tags) - const path = makeCalendarPath(url, event.id) + const path = makeCalendarPath(url, getAddress(event)) const shouldProtect = canEnforceNip70(url) const editEvent = () => pushModal(CalendarEventEdit, {url, event}) diff --git a/src/app/components/CalendarEventItem.svelte b/src/app/components/CalendarEventItem.svelte index 534d978c..960bd065 100644 --- a/src/app/components/CalendarEventItem.svelte +++ b/src/app/components/CalendarEventItem.svelte @@ -20,7 +20,7 @@ + href={makeCalendarPath(url, getAddress(event))}>
diff --git a/src/app/components/ClassifiedActions.svelte b/src/app/components/ClassifiedActions.svelte index b8605a88..65afb4ae 100644 --- a/src/app/components/ClassifiedActions.svelte +++ b/src/app/components/ClassifiedActions.svelte @@ -1,14 +1,20 @@ - - + + {#snippet header()} Create a Classified Listing Advertise a job, sale, or need. -
- - {#snippet label()} -

Title*

- {/snippet} - {#snippet input()} - - {/snippet} -
- - {#snippet label()} -

Description*

- {/snippet} - {#snippet input()} -
- -
- {/snippet} -
- - {#snippet label()} -

Price*

- {/snippet} - {#snippet input()} -
- - -
- {/snippet} -
- - {#snippet label()} -

Images (optional)

- {/snippet} - {#snippet input()} - - {/snippet} -
-
-
- - - - -
+ {/snippet} + diff --git a/src/app/components/ClassifiedEdit.svelte b/src/app/components/ClassifiedEdit.svelte new file mode 100644 index 00000000..c4125eb1 --- /dev/null +++ b/src/app/components/ClassifiedEdit.svelte @@ -0,0 +1,31 @@ + + + + {#snippet header()} + + Edit this Listing + Advertise a job, sale, or need. + + {/snippet} + diff --git a/src/app/components/ClassifiedForm.svelte b/src/app/components/ClassifiedForm.svelte new file mode 100644 index 00000000..2a6e4da5 --- /dev/null +++ b/src/app/components/ClassifiedForm.svelte @@ -0,0 +1,204 @@ + + + + + + Create a Classified Listing + Advertise a job, sale, or need. + +
+ + {#snippet label()} +

Title*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ + {#snippet label()} +

Description*

+ {/snippet} + {#snippet input()} +
+ +
+ {/snippet} +
+ + {#snippet label()} +

Price*

+ {/snippet} + {#snippet input()} +
+ + +
+ {/snippet} +
+ {#if initialValues} + + {#snippet label()} +

Status*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ {/if} + + {#snippet label()} +

Images (optional)

+ {/snippet} + {#snippet input()} + + {/snippet} +
+
+
+ + + + +
diff --git a/src/app/components/ClassifiedItem.svelte b/src/app/components/ClassifiedItem.svelte index 75f9afcb..dcbda74e 100644 --- a/src/app/components/ClassifiedItem.svelte +++ b/src/app/components/ClassifiedItem.svelte @@ -24,7 +24,7 @@ + href={makeClassifiedPath(url, getAddress(event))}> {#if title}

{title}

diff --git a/src/app/components/NoteContent.svelte b/src/app/components/NoteContent.svelte index 09d5ab13..d14c6c47 100644 --- a/src/app/components/NoteContent.svelte +++ b/src/app/components/NoteContent.svelte @@ -10,14 +10,16 @@ const props: ComponentProps = $props() -{#if props.event.kind === EVENT_TIME} - -{:else if props.event.kind === THREAD} - -{:else if props.event.kind === CLASSIFIED} - -{:else if props.event.kind === ZAP_GOAL} - -{:else} - -{/if} +{#key props.event.id} + {#if props.event.kind === EVENT_TIME} + + {:else if props.event.kind === THREAD} + + {:else if props.event.kind === CLASSIFIED} + + {:else if props.event.kind === ZAP_GOAL} + + {:else} + + {/if} +{/key} diff --git a/src/app/components/NoteContentClassified.svelte b/src/app/components/NoteContentClassified.svelte index 051d856d..d1f65a78 100644 --- a/src/app/components/NoteContentClassified.svelte +++ b/src/app/components/NoteContentClassified.svelte @@ -17,7 +17,7 @@ {#if props.event.content} {/if} -
+
{#each images as image (image)} {/each} diff --git a/src/app/core/commands.ts b/src/app/core/commands.ts index cf6e9249..a169d6a3 100644 --- a/src/app/core/commands.ts +++ b/src/app/core/commands.ts @@ -531,7 +531,6 @@ export const uploadFile = async (file: File, options: UploadFileOptions = {}) => const ext = "." + type.split("/")[1] const server = await getBlossomServer(options) - console.log("====", server) const hashes = [await sha256(await file.arrayBuffer())] const $signer = signer.get() || Nip01Signer.ephemeral() const authTemplate = makeBlossomAuthEvent({action: "upload", server, hashes}) diff --git a/src/app/util/notifications.ts b/src/app/util/notifications.ts index 6b2b54dd..8d842eed 100644 --- a/src/app/util/notifications.ts +++ b/src/app/util/notifications.ts @@ -232,13 +232,13 @@ export const notifications = derived( } } - const commentsByClassifiedId = groupBy( - e => getTagValue("E", e.tags), + const commentsByClassifiedAddress = groupBy( + e => getTagValue("A", e.tags), classifiedComments.filter(spec({kind: COMMENT})), ) - for (const [classifiedId, [comment]] of commentsByClassifiedId.entries()) { - const classifiedItemPath = makeClassifiedPath(url, classifiedId) + for (const [address, [comment]] of commentsByClassifiedAddress.entries()) { + const classifiedItemPath = makeClassifiedPath(url, address) if (hasNotification(classifiedPath, comment)) { paths.add(spacePathMobile) @@ -250,13 +250,13 @@ export const notifications = derived( } } - const commentsByEventId = groupBy( - e => getTagValue("E", e.tags), + const commentsByEventAddress = groupBy( + e => getTagValue("A", e.tags), calendarComments.filter(spec({kind: COMMENT})), ) - for (const [eventId, [comment]] of commentsByEventId.entries()) { - const calendarItemPath = makeCalendarPath(url, eventId) + for (const [address, [comment]] of commentsByEventAddress.entries()) { + const calendarItemPath = makeCalendarPath(url, address) if (hasNotification(calendarPath, comment)) { paths.add(spacePathMobile) diff --git a/src/app/util/routes.ts b/src/app/util/routes.ts index 8cc89a68..418bcbf5 100644 --- a/src/app/util/routes.ts +++ b/src/app/util/routes.ts @@ -62,16 +62,13 @@ export const makeRoomPath = (url: string, h: string) => `/spaces/${encodeRelay(u export const makeSpaceChatPath = (url: string) => makeRoomPath(url, "chat") -export const makeGoalPath = (url: string, eventId?: string) => makeSpacePath(url, "goals", eventId) +export const makeGoalPath = (url: string, id?: string) => makeSpacePath(url, "goals", id) -export const makeThreadPath = (url: string, eventId?: string) => - makeSpacePath(url, "threads", eventId) +export const makeThreadPath = (url: string, id?: string) => makeSpacePath(url, "threads", id) -export const makeClassifiedPath = (url: string, eventId?: string) => - makeSpacePath(url, "classifieds", eventId) +export const makeClassifiedPath = (url: string, address?: string) => makeSpacePath(url, "classifieds", address) -export const makeCalendarPath = (url: string, eventId?: string) => - makeSpacePath(url, "calendar", eventId) +export const makeCalendarPath = (url: string, address?: string) => makeSpacePath(url, "calendar", address) export const getPrimaryNavItem = ($page: Page) => $page.route?.id?.split("/")[1] @@ -126,17 +123,18 @@ export const getEventPath = async (event: TrustedEvent, urls: string[]) => { } if (event.kind === CLASSIFIED) { - return makeClassifiedPath(url, event.id) + return makeClassifiedPath(url, getAddress(event)) } if (event.kind === EVENT_TIME) { - return makeCalendarPath(url, event.id) + return makeCalendarPath(url, getAddress(event)) } if (event.kind === MESSAGE) { return h ? makeRoomPath(url, h) : makeSpacePath(url, "chat") } + const address = event.tags.find(nthEq(0, "A"))?.[1] const kind = event.tags.find(nthEq(0, "K"))?.[1] const id = event.tags.find(nthEq(0, "E"))?.[1] @@ -149,18 +147,21 @@ export const getEventPath = async (event: TrustedEvent, urls: string[]) => { return makeThreadPath(url, id) } - if (parseInt(kind) === CLASSIFIED) { - return makeClassifiedPath(url, id) - } - - if (parseInt(kind) === EVENT_TIME) { - return makeCalendarPath(url, id) - } - if (parseInt(kind) === MESSAGE) { return h ? makeRoomPath(url, h) : makeSpacePath(url, "chat") } } + + if (address && kind) { + if (parseInt(kind) === CLASSIFIED) { + return makeClassifiedPath(url, address) + } + + if (parseInt(kind) === EVENT_TIME) { + return makeCalendarPath(url, address) + } + + } } return entityLink(nip19.neventEncode({id: event.id, relays: urls})) @@ -171,10 +172,10 @@ export const getRoomItemPath = (url: string, event: TrustedEvent) => { case THREAD: return makeThreadPath(url, event.id) case CLASSIFIED: - return makeClassifiedPath(url, event.id) + return makeClassifiedPath(url, getAddress(event)) case ZAP_GOAL: return makeGoalPath(url, event.id) case EVENT_TIME: - return makeCalendarPath(url, event.id) + return makeCalendarPath(url, getAddress(event)) } } diff --git a/src/routes/spaces/[relay]/calendar/[id]/+page.svelte b/src/routes/spaces/[relay]/calendar/[address]/+page.svelte similarity index 100% rename from src/routes/spaces/[relay]/calendar/[id]/+page.svelte rename to src/routes/spaces/[relay]/calendar/[address]/+page.svelte diff --git a/src/routes/spaces/[relay]/classifieds/[id]/+page.svelte b/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte similarity index 90% rename from src/routes/spaces/[relay]/classifieds/[id]/+page.svelte rename to src/routes/spaces/[relay]/classifieds/[address]/+page.svelte index 99c4a13c..dd1ba4f4 100644 --- a/src/routes/spaces/[relay]/classifieds/[id]/+page.svelte +++ b/src/routes/spaces/[relay]/classifieds/[address]/+page.svelte @@ -24,10 +24,10 @@ import {deriveEvent, decodeRelay} from "@app/core/state" import {setChecked} from "@app/util/notifications" - const {relay, id} = $page.params as MakeNonOptional + const {relay, address} = $page.params as MakeNonOptional const url = decodeRelay(relay) - const event = deriveEvent(id, [url]) - const filters = [{kinds: [COMMENT], "#E": [id]}] + const event = deriveEvent(address, [url]) + const filters = [{kinds: [COMMENT], "#A": [address]}] const replies = deriveEventsAsc(deriveEventsById({filters, repository})) const back = () => history.back() @@ -115,10 +115,12 @@
{/if} {:else} - {#await sleep(5000)} - Loading listing... - {:then} -

Failed to load classified listing.

- {/await} +
+ {#await sleep(5000)} + Loading listing... + {:then} +

Failed to load classified listing.

+ {/await} +
{/if} diff --git a/src/routes/spaces/[relay]/recent/+page.svelte b/src/routes/spaces/[relay]/recent/+page.svelte index d85bb612..fb25a6e8 100644 --- a/src/routes/spaces/[relay]/recent/+page.svelte +++ b/src/routes/spaces/[relay]/recent/+page.svelte @@ -140,7 +140,7 @@ {:else if event.kind === CLASSIFIED} - + View Listing @@ -150,7 +150,7 @@ {:else if event.kind === EVENT_TIME} - + View Event