| | const API_URL = "https://graphql.datocms.com"; |
| | const API_TOKEN = process.env.DATOCMS_API_TOKEN; |
| |
|
| | |
| | const responsiveImageFragment = ` |
| | fragment responsiveImageFragment on ResponsiveImage { |
| | srcSet |
| | webpSrcSet |
| | sizes |
| | src |
| | width |
| | height |
| | aspectRatio |
| | alt |
| | title |
| | bgColor |
| | base64 |
| | } |
| | `; |
| |
|
| | async function fetchAPI(query, { variables, preview } = {}) { |
| | const res = await fetch(API_URL + (preview ? "/preview" : ""), { |
| | method: "POST", |
| | headers: { |
| | "Content-Type": "application/json", |
| | Authorization: `Bearer ${API_TOKEN}`, |
| | }, |
| | body: JSON.stringify({ |
| | query, |
| | variables, |
| | }), |
| | }); |
| |
|
| | const json = await res.json(); |
| | if (json.errors) { |
| | console.error(json.errors); |
| | throw new Error("Failed to fetch API"); |
| | } |
| | return json.data; |
| | } |
| |
|
| | export async function getPreviewPostBySlug(slug) { |
| | const data = await fetchAPI( |
| | ` |
| | query PostBySlug($slug: String) { |
| | post(filter: {slug: {eq: $slug}}) { |
| | slug |
| | } |
| | }`, |
| | { |
| | preview: true, |
| | variables: { |
| | slug, |
| | }, |
| | }, |
| | ); |
| | return data?.post; |
| | } |
| |
|
| | export async function getAllPostsWithSlug() { |
| | const data = await fetchAPI(` |
| | { |
| | allPosts { |
| | slug |
| | } |
| | } |
| | `); |
| | return data?.allPosts; |
| | } |
| |
|
| | export async function getAllPostsForHome(preview) { |
| | const data = await fetchAPI( |
| | ` |
| | { |
| | allPosts(orderBy: date_DESC, first: 20) { |
| | title |
| | slug |
| | excerpt |
| | date |
| | coverImage { |
| | responsiveImage(imgixParams: {fm: jpg, fit: crop, w: 2000, h: 1000 }) { |
| | ...responsiveImageFragment |
| | } |
| | } |
| | author { |
| | name |
| | picture { |
| | url(imgixParams: {fm: jpg, fit: crop, w: 100, h: 100, sat: -100}) |
| | } |
| | } |
| | } |
| | } |
| | |
| | ${responsiveImageFragment} |
| | `, |
| | { preview }, |
| | ); |
| | return data?.allPosts; |
| | } |
| |
|
| | export async function getPostAndMorePosts(slug, preview) { |
| | const data = await fetchAPI( |
| | ` |
| | query PostBySlug($slug: String) { |
| | post(filter: {slug: {eq: $slug}}) { |
| | title |
| | slug |
| | content |
| | date |
| | ogImage: coverImage{ |
| | url(imgixParams: {fm: jpg, fit: crop, w: 2000, h: 1000 }) |
| | } |
| | coverImage { |
| | responsiveImage(imgixParams: {fm: jpg, fit: crop, w: 2000, h: 1000 }) { |
| | ...responsiveImageFragment |
| | } |
| | } |
| | author { |
| | name |
| | picture { |
| | url(imgixParams: {fm: jpg, fit: crop, w: 100, h: 100, sat: -100}) |
| | } |
| | } |
| | } |
| | |
| | morePosts: allPosts(orderBy: date_DESC, first: 2, filter: {slug: {neq: $slug}}) { |
| | title |
| | slug |
| | excerpt |
| | date |
| | coverImage { |
| | responsiveImage(imgixParams: {fm: jpg, fit: crop, w: 2000, h: 1000 }) { |
| | ...responsiveImageFragment |
| | } |
| | } |
| | author { |
| | name |
| | picture { |
| | url(imgixParams: {fm: jpg, fit: crop, w: 100, h: 100, sat: -100}) |
| | } |
| | } |
| | } |
| | } |
| | |
| | ${responsiveImageFragment} |
| | `, |
| | { |
| | preview, |
| | variables: { |
| | slug, |
| | }, |
| | }, |
| | ); |
| | return data; |
| | } |
| |
|