import { createEffect, createSignal, For, Show } from "solid-js"; import { getAtk, useUserinfo } from "../stores/userinfo.tsx"; import styles from "./PostPublish.module.css"; import { closeModel, openModel } from "../scripts/modals.ts"; export default function PostPublish(props: { replying?: any, reposting?: any, editing?: any, realmId?: number, onReset: () => void, onError: (message: string | null) => void, onPost: () => void }) { const userinfo = useUserinfo(); const [submitting, setSubmitting] = createSignal(false); const [uploading, setUploading] = createSignal(false); const [attachments, setAttachments] = createSignal([]); const [categories, setCategories] = createSignal<{ alias: string, name: string }[]>([]); const [tags, setTags] = createSignal<{ alias: string, name: string }[]>([]); createEffect(() => { setAttachments(props.editing?.attachments ?? []); setCategories(props.editing?.categories ?? []); setTags(props.editing?.tags ?? []); }, [props.editing]); async function doPost(evt: SubmitEvent) { evt.preventDefault(); const form = evt.target as HTMLFormElement; const data = Object.fromEntries(new FormData(form)); if (!data.content) return; setSubmitting(true); const res = await fetch("/api/posts", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${getAtk()}` }, body: JSON.stringify({ alias: data.alias ?? crypto.randomUUID().replace(/-/g, ""), title: data.title, content: data.content, attachments: attachments(), categories: categories(), tags: tags(), realm_id: props.realmId, published_at: data.published_at ? new Date(data.published_at as string) : new Date(), repost_to: props.reposting?.id, reply_to: props.replying?.id }) }); if (res.status !== 200) { props.onError(await res.text()); } else { form.reset(); props.onPost(); props.onError(null); } setSubmitting(false); } async function doEdit(evt: SubmitEvent) { evt.preventDefault(); const form = evt.target as HTMLFormElement; const data = Object.fromEntries(new FormData(form)); if (!data.content) return; if (uploading()) return; setSubmitting(true); const res = await fetch(`/api/posts/${props.editing?.id}`, { method: "PUT", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${getAtk()}` }, body: JSON.stringify({ alias: data.alias ?? crypto.randomUUID().replace(/-/g, ""), title: data.title, content: data.content, attachments: attachments(), categories: categories(), tags: tags(), realm_id: props.realmId, published_at: data.published_at ? new Date(data.published_at as string) : new Date() }) }); if (res.status !== 200) { props.onError(await res.text()); } else { form.reset(); props.onPost(); props.onError(null); } setSubmitting(false); } async function uploadAttachments(evt: SubmitEvent) { evt.preventDefault(); const form = evt.target as HTMLFormElement; const data = new FormData(form); if (!data.get("attachment")) return; setUploading(true); const res = await fetch("/api/attachments", { method: "POST", headers: { "Authorization": `Bearer ${getAtk()}` }, body: data }); if (res.status !== 200) { props.onError(await res.text()); } else { const data = await res.json(); setAttachments(attachments().concat([data.info])); props.onError(null); form.reset(); } setUploading(false); } function addCategory(evt: SubmitEvent) { evt.preventDefault(); const form = evt.target as HTMLFormElement; const data = Object.fromEntries(new FormData(form)); if (!data.alias) data.alias = crypto.randomUUID().replace(/-/g, ""); if (!data.name) return; setCategories(categories().concat([data as any])); form.reset(); } function removeCategory(target: any) { setCategories(categories().filter(item => item.alias !== target.alias)) } function addTag(evt: SubmitEvent) { evt.preventDefault(); const form = evt.target as HTMLFormElement; const data = Object.fromEntries(new FormData(evt.target as HTMLFormElement)); if (!data.alias) data.alias = crypto.randomUUID().replace(/-/g, ""); if (!data.name) return; setTags(tags().concat([data as any])); form.reset(); } function removeTag(target: any) { setTags(tags().filter(item => item.alias !== target.alias)) } function resetForm() { setAttachments([]); setCategories([]); setTags([]); props.onReset(); } return ( <>
resetForm()}>
{userinfo?.displayName.substring(0, 1)}}> avatar