Remix example
Here is an example using the @ts-ghost/content-api
in a Remix loader:
Installation
pnpm add @ts-ghost/content-api
Create .env
variable
GHOST_URL="https://myblog.com"
GHOST_CONTENT_API_KEY="e9b414c5d95a5436a647ff04ab"
Use in your route loader
import { json, type LoaderArgs, type V2_MetaFunction } from "@remix-run/node";
import { Link, useLoaderData } from "@remix-run/react";
import { TSGhostContentAPI } from "@ts-ghost/content-api";
export const meta: V2_MetaFunction = () => {
return [{ title: "New Remix App" }];
};
export async function loader({ request }: LoaderArgs) {
const api = new TSGhostContentAPI(
process.env.GHOST_URL || "",
process.env.GHOST_CONTENT_API_KEY || "",
"v5.0"
);
const [settings, posts] = await Promise.all([api.settings.fetch(), api.posts.browse().fetch()]);
if (!settings.success) {
throw new Error(settings.errors.join(", "));
}
if (!posts.success) {
throw new Error(posts.errors.join(", "));
}
return json({ settings: settings.data, posts: posts.data });
}
export default function Index() {
const { settings, posts } = useLoaderData<typeof loader>();
return (
<div style={{ fontFamily: "system-ui, sans-serif", lineHeight: "1.4" }}>
<h1>This is a list of posts for {settings.title}:</h1>
<ul>
{posts.map((post) => (
<li key={post.slug}>
<Link to={`/${post.slug}`}>{post.title}</Link>
</li>
))}
</ul>
</div>
);
}