diff --git a/README.md b/README.md index ceaca5d97..9799f1cf3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # noStrudel -> NOTE: This client is still in development and is buggy +> NOTE: This client is still in development and will have bugs ## noStrudel is my personal nostr client. @@ -10,7 +10,7 @@ There are many features missing from this client and I wont get around to implem Live Instance: [nostrudel.ninja](https://nostrudel.ninja) -You can find better clients with more features in the [awesome-nostr](https://github.com/aljazceru/awesome-nostr) repo. +You can find better clients with more features on [nostrapps.com](https://www.nostrapps.com/) or in the [awesome-nostr](https://github.com/aljazceru/awesome-nostr) repo. ## Please don't trust my app with your nsec @@ -30,7 +30,7 @@ docker run --rm -p 8080:80 ghcr.io/hzrd149/nostrudel git clone git@github.com:hzrd149/nostrudel.git cd nostrudel yarn install -yarn start +yarn dev ``` ## Contributing diff --git a/cypress/e2e/embeds.cy.ts b/cypress/e2e/embeds.cy.ts index 2116fa165..054d29f4f 100644 --- a/cypress/e2e/embeds.cy.ts +++ b/cypress/e2e/embeds.cy.ts @@ -2,7 +2,7 @@ describe("Embeds", () => { describe("hashtags", () => { it('should handle uppercase hashtags and ","', () => { cy.visit( - "#/n/nevent1qqsrj5ns6wva3fcghlyx0hp7hhajqtqk3kuckp7xhhscrm4jl7futegpz9mhxue69uhkummnw3e82efwvdhk6qgswaehxw309ahx7um5wgh8w6twv5pkpt8l", + "#/n/nevent1qqsrj5ns6wva3fcghlyx0hp7hhajqtqk3kuckp7xhhscrm4jl7futegpz9mhxue69uhkummnw3e82efwvdhk6qgswaehxw309ahx7um5wgh8w6twv5pkpt8l" ); cy.findByRole("link", { name: "#Japan" }).should("be.visible"); @@ -15,18 +15,18 @@ describe("Embeds", () => { describe("links", () => { it("embed trustless.computer links", () => { cy.visit( - "#/n/nevent1qqsfn2mv3pe2v7jak4r5wnyengt36t0rx26w04hgysrmtpml8jnlk5cprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2qgawaehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2aq2wry06", + "#/n/nevent1qqsfn2mv3pe2v7jak4r5wnyengt36t0rx26w04hgysrmtpml8jnlk5cprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2qgawaehxw309ahx7um5wgkhqatz9emk2mrvdaexgetj9ehx2aq2wry06" ); cy.get('[href="https://trustless.computer/"]').should("be.visible"); cy.get( - '[href="https://mempool.space/tx/461c6f56015c94d74837b68c9d08f4b80e7db7ca1e5ac4c53d9aa8c76b667672"]', + '[href="https://mempool.space/tx/461c6f56015c94d74837b68c9d08f4b80e7db7ca1e5ac4c53d9aa8c76b667672"]' ).should("be.visible"); }); it("embeds links", () => { cy.visit( - "#/n/nevent1qqsvg6kt4hl79qpp5p673g7ref6r0c5jvp4yys7mmvs4m50t30sy9dgpz9mhxue69uhkummnw3e82efwvdhk6qgjwaehxw309aex2mrp0yhxvdm69e5k7r3xlpe", + "#/n/nevent1qqsvg6kt4hl79qpp5p673g7ref6r0c5jvp4yys7mmvs4m50t30sy9dgpz9mhxue69uhkummnw3e82efwvdhk6qgjwaehxw309aex2mrp0yhxvdm69e5k7r3xlpe" ); cy.get('[href="https://getalby.com/"]').should("exist"); @@ -38,11 +38,11 @@ describe("Embeds", () => { it("embeds simplex.chat links", () => { cy.visit( - "#/n/nevent1qqsymds0vlpp4f5s0dckjf4qz283pdsen0rmx8lu7ct6hpnxag2hpacpremhxue69uhkummnw3ez6un9d3shjtnwda4k7arpwfhjucm0d5q3qamnwvaz7tmwdaehgu3wwa5kueghxyq76", + "#/n/nevent1qqsymds0vlpp4f5s0dckjf4qz283pdsen0rmx8lu7ct6hpnxag2hpacpremhxue69uhkummnw3ez6un9d3shjtnwda4k7arpwfhjucm0d5q3qamnwvaz7tmwdaehgu3wwa5kueghxyq76" ); cy.get( - '[href="https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2F0YuTwO05YJWS8rkjn9eLJDjQhFKvIYd8d4xG8X1blIU%3D%40smp8.simplex.im%2FVlHiRmia02CDgga7w-uNb2FQZTZsj3UR%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAd2GEWU9Zjrljhw8O4FldcxrqehkDWezXl-cWD-VkeEw%253D%26srv%3Dbeccx4yfxxbvyhqypaavemqurytl6hozr47wfc7uuecacjqdvwpw2xid.onion"]', + '[href="https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2F0YuTwO05YJWS8rkjn9eLJDjQhFKvIYd8d4xG8X1blIU%3D%40smp8.simplex.im%2FVlHiRmia02CDgga7w-uNb2FQZTZsj3UR%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAd2GEWU9Zjrljhw8O4FldcxrqehkDWezXl-cWD-VkeEw%253D%26srv%3Dbeccx4yfxxbvyhqypaavemqurytl6hozr47wfc7uuecacjqdvwpw2xid.onion"]' ).should("be.visible"); }); }); @@ -50,7 +50,7 @@ describe("Embeds", () => { describe("Nostr links", () => { it("should embed noub1...", () => { cy.visit( - "#/n/nevent1qqsd5yw7sntqfc4e7u4aempvgctry2plz653t9gpf97ctk5vc0ftskgpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3zamnwvaz7tmwdaehgun4v5hxxmmdfxdj3a", + "#/n/nevent1qqsd5yw7sntqfc4e7u4aempvgctry2plz653t9gpf97ctk5vc0ftskgpz3mhxue69uhhyetvv9ujuerpd46hxtnfduq3zamnwvaz7tmwdaehgun4v5hxxmmdfxdj3a" ); cy.contains("Alby team"); @@ -69,7 +69,7 @@ describe("Embeds", () => { describe("youtube", () => { it("should embed playlists", () => { cy.visit( - "#/n/nevent1qqs8w6e63smpr5ccmz4l0w5pvnkp6r7z2fxaadjwu2g74y95pl9xv0cpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqqkgf54", + "#/n/nevent1qqs8w6e63smpr5ccmz4l0w5pvnkp6r7z2fxaadjwu2g74y95pl9xv0cpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqqkgf54" ); cy.findByTitle(/youtube video player/i).should("be.visible"); @@ -80,31 +80,31 @@ describe("Embeds", () => { describe("Music", () => { it("should handle wavlake links", () => { cy.visit( - "#/n/nevent1qqsve4ud5v8gjds2f2h7exlmjvhqayu4s520pge7frpwe22wezny0pcpp4mhxue69uhkummn9ekx7mqprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2mxs3z0", + "#/n/nevent1qqsve4ud5v8gjds2f2h7exlmjvhqayu4s520pge7frpwe22wezny0pcpp4mhxue69uhkummn9ekx7mqprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2mxs3z0" ); cy.findByTitle("Wavlake Embed").should("be.visible"); }); it("should handle spotify links", () => { cy.visit( - "#/n/nevent1qqsx0lz7m72qzq499exwhnfszvgwea8tv38x9wkv32yhkmwwmhgs7jgprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk25m3sln", + "#/n/nevent1qqsx0lz7m72qzq499exwhnfszvgwea8tv38x9wkv32yhkmwwmhgs7jgprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk25m3sln" ); cy.findByTitle("Spotify List Embed").should("exist"); cy.visit( - "#/n/nevent1qqsqxkmz49hydf8ppa9k6x6zrcq7m4evhhlye0j3lcnz8hrl2q6np4spz3mhxue69uhhyetvv9ujuerpd46hxtnfdult02qz", + "#/n/nevent1qqsqxkmz49hydf8ppa9k6x6zrcq7m4evhhlye0j3lcnz8hrl2q6np4spz3mhxue69uhhyetvv9ujuerpd46hxtnfdult02qz" ); cy.findByTitle("Spotify Embed").should("exist"); }); it("should handle apple music links", () => { cy.visit( - "#/n/nevent1qqs9kqt9d7r4zjpawcyl82x5qsn4hals4wn294dv95knrahs4mggwasprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2whhzvz", + "#/n/nevent1qqs9kqt9d7r4zjpawcyl82x5qsn4hals4wn294dv95knrahs4mggwasprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2whhzvz" ); cy.findByTitle("Apple Music Embed").should("exist"); cy.visit( - "#/n/nevent1qqszyrz4uug75j4086kj4f8peg3g0v8g9f04zjxplnpq0uxljtthggqprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2aeexmq", + "#/n/nevent1qqszyrz4uug75j4086kj4f8peg3g0v8g9f04zjxplnpq0uxljtthggqprdmhxue69uhkvet9v3ejumn0wd68ytnzv9hxgtmdv4kk2aeexmq" ); cy.findByTitle("Apple Music List Embed").should("exist"); }); @@ -118,7 +118,7 @@ describe("Embeds", () => { describe("Emoji", () => { it("should embed emojis", () => { cy.visit( - "#/n/nevent1qqsdj7k47uh4z0ypl2m29lvd4ar9zpf6dcy7ls0q6g6qctnxfj5n3pcpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqdyqlpq", + "#/n/nevent1qqsdj7k47uh4z0ypl2m29lvd4ar9zpf6dcy7ls0q6g6qctnxfj5n3pcpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqdyqlpq" ); cy.findByRole("img", { name: /pepeD/i }).should("be.visible"); diff --git a/cypress/e2e/login.cy.ts b/cypress/e2e/login.cy.ts index 00a7770a5..e068c957a 100644 --- a/cypress/e2e/login.cy.ts +++ b/cypress/e2e/login.cy.ts @@ -50,7 +50,7 @@ describe("Login view", () => { it("should redirect after login", () => { cy.visit( - "#/n/nevent1qqs88gdxv36qsjfwr66k7wxuq9r2tg8rsdcnfkcqdg4sc6vlnsma98qpzpmhxue69uhkummnw3ezuamfdejsz9rhwden5te0wfjkccte9ejxzmt4wvhxjmccew89d", + "#/n/nevent1qqs88gdxv36qsjfwr66k7wxuq9r2tg8rsdcnfkcqdg4sc6vlnsma98qpzpmhxue69uhkummnw3ezuamfdejsz9rhwden5te0wfjkccte9ejxzmt4wvhxjmccew89d" ); cy.findByRole("link", { name: /login/i }).click(); diff --git a/cypress/e2e/profile.cy.ts b/cypress/e2e/profile.cy.ts index 5f6d3ad38..d175f099d 100644 --- a/cypress/e2e/profile.cy.ts +++ b/cypress/e2e/profile.cy.ts @@ -1,7 +1,7 @@ describe("Profile view", () => { it("should load a rss feed profile", () => { cy.visit( - "#/u/nprofile1qqsp6hxqjatvxtesgszs8aee0fcjccxa3ef3mzjva4uv2yr5lucp6jcpzemhxue69uhhyumnd3shjtnwdaehgu3wd4hk2s8c5un", + "#/u/nprofile1qqsp6hxqjatvxtesgszs8aee0fcjccxa3ef3mzjva4uv2yr5lucp6jcpzemhxue69uhhyumnd3shjtnwdaehgu3wd4hk2s8c5un" ); cy.contains("fjsmu"); diff --git a/cypress/e2e/public.cy.ts b/cypress/e2e/public.cy.ts index 499d320b2..8aeae9332 100644 --- a/cypress/e2e/public.cy.ts +++ b/cypress/e2e/public.cy.ts @@ -2,7 +2,7 @@ describe("No account", () => { describe("note view", () => { it("should fetch and render note", () => { cy.visit( - "#/n/nevent1qqs84hwdlls703w4yf66qsszxjqfc0xselfxrzr6n4qp40vzdnczragpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5jcwczn", + "#/n/nevent1qqs84hwdlls703w4yf66qsszxjqfc0xselfxrzr6n4qp40vzdnczragpr4mhxue69uhkummnw3ez6ur4vgh8wetvd3hhyer9wghxuet5jcwczn" ); cy.get(".chakra-card") diff --git a/cypress/e2e/thread.cy.ts b/cypress/e2e/thread.cy.ts index 0a1d37156..313aca5de 100644 --- a/cypress/e2e/thread.cy.ts +++ b/cypress/e2e/thread.cy.ts @@ -1,7 +1,7 @@ describe("Thread", () => { it("should handle quote notes with e tags correctly", () => { cy.visit( - "#/n/nevent1qqsx2lnyuke6vmsrz9fdrd6uwjy0g0e9l6menfgdj5truugkh9qmkkgpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqgc9md6", + "#/n/nevent1qqsx2lnyuke6vmsrz9fdrd6uwjy0g0e9l6menfgdj5truugkh9qmkkgpzpmhxue69uhkummnw3ezuamfdejszrthwden5te0dehhxtnvdakqgc9md6" ); // find first note diff --git a/index.html b/index.html index 42965167e..f80fce05e 100644 --- a/index.html +++ b/index.html @@ -1,4 +1,4 @@ - + diff --git a/package.json b/package.json index 5341b9d17..d86a7a8fb 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "license": "MIT", "scripts": { "start": "vite serve", + "dev": "vite serve", "build": "tsc --project tsconfig.json && vite build", "format": "prettier --ignore-path .prettierignore -w .", "e2e": "cypress open", diff --git a/src/components/connected-relays.tsx b/src/components/connected-relays.tsx index 719e47d8a..64e9e1493 100644 --- a/src/components/connected-relays.tsx +++ b/src/components/connected-relays.tsx @@ -21,7 +21,6 @@ import { import relayPoolService from "../services/relay-pool"; import { useInterval } from "react-use"; import { RelayStatus } from "./relay-status"; -import { useIsMobile } from "../hooks/use-is-mobile"; import { RelayIcon } from "./icons"; import { Relay } from "../classes/relay"; import { RelayFavicon } from "./relay-favicon"; @@ -29,7 +28,6 @@ import relayScoreboardService from "../services/relay-scoreboard"; import { RelayScoreBreakdown } from "./relay-score-breakdown"; export const ConnectedRelays = () => { - const isMobile = useIsMobile(); const { isOpen, onOpen, onClose } = useDisclosure(); const [relays, setRelays] = useState(relayPoolService.getRelays()); const sortedRelays = useMemo(() => relayScoreboardService.getRankedRelays(relays.map((r) => r.url)), [relays]); diff --git a/src/components/embed-types/emoji.tsx b/src/components/embed-types/emoji.tsx index cd57136f3..505cc400d 100644 --- a/src/components/embed-types/emoji.tsx +++ b/src/components/embed-types/emoji.tsx @@ -7,7 +7,7 @@ export function embedEmoji(content: EmbedableContent, note: NostrEvent | DraftNo regexp: /:([a-zA-Z0-9_]+):/i, render: (match) => { const emojiTag = note.tags.find( - (tag) => tag[0] === "emoji" && tag[1].toLowerCase() === match[1].toLowerCase() && tag[2], + (tag) => tag[0] === "emoji" && tag[1].toLowerCase() === match[1].toLowerCase() && tag[2] ); if (emojiTag) { return ( diff --git a/src/components/note/index.tsx b/src/components/note/index.tsx index a876baef1..6529818a3 100644 --- a/src/components/note/index.tsx +++ b/src/components/note/index.tsx @@ -53,7 +53,7 @@ export const Note = React.memo(({ event, variant = "outline" }: NoteProps) => { - + diff --git a/src/components/note/note-relays.tsx b/src/components/note/note-relays.tsx index 77a42b857..daa3fb090 100644 --- a/src/components/note/note-relays.tsx +++ b/src/components/note/note-relays.tsx @@ -3,16 +3,16 @@ import { getEventRelays } from "../../services/event-relays"; import { NostrEvent } from "../../types/nostr-event"; import useSubject from "../../hooks/use-subject"; import { RelayIconStack } from "../relay-icon-stack"; -import { useIsMobile } from "../../hooks/use-is-mobile"; import { getEventUID } from "../../helpers/nostr/event"; +import { useBreakpointValue } from "@chakra-ui/react"; export type NoteRelaysProps = { event: NostrEvent; }; export const EventRelays = memo(({ event }: NoteRelaysProps) => { - const isMobile = useIsMobile(); + const maxRelays = useBreakpointValue({ base: 3, md: undefined }); const eventRelays = useSubject(getEventRelays(getEventUID(event))); - return ; + return ; }); diff --git a/src/components/note/note-zaps-modal.tsx b/src/components/note/note-zaps-modal.tsx index 2b93f8f3d..82cc39d46 100644 --- a/src/components/note/note-zaps-modal.tsx +++ b/src/components/note/note-zaps-modal.tsx @@ -17,11 +17,10 @@ import { UserAvatarLink } from "../user-avatar-link"; import { UserLink } from "../user-link"; import dayjs from "dayjs"; import { DislikeIcon, LightningIcon, LikeIcon } from "../icons"; -import { ParsedZap, parseZapEvent } from "../../helpers/zaps"; +import { ParsedZap } from "../../helpers/zaps"; import { readablizeSats } from "../../helpers/bolt11"; import useEventReactions from "../../hooks/use-event-reactions"; import useEventZaps from "../../hooks/use-event-zaps"; -import { useIsMobile } from "../../hooks/use-is-mobile"; function getReactionIcon(content: string) { switch (content) { @@ -48,12 +47,10 @@ const ReactionEvent = React.memo(({ event }: { event: NostrEvent }) => ( )); const ZapEvent = React.memo(({ zap }: { zap: ParsedZap }) => { - const isMobile = useIsMobile(); - if (!zap.payment.amount) return null; return ( - + @@ -80,14 +77,13 @@ export default function NoteReactionsModal({ const zaps = useEventZaps(noteId, [], true) ?? []; const reactions = useEventReactions(noteId, [], true) ?? []; const [selected, setSelected] = useState("zaps"); - const isMobile = useIsMobile(); return ( - + {showReplies && ( - + {post.replies.map((child) => ( ))} diff --git a/src/views/profile/edit.tsx b/src/views/profile/edit.tsx index 509dabe99..26b99cb1b 100644 --- a/src/views/profile/edit.tsx +++ b/src/views/profile/edit.tsx @@ -206,7 +206,7 @@ export const ProfileEditView = () => { nip05: metadata?.nip05, lightningAddress: metadata?.lud16 || metadata?.lud06, }), - [metadata], + [metadata] ); const handleSubmit = async (data: FormData) => { diff --git a/src/views/relays/index.tsx b/src/views/relays/index.tsx index 47b7ed699..d2fba1e6b 100644 --- a/src/views/relays/index.tsx +++ b/src/views/relays/index.tsx @@ -25,7 +25,7 @@ export default function RelaysView() { .map((r) => r.url) .filter(safeRelayUrl); const { value: onlineRelays = [] } = useAsync(async () => - fetch("https://api.nostr.watch/v1/online").then((res) => res.json() as Promise), + fetch("https://api.nostr.watch/v1/online").then((res) => res.json() as Promise) ); const filteredRelays = useMemo(() => { @@ -51,9 +51,9 @@ export default function RelaysView() { Add Custom - + {filteredRelays.map((url) => ( - + ))} @@ -61,9 +61,9 @@ export default function RelaysView() { <> Discovered Relays - + {discoveredRelays.map((url) => ( - + ))} diff --git a/src/views/relays/relay.tsx b/src/views/relays/relay.tsx index 9d3bf2fa8..739ce6786 100644 --- a/src/views/relays/relay.tsx +++ b/src/views/relays/relay.tsx @@ -105,7 +105,11 @@ function RelayPage({ relay }: { relay: string }) { - {info?.supported_nips?.map((nip) => )} + + {info?.supported_nips?.map((nip) => ( + + ))} + Reviews diff --git a/src/views/search/index.tsx b/src/views/search/index.tsx index 8f7feb904..4b5b86846 100644 --- a/src/views/search/index.tsx +++ b/src/views/search/index.tsx @@ -87,7 +87,7 @@ function SearchResults({ search }: { search: string }) { `search`, searchRelays, { search: search || "", kinds: [Kind.Metadata] }, - { enabled: !!search }, + { enabled: !!search } ); const events = useSubject(timeline?.timeline) ?? []; @@ -96,7 +96,7 @@ function SearchResults({ search }: { search: string }) { return ( - + {events.map((event) => ( ))} @@ -148,17 +148,19 @@ export function SearchPage() { }; return ( - +
- - } aria-label="Qr Scanner" /> - {!!navigator.clipboard.readText && ( - } aria-label="Read clipboard" /> - )} - setSearchInput(e.target.value)} /> - + + + } aria-label="Qr Scanner" /> + {!!navigator.clipboard.readText && ( + } aria-label="Read clipboard" /> + )} + setSearchInput(e.target.value)} /> + + diff --git a/src/views/streams/index.tsx b/src/views/streams/index.tsx index 81672c806..ec1a40c53 100644 --- a/src/views/streams/index.tsx +++ b/src/views/streams/index.tsx @@ -27,7 +27,7 @@ function StreamsPage() { } catch (e) {} return false; }, - [filterStatus], + [filterStatus] ); const { people } = usePeopleListContext(); @@ -49,18 +49,18 @@ function StreamsPage() { return ( - - - setFilterStatus(e.target.value)}> - + {streams.map((stream) => ( - + ))} diff --git a/src/views/streams/stream/index.tsx b/src/views/streams/stream/index.tsx index ee23fc4e3..25fa805d7 100644 --- a/src/views/streams/stream/index.tsx +++ b/src/views/streams/stream/index.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useScroll } from "react-use"; -import { Box, Button, ButtonGroup, Flex, Heading, Spacer, Spinner, Text } from "@chakra-ui/react"; +import { Box, Button, ButtonGroup, Flex, Heading, Spacer, Spinner, Text, useBreakpointValue } from "@chakra-ui/react"; import { useParams, Navigate, useSearchParams, useNavigate } from "react-router-dom"; import { nip19 } from "nostr-tools"; import { Global, css } from "@emotion/react"; @@ -12,7 +12,6 @@ import { LiveVideoPlayer } from "../../../components/live-video-player"; import StreamChat, { ChatDisplayMode } from "./stream-chat"; import { UserAvatarLink } from "../../../components/user-avatar-link"; import { UserLink } from "../../../components/user-link"; -import { useIsMobile } from "../../../hooks/use-is-mobile"; import StreamSummaryContent from "../components/stream-summary-content"; import { ArrowDownSIcon, ArrowUpSIcon, ExternalLinkIcon } from "../../../components/icons"; import useSetColorMode from "../../../hooks/use-set-color-mode"; @@ -24,7 +23,7 @@ import RelaySelectionButton from "../../../components/relay-selection/relay-sele import RelaySelectionProvider from "../../../providers/relay-selection-provider"; function StreamPage({ stream, displayMode }: { stream: ParsedStream; displayMode?: ChatDisplayMode }) { - const isMobile = useIsMobile(); + const vertical = useBreakpointValue({ base: true, lg: false }); const scrollBox = useRef(null); const scrollState = useScroll(scrollBox); const navigate = useNavigate(); @@ -47,8 +46,8 @@ function StreamPage({ stream, displayMode }: { stream: ParsedStream; displayMode return ( - {isMobile && toggleButton} - {!isMobile && ( + {vertical && toggleButton} + {!vertical && ( {displayMode && ( @@ -93,14 +92,14 @@ function StreamPage({ stream, displayMode }: { stream: ParsedStream; displayMode /> )} {!displayMode && ( - + - + @@ -113,15 +112,15 @@ function StreamPage({ stream, displayMode }: { stream: ParsedStream; displayMode - + )} [...(hostMuteList?.tags ?? []), ...(muteList?.tags ?? [])].filter(isPTag).map((t) => t[1] as string), - [hostMuteList, muteList], + [hostMuteList, muteList] ); const eventFilter = useCallback((event: NostrEvent) => !mutedPubkeys.includes(event.pubkey), [mutedPubkeys]); @@ -82,7 +82,7 @@ export default function StreamChat({ "#a": [getATag(stream)], kinds: [STREAM_CHAT_MESSAGE_KIND, Kind.Zap], }, - { eventFilter }, + { eventFilter } ); const events = useSubject(timeline.timeline).sort((a, b) => b.created_at - a.created_at); @@ -153,7 +153,7 @@ export default function StreamChat({ ) : ( - ), + ) )} {!isChatLog && ( diff --git a/src/views/user/components/header.tsx b/src/views/user/components/header.tsx index c2a380158..a130d029b 100644 --- a/src/views/user/components/header.tsx +++ b/src/views/user/components/header.tsx @@ -1,4 +1,4 @@ -import { Flex, Heading, IconButton, Spacer } from "@chakra-ui/react"; +import { Flex, Heading, IconButton, Spacer, useBreakpointValue } from "@chakra-ui/react"; import { useNavigate, Link as RouterLink } from "react-router-dom"; import { ChatIcon, EditIcon } from "../../../components/icons"; import { UserAvatar } from "../../../components/user-avatar"; @@ -8,7 +8,6 @@ import { UserTipButton } from "../../../components/user-tip-button"; import { Bech32Prefix, normalizeToBech32 } from "../../../helpers/nip19"; import { getUserDisplayName } from "../../../helpers/user-metadata"; import { useCurrentAccount } from "../../../hooks/use-current-account"; -import { useIsMobile } from "../../../hooks/use-is-mobile"; import { useUserMetadata } from "../../../hooks/use-user-metadata"; import { UserProfileMenu } from "./user-profile-menu"; @@ -19,7 +18,6 @@ export default function Header({ pubkey: string; showRelaySelectionModal: () => void; }) { - const isMobile = useIsMobile(); const navigate = useNavigate(); const metadata = useUserMetadata(pubkey); const npub = normalizeToBech32(pubkey, Bech32Prefix.Pubkey); @@ -27,6 +25,8 @@ export default function Header({ const account = useCurrentAccount(); const isSelf = pubkey === account?.pubkey; + const showFullNip05 = useBreakpointValue({ base: false, md: true }); + return ( @@ -34,7 +34,7 @@ export default function Header({ {getUserDisplayName(metadata, pubkey)} - + {isSelf && ( - + {followers.map((event) => ( ))} diff --git a/src/views/user/following.tsx b/src/views/user/following.tsx index 5565eb5fa..c3e211d87 100644 --- a/src/views/user/following.tsx +++ b/src/views/user/following.tsx @@ -17,7 +17,7 @@ export default function UserFollowingTab() { if (!contacts) return ; return ( - + {people.map((pubkey) => ( ))} diff --git a/src/views/user/notes.tsx b/src/views/user/notes.tsx index d6cc0a5ac..a23397a2e 100644 --- a/src/views/user/notes.tsx +++ b/src/views/user/notes.tsx @@ -25,7 +25,7 @@ export default function UserNotesTab() { if (hideReposts && isRepost(event)) return false; return timelineEventFilter(event); }, - [showReplies, hideReposts, timelineEventFilter], + [showReplies, hideReposts, timelineEventFilter] ); const timeline = useTimelineLoader( truncatedId(pubkey) + "-notes", @@ -34,7 +34,7 @@ export default function UserNotesTab() { authors: [pubkey], kinds: [Kind.Text, Kind.Repost, STREAM_KIND, 2], }, - { eventFilter }, + { eventFilter } ); const header = ( diff --git a/src/views/user/streams.tsx b/src/views/user/streams.tsx index 1041695d6..c878a2a34 100644 --- a/src/views/user/streams.tsx +++ b/src/views/user/streams.tsx @@ -31,9 +31,9 @@ export default function UserStreamsTab() { return ( callback={callback}> - + {streams.map((stream) => ( - + ))} diff --git a/src/views/user/zaps.tsx b/src/views/user/zaps.tsx index b66b6a639..f5e59614d 100644 --- a/src/views/user/zaps.tsx +++ b/src/views/user/zaps.tsx @@ -87,14 +87,14 @@ const UserZapsTab = () => { } return true; }, - [filter], + [filter] ); const timeline = useTimelineLoader( `${truncatedId(pubkey)}-zaps`, relays, { "#p": [pubkey], kinds: [9735] }, - { eventFilter }, + { eventFilter } ); const events = useSubject(timeline.timeline);