diff --git a/src/app/components/ThreadPagination.svelte b/src/app/components/ThreadPagination.svelte new file mode 100644 index 00000000..7e4026ef --- /dev/null +++ b/src/app/components/ThreadPagination.svelte @@ -0,0 +1,65 @@ + + +
+

Page {page} of {pageCount}

+
+ + + {#each pages as p, i (p)} + {#if i > 0 && p - pages[i - 1] > 1} + + {/if} + + {/each} + + +
+
diff --git a/src/app/components/ThreadPost.svelte b/src/app/components/ThreadPost.svelte new file mode 100644 index 00000000..d55653a4 --- /dev/null +++ b/src/app/components/ThreadPost.svelte @@ -0,0 +1,131 @@ + + +
+
+
+ +
+ + {#if $handle} + {displayHandle($handle)} + {/if} + {#if isOp} + OP + {/if} + {#if showRoom && h} + + # + + {/if} +
+
+
+
+ {formatTimestamp(event.created_at)} + +
+ {#if showRoom && h} + + Posted in # + + {/if} +
+ {#if event.kind === COMMENT} + + {:else} + + {/if} +
+
+ +
+ + + +
+
+
+
+
diff --git a/src/routes/spaces/[relay]/threads/+page.svelte b/src/routes/spaces/[relay]/threads/+page.svelte index c36c3542..b13f49b9 100644 --- a/src/routes/spaces/[relay]/threads/+page.svelte +++ b/src/routes/spaces/[relay]/threads/+page.svelte @@ -16,7 +16,9 @@ import SpaceBar from "@app/components/SpaceBar.svelte" import ThreadItem from "@app/components/ThreadItem.svelte" import ThreadCreate from "@app/components/ThreadCreate.svelte" + import RoomName from "@app/components/RoomName.svelte" import {decodeRelay} from "@app/relays" + import {roomsByUrl} from "@app/groups" import {makeCommentFilter} from "@app/content" import {makeFeed} from "@app/feeds" import {pushModal} from "@app/modal" @@ -44,6 +46,32 @@ return sortBy(e => -max([...(scores.get(e.id) || []), e.created_at]), goals) }) + const boards = $derived.by(() => { + const byRoom = new Map() + + for (const event of items) { + const h = getTagValue("h", event.tags) || "" + const roomEvents = byRoom.get(h) || [] + + roomEvents.push(event) + byRoom.set(h, roomEvents) + } + + const roomOrder = new Map(($roomsByUrl.get(url) || []).map((room, index) => [room.h, index])) + + return Array.from(byRoom.entries()).sort(([a], [b]) => { + if (!a) return 1 + if (!b) return -1 + + const aOrder = roomOrder.get(a) ?? Number.MAX_SAFE_INTEGER + const bOrder = roomOrder.get(b) ?? Number.MAX_SAFE_INTEGER + + if (aOrder !== bOrder) return aOrder - bOrder + + return a.localeCompare(b) + }) + }) + onMount(() => { const feed = makeFeed({ url, @@ -77,11 +105,22 @@ {/snippet} - - {#each items as event (event.id)} -
- -
+ + {#each boards as [h, threads] (h || "general")} +
+

+ {#if h} + # + {:else} + General + {/if} +

+ {#each threads as event (event.id)} +
+ +
+ {/each} +
{/each}

diff --git a/src/routes/spaces/[relay]/threads/[id]/+page.svelte b/src/routes/spaces/[relay]/threads/[id]/+page.svelte index 5196ed9b..60dfc3fc 100644 --- a/src/routes/spaces/[relay]/threads/[id]/+page.svelte +++ b/src/routes/spaces/[relay]/threads/[id]/+page.svelte @@ -1,26 +1,30 @@