{"version":3,"file":"static/chunks/473-f7b81db4716c3210.js","mappings":"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","sources":["webpack://_N_E/./utils/api.js","webpack://_N_E/./utils/constants.js","webpack://_N_E/./utils/helper.js"],"sourcesContent":["import axios from 'axios';\nimport useSWR from 'swr';\nimport { CtfContentTypes } from './constants';\nimport { getContent, isWHEnv } from './helper';\n\nconst SPACE_ID = process.env.NEXT_PUBLIC_CONTENTFUL_SPACE_ID;\nconst CONTENTFUL_ACCESS_TOKEN = process.env.NEXT_PUBLIC_CONTENTFUL_ACCESS_TOKEN;\nconst CONTENTFUL_MANAGEMENT_TOKEN = process.env.CONTENTFUL_MANAGEMENT_TOKEN;\nconst CONTENTFUL_PREVIEW_TOKEN =\n process.env.NEXT_PUBLIC_CONTENTFUL_PREVIEW_ACCESS_TOKEN;\nlet ENVIRONMENT =\n process.env.APP_ENV === 'production'\n ? 'master'\n : isWHEnv() &&\n (process.env.APP_ENV === 'local' || process.env.APP_ENV === 'development')\n ? 'westholme-brand-refresh'\n : 'staging';\nlet switchedEnvironment = false;\nlet totalRequests = 0;\nlet requests = [];\nlet requestCache = {\n pagesByTags: {},\n tagsIdBySlug: {},\n tagGroups: undefined,\n tagsByTagGroup: {},\n tagsById: {},\n};\n\naxios.defaults.validateStatus = false;\naxios.defaults.baseURL = `https://cdn.contentful.com/spaces/${SPACE_ID}/environments/${ENVIRONMENT}`;\naxios.defaults.headers.common[\n 'Authorization'\n] = `Bearer ${CONTENTFUL_ACCESS_TOKEN}`;\n\naxios.interceptors.response.use((r) => {\n totalRequests++;\n requests.push(r.config.url);\n return r;\n});\n\nexport function getTotalRequests() {\n return totalRequests;\n}\n\nexport function getRequests() {\n return requests;\n}\n\nexport function resetCache() {\n requestCache = {\n pagesByTags: {},\n tagsIdBySlug: {},\n tagGroups: undefined,\n tagsByTagGroup: {},\n tagsById: {},\n };\n}\n\nexport async function getAllEnvironments() {\n return await axios.get(\n `https://api.contentful.com/spaces/${SPACE_ID}/environments`,\n {\n headers: {\n Authorization: `Bearer ${CONTENTFUL_MANAGEMENT_TOKEN}`,\n },\n }\n );\n}\n\nexport function isCustomEnvironment() {\n return switchedEnvironment;\n}\n\nexport function switchToPreview() {\n axios.defaults.baseURL = `https://preview.contentful.com/spaces/${SPACE_ID}/environments/${ENVIRONMENT}`;\n axios.defaults.headers.common[\n 'Authorization'\n ] = `Bearer ${CONTENTFUL_PREVIEW_TOKEN}`;\n}\n\nexport function switchToMain() {\n axios.defaults.baseURL = `https://cdn.contentful.com/spaces/${SPACE_ID}/environments/${ENVIRONMENT}`;\n axios.defaults.headers.common[\n 'Authorization'\n ] = `Bearer ${CONTENTFUL_ACCESS_TOKEN}`;\n}\n\nexport function switchEnvironment(env) {\n axios.defaults.baseURL = `https://cdn.contentful.com/spaces/${SPACE_ID}/environments/${env}`;\n ENVIRONMENT = env;\n switchedEnvironment = true;\n}\n\nexport function getCurrentEnvironment() {\n return ENVIRONMENT;\n}\n\nexport async function getAllPages() {\n return await axios.get(\n `/entries?content_type=${CtfContentTypes.PAGE}&include=1`\n );\n}\n\nexport async function getPage(params, include = 10, locale = undefined) {\n return await axios.get(\n `/entries?content_type=${CtfContentTypes.PAGE}&fields.slug=${\n params.slug\n }&include=${include}${locale ? '&locale=' + locale : ''}`\n );\n}\n\nexport async function getPageByTags(\n tags,\n pageNumber,\n limit,\n offset = undefined,\n currentPageId = undefined,\n inclusionOperator = 'all',\n locale = undefined,\n order = '-fields.publishDate',\n preview\n) {\n offset =\n offset && offset > 0\n ? offset\n : pageNumber === 1\n ? 0\n : (pageNumber - 1) * limit;\n tags = tags.join(',');\n\n const url = `/entries?content_type=${CtfContentTypes.PAGE}${\n locale ? '&locale=' + locale : ''\n }&fields.tags.sys.id[${\n inclusionOperator ?? 'all'\n }]=${tags}&skip=${offset}&limit=${limit}${\n currentPageId ? '&sys.id[ne]=' + currentPageId : ''\n }&order=${order}`;\n const request = axios.get(url);\n const cacheKey = tags + pageNumber + limit + offset + currentPageId + locale;\n if (!preview && !requestCache.pagesByTags[cacheKey]) {\n requestCache.pagesByTags[cacheKey] = request;\n }\n\n return await (preview ? request : requestCache.pagesByTags[cacheKey]);\n}\n\nexport async function getTagIdsBySlug(slugs, preview) {\n const cacheKey = slugs;\n const request = axios.get(\n `/entries?content_type=${CtfContentTypes.TAG}&fields.slug[in]=${slugs}`\n );\n if (!preview && !requestCache.tagsIdBySlug[cacheKey]) {\n requestCache.tagsIdBySlug[cacheKey] = request;\n }\n\n return await (preview ? request : requestCache.tagsIdBySlug[cacheKey]);\n}\n\nexport async function getAllTagGroups() {\n if (!requestCache.tagGroups) {\n requestCache.tagGroups = axios.get(\n `/entries?content_type=${CtfContentTypes.TAG_GROUP}`\n );\n }\n return await requestCache.tagGroups;\n}\n\n/**\n * Recursively searches parent entries until pages are found\n * @param entityId\n * @return {Promise<*[]>}\n */\nexport async function getPagesWithEntry(entityId) {\n const res = await axios.get(`/entries?links_to_entry=${entityId}`);\n let pages = [];\n const searchedEntities = [];\n\n await Promise.all(\n res.data.items.map(async (e) => {\n if (e.sys.contentType.sys.id === 'page') {\n pages.push(e);\n return;\n }\n\n if (searchedEntities.includes(e.sys.id)) {\n return;\n }\n searchedEntities.push(e.sys.id);\n\n (await getPagesWithEntry(e.sys.id)).forEach((p) => pages.push(p));\n })\n );\n\n return pages;\n}\n\n/**\n * Returns the dynamic components (carousel or content grid) which are potentially affected by this slug\n * @param slug\n * @return {Promise<*[]>}\n */\nexport async function getRelatedEntities(slug) {\n const res = await getPage({ slug });\n const page = res.data.items[0];\n const pageTags = page.fields.tags.map(\n (t) => getContent(t.sys.id, res.data.includes.Entry).sys.id\n );\n let relatedEntities = [];\n\n await Promise.all(\n pageTags.map(async (entityId) => {\n const res = await axios.get(`/entries?links_to_entry=${entityId}`);\n\n res.data.items\n .filter((i) =>\n ['carousel', 'contentGrid', 'navigationLink'].includes(\n i.sys.contentType.sys.id\n )\n )\n .forEach((i) => relatedEntities.push(i));\n })\n );\n\n return relatedEntities;\n}\n\nexport async function getDynamicPages(\n _key,\n queryTagIds,\n paginationNo,\n paginationLimit,\n assets,\n entries,\n locale = undefined,\n offset = undefined,\n currentPageId = undefined,\n inclusionOperator = 'all',\n order,\n preview\n) {\n const resp = await getPageByTags(\n queryTagIds,\n paginationNo,\n paginationLimit,\n offset,\n currentPageId,\n inclusionOperator,\n locale,\n order,\n preview\n );\n let filteredNewAssets = [],\n filteredNewEntries = [];\n\n // Append new assets if not already exist\n if (resp?.data?.includes?.Asset) {\n const existingAssetIds = assets.map((j) => j.sys.id);\n filteredNewAssets = resp.data.includes.Asset.filter(\n (j) => !existingAssetIds.includes(j.sys.id)\n );\n }\n\n // Append new entries if not already exist\n if (resp?.data?.includes?.Entry) {\n const existingEntryIds = entries.map((j) => j.sys.id);\n filteredNewEntries = resp.data.includes.Entry.filter(\n (j) => !existingEntryIds.includes(j.sys.id)\n );\n }\n\n return {\n resp,\n filteredNewAssets,\n filteredNewEntries,\n };\n}\n\nexport function useDynamicPages(\n queryTagIds,\n paginationNo,\n paginationLimit,\n assets,\n entries,\n locale = undefined,\n offset = undefined,\n inclusionOperator = undefined,\n order\n) {\n const loadData = queryTagIds && paginationNo && paginationLimit;\n const { data, error } = useSWR(\n () =>\n //only fetch when all params data is available\n loadData\n ? [\n 'dynamic-pages',\n queryTagIds,\n paginationNo,\n paginationLimit,\n assets,\n entries,\n locale,\n offset,\n undefined,\n inclusionOperator,\n order,\n ]\n : null,\n getDynamicPages\n );\n\n return {\n data: data,\n isLoading: loadData && !error && !data,\n isError: error,\n };\n}\n\nexport async function getTagsByIds(ids) {\n const key = ids.join();\n if (!requestCache.tagsById[key]) {\n requestCache.tagsById[key] = axios.get(\n `/entries?content_type=${CtfContentTypes.TAG}&sys.id[in]=${ids}`\n );\n }\n\n return await requestCache.tagsById[key];\n}\n\nexport async function getTagsByTagGroupId(id, preview) {\n const request = axios.get(\n `/entries?content_type=${CtfContentTypes.TAG}&fields.tagGroup.sys.id=${id}&order=fields.name&include=10`\n );\n if (!preview && !requestCache.tagsByTagGroup[id]) {\n requestCache.tagsByTagGroup[id] = request;\n }\n\n return await (preview ? request : requestCache.tagsByTagGroup[id]);\n}\n\nexport async function getContentById(id) {\n return await axios.get(`/entries?sys.id=${id}&include=10`);\n}\n\nexport async function findPagesForSearch(keyword, tags) {\n let tagsQuery = '';\n if (tags && tags.length > 0) {\n tagsQuery = `&fields.tags.sys.id[in]=${tags.join(',')}`;\n }\n\n const resp = await axios.get(\n `/entries?content_type=${\n CtfContentTypes.PAGE\n }${tagsQuery}&sys.revision[gte]=1&sys.createdAt[exists]=true&query=${encodeURIComponent(\n keyword\n )}`\n );\n\n return resp.data.items ? resp.data.items.map((p) => p.sys.id) : null;\n}\n\nexport async function searchPagesByKeyword(\n pageIds,\n paginationNo,\n paginationLimit,\n assets,\n entries,\n locale = undefined\n) {\n let offset = 0;\n if (paginationNo > 1) {\n offset = (paginationNo - 1) * paginationLimit;\n }\n\n const resp = await axios.get(\n `/entries?content_type=${CtfContentTypes.PAGE}&sys.id[in]=${pageIds?.join(\n ','\n )}&sys.revision[gte]=1&sys.createdAt[exists]=true&skip=${offset}&limit=${paginationLimit}&include=10${\n locale ? '&locale=' + locale : ''\n }`\n );\n\n let filteredNewAssets = [],\n filteredNewEntries = [];\n\n // Append new assets if not already exist\n if (resp?.data?.includes?.Asset) {\n const existingAssetIds = assets.map((j) => j.sys.id);\n filteredNewAssets = resp.data.includes.Asset.filter(\n (j) => !existingAssetIds.includes(j.sys.id)\n );\n }\n\n // Append new entries if not already exist\n if (resp?.data?.includes?.Entry) {\n const existingEntryIds = entries.map((j) => j.sys.id);\n filteredNewEntries = resp.data.includes.Entry.filter(\n (j) => !existingEntryIds.includes(j.sys.id)\n );\n }\n\n return {\n resp,\n filteredNewAssets,\n filteredNewEntries,\n };\n}\n\nexport async function getRobot() {\n const resp = await axios.get(\n `/entries?content_type=${CtfContentTypes.ROBOT}`\n );\n return resp?.data?.items?.[0]?.fields ?? {};\n}\n","// Asset position for story component.\nexport const CtfAssetPositions = {\n LEFT: 'Left',\n RIGHT: 'Right',\n};\n\n// Asset type\nexport const CtfAssetType = {\n IMAGE: 'image',\n VIDEO: 'video',\n};\n\n// List of two column content type from contentful\nexport const CtfTwoColumnContentStyle = {\n LEGAL: 'legal',\n RECIPE_DD: 'recipe-dd',\n};\n\n// List of lead generation type from contentful. For analytics purpose\nexport const CtfLeadGenType = {\n SIGNUP: 'signup',\n OFFER: 'offer',\n};\n\nexport const CtfWHLeadGenType = {\n PURCHASE: 'Purchase form',\n SIGNUP: 'Sign-up form',\n GENERAL: 'General form',\n PRODUCT: 'Product form',\n}\n\n// List of carousel styles from contentful.\nexport const CtfCarouselStyle = {\n FEATURED: 'Featured',\n FEATURED_FULL: 'Featured (Full Width)',\n HERO: 'Hero',\n NORMAL: 'Normal',\n SLIDER: 'Slider',\n FEATURED_ASYMMETRIC: 'Featured (Asymmetric Content Width)',\n FEATURED_ASYMMETRIC_FULL: 'Featured (Asymmetric Full Width)',\n};\n\n// List of carousel styles from contentful.\nexport const CtfStoryStyle = {\n ASSET: 'Featured Asset',\n NORMAL: 'Normal',\n RECIPE_STEPS: 'Recipe Steps',\n};\n\n// List of content types from contentful.\nexport const CtfContentTypes = {\n CARD: 'card',\n INGREDIENT_SECTION: 'ingredientSection',\n PAGE: 'page',\n TAG: 'tag',\n TAG_GROUP: 'tagGroup',\n NAVIGATION: 'navigation,',\n ROBOT: 'robot',\n};\n\n// CTA style enum from contentful\nexport const CtfCtaStyle = {\n PRIMARY: 'Primary',\n SECONDARY: 'Secondary',\n // only on DD\n DD_PRIMARY_FILLED: 'DDPrimaryFilled',\n DD_PRIMARY_LINE: 'DDPrimaryLine',\n DD_SECONDARY: 'DDSecondary',\n DD_TERTIARY: 'DDTertiary',\n DD_DEFAULT: 'DDDefault',\n};\n\n// Static slug for pages from contentful.\nexport const CtfPageSlug = {\n HOME: 'home',\n};\n\n// List of tags from contentful.\nexport const CtfTags = {\n STANDALONE: 'standalone',\n};\n\n// Pagination defaults\nexport const PaginationDefaults = {\n LIMIT: 9,\n};\n\n// BlockText style from contentful\nexport const CtfBlockTextStyle = {\n TEXT: 'text',\n BLOCKQUOTE: 'blockquote',\n BLOCKQUOTE_BODY_LARGE: 'blockquote-body-large',\n};\n\n// RichText nodeType\nexport const CtfRichTextTag = {\n HR: 'hr',\n HYPERLINK: 'hyperlink',\n ENTRY_HYPERLINK: 'entry-hyperlink',\n PARAGRAPH: 'paragraph',\n OL: 'ordered-list',\n TABLE: 'table',\n UL: 'unordered-list',\n TABLE_HEADER_CELL: 'table-header-cel',\n BLOCKQUOTE: 'blockquote',\n HEADING_1: 'heading-1',\n HEADING_2: 'heading-2',\n HEADING_3: 'heading-3',\n HEADING_4: 'heading-4',\n HEADING_5: 'heading-5',\n HEADING_6: 'heading-6',\n};\n\n// BlockText position from contentful\nexport const CtfBlockTextPositions = {\n LEFT: 'Left',\n RIGHT: 'Right',\n};\n\n// SectionHeader type from contentful\nexport const CtfSectionHeaderType = {\n PAGE_LARGE: 'page-large', // for DD's 404\n PAGE: 'page',\n SECTION: 'section',\n LEVEL_2: 'level-2',\n LEVEL_3: 'level-3',\n};\n\nexport const CtfSectionHeaderHeadingSize = {\n H1: 'h1',\n H2: 'h2',\n H3: 'h3',\n H4: 'h4',\n H5: 'h5',\n H6: 'h6',\n};\n\n// SectionHeader position from contentful\nexport const CtfSectionHeaderPositions = {\n CENTER: 'Center',\n LEFT: 'Left',\n RIGHT: 'Right',\n};\n\nexport const CtfWidthOptions = {\n PADDING: 'Full Padding',\n NO_LEFT: 'No Left Padding',\n NO_RIGHT: 'No Right Padding',\n FULL_WIDTH: 'Full Width',\n};\n\nexport const CtfChefIntroStyle = {\n RECIPE: 'recipe',\n RESTAURANT: 'restaurant',\n CUSTOM: 'custom',\n};\n\n// List of navigation styles from contentful.\nexport const CtfNavigationStyle = {\n DEFAULT: 'Default',\n STICKY: 'Sticky',\n};\n\n// Content Query Order for dynamic\nexport const CtfContentQueryOrder = {\n CREATE_DATE: 'Create Date',\n PUBLISH_DATE: 'Publish Date',\n};\n\nexport const ContentQueryOrder = {\n PUBLISH_DATE: '-fields.publishDate',\n CREATE_DATE: '-sys.createdAt',\n};\n","/**\n * Function to get WEB_ENV or STORYBOOK_WEB_ENV environment variable value\n * if WEB_ENV and STORYBOOK_WEB_ENV does not exists, it will return 'wh' (short for westholme) as default value.\n */\nexport function getWebEnv() {\n if (process.env.WEB_ENV) {\n return process.env.WEB_ENV;\n } else if (process.env.STORYBOOK_WEB_ENV) {\n return process.env.STORYBOOK_WEB_ENV;\n }\n\n return 'wh';\n}\n\nexport const isDDEnv = () =>\n process.env.WEB_ENV === 'dd' || process.env.NEXT_PUBLIC_WEB_ENV === 'dd';\nexport const isWHEnv = () =>\n process.env.WEB_ENV === 'wh' || process.env.NEXT_PUBLIC_WEB_ENV === 'wh';\n\n/**\n * Function to get asset object from Asset collection of contentful.\n * @param {string} id\n * @param {object[]} assets\n * @returns\n */\nexport function getAsset(id, assets) {\n const asset = assets.find((item) => item.sys.id === id) || null;\n return asset;\n}\n/**\n * Function to get content object from Entry collection of contentful.\n * @param {string} id\n * @param {object[]} entries\n * @returns\n */\nexport function getContent(id, entries) {\n if (!entries?.length) return null;\n\n const entry = entries.find((item) => item.sys.id === id) || null;\n return entry;\n}\n\n/**\n * Function to get content type from given content object of contentful.\n * @param {object} content\n * @returns\n */\nexport function getContentType(content) {\n return content.sys.contentType.sys.id;\n}\n\n/**\n * Function to get fields from a content object of contentful.\n * @param {object} content\n * @returns\n */\nexport function getFields(content) {\n return content.fields;\n}\n\n/**\n * Function to find an Entry collection of contentful's index based on sys.id.\n * @param {string} id\n * @param {object[]} entries\n * @returns\n */\nexport function findContentIndex(id, entries) {\n return entries.findIndex((item) => item.sys.id === id);\n}\n\n/**\n * Function to find Entries in a collection based on their content type\n * @param {string} type\n * @param {object[]} entries\n * @returns\n */\nexport function findContentsByType(type, entries) {\n return entries.filter((item) => item.sys.contentType.sys.id === type);\n}\nexport function findOneContentByType(type, page, entries) {\n const pageContentBlocks = page.fields.content\n ? page.fields.content.map((c) => c.sys.id)\n : [];\n return entries.find(\n (item) =>\n pageContentBlocks.includes(item.sys.id) &&\n item.sys.contentType.sys.id === type\n );\n}\n\n/**\n * Function to get current pagination's page number from URL.\n * @param {string} pathname\n * @param {object[]} entries\n * @returns\n */\nexport function getPageNumber(pathname) {\n const cleanPathNameWithoutQueryString = pathname.split('?')[0];\n const urlPathnames = cleanPathNameWithoutQueryString.split('/');\n\n if (urlPathnames[2] && !isNaN(urlPathnames[2])) {\n return urlPathnames[2];\n }\n\n return undefined;\n}\n\n/**\n * Function to merge Assets/Entries without creating duplicates.\n * @param {array} array\n * @param {array} arrayToMerge\n * @returns\n */\nexport function mergeAssetsOrEntries(array, arrayToMerge = []) {\n if (!arrayToMerge?.length) {\n return array;\n }\n return [\n ...array,\n ...arrayToMerge?.filter((i) => !array.some((j) => j.sys.id === i.sys.id)),\n ];\n}\n\nexport function removeKeys(obj, keysToRemove) {\n return Object.fromEntries(\n Object.entries(obj).filter(([key]) => !keysToRemove.includes(key))\n );\n}\n\n// export function renameKey(obj, oldKey, newKey) {\n// if (obj.hasOwnProperty(oldKey)) {\n// obj[newKey] = obj[oldKey]; // Create new key with the value of old key\n// delete obj[oldKey]; // Delete the old key\n// }\n// }\n\n"],"names":["SPACE_ID","process","CONTENTFUL_ACCESS_TOKEN","ENVIRONMENT","env","CONTENTFUL_MANAGEMENT_TOKEN","APP_ENV","isWHEnv","requests","requestCache","pagesByTags","tagsIdBySlug","tagGroups","undefined","tagsByTagGroup","tagsById","switchEnvironment","axios","getAllPages","CtfContentTypes","getPageByTags","tags","pageNumber","limit","offset","currentPageId","inclusionOperator","locale","order","preview","url","request","cacheKey","join","getTagIdsBySlug","slugs","getAllTagGroups","getDynamicPages","_key","queryTagIds","paginationNo","paginationLimit","assets","entries","resp","filteredNewAssets","filteredNewEntries","existingAssetIds","existingEntryIds","data","includes","Asset","map","j","sys","id","filter","Entry","useDynamicPages","loadData","useSWR","error","isLoading","isError","getTagsByTagGroupId","getRobot","items","fields","r","push","config","CtfAssetPositions","LEFT","RIGHT","CtfAssetType","IMAGE","VIDEO","CtfTwoColumnContentStyle","LEGAL","RECIPE_DD","CtfLeadGenType","SIGNUP","OFFER","CtfWHLeadGenType","PURCHASE","GENERAL","PRODUCT","CtfCarouselStyle","FEATURED","FEATURED_FULL","HERO","NORMAL","SLIDER","FEATURED_ASYMMETRIC","FEATURED_ASYMMETRIC_FULL","CtfStoryStyle","ASSET","RECIPE_STEPS","CARD","INGREDIENT_SECTION","PAGE","TAG","TAG_GROUP","NAVIGATION","ROBOT","CtfCtaStyle","PRIMARY","SECONDARY","DD_PRIMARY_FILLED","DD_PRIMARY_LINE","DD_SECONDARY","DD_TERTIARY","DD_DEFAULT","PaginationDefaults","LIMIT","CtfBlockTextStyle","TEXT","BLOCKQUOTE","BLOCKQUOTE_BODY_LARGE","CtfRichTextTag","HR","HYPERLINK","ENTRY_HYPERLINK","PARAGRAPH","OL","TABLE","UL","TABLE_HEADER_CELL","HEADING_1","HEADING_2","HEADING_3","HEADING_4","HEADING_5","HEADING_6","CtfBlockTextPositions","CtfSectionHeaderType","PAGE_LARGE","SECTION","LEVEL_2","LEVEL_3","CtfSectionHeaderHeadingSize","H1","H2","H3","H4","H5","H6","CtfSectionHeaderPositions","CENTER","CtfWidthOptions","PADDING","NO_LEFT","NO_RIGHT","FULL_WIDTH","CtfChefIntroStyle","RECIPE","RESTAURANT","CUSTOM","CtfNavigationStyle","DEFAULT","STICKY","CtfContentQueryOrder","CREATE_DATE","PUBLISH_DATE","ContentQueryOrder","getWebEnv","WEB_ENV","STORYBOOK_WEB_ENV","isDDEnv","getAsset","find","item","getContent","length","getContentType","content","contentType","getFields","findOneContentByType","type","page","pageContentBlocks","c","getPageNumber","pathname","urlPathnames","split","isNaN","removeKeys","obj","keysToRemove","Object","fromEntries","key"],"sourceRoot":""}