diff --git a/src/components/NewPostWidget.tsx b/src/components/NewPostWidget.tsx new file mode 100644 index 0000000..617a022 --- /dev/null +++ b/src/components/NewPostWidget.tsx @@ -0,0 +1,124 @@ +import { useState, ChangeEvent } from 'react' + +interface NewPostWidgetProps { + onSubmit: (content: string, media: File[]) => void + isSubmitting?: boolean +} + +export default function NewPostWidget({ onSubmit, isSubmitting = false }: NewPostWidgetProps) { + const [content, setContent] = useState('') + const [media, setMedia] = useState([]) + const [mediaPreviewUrls, setMediaPreviewUrls] = useState([]) + + const handleContentChange = (e: ChangeEvent) => { + setContent(e.target.value) + } + + const handleMediaChange = (e: ChangeEvent) => { + if (e.target.files && e.target.files.length > 0) { + const newFiles = Array.from(e.target.files) + setMedia([...media, ...newFiles]) + + // Create preview URLs for the new files + const newPreviewUrls = newFiles.map((file) => URL.createObjectURL(file)) + setMediaPreviewUrls([...mediaPreviewUrls, ...newPreviewUrls]) + } + } + + const handleSubmit = () => { + if (content.trim() || media.length > 0) { + onSubmit(content, media) + setContent('') + setMedia([]) + + // Revoke object URLs to avoid memory leaks + mediaPreviewUrls.forEach((url) => URL.revokeObjectURL(url)) + setMediaPreviewUrls([]) + } + } + + const handleRemoveMedia = (index: number) => { + const newMedia = [...media] + newMedia.splice(index, 1) + setMedia(newMedia) + + // Revoke the URL of the removed media + URL.revokeObjectURL(mediaPreviewUrls[index]) + const newPreviewUrls = [...mediaPreviewUrls] + newPreviewUrls.splice(index, 1) + setMediaPreviewUrls(newPreviewUrls) + } + + return ( +
+