From fa24e73c6cfd65ff8b1e1da6284d8ffd9935bc8b Mon Sep 17 00:00:00 2001 From: "Tom (plebeius.eth)" Date: Tue, 11 Feb 2025 16:24:26 +0100 Subject: [PATCH] feat: auto subscribe new accounts to specific default subplebbits --- src/components/account-bar/account-bar.tsx | 7 +++- .../over-18-warning/over-18-warning.tsx | 6 --- src/hooks/use-auto-subscribe.ts | 38 +++++++++++++++++++ src/hooks/use-default-subplebbits.ts | 10 +++++ .../subplebbit-settings.tsx | 2 +- 5 files changed, 54 insertions(+), 9 deletions(-) create mode 100644 src/hooks/use-auto-subscribe.ts diff --git a/src/components/account-bar/account-bar.tsx b/src/components/account-bar/account-bar.tsx index 5b1d3c76..57757627 100644 --- a/src/components/account-bar/account-bar.tsx +++ b/src/components/account-bar/account-bar.tsx @@ -1,9 +1,10 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { Link, useLocation, useParams } from 'react-router-dom'; -import { createAccount, setActiveAccount, useAccount, useAccounts } from '@plebbit/plebbit-react-hooks'; import { useTranslation } from 'react-i18next'; -import styles from './account-bar.module.css'; +import { createAccount, setActiveAccount, useAccount, useAccounts } from '@plebbit/plebbit-react-hooks'; import { isSettingsView, isSubmitView, isSubplebbitView } from '../../lib/utils/view-utils'; +import { useAutoSubscribe } from '../../hooks/use-auto-subscribe'; +import styles from './account-bar.module.css'; import SearchBar from '../search-bar'; const AccountBar = () => { @@ -17,6 +18,8 @@ const AccountBar = () => { const isInSubmitView = isSubmitView(location.pathname); const isInSettingsView = isSettingsView(location.pathname); + useAutoSubscribe(); + const [searchVisible, setSearchVisible] = useState(false); const toggleSearchVisible = () => setSearchVisible(!searchVisible); const searchBarRef = useRef(null); diff --git a/src/components/over-18-warning/over-18-warning.tsx b/src/components/over-18-warning/over-18-warning.tsx index 96b73795..707f08b9 100644 --- a/src/components/over-18-warning/over-18-warning.tsx +++ b/src/components/over-18-warning/over-18-warning.tsx @@ -7,12 +7,6 @@ const Over18Warning = () => { const { t } = useTranslation(); const contentOptionsStore = useContentOptionsStore(); - const hasUnhiddenAnyNsfwCommunity = - !contentOptionsStore.hideAdultCommunities || - !contentOptionsStore.hideGoreCommunities || - !contentOptionsStore.hideAntiCommunities || - !contentOptionsStore.hideVulgarCommunities; - const handleAcceptWarning = () => { contentOptionsStore.setHideAdultCommunities(false); contentOptionsStore.setHideGoreCommunities(false); diff --git a/src/hooks/use-auto-subscribe.ts b/src/hooks/use-auto-subscribe.ts new file mode 100644 index 00000000..6415a0ed --- /dev/null +++ b/src/hooks/use-auto-subscribe.ts @@ -0,0 +1,38 @@ +import { useEffect } from 'react'; +import { useAccount, setAccount } from '@plebbit/plebbit-react-hooks'; +import { getAutoSubscribeAddresses } from './use-default-subplebbits'; + +const AUTO_SUBSCRIBE_KEY_PREFIX = 'seedit-auto-subscribe-done-'; +const AUTO_SUBSCRIBE_DELAY = 200; + +export const useAutoSubscribe = () => { + const account = useAccount(); + const accountAddress = account?.author?.address; + const hasExistingSubscriptions = account?.subscriptions?.length > 0; + + useEffect(() => { + if (!accountAddress || hasExistingSubscriptions) return; + + const storageKey = AUTO_SUBSCRIBE_KEY_PREFIX + accountAddress; + const hasAutoSubscribed = localStorage.getItem(storageKey); + + if (!hasAutoSubscribed) { + const initialDelay = setTimeout(() => { + const autoSubscribeAddresses = getAutoSubscribeAddresses(); + + if (autoSubscribeAddresses.length) { + const newSubscriptions = Array.from(new Set([...(account.subscriptions || []), ...autoSubscribeAddresses])); + + setAccount({ + ...account, + subscriptions: newSubscriptions, + }); + + localStorage.setItem(storageKey, 'true'); + } + }, AUTO_SUBSCRIBE_DELAY); + + return () => clearTimeout(initialDelay); + } + }, [accountAddress, account, hasExistingSubscriptions]); +}; diff --git a/src/hooks/use-default-subplebbits.ts b/src/hooks/use-default-subplebbits.ts index 67908fda..cf0aa5d3 100644 --- a/src/hooks/use-default-subplebbits.ts +++ b/src/hooks/use-default-subplebbits.ts @@ -14,10 +14,12 @@ export interface MultisubSubplebbit { address: string; tags?: string[]; features?: string[]; + seeditAutoSubscribe?: boolean; } let cacheSubplebbits: MultisubSubplebbit[] | null = null; let cacheMetadata: MultisubMetadata | null = null; +let cacheAutoSubscribeAddresses: string[] | null = null; export const useDefaultSubplebbits = () => { const [subplebbits, setSubplebbits] = useState([]); @@ -33,6 +35,12 @@ export const useDefaultSubplebbits = () => { // { cache: 'no-cache' } ).then((res) => res.json()); cacheSubplebbits = multisub.subplebbits; + + // Cache auto-subscribe addresses when we fetch subplebbits + cacheAutoSubscribeAddresses = multisub.subplebbits + .filter((sub: MultisubSubplebbit) => sub.seeditAutoSubscribe && sub.address) + .map((sub: MultisubSubplebbit) => sub.address); + setSubplebbits(multisub.subplebbits); } catch (e) { console.warn(e); @@ -116,3 +124,5 @@ const getUniqueTags = (multisub: any) => { export const useDefaultSubplebbitTags = (subplebbits: any) => { return useMemo(() => getUniqueTags(subplebbits), [subplebbits]); }; + +export const getAutoSubscribeAddresses = () => cacheAutoSubscribeAddresses || []; diff --git a/src/views/subplebbit-settings/subplebbit-settings.tsx b/src/views/subplebbit-settings/subplebbit-settings.tsx index dd79f9f0..0d0bcd56 100644 --- a/src/views/subplebbit-settings/subplebbit-settings.tsx +++ b/src/views/subplebbit-settings/subplebbit-settings.tsx @@ -442,7 +442,7 @@ const SubplebbitSettings = () => { resetSubplebbitSettingsStore(); navigate(`/p/${createdSubplebbit?.address}/`); } - }, [createdSubplebbit, navigate, resetSubplebbitSettingsStore, account]); + }, [createdSubplebbit, navigate, resetSubplebbitSettingsStore, account, subscribe]); useEffect(() => { resetSubplebbitSettingsStore();