import { Button } from '@/components/ui/button' import { Label } from '@/components/ui/label' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import { StorageKey } from '@/constants' import { useToast } from '@/hooks/use-toast' import { createCommentDraftEvent, createPictureNoteDraftEvent, createShortTextNoteDraftEvent } from '@/lib/draft-event' import { extractImagesFromContent } from '@/lib/event' import { useNostr } from '@/providers/NostrProvider' import client from '@/services/client.service' import { ChevronDown, LoaderCircle } from 'lucide-react' import { Event, kinds } from 'nostr-tools' import { useEffect, useState } from 'react' import { useTranslation } from 'react-i18next' import Mentions from './Mentions' import Preview from './Preview' import Uploader from './Uploader' export default function PostContent({ defaultContent = '', parentEvent, close }: { defaultContent?: string parentEvent?: Event close: () => void }) { const { t } = useTranslation() const { toast } = useToast() const { publish, checkLogin } = useNostr() const [content, setContent] = useState(defaultContent) const [pictureInfos, setPictureInfos] = useState<{ url: string; tags: string[][] }[]>([]) const [posting, setPosting] = useState(false) const [showMoreOptions, setShowMoreOptions] = useState(false) const [addClientTag, setAddClientTag] = useState(false) const [isPictureNote, setIsPictureNote] = useState(false) const [hasImages, setHasImages] = useState(false) const canPost = !!content && !posting useEffect(() => { setAddClientTag(window.localStorage.getItem(StorageKey.ADD_CLIENT_TAG) === 'true') }, []) useEffect(() => { const { images } = extractImagesFromContent(content) setHasImages(!!images && images.length > 0) }, [content]) const handleTextareaChange = (e: React.ChangeEvent) => { setContent(e.target.value) } const post = async (e: React.MouseEvent) => { e.stopPropagation() checkLogin(async () => { if (!canPost) { close() return } setPosting(true) try { const additionalRelayUrls: string[] = [] if (parentEvent) { const relayList = await client.fetchRelayList(parentEvent.pubkey) additionalRelayUrls.push(...relayList.read.slice(0, 5)) } if (isPictureNote && !hasImages) { throw new Error(t('Picture note requires images')) } const draftEvent = isPictureNote && !parentEvent && hasImages ? await createPictureNoteDraftEvent(content, pictureInfos, { addClientTag }) : parentEvent && parentEvent.kind !== kinds.ShortTextNote ? await createCommentDraftEvent(content, parentEvent, pictureInfos, { addClientTag }) : await createShortTextNoteDraftEvent(content, pictureInfos, { parentEvent, addClientTag }) await publish(draftEvent, additionalRelayUrls) setContent('') close() } catch (error) { if (error instanceof AggregateError) { error.errors.forEach((e) => toast({ variant: 'destructive', title: t('Failed to post'), description: e.message }) ) } else if (error instanceof Error) { toast({ variant: 'destructive', title: t('Failed to post'), description: error.message }) } console.error(error) return } finally { setPosting(false) } toast({ title: t('Post successful'), description: t('Your post has been published') }) }) } const onAddClientTagChange = (checked: boolean) => { setAddClientTag(checked) window.localStorage.setItem(StorageKey.ADD_CLIENT_TAG, checked.toString()) } return (