Spaces:
No application file
No application file
| import * as Utils from "@contentstack/utils"; | |
| import ContentstackLivePreview from "@contentstack/live-preview-utils"; | |
| import getConfig from "next/config"; | |
| import { | |
| customHostUrl, | |
| initializeContentStackSdk, | |
| isValidCustomHostUrl, | |
| } from "./utils"; | |
| type GetEntry = { | |
| contentTypeUid: string; | |
| referenceFieldPath: string[] | undefined; | |
| jsonRtePath: string[] | undefined; | |
| }; | |
| type GetEntryByUrl = { | |
| entryUrl: string | undefined; | |
| contentTypeUid: string; | |
| referenceFieldPath: string[] | undefined; | |
| jsonRtePath: string[] | undefined; | |
| }; | |
| const { publicRuntimeConfig } = getConfig(); | |
| const envConfig = process.env.CONTENTSTACK_API_KEY | |
| ? process.env | |
| : publicRuntimeConfig; | |
| let customHostBaseUrl = envConfig.CONTENTSTACK_API_HOST as string; | |
| customHostBaseUrl = customHostUrl(customHostBaseUrl); | |
| // SDK initialization | |
| const Stack = initializeContentStackSdk(); | |
| // set host url only for custom host or non prod base url's | |
| if (isValidCustomHostUrl(customHostBaseUrl)) { | |
| Stack.setHost(customHostBaseUrl); | |
| } | |
| // Setting LP if enabled | |
| ContentstackLivePreview.init({ | |
| //@ts-ignore | |
| stackSdk: Stack, | |
| clientUrlParams: { | |
| host: envConfig.CONTENTSTACK_APP_HOST, | |
| }, | |
| stackDetails: { | |
| apiKey: envConfig.CONTENTSTACK_API_KEY, | |
| environment: envConfig.CONTENTSTACK_ENVIRONMENT, | |
| }, | |
| enable: envConfig.CONTENTSTACK_LIVE_PREVIEW === "true", | |
| ssr: false, | |
| })?.catch((err) => console.error(err)); | |
| export const { onEntryChange } = ContentstackLivePreview; | |
| const renderOption = { | |
| span: (node: any, next: any) => next(node.children), | |
| }; | |
| /** | |
| * | |
| * fetches all the entries from specific content-type | |
| * @param {* content-type uid} contentTypeUid | |
| * @param {* reference field name} referenceFieldPath | |
| * @param {* Json RTE path} jsonRtePath | |
| * | |
| */ | |
| export const getEntry = ({ | |
| contentTypeUid, | |
| referenceFieldPath, | |
| jsonRtePath, | |
| }: GetEntry) => { | |
| return new Promise((resolve, reject) => { | |
| const query = Stack.ContentType(contentTypeUid).Query(); | |
| if (referenceFieldPath) query.includeReference(referenceFieldPath); | |
| query | |
| .toJSON() | |
| .find() | |
| .then( | |
| (result) => { | |
| jsonRtePath && | |
| Utils.jsonToHTML({ | |
| entry: result, | |
| paths: jsonRtePath, | |
| renderOption, | |
| }); | |
| resolve(result); | |
| }, | |
| (error) => { | |
| reject(error); | |
| } | |
| ); | |
| }); | |
| }; | |
| /** | |
| *fetches specific entry from a content-type | |
| * | |
| * @param {* content-type uid} contentTypeUid | |
| * @param {* url for entry to be fetched} entryUrl | |
| * @param {* reference field name} referenceFieldPath | |
| * @param {* Json RTE path} jsonRtePath | |
| * @returns | |
| */ | |
| export const getEntryByUrl = ({ | |
| contentTypeUid, | |
| entryUrl, | |
| referenceFieldPath, | |
| jsonRtePath, | |
| }: GetEntryByUrl) => { | |
| return new Promise((resolve, reject) => { | |
| const blogQuery = Stack.ContentType(contentTypeUid).Query(); | |
| if (referenceFieldPath) blogQuery.includeReference(referenceFieldPath); | |
| blogQuery.toJSON(); | |
| const data = blogQuery.where("url", `${entryUrl}`).find(); | |
| data.then( | |
| (result) => { | |
| jsonRtePath && | |
| Utils.jsonToHTML({ | |
| entry: result, | |
| paths: jsonRtePath, | |
| renderOption, | |
| }); | |
| resolve(result[0]); | |
| }, | |
| (error) => { | |
| console.error(error); | |
| reject(error); | |
| } | |
| ); | |
| }); | |
| }; | |