import { useEffect, useRef, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useLocation, useNavigate, useParams } from 'react-router-dom'; import { Comment, setAccount, useAccount, useEditedComment } from '@bitsocial/bitsocial-react-hooks'; import getShortAddress from '../../lib/get-short-address'; import useCommunitiesPagesStore from '@bitsocial/bitsocial-react-hooks/dist/stores/communities-pages'; import { getLinkMediaInfo } from '../../lib/utils/media-utils'; import { isValidPublishURL, isValidURL } from '../../lib/utils/url-utils'; import { isAllView, isCatalogView, isModQueueView, isModView, isPostPageView, isSubscriptionsView } from '../../lib/utils/view-utils'; import { useAccountCommunityAddresses } from '../../hooks/use-account-community-addresses'; import { useDirectories, useDirectoryByAddress } from '../../hooks/use-directories'; import useIsMobile from '../../hooks/use-is-mobile'; import { useResolvedCommunityAddress } from '../../hooks/use-resolved-community-address'; import useSafeAccountComment from '../../hooks/use-safe-account-comment'; import useFetchGifFirstFrame from '../../hooks/use-fetch-gif-first-frame'; import usePublishPost from '../../hooks/use-publish-post'; import usePublishReply from '../../hooks/use-publish-reply'; import { useFileUpload } from '../../hooks/use-file-upload'; import { getShowUploadControls, isWebRuntime } from '../../lib/media-hosting/show-upload-controls'; import { isCommentArchived } from '../../lib/utils/comment-moderation-utils'; import useMediaHostingStore from '../../stores/use-media-hosting-store'; import BoardOfflineAlert from '../board-offline-alert/board-offline-alert'; import styles from './post-form.module.css'; import capitalize from 'lodash/capitalize'; import debounce from 'lodash/debounce'; export const LinkTypePreviewer = ({ link }: { link: string }) => { const { t } = useTranslation(); const mediaInfo = getLinkMediaInfo(link); let type = mediaInfo?.type; const { status: gifFrameStatus } = useFetchGifFirstFrame(type === 'gif' ? mediaInfo?.url : undefined); if (type === 'gif' && gifFrameStatus === 'ready') { type = t('animated_gif'); } else if (type === 'gif') { type = t('gif'); } return isValidURL(link) ? type : t('invalid_url'); }; const PostFormActions = ({ disableReplyPublish = false, variant, t, isInPostView, onPublishReply, onPublishPost, handleUpload, isUploading, showUploadControls, }: { disableReplyPublish?: boolean; variant: 'reply' | 'post' | 'upload'; t: (key: string) => string; isInPostView: boolean; onPublishReply: () => void; onPublishPost: () => void; handleUpload: () => void; isUploading: boolean; showUploadControls: boolean; }) => { if (variant === 'reply' && isInPostView) { return ( ); } if (variant === 'post' && !isInPostView) { return ; } if (variant === 'upload' && showUploadControls) { return ( ); } return null; }; interface PostFormFieldsProps { t: (key: string) => string; account: ReturnType; displayName: string | undefined; isInPostView: boolean; subjectRef: React.Ref; textRef: React.Ref; urlRef: React.Ref; url: string; lengthError: string | null; handleContentChange: (e: React.ChangeEvent) => void; setPublishPostOptions: (opts: Record) => void; setPublishReplyOptions: (opts: Record) => void; setUrl: (url: string) => void; isUploading: boolean; uploadedFileName: string | null | undefined; showUploadControls: boolean; showSpoilerForPost: boolean; showSpoilerForReply: boolean; isInAllView: boolean; isInSubscriptionsView: boolean; isInModView: boolean; directories: ReturnType; accountCommunityAddresses: string[]; subscriptions: string[]; communityAddress: string | undefined; requirePostLinkIsMedia: boolean; onPublishReply: () => void; onPublishPost: () => void; handleUpload: () => void; disableReplyPublish: boolean; } const PostFormFields = ({ t, account, displayName, isInPostView, subjectRef, textRef, urlRef, url, lengthError, handleContentChange, setPublishPostOptions, setPublishReplyOptions, setUrl, isUploading, uploadedFileName, showUploadControls, showSpoilerForPost, showSpoilerForReply, isInAllView, isInSubscriptionsView, isInModView, directories, accountCommunityAddresses, subscriptions, communityAddress, requirePostLinkIsMedia, onPublishReply, onPublishPost, handleUpload, disableReplyPublish, }: PostFormFieldsProps) => ( <> {t('name')} { const newDisplayName = e.target.value.trim() || undefined; setAccount({ ...account, author: { ...account?.author, displayName: newDisplayName } }); if (isInPostView) { setPublishReplyOptions({ displayName: newDisplayName }); } else { setPublishPostOptions({ displayName: newDisplayName }); } }} /> {!isInPostView && ( {t('subject')} { setPublishPostOptions({ title: e.target.value }); }} /> )} {t('comment')}