From 0f7964bfa6bb694ed2ca86a8c4ea88384ae7d4c8 Mon Sep 17 00:00:00 2001 From: Kieran Date: Fri, 14 Apr 2023 12:57:48 +0100 Subject: [PATCH] tweak subscriptions page --- packages/app/src/Element/Zap.tsx | 4 +- packages/app/src/Feed/LoginFeed.ts | 2 +- packages/app/src/Login/Functions.ts | 168 ++++++++++----------- packages/app/src/Pages/Root.tsx | 4 +- packages/app/src/Pages/subscribe/index.tsx | 10 +- packages/app/src/Subscription/index.ts | 2 +- 6 files changed, 92 insertions(+), 98 deletions(-) diff --git a/packages/app/src/Element/Zap.tsx b/packages/app/src/Element/Zap.tsx index d3891fa9..57c0044a 100644 --- a/packages/app/src/Element/Zap.tsx +++ b/packages/app/src/Element/Zap.tsx @@ -1,19 +1,17 @@ import "./Zap.css"; import { useMemo } from "react"; import { FormattedMessage, useIntl } from "react-intl"; -import { useSelector } from "react-redux"; import { HexKey, TaggedRawEvent } from "@snort/nostr"; import { decodeInvoice, InvoiceDetails, sha256, unwrap } from "Util"; import { formatShort } from "Number"; import Text from "Element/Text"; import ProfileImage from "Element/ProfileImage"; -import { RootState } from "State/Store"; import { findTag } from "Util"; import { UserCache } from "Cache/UserCache"; +import useLogin from "Hooks/useLogin"; import messages from "./messages"; -import useLogin from "Hooks/useLogin"; function getInvoice(zap: TaggedRawEvent): InvoiceDetails | undefined { const bolt11 = findTag(zap, "bolt11"); diff --git a/packages/app/src/Feed/LoginFeed.ts b/packages/app/src/Feed/LoginFeed.ts index 325fbdf9..d01431f3 100644 --- a/packages/app/src/Feed/LoginFeed.ts +++ b/packages/app/src/Feed/LoginFeed.ts @@ -20,7 +20,7 @@ import { SubscriptionEvent } from "Subscription"; */ export default function useLoginFeed() { const login = useLogin(); - const { publicKey: pubKey, privateKey: privKey, readNotifications, muted: stateMuted } = login; + const { publicKey: pubKey, privateKey: privKey, readNotifications } = login; const { isMuted } = useModeration(); const publisher = useEventPublisher(); diff --git a/packages/app/src/Login/Functions.ts b/packages/app/src/Login/Functions.ts index 5b0257a3..d0562e4c 100644 --- a/packages/app/src/Login/Functions.ts +++ b/packages/app/src/Login/Functions.ts @@ -9,135 +9,135 @@ import { bech32ToHex, dedupeById, randomSample, sanitizeRelayUrl, unixNowMs } fr import { getCurrentSubscription, SubscriptionEvent } from "Subscription"; export function setRelays(state: LoginSession, relays: Record, createdAt: number) { - if (state.relays.timestamp > createdAt) { - return; - } + if (state.relays.timestamp > createdAt) { + return; + } - // filter out non-websocket urls - const filtered = new Map(); - for (const [k, v] of Object.entries(relays)) { - if (k.startsWith("wss://") || k.startsWith("ws://")) { - const url = sanitizeRelayUrl(k); - if (url) { - filtered.set(url, v as RelaySettings); - } - } + // filter out non-websocket urls + const filtered = new Map(); + for (const [k, v] of Object.entries(relays)) { + if (k.startsWith("wss://") || k.startsWith("ws://")) { + const url = sanitizeRelayUrl(k); + if (url) { + filtered.set(url, v as RelaySettings); + } } - state.relays.item = Object.fromEntries(filtered.entries()); - state.relays.timestamp = createdAt; - LoginStore.updateSession(state); + } + state.relays.item = Object.fromEntries(filtered.entries()); + state.relays.timestamp = createdAt; + LoginStore.updateSession(state); } export function removeRelay(state: LoginSession, addr: string) { - delete state.relays.item[addr]; - LoginStore.updateSession(state); + delete state.relays.item[addr]; + LoginStore.updateSession(state); } export function updatePreferences(state: LoginSession, p: UserPreferences) { - state.preferences = p; - LoginStore.updateSession(state); + state.preferences = p; + LoginStore.updateSession(state); } export function logout(k: HexKey) { - LoginStore.removeSession(k); + LoginStore.removeSession(k); } export function markNotificationsRead(state: LoginSession) { - state.readNotifications = unixNowMs(); - LoginStore.updateSession(state); + state.readNotifications = unixNowMs(); + LoginStore.updateSession(state); } export function clearEntropy(state: LoginSession) { - state.generatedEntropy = undefined; - LoginStore.updateSession(state); + state.generatedEntropy = undefined; + LoginStore.updateSession(state); } /** * Generate a new key and login with this generated key */ export async function generateNewLogin(publisher: EventPublisher) { - const ent = generateBip39Entropy(); - const entHex = secp.utils.bytesToHex(ent); - const newKeyHex = entropyToDerivedKey(ent); - let newRelays: Record = {}; + const ent = generateBip39Entropy(); + const entHex = secp.utils.bytesToHex(ent); + const newKeyHex = entropyToDerivedKey(ent); + let newRelays: Record = {}; - try { - const rsp = await fetch("https://api.nostr.watch/v1/online"); - if (rsp.ok) { - const online: string[] = await rsp.json(); - const pickRandom = randomSample(online, 4); - const relayObjects = pickRandom.map(a => [a, { read: true, write: true }]); - newRelays = { - ...Object.fromEntries(relayObjects), - ...Object.fromEntries(DefaultRelays.entries()), - }; - } - } catch (e) { - console.warn(e); + try { + const rsp = await fetch("https://api.nostr.watch/v1/online"); + if (rsp.ok) { + const online: string[] = await rsp.json(); + const pickRandom = randomSample(online, 4); + const relayObjects = pickRandom.map(a => [a, { read: true, write: true }]); + newRelays = { + ...Object.fromEntries(relayObjects), + ...Object.fromEntries(DefaultRelays.entries()), + }; } + } catch (e) { + console.warn(e); + } - const ev = await publisher.addFollow([bech32ToHex(SnortPubKey), newKeyHex], newRelays); - publisher.broadcast(ev); + const ev = await publisher.addFollow([bech32ToHex(SnortPubKey), newKeyHex], newRelays); + publisher.broadcast(ev); - LoginStore.loginWithPrivateKey(newKeyHex, entHex); + LoginStore.loginWithPrivateKey(newKeyHex, entHex); } export function setTags(state: LoginSession, tags: Array, ts: number) { - if (state.tags.timestamp > ts) { - return; - } - state.tags.item = tags; - state.tags.timestamp = ts; - LoginStore.updateSession(state); + if (state.tags.timestamp > ts) { + return; + } + state.tags.item = tags; + state.tags.timestamp = ts; + LoginStore.updateSession(state); } export function setMuted(state: LoginSession, muted: Array, ts: number) { - if (state.muted.timestamp > ts) { - return; - } - state.muted.item = muted; - state.muted.timestamp = ts; - LoginStore.updateSession(state); + if (state.muted.timestamp > ts) { + return; + } + state.muted.item = muted; + state.muted.timestamp = ts; + LoginStore.updateSession(state); } export function setBlocked(state: LoginSession, blocked: Array, ts: number) { - if (state.blocked.timestamp > ts) { - return; - } - state.blocked.item = blocked; - state.blocked.timestamp = ts; - LoginStore.updateSession(state); + if (state.blocked.timestamp > ts) { + return; + } + state.blocked.item = blocked; + state.blocked.timestamp = ts; + LoginStore.updateSession(state); } export function setFollows(state: LoginSession, follows: Array, ts: number) { - if (state.follows.timestamp > ts) { - return; - } - state.follows.item = follows; - state.follows.timestamp = ts; - LoginStore.updateSession(state); + if (state.follows.timestamp > ts) { + return; + } + state.follows.item = follows; + state.follows.timestamp = ts; + LoginStore.updateSession(state); } export function setPinned(state: LoginSession, pinned: Array, ts: number) { - if (state.pinned.timestamp > ts) { - return; - } - state.pinned.item = pinned; - state.pinned.timestamp = ts; - LoginStore.updateSession(state); + if (state.pinned.timestamp > ts) { + return; + } + state.pinned.item = pinned; + state.pinned.timestamp = ts; + LoginStore.updateSession(state); } export function setBookmarked(state: LoginSession, bookmarked: Array, ts: number) { - if (state.bookmarked.timestamp > ts) { - return; - } - state.bookmarked.item = bookmarked; - state.bookmarked.timestamp = ts; - LoginStore.updateSession(state); + if (state.bookmarked.timestamp > ts) { + return; + } + state.bookmarked.item = bookmarked; + state.bookmarked.timestamp = ts; + LoginStore.updateSession(state); } export function addSubscription(state: LoginSession, ...subs: SubscriptionEvent[]) { - state.subscriptions = dedupeById([...state.subscriptions, ...subs]); - state.currentSubscription = getCurrentSubscription(state.subscriptions); - LoginStore.updateSession(state); -} \ No newline at end of file + state.subscriptions = dedupeById([...(state.subscriptions || []), ...subs]); + state.currentSubscription = getCurrentSubscription(state.subscriptions); + LoginStore.updateSession(state); +} diff --git a/packages/app/src/Pages/Root.tsx b/packages/app/src/Pages/Root.tsx index ea9c2343..9f038f5c 100644 --- a/packages/app/src/Pages/Root.tsx +++ b/packages/app/src/Pages/Root.tsx @@ -1,18 +1,16 @@ import "./Root.css"; import { useEffect, useMemo, useState } from "react"; -import { useSelector } from "react-redux"; import { Link, Outlet, RouteObject, useLocation, useNavigate, useParams } from "react-router-dom"; import { useIntl, FormattedMessage } from "react-intl"; import Tabs, { Tab } from "Element/Tabs"; -import { RootState } from "State/Store"; import Timeline from "Element/Timeline"; import { System } from "System"; import { TimelineSubject } from "Feed/TimelineFeed"; import { debounce, getRelayName, sha256, unixNow, unwrap } from "Util"; +import useLogin from "Hooks/useLogin"; import messages from "./messages"; -import useLogin from "Hooks/useLogin"; interface RelayOption { url: string; diff --git a/packages/app/src/Pages/subscribe/index.tsx b/packages/app/src/Pages/subscribe/index.tsx index 316a7409..c010e3c3 100644 --- a/packages/app/src/Pages/subscribe/index.tsx +++ b/packages/app/src/Pages/subscribe/index.tsx @@ -58,9 +58,10 @@ export function SubscribePage() {

{mapPlanName(a.id)}

{formatShort(a.price)}, + plan: mapPlanName(a.id), + price: {formatShort(a.price)} sats/mo, }} /> : @@ -86,10 +87,7 @@ export function SubscribePage() { {a.disabled ? ( ) : ( - + )} diff --git a/packages/app/src/Subscription/index.ts b/packages/app/src/Subscription/index.ts index a3db06fa..8349beee 100644 --- a/packages/app/src/Subscription/index.ts +++ b/packages/app/src/Subscription/index.ts @@ -18,7 +18,7 @@ export const Plans = [ { id: SubscriptionType.Supporter, price: 5_000, - disabled: true, + disabled: false, unlocks: [LockedFeatures.MultiAccount, LockedFeatures.NostrAddress, LockedFeatures.Badge], }, {