import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; import { PublishCommentOptions, setAccount, useAccount, useAccountComment, useComment, usePublishComment, useSubplebbit } from '@plebbit/plebbit-react-hooks'; import { create } from 'zustand'; import { alertChallengeVerificationFailed } from '../../lib/utils/challenge-utils'; import { getLinkMediaInfo } from '../../lib/utils/media-utils'; import { isValidURL } from '../../lib/utils/url-utils'; import { isAllView, isDescriptionView, isPostPageView, isRulesView, isSubscriptionsView } from '../../lib/utils/view-utils'; import { useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits'; import useReply from '../../hooks/use-reply'; import useChallengesStore from '../../stores/use-challenges-store'; import styles from './post-form.module.css'; import _ from 'lodash'; import { getFormattedTimeAgo } from '../../lib/utils/time-utils'; type SubmitState = { subplebbitAddress: string | undefined; title: string | undefined; content: string | undefined; link: string | undefined; spoiler: boolean | undefined; publishCommentOptions: PublishCommentOptions; setSubmitStore: (data: Partial) => void; resetSubmitStore: () => void; }; const { addChallenge } = useChallengesStore.getState(); const useSubmitStore = create((set) => ({ subplebbitAddress: undefined, title: undefined, content: undefined, link: undefined, spoiler: undefined, publishCommentOptions: {}, setSubmitStore: ({ subplebbitAddress, title, content, link, spoiler }) => set((state) => { const nextState = { ...state }; if (subplebbitAddress !== undefined) nextState.subplebbitAddress = subplebbitAddress; if (title !== undefined) nextState.title = title || undefined; if (content !== undefined) nextState.content = content || undefined; if (link !== undefined) nextState.link = link || undefined; if (spoiler !== undefined) nextState.spoiler = spoiler || undefined; nextState.publishCommentOptions = { ...nextState, onChallenge: (...args: any) => addChallenge(args), onChallengeVerification: alertChallengeVerificationFailed, onError: (error: Error) => { console.error(error); let errorMessage = error.message; alert(errorMessage); }, }; return nextState; }), resetSubmitStore: () => set({ subplebbitAddress: undefined, title: undefined, content: undefined, link: undefined, spoiler: undefined, publishCommentOptions: {} }), })); export const LinkTypePreviewer = ({ link }: { link: string }) => { const { t } = useTranslation(); const mediaInfo = getLinkMediaInfo(link); return isValidURL(link) ? mediaInfo?.type : t('invalid_url'); }; const PostFormTable = ({ closeForm }: { closeForm: () => void }) => { const { t } = useTranslation(); const account = useAccount(); const { displayName } = account?.author || {}; const [url, setUrl] = useState(''); const { title, content, link, publishCommentOptions, setSubmitStore, resetSubmitStore } = useSubmitStore(); const { index, publishComment } = usePublishComment(publishCommentOptions); const textRef = useRef(null); const urlRef = useRef(null); const subjectRef = useRef(null); const location = useLocation(); const isInAllView = isAllView(location.pathname); const isInSubscriptionsView = isSubscriptionsView(location.pathname); const subscriptions = account?.subscriptions || []; const defaultSubplebbitAddresses = useDefaultSubplebbitAddresses(); const resetFields = () => { if (textRef.current) { textRef.current.value = ''; } if (urlRef.current) { urlRef.current.value = ''; } if (subjectRef.current) { subjectRef.current.value = ''; } }; const onPublishPost = () => { if (!title && !content && !link) { alert(`Cannot post empty comment`); return; } if (link && !isValidURL(link)) { alert(`Invalid link`); return; } publishComment(); }; const params = useParams(); const accountComment = useAccountComment({ commentIndex: params?.accountCommentIndex as any }); const subplebbitAddress = params?.subplebbitAddress || accountComment?.subplebbitAddress; useEffect(() => { if (subplebbitAddress) { setSubmitStore({ subplebbitAddress }); } }, [subplebbitAddress, setSubmitStore]); // redirect to pending page when pending comment is created const navigate = useNavigate(); useEffect(() => { if (typeof index === 'number') { resetSubmitStore(); resetFields(); navigate(`/profile/${index}`); } }, [index, resetSubmitStore, navigate]); // in post page, publish a reply to the post const isInPostView = isPostPageView(location.pathname, params); const cid = params?.commentCid as string; const { setContent, resetContent, replyIndex, publishReply } = useReply({ cid, subplebbitAddress }); const onPublishReply = () => { const currentContent = textRef.current?.value || ''; const currentUrl = urlRef.current?.value || ''; if (!currentContent.trim() && !currentUrl) { alert(`Cannot post empty comment`); return; } if (currentUrl && !isValidURL(currentUrl)) { alert('The provided link is not a valid URL.'); return; } publishReply(); }; useEffect(() => { if (typeof replyIndex === 'number') { resetContent(); resetFields(); closeForm(); } }, [replyIndex, resetContent, closeForm]); return ( {!isInPostView && ( )}
{t('name')} setAccount({ ...account, author: { ...account?.author, displayName: e.target.value } })} /> {isInPostView && }
{t('subject')} { setSubmitStore({ title: e.target.value }); }} />
{t('comment')}