import { useEffect, useMemo, useRef, FormEvent } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { Trans, useTranslation } from 'react-i18next'; import { useSubplebbits } from '@plebbit/plebbit-react-hooks'; import styles from './home.module.css'; import { useDefaultSubplebbits, useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits'; import useSubplebbitsStats from '../../hooks/use-subplebbits-stats'; import PopularThreadsBox from './popular-threads-box'; import BoardsList from './boards-list'; import Version from '../../components/version'; import useDisclaimerModalStore from '../../stores/use-disclaimer-modal-store'; import useDirectoryModalStore from '../../stores/use-directory-modal-store'; import DisclaimerModal from '../../components/disclaimer-modal'; import DirectoryModal from '../../components/directory-modal'; import _ from 'lodash'; // https://github.com/plebbit/lists/blob/master/5chan-multisub.json const SearchBar = () => { const searchInputRef = useRef(null); const { t } = useTranslation(); const navigate = useNavigate(); const { showDisclaimerModal } = useDisclaimerModalStore(); const handleSearchSubmit = (e: FormEvent) => { e.preventDefault(); const searchInput = searchInputRef.current?.value; if (searchInput) { showDisclaimerModal(searchInput, navigate); } }; return (
); }; const InfoBox = () => { const { t } = useTranslation(); return (

{t('what_is_5chan')}

, }} />

{t('no_global_rules_info')}
); }; const Stats = ({ subplebbitAddresses }: { subplebbitAddresses: string[] }) => { const { t } = useTranslation(); const stats = useSubplebbitsStats({ subplebbitAddresses }); const allStatsLoaded = useMemo(() => { return subplebbitAddresses.every((address) => stats[address]); }, [stats, subplebbitAddresses]); const { totalPosts, currentUsers } = useMemo(() => { let totalPosts = 0; let currentUsers = 0; if (allStatsLoaded) { Object.values(stats).forEach((stat: any) => { totalPosts += stat.allPostCount || 0; currentUsers += stat.weekActiveUserCount || 0; }); } return { totalPosts, currentUsers }; }, [stats, allStatsLoaded]); const boardsTracked = Object.values(stats).filter((stat: any) => stat && !stat.loading).length; return (

{t('stats')}

{t('total_posts')} {totalPosts}
{t('current_users')} {currentUsers}
{t('boards_tracked')} {boardsTracked}
); }; export const Footer = () => { const { t } = useTranslation(); return ( <>

•{' '} Feedback {' '} •{' '} Contact


5chan is free and open source software under GPLv2 license.
); }; export const HomeLogo = () => { return (
); }; const Home = () => { const defaultSubplebbits = useDefaultSubplebbits(); const subplebbitAddresses = useDefaultSubplebbitAddresses(); const { subplebbits } = useSubplebbits({ subplebbitAddresses }); const { closeDirectoryModal } = useDirectoryModalStore(); useEffect(() => { document.title = '5chan'; }, []); // Close directory modal when navigating away from home useEffect(() => { return () => { closeDirectoryModal(); }; }, [closeDirectoryModal]); return ( <>
); }; export default Home;