From a5be4da2e8d7eddfc2032da10e5e14254fe52fd4 Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 18 Aug 2023 19:01:34 +0100 Subject: [PATCH] Better POW UX --- packages/app/src/Element/NoteCreator.tsx | 9 +-- packages/app/src/Element/NoteFooter.tsx | 92 ++++++++++++++++++------ packages/system/src/index.ts | 1 + packages/system/src/pow-util.ts | 4 +- 4 files changed, 78 insertions(+), 28 deletions(-) diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index 75c00fe3..5b379253 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -36,6 +36,7 @@ import { LoginStore } from "Login"; import { getCurrentSubscription } from "Subscription"; import useLogin from "Hooks/useLogin"; import { System } from "index"; +import AsyncButton from "Element/AsyncButton"; interface NotePreviewProps { note: TaggedNostrEvent; @@ -174,9 +175,9 @@ export function NoteCreator() { dispatch(reset()); } - function onSubmit(ev: React.MouseEvent) { + async function onSubmit(ev: React.MouseEvent) { ev.stopPropagation(); - sendNote().catch(console.warn); + await sendNote(); } async function loadPreview() { @@ -374,9 +375,9 @@ export function NoteCreator() { - + {showAdvanced && (
diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index 4a92c86b..85a3e49d 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -1,8 +1,8 @@ -import React, { useEffect, useState } from "react"; +import React, { HTMLProps, useEffect, useState } from "react"; import { useSelector, useDispatch } from "react-redux"; import { useIntl } from "react-intl"; import { useLongPress } from "use-long-press"; -import { TaggedNostrEvent, HexKey, u256, ParsedZap } from "@snort/system"; +import { TaggedNostrEvent, HexKey, u256, ParsedZap, countLeadingZeros } from "@snort/system"; import { LNURL } from "@snort/shared"; import { useUserProfile } from "@snort/system-react"; @@ -11,7 +11,7 @@ import Spinner from "Icons/Spinner"; import { formatShort } from "Number"; import useEventPublisher from "Feed/EventPublisher"; -import { delay, normalizeReaction, unwrap } from "SnortUtils"; +import { delay, findTag, normalizeReaction, unwrap } from "SnortUtils"; import { NoteCreator } from "Element/NoteCreator"; import SendSats from "Element/SendSats"; import { ZapsSummary } from "Element/Zap"; @@ -173,16 +173,26 @@ export default function NoteFooter(props: NoteFooterProps) { } }, [prefs.autoZap, author, zapping]); + function powIcon() { + const pow = findTag(ev, "nonce") ? countLeadingZeros(ev.id) : undefined; + if (pow) { + return ( + + ); + } + } + function tipButton() { const service = getLNURL(); if (service) { return ( - <> -
fastZap(e)}> - {zapping ? : wallet?.isReady() ? : } - {zapTotal > 0 &&
{formatShort(zapTotal)}
} -
- + fastZap(e)} + /> ); } return null; @@ -190,10 +200,12 @@ export default function NoteFooter(props: NoteFooterProps) { function repostIcon() { return ( -
repost()}> - - {reposts.length > 0 &&
{formatShort(reposts.length)}
} -
+ repost()} + /> ); } @@ -203,12 +215,12 @@ export default function NoteFooter(props: NoteFooterProps) { } const reacted = hasReacted("+"); return ( - <> -
react(prefs.reactionEmoji)}> - -
{formatShort(positive.length)}
-
- + react(prefs.reactionEmoji)} + /> ); } @@ -228,9 +240,12 @@ export default function NoteFooter(props: NoteFooterProps) { {tipButton()} {reactionIcons()} {repostIcon()} -
- -
+ handleReplyButtonClick()} + /> + {powIcon()}
{willRenderNoteCreator && } ); } + +interface AsyncFooterIconProps extends HTMLProps { + iconName: string; + value?: number; + loading?: boolean; + onClick?: (e: React.MouseEvent) => Promise; +} + +function AsyncFooterIcon(props: AsyncFooterIconProps) { + const [loading, setLoading] = useState(props.loading ?? false); + + async function handleClick(e: React.MouseEvent) { + setLoading(true); + try { + if (props.onClick) { + await props.onClick(e); + } + } catch (ex) { + console.error(ex); + } + setLoading(false); + } + + return ( +
handleClick(e)}> + {loading ? : } + {props.value &&
{formatShort(props.value)}
} +
+ ); +} diff --git a/packages/system/src/index.ts b/packages/system/src/index.ts index 86763ea3..30bb16b7 100644 --- a/packages/system/src/index.ts +++ b/packages/system/src/index.ts @@ -22,6 +22,7 @@ export * from "./zaps"; export * from "./signer"; export * from "./text"; export * from "./pow"; +export * from "./pow-util"; export * from "./impl/nip4"; export * from "./impl/nip44"; diff --git a/packages/system/src/pow-util.ts b/packages/system/src/pow-util.ts index 952e60af..aab35f5d 100644 --- a/packages/system/src/pow-util.ts +++ b/packages/system/src/pow-util.ts @@ -30,7 +30,7 @@ export function minePow(e: NostrPowEvent, target: number) { e.tags[nonceTagIdx][1] = (++ctr).toString(); e.id = createId(e); - } while (countLeadingZeroes(e.id) < target); + } while (countLeadingZeros(e.id) < target); return e; } @@ -40,7 +40,7 @@ function createId(e: NostrPowEvent) { return bytesToHex(sha256(JSON.stringify(payload))); } -function countLeadingZeroes(hex: string) { +export function countLeadingZeros(hex: string) { let count = 0; for (let i = 0; i < hex.length; i++) {