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 { useDirectories, useDirectoryAddresses } from '../../hooks/use-directories'; import { SubplebbitStatsCollector, useSubplebbitsStatsStore } from '../../hooks/use-subplebbits-stats'; import PopularThreadsBox from './popular-threads-box'; import BoardsList from './boards-list'; import Version from '../../components/version'; import useDirectoryModalStore from '../../stores/use-directory-modal-store'; import DisclaimerModal from '../../components/disclaimer-modal'; import DirectoryModal from '../../components/directory-modal'; import { getBoardPath } from '../../lib/utils/route-utils'; import { lowerCase } from 'lodash'; // https://github.com/bitsocialhq/lists/blob/master/5chan-directories.json const SearchBar = () => { const searchInputRef = useRef(null); const { t } = useTranslation(); const navigate = useNavigate(); const directories = useDirectories(); const handleSearchSubmit = (e: FormEvent) => { e.preventDefault(); const searchInput = searchInputRef.current?.value; if (searchInput) { const boardPath = getBoardPath(searchInput, directories); navigate(`/${boardPath}`); } }; return (
); }; const InfoBox = () => { const { t } = useTranslation(); return (

{t('what_is_5chan')}

, 2: , }} />

{t('no_global_rules_info')}
); }; const Stats = ({ directoryAddresses }: { directoryAddresses: string[] }) => { const { t } = useTranslation(); const subplebbitsStats = useSubplebbitsStatsStore((state) => state.subplebbitsStats); const { totalPosts, currentUsers, boardsTracked } = useMemo(() => { let totalPosts = 0; let currentUsers = 0; let boardsTracked = 0; directoryAddresses.forEach((address) => { const stat = subplebbitsStats[address]; if (stat) { totalPosts += stat.allPostCount || 0; currentUsers += stat.weekActiveUserCount || 0; boardsTracked++; } }); return { totalPosts, currentUsers, boardsTracked }; }, [subplebbitsStats, directoryAddresses]); return ( <> {/* Render collectors to fetch stats for each subplebbit */} {directoryAddresses.map((address) => ( ))}

{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 directories = useDirectories(); const directoryAddresses = useDirectoryAddresses(); const { subplebbits } = useSubplebbits({ subplebbitAddresses: directoryAddresses }); const { closeDirectoryModal } = useDirectoryModalStore(); useEffect(() => { document.title = '5chan'; }, []); // Close directory modal when navigating away from home useEffect(() => { return () => { closeDirectoryModal(); }; }, [closeDirectoryModal]); return ( <>
); }; export default Home;