import { useCallback, useEffect, useRef, useState } from 'react'; import { Link } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; import { Subplebbit, useAccount, useAccountSubplebbits } from '@plebbit/plebbit-react-hooks'; import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js'; import useHomeFiltersStore from '../../../stores/use-home-filters-store'; import { useMultisubMetadata } from '../../../hooks/use-default-subplebbits'; import styles from '../home.module.css'; import { nsfwTags } from '../home'; const BoxModal = ({ isBoardsBoxModal }: { isBoardsBoxModal: boolean }) => { const { t } = useTranslation(); const [showFilterModal, setShowFilterModal] = useState(false); const modalRef = useRef(null); const { showNsfwBoardsOnly, setShowNsfwBoardsOnly, showWorksafeBoardsOnly, setShowWorksafeBoardsOnly, useCatalog, setUseCatalog, showWorksafeContentOnly, setShowWorksafeContentOnly, showNsfwContentOnly, setShowNsfwContentOnly, } = useHomeFiltersStore(); const handleClickOutside = useCallback( (event: MouseEvent) => { if (modalRef.current && !modalRef.current.contains(event.target as Node)) { setShowFilterModal(false); } }, [modalRef, setShowFilterModal], ); useEffect(() => { document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, [handleClickOutside]); return ( <> setShowFilterModal(true)}> {isBoardsBoxModal ? t('filter') : t('options')} ▼ {showFilterModal && (
{isBoardsBoxModal ? ( <>
{ setShowNsfwBoardsOnly(false); setShowWorksafeBoardsOnly(false); setShowFilterModal(false); }} > Show All Boards
{ if (showWorksafeBoardsOnly) { setShowWorksafeBoardsOnly(false); } setShowNsfwBoardsOnly(!showNsfwBoardsOnly); setShowFilterModal(false); }} > Show NSFW Boards Only
{ if (showNsfwBoardsOnly) { setShowNsfwBoardsOnly(false); } setShowWorksafeBoardsOnly(!showWorksafeBoardsOnly); setShowFilterModal(false); }} > Show Worksafe Boards Only
{ setUseCatalog(!useCatalog); setShowFilterModal(false); }} > Use Catalog
) : ( <>
{ if (showNsfwContentOnly) { setShowNsfwContentOnly(false); } setShowWorksafeContentOnly(!showWorksafeContentOnly); setShowFilterModal(false); }} > Show Worksafe Content Only
{ if (showWorksafeContentOnly) { setShowWorksafeContentOnly(false); } setShowNsfwContentOnly(!showNsfwContentOnly); setShowFilterModal(false); }} > Show NSFW Content Only
{ setShowWorksafeContentOnly(false); setShowNsfwContentOnly(false); setShowFilterModal(false); }} > Show All Content
)}
)} ); }; const Board = ({ isOffline, subplebbit }: { isOffline: boolean; subplebbit: Subplebbit }) => { const { t } = useTranslation(); const { address, title, tags } = subplebbit || {}; const nsfwTag = tags.find((tag: string) => nsfwTags.includes(tag)); const { useCatalog } = useHomeFiltersStore(); const boardLink = useCatalog ? `/p/${address}/catalog` : `/p/${address}`; return (
{isOffline && } {title || address} {nsfwTag && ({t(nsfwTag)})}
); }; const BoardsBox = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits: any }) => { const { t } = useTranslation(); const account = useAccount(); const subscriptions = account?.subscriptions || []; const { accountSubplebbits } = useAccountSubplebbits(); const accountSubplebbitAddresses = Object.keys(accountSubplebbits); const { showNsfwBoardsOnly, showWorksafeBoardsOnly } = useHomeFiltersStore(); const filterSubs = (subs: Subplebbit[], includeTags: string[], excludeTags: string[] = []) => subs.filter((sub) => includeTags.every((tag) => sub.tags?.includes(tag)) && excludeTags.every((tag) => !sub.tags?.includes(tag))); let plebbitSubs = filterSubs(multisub, ['plebbit']); let interestsSubs = filterSubs(multisub, ['topic'], ['plebbit', 'country', 'international']); let randomSubs = filterSubs(multisub, ['random'], ['plebbit']); let internationalSubs = filterSubs(multisub, ['international']); let projectsSubs = filterSubs(multisub, ['project'], ['plebbit', 'topic']); const filterByNsfw = (subs: Subplebbit[], includeNsfw: boolean) => subs.filter((sub) => sub.tags.some((tag: string) => nsfwTags.includes(tag)) === includeNsfw); const filterCategoriesByNsfw = (subsArray: Subplebbit[][], includeNsfw: boolean) => subsArray.map((subs) => filterByNsfw(subs, includeNsfw)); const includeNsfw = showNsfwBoardsOnly ? true : showWorksafeBoardsOnly ? false : null; if (includeNsfw !== null) { [plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs] = filterCategoriesByNsfw( [plebbitSubs, interestsSubs, randomSubs, internationalSubs, projectsSubs], includeNsfw, ); } const isSubOffline = (address: string) => { const subplebbit = subplebbits && subplebbits.find((sub: Subplebbit) => sub?.address === address); const isOffline = subplebbit?.updatedAt && subplebbit.updatedAt < Date.now() / 1000 - 60 * 60; return isOffline; }; const multisubMetadata = useMultisubMetadata(); return (

{t('boards')}

Multiboards

{multisubMetadata?.title || 'All'}
Subscriptions
{plebbitSubs.length > 0 && ( <>

Plebbit

{plebbitSubs.map((sub) => ( ))}
)} {projectsSubs.length > 0 && ( <>

{t('projects')}

{projectsSubs.map((sub) => ( ))}
)}
{interestsSubs.length > 0 && ( <>

{t('interests')}

{interestsSubs.map((sub) => ( ))}
)}
{randomSubs.length > 0 && ( <>

{t('random')}

{randomSubs.map((sub) => ( ))}
)} {internationalSubs.length > 0 && ( <>

{t('international')}

{internationalSubs.map((sub) => ( ))}
)}

{t('subscriptions')}

{subscriptions.length > 0 ? subscriptions.map((address: string, index: number) => (
p/{address && Plebbit.getShortAddress(address)}
)) : t('not_subscribed')}

{t('moderating')}

{accountSubplebbitAddresses.length > 0 ? accountSubplebbitAddresses.map((address: string, index: number) => (
p/{address && Plebbit.getShortAddress(address)}
)) : t('not_moderating')}
); }; export default BoardsBox;