Feed

{#if currentPubkey} {/if}
{#if loading}

Loading feed...

{:else if posts.length === 0 && replaceableEvents.length === 0}

No posts yet. Be the first to post!

{:else} {#if newPostsCount > 0}
{/if}
{#each allFeedItems as item (item.id)} {#if item.type === 'post'} {@const parentId = item.event.tags.find((t) => t[0] === 'e' && t[3] === 'reply')?.[1]} {@const parentEvent = parentId ? (posts.find(p => p.id === parentId) || loadedParentQuotedEvents.get(parentId)) : undefined} {@const quotedId = item.event.tags.find((t) => t[0] === 'q')?.[1]} {@const quotedEvent = quotedId ? (posts.find(p => p.id === quotedId) || loadedParentQuotedEvents.get(quotedId)) : undefined}
openThreadDrawer(item.event, e)} role="button" tabindex="0" onkeydown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); openThreadDrawer(item.event); } }} > { // Store loaded parent/quoted events in separate map to prevent feed re-rendering // NEVER add to main posts array - this causes feed jumping if (!loadedParentQuotedEvents.has(event.id)) { loadedParentQuotedEvents.set(event.id, event); } }} onQuotedLoaded={(event) => { // Store loaded parent/quoted events in separate map to prevent feed re-rendering // NEVER add to main posts array - this causes feed jumping if (!loadedParentQuotedEvents.has(event.id)) { loadedParentQuotedEvents.set(event.id, event); } }} />
{:else if item.type === 'replaceable'}
{/if} {/each}
{#if loadingMore}

Loading more...

{/if} {#if !hasMore && allFeedItems.length > 0}

No more posts

{/if} {#if (showOPsOnly || showResponsesToMe) && getFilteredPosts().length === 0 && posts.length > 0 && replaceableEvents.length === 0}

{#if showResponsesToMe && showOPsOnly} No original posts responding to you found. Try unchecking the filters. {:else if showResponsesToMe} No responses to you found. Try unchecking "Show responses to me". {:else} No original posts found. Try unchecking "Show OPs only". {/if}

{/if} {/if}