import { createSignal, createEffect, For, Show } from "solid-js"; import Dropzone from "./Dropzone"; import XCircle from "~/components/icons/XCircle"; import AddImageToS3 from "~/lib/s3upload"; import { env } from "~/env/client"; export interface AddAttachmentSectionProps { type: "blog" | "project"; postId?: number; postTitle: string; existingAttachments?: string; } export default function AddAttachmentSection(props: AddAttachmentSectionProps) { const [images, setImages] = createSignal([]); const [imageHolder, setImageHolder] = createSignal([]); const [newImageHolder, setNewImageHolder] = createSignal([]); const [newImageHolderKeys, setNewImageHolderKeys] = createSignal( [] ); createEffect(() => { if (props.existingAttachments) { const imgStringArr = props.existingAttachments.split(","); setImageHolder(imgStringArr); } }); const handleImageDrop = async (acceptedFiles: File[]) => { if (props.postTitle) { for (const file of acceptedFiles) { setImages((prev) => [...prev, file]); try { const key = await AddImageToS3(file, props.postTitle, props.type); if (key) { setNewImageHolderKeys((prev) => [...prev, key]); const reader = new FileReader(); reader.onload = () => { const str = reader.result; if (str) { setNewImageHolder((prev) => [...prev, str as string]); } }; reader.readAsDataURL(file); } } catch (err) { console.error("Failed to upload image:", err); } } } }; const removeImage = async (index: number, key: string) => { if (props.postId && props.existingAttachments) { const imgStringArr = props.existingAttachments.split(","); const newString = imgStringArr.filter((str) => str !== key).join(","); try { await fetch("/api/trpc/misc.deleteImage", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ key, newAttachmentString: newString, type: props.type, id: props.postId }) }); setImageHolder((prev) => prev.filter((_, i) => i !== index)); } catch (err) { console.error("Failed to delete image:", err); } } }; const removeNewImage = async (index: number, key: string) => { setImages((prev) => prev.filter((_, i) => i !== index)); setNewImageHolder((prev) => prev.filter((_, i) => i !== index)); try { await fetch("/api/trpc/misc.simpleDeleteImage", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ key }) }); } catch (err) { console.error("Failed to delete image:", err); } }; const copyToClipboard = async (key: string) => { try { const bucketString = env.VITE_AWS_BUCKET_STRING || ""; await navigator.clipboard.writeText(bucketString + key); console.log("Text copied to clipboard"); } catch (err) { console.error("Failed to copy text:", err); } }; return ( Add title to add attachments } >
Attachments
{(key, index) => (
attachment
)}
{(img, index) => (
)}
); }