No posts yet. Be the first to post!
{#each posts as post (post.id)}
diff --git a/src/lib/modules/feed/Kind1Reply.svelte b/src/lib/modules/feed/Kind1Reply.svelte
new file mode 100644
index 0000000..a4d3ed6
--- /dev/null
+++ b/src/lib/modules/feed/Kind1Reply.svelte
@@ -0,0 +1,121 @@
+
+
+
+ {#if parentEvent}
+
+ Replying to: {getParentPreview()}
+
+ {/if}
+
+
+
+
+
+
+
+
+
+
+
+ {#if onReply}
+
+ {/if}
+
+
+
+
diff --git a/src/lib/modules/feed/ReplyToKind1Form.svelte b/src/lib/modules/feed/ReplyToKind1Form.svelte
new file mode 100644
index 0000000..ca7e6f0
--- /dev/null
+++ b/src/lib/modules/feed/ReplyToKind1Form.svelte
@@ -0,0 +1,141 @@
+
+
+
+
+
diff --git a/src/lib/modules/feed/ZapReceiptReply.svelte b/src/lib/modules/feed/ZapReceiptReply.svelte
new file mode 100644
index 0000000..5d0226e
--- /dev/null
+++ b/src/lib/modules/feed/ZapReceiptReply.svelte
@@ -0,0 +1,112 @@
+
+
+
+
+
+ {#if zapReceipt.content}
+
+ {zapReceipt.content}
+
+ {/if}
+
+
+ {#if onReply}
+
+ {/if}
+
+
+
+
diff --git a/src/lib/modules/profiles/ProfilePage.svelte b/src/lib/modules/profiles/ProfilePage.svelte
index 1b425fa..f8e175c 100644
--- a/src/lib/modules/profiles/ProfilePage.svelte
+++ b/src/lib/modules/profiles/ProfilePage.svelte
@@ -6,14 +6,18 @@
import { fetchProfile } from '../../services/auth/profile-fetcher.js';
import { fetchUserStatus } from '../../services/auth/user-status-fetcher.js';
import { nostrClient } from '../../services/nostr/nostr-client.js';
+ import { relayManager } from '../../services/nostr/relay-manager.js';
import { onMount } from 'svelte';
import { page } from '$app/stores';
import type { ProfileData } from '../../services/auth/profile-fetcher.js';
+ import type { NostrEvent } from '../../types/nostr.js';
let profile = $state
(null);
let userStatus = $state(null);
- let posts = $state([]);
+ let posts = $state([]);
+ let responses = $state([]);
let loading = $state(true);
+ let activeTab = $state<'posts' | 'responses'>('posts');
onMount(async () => {
await nostrClient.initialize();
@@ -43,13 +47,29 @@
userStatus = status;
// Load kind 1 posts
- const config = nostrClient.getConfig();
+ const profileRelays = relayManager.getProfileReadRelays();
const feedEvents = await nostrClient.fetchEvents(
[{ kinds: [1], authors: [pubkey], limit: 20 }],
- [...config.defaultRelays, ...config.profileRelays],
+ profileRelays,
{ useCache: true, cacheResults: true }
);
posts = feedEvents.sort((a, b) => b.created_at - a.created_at);
+
+ // Load kind 1 responses (replies to this user's posts)
+ const responseRelays = relayManager.getKind1ResponseReadRelays();
+ const responseEvents = await nostrClient.fetchEvents(
+ [{ kinds: [1], '#p': [pubkey], limit: 20 }],
+ responseRelays,
+ { useCache: true, cacheResults: true }
+ );
+ // Filter to only include actual replies (have e tag pointing to user's posts)
+ const userPostIds = new Set(posts.map(p => p.id));
+ responses = responseEvents
+ .filter(e => {
+ const eTag = e.tags.find(t => t[0] === 'e');
+ return eTag && userPostIds.has(eTag[1]);
+ })
+ .sort((a, b) => b.created_at - a.created_at);
} catch (error) {
console.error('Error loading profile:', error);
} finally {
@@ -106,15 +126,41 @@
-
Posts
- {#if posts.length === 0}
-
No posts yet.
+
+
+
+
+
+ {#if activeTab === 'posts'}
+ {#if posts.length === 0}
+
No posts yet.
+ {:else}
+
+ {#each posts as post (post.id)}
+
+ {/each}
+
+ {/if}
{:else}
-
- {#each posts as post (post.id)}
-
- {/each}
-
+ {#if responses.length === 0}
+
No responses yet.
+ {:else}
+
+ {#each responses as response (response.id)}
+
+ {/each}
+
+ {/if}
{/if}
{:else}
diff --git a/src/lib/modules/threads/CreateThreadForm.svelte b/src/lib/modules/threads/CreateThreadForm.svelte
index a66b334..d7db1a9 100644
--- a/src/lib/modules/threads/CreateThreadForm.svelte
+++ b/src/lib/modules/threads/CreateThreadForm.svelte
@@ -1,6 +1,7 @@
+
+{#if loading}
+
Loading thread...
+{/if}
+
+
diff --git a/src/lib/services/nostr/auth-handler.ts b/src/lib/services/nostr/auth-handler.ts
index a73359a..fc2b2a3 100644
--- a/src/lib/services/nostr/auth-handler.ts
+++ b/src/lib/services/nostr/auth-handler.ts
@@ -13,6 +13,7 @@ import { decryptPrivateKey } from '../security/key-management.js';
import { sessionManager, type AuthMethod } from '../auth/session-manager.js';
import { fetchRelayLists } from '../auth/relay-list-fetcher.js';
import { nostrClient } from './nostr-client.js';
+import { relayManager } from './relay-manager.js';
import type { NostrEvent } from '../../types/nostr.js';
// Mute list and blocked relays management
@@ -107,14 +108,13 @@ export async function authenticateAsAnonymous(password: string): Promise