diff --git a/package-lock.json b/package-lock.json index 884621c..aab1b62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "rondevu-demo", "version": "0.5.0", "dependencies": { - "@xtr-dev/rondevu-client": "^0.7.3", + "@xtr-dev/rondevu-client": "^0.7.4", "@zxing/library": "^0.21.3", "qrcode": "^1.5.4", "react": "^18.2.0", @@ -1171,9 +1171,9 @@ } }, "node_modules/@xtr-dev/rondevu-client": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@xtr-dev/rondevu-client/-/rondevu-client-0.7.3.tgz", - "integrity": "sha512-WcKc+q1JOh/v5doX0PaX9pYIJa0ofJHgxUo+xdOIjuBjUQuQW+F1G71NxtzCia2A62VPJdctL5TgADNKYmlIHQ==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@xtr-dev/rondevu-client/-/rondevu-client-0.7.4.tgz", + "integrity": "sha512-MPmw9iSc7LxLduu4TtVrcPvBl/Cuul5sqgOAKUWW7XYXYAObFYUtu9RcbWShR+a6Bwwx7oHadz5I2U8eWsebXQ==", "license": "MIT", "dependencies": { "@xtr-dev/rondevu-client": "^0.5.1" diff --git a/package.json b/package.json index 8c1bc2f..42bc119 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "deploy": "npm run build && npx wrangler pages deploy dist --project-name=rondevu-demo" }, "dependencies": { - "@xtr-dev/rondevu-client": "^0.7.3", + "@xtr-dev/rondevu-client": "^0.7.4", "@zxing/library": "^0.21.3", "qrcode": "^1.5.4", "react": "^18.2.0", diff --git a/src/App.jsx b/src/App.jsx index 4bda51c..df841e3 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -33,8 +33,11 @@ export default function App() { const [myConnections, setMyConnections] = useState([]); // Discovery state - const [searchTopic, setSearchTopic] = useState('demo-chat'); + const [selectedTopic, setSelectedTopic] = useState(null); const [discoveredOffers, setDiscoveredOffers] = useState([]); + const [topics, setTopics] = useState([]); + const [topicsLoading, setTopicsLoading] = useState(false); + const [topicsError, setTopicsError] = useState(null); // Messages const [messages, setMessages] = useState([]); @@ -192,8 +195,32 @@ export default function App() { } }; - // Discover peers - const handleDiscoverPeers = async () => { + // Fetch available topics from server + const fetchTopics = async () => { + if (!client) return; + + try { + setTopicsLoading(true); + setTopicsError(null); + const result = await client.offers.getTopics({ limit: 100 }); + setTopics(result.topics); + } catch (err) { + console.error('Error fetching topics:', err); + setTopicsError(err.message); + } finally { + setTopicsLoading(false); + } + }; + + // Fetch topics when discover tab is opened + useEffect(() => { + if (activeTab === 'discover' && topics.length === 0 && !topicsLoading && client) { + fetchTopics(); + } + }, [activeTab, client]); + + // Discover peers by topic + const handleDiscoverPeers = async (topicName) => { if (!client) return; if (!client.isAuthenticated()) { @@ -202,13 +229,14 @@ export default function App() { } try { - const offers = await client.offers.findByTopic(searchTopic.trim(), {limit: 50}); + setSelectedTopic(topicName); + const offers = await client.offers.findByTopic(topicName, {limit: 50}); setDiscoveredOffers(offers); if (offers.length === 0) { - toast.error('No peers found!'); + toast(`No peers found for "${topicName}"`); } else { - toast.success(`Found ${offers.length} peer(s)`); + toast.success(`Found ${offers.length} peer(s) for "${topicName}"`); } } catch (err) { toast.error(`Error: ${err.message}`); @@ -600,52 +628,122 @@ export default function App() { {activeTab === 'discover' && (
Search for peers by topic
+Browse topics to find peers
-+ Found {discoveredOffers.length} peer(s) +
+ {discoveredOffers.map(offer => { + const isConnected = myConnections.some(c => c.id === offer.id); + const isMine = credentials && offer.peerId === credentials.peerId; + + return ( +