import { useEffect, useMemo, useRef } 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 packageJson from '../../../package.json'; import useDefaultSubplebbits, { useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits'; import useSubplebbitsStats from '../../hooks/use-subplebbits-stats'; import LoadingEllipsis from '../../components/loading-ellipsis'; import PopularThreadsBox from './popular-threads-box'; import BoardsBox from './boards-box'; // https://github.com/plebbit/temporary-default-subplebbits/blob/master/README.md // plebchan shouldn't consider 'vulgar' or 'anti' as nsfw tags, unlike more sfw-oriented clients export const nsfwTags = ['adult', 'gore']; const SearchBar = () => { const searchInputRef = useRef(null); const { t } = useTranslation(); const navigate = useNavigate(); const handleSearchSubmit = () => { const searchInput = searchInputRef.current?.value; if (searchInput) { navigate(`/p/${searchInput}`); } }; return (
); }; const InfoBox = () => { const { t } = useTranslation(); return (

{t('what_is_plebchan')}

}} />

{t('no_global_rules_info')}
); }; const Stats = ({ multisub, subplebbitAddresses }: { multisub: any; 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; const enoughStats = boardsTracked >= multisub.length / 2; return (

{t('stats')}

{enoughStats ? ( <>
{t('total_posts')} {totalPosts}
{t('current_users')} {currentUsers}
{t('boards_tracked')} {boardsTracked}
) : ( )}
); }; const { version } = packageJson; const downloadAppLink = (() => { const platform = navigator.platform; if (platform === 'Linux' || platform === 'Linux x86_64' || platform === 'Linux i686' || platform === 'Linux aarch64') { return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.AppImage`; } else if (platform === 'Win32' || platform === 'Win64' || platform === 'Windows') { return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan.Portable.${version}.exe`; } else if (platform === 'MacIntel' || platform === 'Macintosh') { return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.dmg`; } else if (platform === 'Android') { return undefined; } else if (platform === 'iPhone' || platform === 'iPad') { return undefined; } else { return undefined; } })(); const isElectron = window.isElectron === true; const commitRef = process.env.REACT_APP_COMMIT_REF; export const Footer = () => { const { t } = useTranslation(); return ( <>
v{packageJson.version} {isElectron && ( node stats )} {commitRef && ( #{commitRef.slice(0, 7)} )}
); }; export const HomeLogo = () => { return (
); }; const Home = () => { const defaultSubplebbits = useDefaultSubplebbits(); const subplebbitAddresses = useDefaultSubplebbitAddresses(); const { subplebbits } = useSubplebbits({ subplebbitAddresses }); useEffect(() => { document.title = 'plebchan'; }, []); return (
); }; export default Home;