import { useEffect, useState, useMemo } from 'react'; import { Link, useLocation } from 'react-router-dom'; import { useAccount } from '@plebbit/plebbit-react-hooks'; import useTopbarEditModalStore from '../../stores/use-topbar-edit-modal-store'; import useTopbarVisibilityStore from '../../stores/use-topbar-visibility-store'; import { getAllBoardCodes } from '../../constants/board-codes'; import styles from './topbar-edit-modal.module.css'; const TopbarEditModal = () => { const { showModal, closeTopbarEditModal } = useTopbarEditModalStore(); const { visibleDirectories, showSubscriptionsInTopbar, setDirectoryVisibility, setShowSubscriptionsInTopbar } = useTopbarVisibilityStore(); const account = useAccount(); const subscriptions = useMemo(() => account?.subscriptions || [], [account?.subscriptions]); const location = useLocation(); // Convert visible directories set to space-separated string for input const directoriesToString = (dirs: Set): string => { return Array.from(dirs).sort().join(' '); }; // Convert space-separated string to set of directory codes const stringToDirectories = (str: string): Set => { const codes = str .trim() .split(/\s+/) .filter((code) => code.length > 0) .map((code) => code.toLowerCase()); return new Set(codes); }; // Memoize board codes to avoid recalculating const allBoardCodes = useMemo(() => getAllBoardCodes(), []); // Check if all directories are visible (default state) const allDirectoriesVisible = useMemo(() => allBoardCodes.every((code) => visibleDirectories.has(code)), [allBoardCodes, visibleDirectories]); // Local state for text input (will be saved on Save click) // Empty string means all directories visible (default), otherwise show only the specified codes const [localDirectoryInput, setLocalDirectoryInput] = useState(allDirectoriesVisible ? '' : directoriesToString(visibleDirectories)); const [showSubscriptions, setShowSubscriptions] = useState(showSubscriptionsInTopbar); // Sync local state when modal opens or store changes useEffect(() => { if (showModal) { const allVisible = allBoardCodes.every((code) => visibleDirectories.has(code)); setLocalDirectoryInput(allVisible ? '' : directoriesToString(visibleDirectories)); setShowSubscriptions(showSubscriptionsInTopbar); } }, [showModal, visibleDirectories, showSubscriptionsInTopbar, allBoardCodes]); if (!showModal) { return null; } const handleBackdropClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) { closeTopbarEditModal(); } }; const handleSave = () => { // If input is empty, show all directories (default behavior) // Otherwise, show only the directories specified in the input if (localDirectoryInput.trim() === '') { // Show all directories allBoardCodes.forEach((code) => { setDirectoryVisibility(code, true); }); } else { // Show only specified directories const inputDirectories = stringToDirectories(localDirectoryInput); allBoardCodes.forEach((code) => { setDirectoryVisibility(code, inputDirectories.has(code)); }); } setShowSubscriptionsInTopbar(showSubscriptions); closeTopbarEditModal(); }; return (

Custom Board List

setLocalDirectoryInput(e.target.value)} />
{subscriptions.length > 0 && (
setShowSubscriptions(e.target.checked)} /> ( { e.stopPropagation(); closeTopbarEditModal(); }} > edit subscriptions )
)}
); }; export default TopbarEditModal;