diff --git a/src/lib/components/VirtualItem.svelte b/src/lib/components/VirtualItem.svelte
new file mode 100644
index 00000000..ee984279
--- /dev/null
+++ b/src/lib/components/VirtualItem.svelte
@@ -0,0 +1,56 @@
+
+
+
{:else if type === "date"}
{value}
+ {:else if shouldVirtualize}
+
+ {@const event = value as TrustedEvent}
+ {#if event.kind === ROOM_ADD_MEMBER}
+
+ {:else}
+
+
+
+ {/if}
+
{:else}
{@const event = value as TrustedEvent}
{#if event.kind === ROOM_ADD_MEMBER}
diff --git a/src/routes/spaces/[relay]/chat/+page.svelte b/src/routes/spaces/[relay]/chat/+page.svelte
index 08e40d79..f89a94ed 100644
--- a/src/routes/spaces/[relay]/chat/+page.svelte
+++ b/src/routes/spaces/[relay]/chat/+page.svelte
@@ -21,6 +21,7 @@
import SpaceSearch from "@app/components/SpaceSearch.svelte"
import RoomItem from "@app/components/RoomItem.svelte"
import RoomItemAddMember from "@src/app/components/RoomItemAddMember.svelte"
+ import VirtualItem from "@lib/components/VirtualItem.svelte"
import RoomCompose from "@app/components/RoomCompose.svelte"
import RoomComposeEdit from "@src/app/components/RoomComposeEdit.svelte"
@@ -37,6 +38,7 @@
const url = decodeRelay($page.params.relay!)
const shouldProtect = canEnforceNip70(url)
const at = $derived(parseInt($page.url.searchParams.get("at")!))
+ const shouldVirtualize = $derived(isNaN(at))
const replyTo = (event: TrustedEvent) => {
parent = event
@@ -309,7 +311,7 @@
Looking for messages...
{/if}
- {#each elements as { type, id, value, showPubkey, addSpaceBelow } (id)}
+ {#each elements as { type, id, value, showPubkey, addSpaceBelow }, i (id)}
{#if type === "new-messages"}
{:else if type === "date"}
{value}
+ {:else if shouldVirtualize}
+
+ {@const event = value as TrustedEvent}
+ {#if event.kind === RELAY_ADD_MEMBER}
+
+ {:else}
+
+
+
+ {/if}
+
{:else}
{@const event = value as TrustedEvent}
{#if event.kind === RELAY_ADD_MEMBER}