import { useEffect, useState, FormEvent } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import { useSubplebbit } from '@plebbit/plebbit-react-hooks'; import { Footer, HomeLogo } from '../home'; import { useDirectories, DirectoryCommunity } from '../../hooks/use-directories'; import { getSubplebbitAddress, getBoardPath } from '../../lib/utils/route-utils'; import Markdown from '../../components/markdown'; import styles from './rules.module.css'; const getBoardShortCode = (title?: string): string => { if (!title) return ''; const match = title.match(/^\/([^/]+)\//); return match ? match[1] : ''; }; const getBoardName = (title?: string): string => { if (!title) return ''; const match = title.match(/^\/[^/]+\/\s*-\s*(.+)$/); return match ? match[1] : title; }; const BoardRulesDisplay = ({ subplebbitAddress, directories }: { subplebbitAddress: string; directories: DirectoryCommunity[] }) => { const subplebbit = useSubplebbit({ subplebbitAddress }); const { rules, state, title, shortAddress } = subplebbit || {}; let loadingText: string | null = null; if (!subplebbit) { loadingText = 'connecting...'; } else { switch (state) { case 'fetching-ipns': case 'fetching-ipfs': loadingText = 'loading...'; break; case 'failed': loadingText = 'failed to load'; break; case 'succeeded': loadingText = null; break; default: loadingText = state ? `${state}...` : 'loading...'; } } const isLoaded = state === 'succeeded'; const defaultSub = directories.find((sub) => sub.address === subplebbitAddress); let displayTitle: string; if (defaultSub?.title) { const shortCode = getBoardShortCode(defaultSub.title); const boardName = getBoardName(defaultSub.title); displayTitle = `Rules for: /${shortCode}/ - ${boardName}`; } else if (title) { const shortCode = getBoardShortCode(title); const boardName = getBoardName(title); if (shortCode && boardName && boardName !== title) { displayTitle = `Rules for: /${shortCode}/ - ${boardName}`; } else { displayTitle = `Rules for: ${shortAddress || subplebbitAddress}`; } } else { displayTitle = `Rules for: ${shortAddress || subplebbitAddress}`; } return (

{displayTitle}

{!isLoaded ? (

{loadingText}

) : rules && rules.length > 0 ? (
    {rules.map((rule: string, index: number) => (
  1. ))}
) : (

This board has no rules set by its owner.

)}
); }; const BoardSelector = ({ directories, selectedAddress, onSelect, }: { directories: DirectoryCommunity[]; selectedAddress: string; onSelect: (address: string) => void; }) => { const [customAddress, setCustomAddress] = useState(''); const handleSelectChange = (e: React.ChangeEvent) => { const value = e.target.value; if (value) { onSelect(value); setCustomAddress(''); } }; const handleCustomSubmit = (e: FormEvent) => { e.preventDefault(); const trimmed = customAddress.trim(); if (trimmed) { onSelect(trimmed); } }; return (

Load rules from a board

or
setCustomAddress(e.target.value)} className={styles.addressInput} />
); }; const Rules = () => { const { boardIdentifier } = useParams(); const navigate = useNavigate(); const directories = useDirectories(); const selectedAddress = boardIdentifier ? getSubplebbitAddress(boardIdentifier, directories) : ''; const handleBoardSelect = (address: string) => { const path = getBoardPath(address, directories); navigate(`/rules/${path}`, { replace: true }); }; useEffect(() => { window.scrollTo(0, 0); document.title = 'Rules - 5chan'; }, []); return (

Rules

5chan is a serverless and adminless tool to browse and post to decentralized imageboards. 5chan does not have global rules or moderators. Each board is independently owned and moderated, with its own set of rules determined by the board owner.

Please read and respect the rules of whatever board you decide to post to.
{selectedAddress && }
); }; export default Rules;