diff --git a/packages/app/config/default.json b/packages/app/config/default.json index 16a7f4f7..a9a0b496 100644 --- a/packages/app/config/default.json +++ b/packages/app/config/default.json @@ -9,6 +9,9 @@ "httpCache": "", "animalNamePlaceholders": false, "features": { - "subscriptions": true + "analytics": true, + "subscriptions": true, + "deck": true, + "zapPool": true } } diff --git a/packages/app/config/iris.json b/packages/app/config/iris.json index 4f882f5f..cc5f1e0b 100644 --- a/packages/app/config/iris.json +++ b/packages/app/config/iris.json @@ -9,6 +9,9 @@ "httpCache": "https://api.iris.to", "animalNamePlaceholders": true, "features": { - "subscriptions": false + "analytics": true, + "subscriptions": false, + "deck": true, + "zapPool": true } } diff --git a/packages/app/custom.d.ts b/packages/app/custom.d.ts index 6961ecb9..d2df8418 100644 --- a/packages/app/custom.d.ts +++ b/packages/app/custom.d.ts @@ -45,7 +45,11 @@ declare const CONFIG: { appleTouchIconUrl: string; httpCache: string; animalNamePlaceholders: boolean; + defaultZapPoolFee?: number; features: { + analytics: boolean; subscriptions: boolean; + deck: boolean; + zapPool: boolean; }; }; diff --git a/packages/app/src/Element/Chat/WriteMessage.tsx b/packages/app/src/Element/Chat/WriteMessage.tsx index 9afe5e0a..6e3e768b 100644 --- a/packages/app/src/Element/Chat/WriteMessage.tsx +++ b/packages/app/src/Element/Chat/WriteMessage.tsx @@ -80,7 +80,7 @@ export default function WriteMessage({ chat }: { chat: Chat }) { return ( <> -
@@ -97,7 +97,7 @@ export default function WriteMessage({ chat }: { chat: Chat }) { /> {error && {error}}
- diff --git a/packages/app/src/Element/Event/Markdown.tsx b/packages/app/src/Element/Event/Markdown.tsx index 44839cf5..c875ea82 100644 --- a/packages/app/src/Element/Event/Markdown.tsx +++ b/packages/app/src/Element/Event/Markdown.tsx @@ -1,11 +1,12 @@ import "./Markdown.css"; import { ReactNode, forwardRef, useMemo } from "react"; +import { transformText } from "@snort/system"; import { marked, Token } from "marked"; import { Link } from "react-router-dom"; import markedFootnote, { Footnotes, Footnote, FootnoteRef } from "marked-footnote"; + import { ProxyImg } from "Element/ProxyImg"; -import { transformText } from "@snort/system"; import Mention from "Element/Embed/Mention"; import NostrLink from "Element/Embed/NostrLink"; diff --git a/packages/app/src/Element/Event/NoteFooter.tsx b/packages/app/src/Element/Event/NoteFooter.tsx index 7f802b67..1d587d14 100644 --- a/packages/app/src/Element/Event/NoteFooter.tsx +++ b/packages/app/src/Element/Event/NoteFooter.tsx @@ -159,7 +159,9 @@ export default function NoteFooter(props: NoteFooterProps) { const result = await zapper.send(wallet, targets, amount); const totalSent = result.reduce((acc, v) => (acc += v.sent), 0); if (totalSent > 0) { - ZapPoolController.allocate(totalSent); + if (CONFIG.features.zapPool) { + ZapPoolController?.allocate(totalSent); + } await interactionCache.zap(); } }); diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 0ce84991..f2053eda 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -78,7 +78,7 @@ export default function Layout() { onClick={() => { LoginStore.removeSession(id); }}> - diff --git a/packages/app/src/Pages/ZapPool.tsx b/packages/app/src/Pages/ZapPool.tsx index e49150cc..24fdd94b 100644 --- a/packages/app/src/Pages/ZapPool.tsx +++ b/packages/app/src/Pages/ZapPool.tsx @@ -34,6 +34,7 @@ const DataProviders = [ ]; function ZapTarget({ target }: { target: ZapPoolRecipient }) { + if (!ZapPoolController) return; const login = useLogin(); const profile = useUserProfile(target.pubkey); const hasAddress = profile?.lud16 || profile?.lud06; @@ -54,7 +55,7 @@ function ZapTarget({ target }: { target: ZapPoolRecipient }) { max={100} value={target.split} onChange={e => - ZapPoolController.set({ + ZapPoolController?.set({ ...target, split: e.target.valueAsNumber, }) @@ -70,11 +71,12 @@ function ZapTarget({ target }: { target: ZapPoolRecipient }) { } export default function ZapPoolPage() { + if (!ZapPoolController) return; const login = useLogin(); const { system } = useEventPublisher(); const zapPool = useSyncExternalStore( - c => ZapPoolController.hook(c), - () => ZapPoolController.snapshot(), + c => unwrap(ZapPoolController).hook(c), + () => unwrap(ZapPoolController).snapshot(), ); const { wallet } = useWallet(); @@ -146,7 +148,7 @@ export default function ZapPoolPage() {

{wallet && ( - ZapPoolController.payout(wallet)}> + ZapPoolController?.payout(wallet)}> )} diff --git a/packages/app/src/Pages/settings/Profile.tsx b/packages/app/src/Pages/settings/Profile.tsx index 2b03119b..5c44c19e 100644 --- a/packages/app/src/Pages/settings/Profile.tsx +++ b/packages/app/src/Pages/settings/Profile.tsx @@ -207,7 +207,7 @@ export default function ProfileSettings(props: ProfileSettingsProps) { setNewAvatar()} disabled={readonly}> diff --git a/packages/app/src/Pages/settings/Root.tsx b/packages/app/src/Pages/settings/Root.tsx index 4c517317..733a69f5 100644 --- a/packages/app/src/Pages/settings/Root.tsx +++ b/packages/app/src/Pages/settings/Root.tsx @@ -92,11 +92,13 @@ const SettingsIndex = () => { -

navigate("/zap-pool")}> - - - -
+ {CONFIG.features.zapPool && ( +
navigate("/zap-pool")}> + + + +
+ )}
diff --git a/packages/app/src/ZapPoolController.ts b/packages/app/src/ZapPoolController.ts index 6667e76e..6c5124dd 100644 --- a/packages/app/src/ZapPoolController.ts +++ b/packages/app/src/ZapPoolController.ts @@ -168,4 +168,4 @@ class ZapPool extends ExternalStore> { } } -export const ZapPoolController = new ZapPool(); +export const ZapPoolController = CONFIG.features.zapPool ? new ZapPool() : undefined; diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 22218563..83a1688a 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -7,7 +7,7 @@ import WasmPath from "@snort/system-wasm/pkg/system_wasm_bg.wasm"; import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; -import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import { createBrowserRouter, RouteObject, RouterProvider } from "react-router-dom"; import { NostrSystem, ProfileLoaderService, @@ -148,7 +148,7 @@ async function initSite() { // inject analytics script // - if (login.preferences.telemetry ?? true) { + if (CONFIG.features.analytics && (login.preferences.telemetry ?? true)) { const sc = document.createElement("script"); sc.src = "https://analytics.v0l.io/js/script.js"; sc.defer = true; @@ -159,7 +159,79 @@ async function initSite() { } let didInit = false; -export const router = createBrowserRouter([ +const mainRoutes = [ + ...RootRoutes, + { + path: "/login", + element: , + }, + { + path: "/help", + element: , + }, + { + path: "/e/:id", + element: , + }, + { + path: "/p/:id", + element: , + }, + { + path: "/notifications", + element: , + }, + { + path: "/settings", + element: , + children: SettingsRoutes, + }, + { + path: "/free-nostr-address", + element: , + }, + { + path: "/nostr-address", + element: , + }, + { + path: "/messages/:id?", + element: , + }, + { + path: "/donate", + element: , + }, + { + path: "/search/:keyword?", + element: , + }, + { + path: "/list-feed/:id", + element: , + }, + ...NewUserRoutes, + ...WalletRoutes, +] as Array; + +if (CONFIG.features.zapPool) { + mainRoutes.push({ + path: "/zap-pool", + element: , + }); +} + +if (CONFIG.features.subscriptions) { + mainRoutes.push(...SubscribeRoutes); +} + +// add catch all route +mainRoutes.push({ + path: "/*", + element: , +}); + +const routes = [ { element: , errorElement: , @@ -170,71 +242,12 @@ export const router = createBrowserRouter([ } return null; }, - children: [ - ...RootRoutes, - { - path: "/login", - element: , - }, - { - path: "/help", - element: , - }, - { - path: "/e/:id", - element: , - }, - { - path: "/p/:id", - element: , - }, - { - path: "/notifications", - element: , - }, - { - path: "/settings", - element: , - children: SettingsRoutes, - }, - { - path: "/free-nostr-address", - element: , - }, - { - path: "/nostr-address", - element: , - }, - { - path: "/messages/:id?", - element: , - }, - { - path: "/donate", - element: , - }, - { - path: "/search/:keyword?", - element: , - }, - { - path: "/zap-pool", - element: , - }, - { - path: "/list-feed/:id", - element: , - }, - ...NewUserRoutes, - ...WalletRoutes, - ...(CONFIG.features.subscriptions ? SubscribeRoutes : []), - { - path: "/*", - element: , - }, - ], + children: mainRoutes, }, - { +] as Array; + +if (CONFIG.features.deck) { + routes.push({ path: "/deck", element: , loader: async () => { @@ -245,8 +258,10 @@ export const router = createBrowserRouter([ return null; }, children: RootTabRoutes, - }, -]); + } as RouteObject); +} + +export const router = createBrowserRouter(routes); const root = ReactDOM.createRoot(unwrap(document.getElementById("root"))); root.render(