import { Show, createSignal } from "solid-js"; import { useSearchParams, useNavigate } from "@solidjs/router"; import { Title } from "@solidjs/meta"; import { cache, createAsync } from "@solidjs/router"; import { getRequestEvent } from "solid-js/web"; import { getPrivilegeLevel, getUserID } from "~/server/utils"; import { api } from "~/lib/api"; // Server function to get auth state const getAuthState = cache(async () => { "use server"; const event = getRequestEvent()!; const privilegeLevel = await getPrivilegeLevel(event.nativeEvent); const userID = await getUserID(event.nativeEvent); return { privilegeLevel, userID }; }, "auth-state"); export default function CreatePost() { const [searchParams] = useSearchParams(); const navigate = useNavigate(); const authState = createAsync(() => getAuthState()); const [title, setTitle] = createSignal(""); const [subtitle, setSubtitle] = createSignal(""); const [body, setBody] = createSignal(""); const [bannerPhoto, setBannerPhoto] = createSignal(""); const [published, setPublished] = createSignal(false); const [tags, setTags] = createSignal([]); const [loading, setLoading] = createSignal(false); const [error, setError] = createSignal(""); const handleSubmit = async (e: Event) => { e.preventDefault(); if (!authState()?.userID) { setError("You must be logged in to create a post"); return; } setLoading(true); setError(""); try { const result = await api.database.createPost.mutate({ category: "blog", title: title(), subtitle: subtitle() || null, body: body() || null, banner_photo: bannerPhoto() || null, published: published(), tags: tags().length > 0 ? tags() : null, author_id: authState()!.userID }); if (result.data) { // Redirect to the new post navigate(`/blog/${encodeURIComponent(title())}`); } } catch (err) { console.error("Error creating post:", err); setError("Failed to create post. Please try again."); } finally { setLoading(false); } }; return ( <> Create Blog Post | Michael Freno
Unauthorized
You must be an admin to create posts.
} >

Create Blog Post

{/* Title */}
setTitle(e.currentTarget.value)} class="border-surface2 bg-surface0 w-full rounded-md border px-4 py-2" placeholder="Enter post title" />
{/* Subtitle */}
setSubtitle(e.currentTarget.value)} class="border-surface2 bg-surface0 w-full rounded-md border px-4 py-2" placeholder="Enter post subtitle" />
{/* Body */}