import React, { useEffect, useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAccount, useCreateSubplebbit, // useSubplebbits, useAccountSubplebbits } from '@plebbit/plebbit-react-hooks'; import { StyledModal } from '../styled/modals/CreateBoardModal.styled'; import useGeneralStore from '../../hooks/stores/useGeneralStore'; import Modal from 'react-modal'; import useError from '../../hooks/useError'; import useSuccess from '../../hooks/useSuccess'; const CreateBoardModal = ({ isOpen, closeModal }) => { const { selectedStyle } = useGeneralStore((state) => state); const account = useAccount(); const navigate = useNavigate(); const nodeRef = useRef(null); const ruleInputRef = useRef(null); const [, setNewErrorMessage] = useError(); const [, setNewSuccessMessage] = useSuccess(); const [title, setTitle] = useState(''); const [description, setDescription] = useState(''); const [avatar, setAvatar] = useState(''); const [moderators, setModerators] = useState(''); const [rule, setRule] = useState(''); const [rules, setRules] = useState([]); const [editIndex, setEditIndex] = useState(-1); const handleAddRule = () => { if (rule.trim() === '') { setNewErrorMessage('Rule field is empty'); return; } if (rules.length >= 15) { setNewErrorMessage('Maximum number of rules is 15'); return; } if (editIndex > -1) { setRules(rules.map((r, i) => (i === editIndex ? rule : r))); setEditIndex(-1); } else { setRules([...rules, rule]); } setRule(''); }; useEffect(() => { if (ruleInputRef.current) { ruleInputRef.current.focus(); } }, [rules]); const handleKeyDown = (e) => { if (e.key === 'Enter') { handleAddRule(); } }; const handleEditRule = (index) => { setRule(rules[index]); setEditIndex(index); ruleInputRef.current.focus(); }; const handleDeleteRule = (index) => { if (index === editIndex) { setEditIndex(-1); } setRules(rules.filter((_, i) => i !== index)); }; const createSubplebbitOptions = { title: title || undefined, description: description || undefined, suggested: { avatarUrl: avatar || undefined, }, roles: moderators || undefined, rules: rules || undefined, }; const resetFields = () => { setTitle(''); setDescription(''); setAvatar(''); setModerators(''); setRule(''); setRules([]); }; const { createdSubplebbit, createSubplebbit } = useCreateSubplebbit(createSubplebbitOptions); const handleCreateBoard = async () => { let moderatorAddresses = moderators.trim() ? moderators.split(',').map((addr) => addr.trim()) : []; let invalidAddresses = moderatorAddresses.filter((addr) => !(addr.endsWith('.eth') || (addr.startsWith('12D3KooW') && addr.length === 52))); if (invalidAddresses.length > 0) { setNewErrorMessage('Invalid moderator addresses: ' + invalidAddresses.join(', ')); return; } const roles = {}; moderatorAddresses.forEach((addr) => { roles[addr] = { role: 'moderator' }; }); roles[account.author.address] = { role: 'admin' }; let createSubplebbitOptions = { roles: roles, }; if (title) { createSubplebbitOptions.title = title; } if (description) { createSubplebbitOptions.description = description; } if (avatar) { createSubplebbitOptions.suggested = { avatarUrl: avatar, }; } if (rules.length > 0) { createSubplebbitOptions.rules = rules; } try { await createSubplebbit(createSubplebbitOptions); } catch (error) { setNewErrorMessage(error.message); } if (createdSubplebbit) { resetFields(); closeModal(); setNewSuccessMessage('Board created successfully, address: ' + createdSubplebbit.address); navigate(`/p/${createdSubplebbit.address}`); } }; // remove after testing: // const {accountSubplebbits} = useAccountSubplebbits() // const ownerSubplebbitAddresses = Object.keys(accountSubplebbits).map(subplebbitAddress => accountSubplebbits[subplebbitAddress].role === 'owner') // const subplebbits = useSubplebbits({subplebbitAddresses: ownerSubplebbitAddresses}) // console.log(subplebbits); return (
Create Board