From 3977dd878e18afbd23e76477f82e67133381c317 Mon Sep 17 00:00:00 2001 From: h3y6e Date: Thu, 16 Feb 2023 08:41:48 +0900 Subject: [PATCH 01/12] align to the right --- packages/app/src/Pages/Root.tsx | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 47ea1cb..802daa4 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -88,22 +88,19 @@ export default function RootPage() { <>
{pubKey && }
{isGlobal && globalRelays.length > 0 && ( -
-
- -
-
- -
+
+ +   +
)} {followHints()} From 3b6815310550f219ab65eb58801e810f41d51f27 Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 16 Feb 2023 16:32:56 +0000 Subject: [PATCH 02/12] bug: redirect tlv entry --- packages/app/src/Pages/NostrLinkHandler.tsx | 34 +++++++++++++++++---- packages/app/src/Util.ts | 2 +- packages/nostr/src/legacy/Links.ts | 31 ++++++++++++++++--- 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/packages/app/src/Pages/NostrLinkHandler.tsx b/packages/app/src/Pages/NostrLinkHandler.tsx index 9721d4c..b61e5f5 100644 --- a/packages/app/src/Pages/NostrLinkHandler.tsx +++ b/packages/app/src/Pages/NostrLinkHandler.tsx @@ -1,20 +1,42 @@ -import { NostrPrefix } from "@snort/nostr"; +import { decodeTLV, NostrPrefix, TLVEntryType } from "@snort/nostr"; import { useEffect } from "react"; +import { useDispatch } from "react-redux"; import { useNavigate, useParams } from "react-router-dom"; +import { setRelays } from "State/Login"; +import { eventLink, profileLink } from "Util"; export default function NostrLinkHandler() { const params = useParams(); + const dispatch = useDispatch(); const navigate = useNavigate(); - const link = decodeURIComponent(params["*"] ?? ""); + const link = decodeURIComponent(params["*"] ?? "").toLowerCase(); useEffect(() => { if (link.length > 0) { - const ls = link.split(":"); - const entity = ls[1]; - if (entity.startsWith(NostrPrefix.PublicKey) || entity.startsWith(NostrPrefix.Profile)) { + const entity = link.startsWith("web+nostr:") ? link.split(":")[1] : link; + if (entity.startsWith(NostrPrefix.PublicKey)) { navigate(`/p/${entity}`); - } else if (entity.startsWith(NostrPrefix.Event) || entity.startsWith(NostrPrefix.Note)) { + } else if (entity.startsWith(NostrPrefix.Note)) { navigate(`/e/${entity}`); + } else if (entity.startsWith(NostrPrefix.Profile) || entity.startsWith(NostrPrefix.Event)) { + const decoded = decodeTLV(entity); + console.debug(decoded); + + const id = decoded.find(a => a.type === TLVEntryType.Special)?.value as string; + const relays = decoded.filter(a => a.type === TLVEntryType.Relay); + if (relays.length > 0) { + const relayObj = { + relays: Object.fromEntries(relays.map(a => [a.value, { read: true, write: false }])), + createdAt: new Date().getTime(), + }; + dispatch(setRelays(relayObj)); + } + + if (entity.startsWith(NostrPrefix.Profile)) { + navigate(profileLink(id)); + } else if (entity.startsWith(NostrPrefix.Event)) { + navigate(eventLink(id)); + } } } }, [link]); diff --git a/packages/app/src/Util.ts b/packages/app/src/Util.ts index 8625f7d..7456ee5 100644 --- a/packages/app/src/Util.ts +++ b/packages/app/src/Util.ts @@ -41,7 +41,7 @@ export function parseId(id: string) { } export function bech32ToHex(str: string) { - const nKey = bech32.decode(str); + const nKey = bech32.decode(str, 1_000); const buff = bech32.fromWords(nKey.words); return secp.utils.bytesToHex(Uint8Array.from(buff)); } diff --git a/packages/nostr/src/legacy/Links.ts b/packages/nostr/src/legacy/Links.ts index 72bc5bb..4b5a0d9 100644 --- a/packages/nostr/src/legacy/Links.ts +++ b/packages/nostr/src/legacy/Links.ts @@ -1,5 +1,6 @@ import * as secp from "@noble/secp256k1"; import { bech32 } from "bech32"; +import { HexKey } from "."; export enum NostrPrefix { PublicKey = "npub", @@ -12,10 +13,17 @@ export enum NostrPrefix { Relay = "nrelay", } +export enum TLVEntryType { + Special = 0, + Relay = 1, + Author = 2, + Kind = 3, +} + export interface TLVEntry { - type: number; + type: TLVEntryType; length: number; - value: string; // hex encoded data + value: string | HexKey | number; } export function encodeTLV(hex: string, prefix: NostrPrefix, relays?: string[]) { @@ -39,7 +47,7 @@ export function encodeTLV(hex: string, prefix: NostrPrefix, relays?: string[]) { } export function decodeTLV(str: string) { - const decoded = bech32.decode(str); + const decoded = bech32.decode(str, 1_000); const data = bech32.fromWords(decoded.words); const entries: TLVEntry[] = []; @@ -51,9 +59,24 @@ export function decodeTLV(str: string) { entries.push({ type: t, length: l, - value: secp.utils.bytesToHex(new Uint8Array(v)), + value: decodeTLVEntry(t, new Uint8Array(v)), }); x += 2 + l; } return entries; } + +function decodeTLVEntry(type: TLVEntryType, data: Uint8Array) { + switch (type) { + case TLVEntryType.Special: + case TLVEntryType.Author: { + return secp.utils.bytesToHex(data); + } + case TLVEntryType.Kind: { + return 0 + } + case TLVEntryType.Relay: { + return new TextDecoder("ASCII").decode(data); + } + } +} From f698806b8284d2d49598a42998b279ebd7445045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Lo=CC=81pez=20Guevara?= Date: Thu, 16 Feb 2023 14:19:40 -0300 Subject: [PATCH 03/12] fix(profile): convert page id to npub bech32 --- packages/app/src/Pages/ProfilePage.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/app/src/Pages/ProfilePage.tsx b/packages/app/src/Pages/ProfilePage.tsx index 580259d..62bac92 100644 --- a/packages/app/src/Pages/ProfilePage.tsx +++ b/packages/app/src/Pages/ProfilePage.tsx @@ -75,6 +75,8 @@ export default function ProfilePage() { users: new Map(), creator: "", }); + const npub = !id.startsWith("npub") ? hexToBech32("npub", id || undefined) : id; + const lnurl = extractLnAddress(user?.lud16 || user?.lud06 || ""); const website_url = user?.website && !user.website.startsWith("http") ? "https://" + user.website : user?.website || ""; @@ -121,7 +123,7 @@ export default function ProfilePage() { {user?.nip05 && } - + {links()}
); From 7be9dcde5a6ea8d8870425d705c01769fed5a2a7 Mon Sep 17 00:00:00 2001 From: h3y6e Date: Fri, 17 Feb 2023 02:31:44 +0900 Subject: [PATCH 04/12] put inside div.main-content --- packages/app/src/Pages/Root.tsx | 36 +++++++++++++++++---------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index 802daa4..9764c3f 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -86,23 +86,25 @@ export default function RootPage() { return ( <> -
{pubKey && }
- {isGlobal && globalRelays.length > 0 && ( -
- -   - -
- )} +
+ {pubKey && } + {isGlobal && globalRelays.length > 0 && ( +
+ +   + +
+ )} +
{followHints()} Date: Thu, 16 Feb 2023 19:00:00 +0000 Subject: [PATCH 05/12] chore: cancel in-progress docker builds --- .github/workflows/docker.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index c514f3c..8ead0f5 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -5,6 +5,9 @@ on: jobs: build: runs-on: self-hosted + concurrency: + group: ${{ github.ref }} + cancel-in-progress: true steps: - uses: actions/checkout@v2 - uses: docker/login-action@v1 From 37a90a90c2dcb9d785a945a480b88500b14b38b5 Mon Sep 17 00:00:00 2001 From: Josh Remaley Date: Tue, 14 Feb 2023 15:53:28 -0600 Subject: [PATCH 06/12] increase clickable area for overflow menu icon --- packages/app/src/Element/Note.css | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/app/src/Element/Note.css b/packages/app/src/Element/Note.css index 1f6830e..5e717c8 100644 --- a/packages/app/src/Element/Note.css +++ b/packages/app/src/Element/Note.css @@ -144,16 +144,18 @@ .reaction-pill { display: flex; - margin: 0px 7px; - padding: 2px 4px; - min-width: 1rem; - align-items: center; - justify-content: center; + flex-direction: row; + margin: 0px 14px; + min-width: 16px; user-select: none; color: var(--font-secondary-color); font-feature-settings: "tnum"; } +.reaction-pill-icon { + margin: auto; +} + .reaction-pill .reaction-pill-number { margin-left: 8px; font-feature-settings: "tnum"; From 625b734fde0555ddbd3393b0a1e55b1db85a8ebc Mon Sep 17 00:00:00 2001 From: Josh Remaley Date: Tue, 14 Feb 2023 16:47:28 -0600 Subject: [PATCH 07/12] add close menu button to exit menu --- packages/app/src/Element/Note.css | 12 ++++++++++++ packages/app/src/Element/NoteFooter.tsx | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/packages/app/src/Element/Note.css b/packages/app/src/Element/Note.css index 5e717c8..680972a 100644 --- a/packages/app/src/Element/Note.css +++ b/packages/app/src/Element/Note.css @@ -218,3 +218,15 @@ .note .reactions-link:hover { text-decoration: underline; } + +.close-menu { + position: absolute; + width: 100vw; + height: 100vh; + top: -400px; + left: -600px; +} + +.close-menu-container { + position: absolute; +} diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index 79dd54b..f35e378 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -209,6 +209,13 @@ export default function NoteFooter(props: NoteFooterProps) { function menuItems() { return ( <> +
+ {/* This menu item serves as a "close menu" button; + it allows the user to click anywhere nearby the menu to close it. */} + +
+ +
{prefs.enableReactions && ( setShowReactions(true)}> From 4fa14247fb2d75ffb49ecced264ba0c25ba3cc17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20Lo=CC=81pez=20Guevara?= Date: Wed, 15 Feb 2023 13:49:03 -0300 Subject: [PATCH 08/12] fix(fotter-actions): add highlighting and min-width --- packages/app/src/Element/Note.css | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/app/src/Element/Note.css b/packages/app/src/Element/Note.css index 680972a..fc6dff8 100644 --- a/packages/app/src/Element/Note.css +++ b/packages/app/src/Element/Note.css @@ -144,9 +144,11 @@ .reaction-pill { display: flex; - flex-direction: row; - margin: 0px 14px; - min-width: 16px; + margin: 0px 7px; + padding: 2px 4px; + min-width: 1rem; + align-items: center; + justify-content: center; user-select: none; color: var(--font-secondary-color); font-feature-settings: "tnum"; From b11ab51ba8f23daf2d815b3b85b175cc70a33e49 Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 16 Feb 2023 21:53:44 +0000 Subject: [PATCH 09/12] bug: catch invalid zaps (missing tag) --- packages/app/src/Element/Zap.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/app/src/Element/Zap.tsx b/packages/app/src/Element/Zap.tsx index 9c4810c..8ad37fc 100644 --- a/packages/app/src/Element/Zap.tsx +++ b/packages/app/src/Element/Zap.tsx @@ -23,6 +23,10 @@ function findTag(e: TaggedRawEvent, tag: string) { function getInvoice(zap: TaggedRawEvent) { const bolt11 = findTag(zap, "bolt11"); + if (!bolt11) { + console.debug("Invalid zap: ", zap); + return {}; + } const decoded = invoiceDecode(bolt11); const amount = decoded.sections.find(section => section.name === "amount")?.value; @@ -66,6 +70,7 @@ export interface ParsedZap { content: string; zapper?: HexKey; valid: boolean; + zapService: HexKey; } export function parseZap(zap: TaggedRawEvent): ParsedZap { @@ -81,6 +86,7 @@ export function parseZap(zap: TaggedRawEvent): ParsedZap { zapper: zapper.pubkey, content: zap.content, valid: zapper.isValid, + zapService: zap.pubkey, }; } From 03285a24cb20c8a0465bc1b2f0ac2ff0ef38afce Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 16 Feb 2023 22:57:25 +0000 Subject: [PATCH 10/12] bug: cleanup docker build --- packages/app/.dockerignore => .dockerignore | 7 ++++--- Dockerfile | 7 ++++++- 2 files changed, 10 insertions(+), 4 deletions(-) rename packages/app/.dockerignore => .dockerignore (50%) diff --git a/packages/app/.dockerignore b/.dockerignore similarity index 50% rename from packages/app/.dockerignore rename to .dockerignore index 404f190..f04d564 100644 --- a/packages/app/.dockerignore +++ b/.dockerignore @@ -1,7 +1,8 @@ -node_modules/ +**/node_modules/ .github/ .vscode/ -build/ +**/build/ yarn-error.log .husky/ -.git/ \ No newline at end of file +.git/ +**/dist/ \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 86990f9..8619f90 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,12 @@ FROM node:16 as build WORKDIR /app -COPY . . + +COPY package.json yarn.lock . +COPY packages/app/package.json packages/app/ +COPY packages/nostr/package.json packages/nostr/ RUN yarn install --network-timeout 1000000 + +COPY . . RUN yarn build FROM nginx:mainline-alpine From 95d0ea8ca93aaacb96e934e36352ee250ccc8c2a Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 16 Feb 2023 23:02:11 +0000 Subject: [PATCH 11/12] chore: use build cache --- .github/workflows/docker.yaml | 11 ++++++++--- .github/workflows/tagged.yml | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 8ead0f5..21ae1ca 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -15,7 +15,12 @@ jobs: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/setup-qemu-action@v1 - - uses: docker/setup-buildx-action@v1 + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 - name: Build the Docker image - run: docker buildx build -t ghcr.io/${{ github.repository_owner }}/snort:latest --platform linux/amd64,linux/arm64 --push . + run: docker buildx build \ + -t ghcr.io/${{ github.repository_owner }}/snort:latest \ + --platform linux/amd64,linux/arm64 \ + --cache-from "type=local,src=/tmp/.buildx-cache" \ + --cache-to "type=local,dest=/tmp/.buildx-cache" \ + --push . diff --git a/.github/workflows/tagged.yml b/.github/workflows/tagged.yml index ed4dbc7..9b2c5a0 100644 --- a/.github/workflows/tagged.yml +++ b/.github/workflows/tagged.yml @@ -25,8 +25,8 @@ jobs: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.GITHUB_TOKEN }} - - uses: docker/setup-qemu-action@v1 - - uses: docker/setup-buildx-action@v1 + - uses: docker/setup-qemu-action@v2 + - uses: docker/setup-buildx-action@v2 - name: Build the Docker image run: | docker buildx build \ From a8a2699b8a077897a6b5dec2995801881d37e5c9 Mon Sep 17 00:00:00 2001 From: Kieran Date: Thu, 16 Feb 2023 23:08:39 +0000 Subject: [PATCH 12/12] bug: docker build typo --- .github/workflows/docker.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/docker.yaml b/.github/workflows/docker.yaml index 21ae1ca..98fbfe6 100644 --- a/.github/workflows/docker.yaml +++ b/.github/workflows/docker.yaml @@ -18,7 +18,8 @@ jobs: - uses: docker/setup-qemu-action@v2 - uses: docker/setup-buildx-action@v2 - name: Build the Docker image - run: docker buildx build \ + run: | + docker buildx build \ -t ghcr.io/${{ github.repository_owner }}/snort:latest \ --platform linux/amd64,linux/arm64 \ --cache-from "type=local,src=/tmp/.buildx-cache" \