aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2025-01-17 16:53:58 -0800
committerAdam Soltys <[email protected]>2025-01-17 16:53:58 -0800
commita2435512c3a29533fc16f7a2375bfd4aac43057c (patch)
treec75bfacd12f68049fd3e78e8a856d1ad789d558b /src
parent65e7795b091af8bc5a1e94cc46eb678e37789cec (diff)
downloadcoinos-ui-a2435512c3a29533fc16f7a2375bfd4aac43057c.tar.gz
coinos-ui-a2435512c3a29533fc16f7a2375bfd4aac43057c.zip
event page
Diffstat (limited to 'src')
-rw-r--r--src/components/Media.svelte25
-rw-r--r--src/routes/(app)/e/[id]/+page.server.ts6
-rw-r--r--src/routes/(app)/e/[id]/+page.svelte21
3 files changed, 46 insertions, 6 deletions
diff --git a/src/components/Media.svelte b/src/components/Media.svelte
new file mode 100644
index 00000000..d24dd12d
--- /dev/null
+++ b/src/components/Media.svelte
@@ -0,0 +1,25 @@
+<script lang="ts">
+ export const isImage = (url: string) =>
+ url?.match(/^.*\.(jpg|jpeg|png|webp|gif|avif|svg)/gi);
+ export const isVideo = (url: string) =>
+ url?.match(/^.*\.(mov|mkv|mp4|avi|m4v|webm)/gi);
+ export const isAudio = (url: string) => url?.match(/^.*\.(ogg|mp3|wav)/gi);
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ export let value: any;
+</script>
+
+{#if !!isImage(value.url)}
+ <img src={value.url} alt={""} />
+{:else if isVideo(value.url)}
+ <!-- svelte-ignore a11y-media-has-caption -->
+ <video src={value.url} controls />
+{:else if isAudio(value.url)}
+ <audio src={value.url} controls>
+ <a href={value.url}>{value.url.replace(/https?:\/\/(www\.)?/, "")}</a>
+ </audio>
+{:else}
+ <a href={value.url}>
+ {value.url.replace(/https?:\/\/(www\.)?/, "")}
+ </a>
+{/if}
diff --git a/src/routes/(app)/e/[id]/+page.server.ts b/src/routes/(app)/e/[id]/+page.server.ts
index 4bad1b9b..78e3ea6e 100644
--- a/src/routes/(app)/e/[id]/+page.server.ts
+++ b/src/routes/(app)/e/[id]/+page.server.ts
@@ -1,12 +1,14 @@
-import { get } from "$lib/utils";
+import { get, post } from "$lib/utils";
import { error } from "@sveltejs/kit";
export async function load({ params }) {
try {
const event = await get(`/event/${params.id}`);
+ const { parts, names } = await post("/parseEvent", { event });
const author = await get(`/users/${event.pubkey}`);
const zaps = await get(`/zaps/${params.id}`);
- return { author, event, zaps };
+
+ return { author, event, names, parts, zaps };
} catch (e) {
console.log(e);
error(500, { message: "Failed to get event" });
diff --git a/src/routes/(app)/e/[id]/+page.svelte b/src/routes/(app)/e/[id]/+page.svelte
index 891ee0eb..15e2be72 100644
--- a/src/routes/(app)/e/[id]/+page.svelte
+++ b/src/routes/(app)/e/[id]/+page.svelte
@@ -1,18 +1,31 @@
<script>
import Avatar from "$comp/Avatar.svelte";
+ import Media from "$comp/Media.svelte";
+
let { data } = $props();
- let { author, event, zaps } = $derived(data);
+ let { author, event, names, parts, zaps } = $derived(data);
let zap = () => {};
</script>
-<div class="container px-4 max-w-xl mx-auto space-y-5 break-words">
+<div class="container px-4 max-w-xl mx-auto space-y-5">
<h1 class="px-3 md:px-0 text-center text-3xl md:text-4xl font-semibold">
Event
</h1>
- <div class="flex items-center gap-2 text-2xl">
+ <div class="flex gap-2 text-2xl">
<Avatar user={author} size={16} />
- <div class="break-words overflow-wrap">{event.content}</div>
+
+ <div class="space-y-5">
+ {#each parts as { type, value }, i}
+ {#if type === "text"}
+ {value}
+ {:else if type === "link"}
+ <Media {value} />
+ {:else if type.match(/^nostr:np(rofile|ub)$/)}
+ <a href={`/${value.pubkey}`} class="font-bold">@{names[value.pubkey]}</a>
+ {/if}
+ {/each}
+ </div>
</div>
<a href={`/send/zap/${event.pubkey}/${event.id}`} class="btn btn-accent">
<iconify-icon noobserver icon="ph:lightning-fill" class="text-yellow-300"