From 985fa2f7c99832cdf3c3351d2273c8fd05402b78 Mon Sep 17 00:00:00 2001
From: polwex <polwex@sortug.com>
Date: Wed, 17 Sep 2025 21:45:18 +0700
Subject: basic comms working

---
 front/src/pages/Feed.tsx | 84 ++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 82 insertions(+), 2 deletions(-)

(limited to 'front/src/pages/Feed.tsx')

diff --git a/front/src/pages/Feed.tsx b/front/src/pages/Feed.tsx
index 65dee64..5902162 100644
--- a/front/src/pages/Feed.tsx
+++ b/front/src/pages/Feed.tsx
@@ -8,6 +8,8 @@ import { useParams } from "wouter";
 import spinner from "@/assets/triangles.svg";
 import { useState } from "react";
 import Composer from "@/components/composer/Composer";
+import Icon from "@/components/Icon";
+import toast from "react-hot-toast";
 // import UserFeed from "./User";
 import { P404 } from "@/Router";
 import { isValidPatp } from "urbit-ob";
@@ -88,11 +90,89 @@ function Global() {
   return <p>Error</p>;
 }
 function Nostr() {
-  const { nostrFeed } = useLocalState();
+  const { nostrFeed, api } = useLocalState((s) => ({
+    nostrFeed: s.nostrFeed,
+    api: s.api,
+  }));
+  const [isSyncing, setIsSyncing] = useState(false);
   const feed = eventsToFc(nostrFeed);
   console.log({ feed });
   const refetch = () => feed;
-  return <PostList data={feed} refetch={refetch} />;
+
+  const handleResync = async () => {
+    if (!api) return;
+
+    setIsSyncing(true);
+    try {
+      await api.syncRelays();
+      toast.success("Nostr feed sync initiated");
+    } catch (error) {
+      toast.error("Failed to sync Nostr feed");
+      console.error("Sync error:", error);
+    } finally {
+      setIsSyncing(false);
+    }
+  };
+
+  // Show empty state with resync option when no feed data
+  if (!feed || !feed.feed || Object.keys(feed.feed).length === 0) {
+    return (
+      <div className="nostr-empty-state">
+        <div className="empty-content">
+          <Icon name="nostr" size={48} color="textMuted" />
+          <h3>No Nostr Posts</h3>
+          <p>
+            Your Nostr feed appears to be empty. Try syncing with your relays to
+            fetch the latest posts.
+          </p>
+          <button
+            onClick={handleResync}
+            disabled={isSyncing}
+            className="resync-btn"
+          >
+            {isSyncing ? (
+              <>
+                <img src={spinner} alt="Loading" className="btn-spinner" />
+                Syncing...
+              </>
+            ) : (
+              <>
+                <Icon name="settings" size={16} />
+                Sync Relays
+              </>
+            )}
+          </button>
+        </div>
+      </div>
+    );
+  }
+
+  // Show feed with resync button in header
+  return (
+    <div className="nostr-feed">
+      <div className="nostr-header">
+        <div className="feed-info">
+          <h4>Nostr Feed</h4>
+          <span className="post-count">
+            {Object.keys(feed.feed).length} posts
+          </span>
+        </div>
+        <button
+          onClick={handleResync}
+          disabled={isSyncing}
+          className="resync-btn-small"
+          title="Sync with Nostr relays"
+        >
+          {isSyncing ? (
+            <img src={spinner} alt="Loading" className="btn-spinner-small" />
+          ) : (
+            <Icon name="settings" size={16} />
+          )}
+        </button>
+      </div>
+      <PostList data={feed} refetch={refetch} />
+    </div>
+  );
 }
 
 export default Loader;
-- 
cgit v1.2.3

