From 511f401367dd5b7113853d63cfa1f7f62bacd51a Mon Sep 17 00:00:00 2001 From: Kieran Date: Wed, 29 Nov 2023 12:05:36 +0000 Subject: [PATCH] feat: limit deck to subscribers --- packages/app/custom.d.ts | 3 ++ packages/app/src/Pages/DeckLayout.tsx | 29 +++++++++++++++++-- packages/app/src/Pages/Layout/NavSidebar.tsx | 15 ++++++++-- .../src/Pages/subscribe/SubscriptionCard.tsx | 2 +- packages/app/src/Pages/subscribe/index.tsx | 2 +- 5 files changed, 45 insertions(+), 6 deletions(-) diff --git a/packages/app/custom.d.ts b/packages/app/custom.d.ts index 2827861c..6bba1965 100644 --- a/packages/app/custom.d.ts +++ b/packages/app/custom.d.ts @@ -63,7 +63,10 @@ declare const CONFIG: { signUp: { moderation: boolean; }; + // Filter urls from nav sidebar hideFromNavbar?: Array; + // Limit deck to certain subvscriber tier + deckSubKind?: number; eventLinkPrefix: NostrPrefix; profileLinkPrefix: NostrPrefix; defaultRelays: Record; diff --git a/packages/app/src/Pages/DeckLayout.tsx b/packages/app/src/Pages/DeckLayout.tsx index a09015c8..1aa758bf 100644 --- a/packages/app/src/Pages/DeckLayout.tsx +++ b/packages/app/src/Pages/DeckLayout.tsx @@ -1,6 +1,6 @@ import "./Deck.css"; import { createContext, useContext, useEffect, useState } from "react"; -import { Outlet, useNavigate } from "react-router-dom"; +import { Link, Outlet, useNavigate } from "react-router-dom"; import { FormattedMessage } from "react-intl"; import { NostrLink, TaggedNostrEvent } from "@snort/system"; @@ -22,6 +22,8 @@ import useLogin from "@/Hooks/useLogin"; import { LongFormText } from "@/Element/Event/LongFormText"; import NavSidebar from "@/Pages/Layout/NavSidebar"; import ErrorBoundary from "@/Element/ErrorBoundary"; +import { getCurrentSubscription } from "@/Subscription"; +import { mapPlanName } from "./subscribe"; type Cols = "notes" | "articles" | "media" | "streams" | "notifications"; @@ -39,12 +41,13 @@ interface DeckScope { export const DeckContext = createContext(undefined); export function SnortDeckLayout() { - const login = useLogin(); + const login = useLogin(s => ({ publicKey: s.publicKey, subscriptions: s.subscriptions })); const navigate = useNavigate(); const [deckState, setDeckState] = useState({ thread: undefined, article: undefined, }); + const sub = getCurrentSubscription(login.subscriptions); useLoginFeed(); useTheme(); @@ -57,6 +60,28 @@ export function SnortDeckLayout() { }, [login]); if (!login.publicKey) return null; + if (CONFIG.deckSubKind !== undefined && (sub?.type ?? -1) < CONFIG.deckSubKind) { + return
+ +
+
+
+ +
+
+ + + +
+
+
+
+ } const cols = ["notes", "media", "notifications", "articles"] as Array; return (
diff --git a/packages/app/src/Pages/Layout/NavSidebar.tsx b/packages/app/src/Pages/Layout/NavSidebar.tsx index 842a166d..e009520b 100644 --- a/packages/app/src/Pages/Layout/NavSidebar.tsx +++ b/packages/app/src/Pages/Layout/NavSidebar.tsx @@ -9,6 +9,7 @@ import { NoteCreatorButton } from "../../Element/Event/Create/NoteCreatorButton" import { FormattedMessage } from "react-intl"; import classNames from "classnames"; import { HasNotificationsMarker } from "@/Pages/Layout/AccountHeader"; +import { getCurrentSubscription } from "@/Subscription"; const MENU_ITEMS = [ { @@ -64,11 +65,13 @@ const getNavLinkClass = (isActive: boolean, narrow: boolean) => { }; export default function NavSidebar({ narrow = false }) { - const { publicKey } = useLogin(s => ({ + const { publicKey, subscriptions } = useLogin(s => ({ publicKey: s.publicKey, + subscriptions: s.subscriptions })); const profile = useUserProfile(publicKey); const navigate = useNavigate(); + const sub = getCurrentSubscription(subscriptions); const className = classNames( { "xl:w-56 xl:gap-3 xl:items-start": !narrow }, @@ -80,7 +83,15 @@ export default function NavSidebar({ narrow = false }) {
- {MENU_ITEMS.filter(a => !(CONFIG.hideFromNavbar ?? []).includes(a.link)).map(item => { + {MENU_ITEMS.filter(a => { + if ((CONFIG.hideFromNavbar ?? []).includes(a.link)) { + return false; + } + if (a.link == "/deck" && CONFIG.deckSubKind !== undefined && (sub?.type ?? -1) < CONFIG.deckSubKind) { + return false; + } + return true; + }).map(item => { if (!item.nonLoggedIn && !publicKey) { return ""; } diff --git a/packages/app/src/Pages/subscribe/SubscriptionCard.tsx b/packages/app/src/Pages/subscribe/SubscriptionCard.tsx index 28e3f6a1..773c7c5b 100644 --- a/packages/app/src/Pages/subscribe/SubscriptionCard.tsx +++ b/packages/app/src/Pages/subscribe/SubscriptionCard.tsx @@ -51,7 +51,7 @@ export default function SubscriptionCard({ sub }: { sub: Subscription }) {

{daysToExpire >= 1 && ( diff --git a/packages/app/src/Pages/subscribe/index.tsx b/packages/app/src/Pages/subscribe/index.tsx index a2b64238..c13e9361 100644 --- a/packages/app/src/Pages/subscribe/index.tsx +++ b/packages/app/src/Pages/subscribe/index.tsx @@ -16,7 +16,7 @@ import classNames from "classnames"; export function mapPlanName(id: number) { switch (id) { case SubscriptionType.Supporter: - return ; + return ; case SubscriptionType.Premium: return ; }