diff --git a/src/components/connected-relays.tsx b/src/components/connected-relays.tsx index 5455c181b..b40cd14ad 100644 --- a/src/components/connected-relays.tsx +++ b/src/components/connected-relays.tsx @@ -22,6 +22,8 @@ import { import { useInterval } from "react-use"; import { Relay } from "../services/relays"; import relayPool from "../services/relays/relay-pool"; +import useSubject from "../hooks/use-subject"; +import settings from "../services/settings"; const getRelayStatusText = (relay: Relay) => { if (relay.connecting) return "Connecting..."; @@ -31,6 +33,7 @@ const getRelayStatusText = (relay: Relay) => { }; export const ConnectedRelays = () => { + const relayUrls = useSubject(settings.relays); const { isOpen, onOpen, onClose } = useDisclosure(); const [relays, setRelays] = useState([]); @@ -38,6 +41,13 @@ export const ConnectedRelays = () => { setRelays(relayPool.getRelays()); }, 1000); + useInterval(() => { + for (const url of relayUrls) { + // ask the pool to reconnect if disconnected + relayPool.requestRelay(url); + } + }, 1000 * 30); + const connected = relays.filter((relay) => relay.okay); const disconnected = relays.filter((relay) => !relay.okay); diff --git a/src/components/post.tsx b/src/components/post.tsx index c899951e2..4043aee74 100644 --- a/src/components/post.tsx +++ b/src/components/post.tsx @@ -27,7 +27,6 @@ export type PostProps = { }; export const Post = React.memo(({ event }: PostProps) => { const { isOpen, onClose, onOpen } = useDisclosure(); - const corsProxy = useSubject(settings.corsProxy); const userMetadata = useUserMetadata(event.pubkey); const isLong = event.content.length > 800; @@ -37,10 +36,7 @@ export const Post = React.memo(({ event }: PostProps) => { - + diff --git a/src/services/relays/relay-pool.ts b/src/services/relays/relay-pool.ts index 757eb021d..a6364dae5 100644 --- a/src/services/relays/relay-pool.ts +++ b/src/services/relays/relay-pool.ts @@ -72,13 +72,4 @@ if (import.meta.env.DEV) { window.relayPool = relayPool; } -// TODO: move this somewhere where it makes sense -setTimeout(async () => { - const urls = settings.relays.getValue(); - - for (const url of urls) { - relayPool.requestRelay(url); - } -}, 1000 * 10); - export default relayPool; diff --git a/src/services/user-metadata.ts b/src/services/user-metadata.ts index 53361aeb6..8ba558458 100644 --- a/src/services/user-metadata.ts +++ b/src/services/user-metadata.ts @@ -4,7 +4,7 @@ import db from "./db"; import settings from "./settings"; import { Subscription } from "./subscriptions"; -class UserMetadata { +class UserMetadataService { requests = new Set(); subjects = new Map>(); subscription: Subscription; @@ -12,11 +12,17 @@ class UserMetadata { constructor(relayUrls: string[] = []) { this.subscription = new Subscription(relayUrls, undefined, "user-metadata"); - this.subscription.onEvent.subscribe((event) => { + this.subscription.onEvent.subscribe(async (event) => { try { + const current = await db.get("user-metadata", event.pubkey); + if (current && current.created_at > event.created_at) { + // ignore this event because its older + return; + } + db.put("user-metadata", event); + const metadata = JSON.parse(event.content); this.getUserSubject(event.pubkey).next(metadata); - db.put("user-metadata", event); } catch (e) {} }); @@ -89,7 +95,7 @@ class UserMetadata { } } -const userMetadata = new UserMetadata(settings.relays.getValue()); +const userMetadata = new UserMetadataService(settings.relays.getValue()); if (import.meta.env.DEV) { // @ts-ignore diff --git a/src/views/home.tsx b/src/views/home.tsx index 2b98f4ee8..63d06ae3c 100644 --- a/src/views/home.tsx +++ b/src/views/home.tsx @@ -1,25 +1,30 @@ -import React from "react"; +import { Avatar, HStack } from "@chakra-ui/react"; import { Link } from "react-router-dom"; +import { useUserMetadata } from "../hooks/use-user-metadata"; + +const UserAvatar = ({ pubkey }: { pubkey: string }) => { + const metadata = useUserMetadata(pubkey); + + return ( + + + + ); +}; export const HomeView = () => { return ( <> - - There are many benefits to a joint design and development system. Not - only does it bring benefits to the design team, but it also brings - benefits to engineering teams. It makes sure that our experiences have a - consistent look and feel, not just in our design specs, but in - production. - - - jb55 - - - self - - - gigi - + + + + + + + + + + ); }; diff --git a/src/views/user/index.tsx b/src/views/user/index.tsx index e92bcb743..68bf6c062 100644 --- a/src/views/user/index.tsx +++ b/src/views/user/index.tsx @@ -1,15 +1,22 @@ import React from "react"; import { + Avatar, + Box, Heading, + HStack, + SkeletonText, Tab, TabList, TabPanel, TabPanels, Tabs, + Text, + VStack, } from "@chakra-ui/react"; import { useParams } from "react-router-dom"; import { UserPostsTab } from "./posts"; import { useUserMetadata } from "../../hooks/use-user-metadata"; +import ReactMarkdown from "react-markdown"; export const UserView = () => { const { pubkey } = useParams(); @@ -21,8 +28,20 @@ export const UserView = () => { const metadata = useUserMetadata(pubkey); return ( - <> - {metadata?.name ?? pubkey} + + {" "} + + + + {metadata?.name ?? pubkey} + {metadata?.display_name} + + + {metadata?.about ? ( + {metadata.about} + ) : ( + + )} Posts @@ -42,6 +61,6 @@ export const UserView = () => { - + ); };