mirror of
https://github.com/vercel/commerce.git
synced 2025-05-15 22:16:58 +00:00
325 lines
5.6 KiB
TypeScript
325 lines
5.6 KiB
TypeScript
export const imageFields = `
|
|
alt,
|
|
crop,
|
|
hotspot,
|
|
"url": asset->url,
|
|
"width": asset->metadata.dimensions.width,
|
|
"height": asset->metadata.dimensions.height,
|
|
asset-> {
|
|
_id,
|
|
assetId,
|
|
metadata,
|
|
_type,
|
|
_ref,
|
|
_rev
|
|
}
|
|
`;
|
|
|
|
export const seoFields = `
|
|
title,
|
|
description,
|
|
image {
|
|
${imageFields}
|
|
}
|
|
`;
|
|
|
|
// Construct our "Modules" GROQ
|
|
export const modules = `
|
|
_type == 'hero' => {
|
|
_type,
|
|
_key,
|
|
label,
|
|
title,
|
|
variant,
|
|
headingLevel,
|
|
text,
|
|
link {
|
|
title,
|
|
reference->{title, slug, "locale": language}
|
|
},
|
|
image {
|
|
${imageFields}
|
|
}
|
|
},
|
|
_type == 'filteredProductList' => {
|
|
_type,
|
|
_key,
|
|
title,
|
|
itemsToShow,
|
|
productCategories[]->,
|
|
"products": *[_type == "product" && count(categories[@._ref in ^.^.productCategories[]._ref]) > 0] | order(publishedAt desc, _createdAt desc) [0...12] {
|
|
title,
|
|
"slug": slug.current,
|
|
price,
|
|
images[] {
|
|
${imageFields}
|
|
},
|
|
price {
|
|
value,
|
|
currencyCode,
|
|
retailPrice
|
|
},
|
|
}
|
|
},
|
|
_type == 'slider' => {
|
|
_type,
|
|
_key,
|
|
title,
|
|
sliderType,
|
|
categories[]-> {
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
image {
|
|
${imageFields}
|
|
},
|
|
},
|
|
products[]-> {
|
|
id,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
images[] {
|
|
${imageFields}
|
|
},
|
|
price {
|
|
value,
|
|
currencyCode,
|
|
retailPrice
|
|
},
|
|
},
|
|
},
|
|
_type == 'banner' => {
|
|
_type,
|
|
_key,
|
|
title,
|
|
text,
|
|
image {
|
|
${imageFields}
|
|
}
|
|
},
|
|
_type == 'blurbSection' => {
|
|
disabled,
|
|
_type,
|
|
_key,
|
|
title,
|
|
mobileLayout,
|
|
desktopLayout,
|
|
imageFormat,
|
|
blurbs[]->{
|
|
_type,
|
|
title,
|
|
text,
|
|
link {
|
|
linkType,
|
|
title,
|
|
internalLink {
|
|
reference->
|
|
},
|
|
externalLink {
|
|
title,
|
|
url,
|
|
newWindow
|
|
}
|
|
},
|
|
"locale": language,
|
|
image {
|
|
${imageFields}
|
|
},
|
|
},
|
|
},
|
|
_type == 'uspSection' => {
|
|
disabled,
|
|
_type,
|
|
_key,
|
|
title,
|
|
usps[]->{
|
|
title,
|
|
text,
|
|
"locale": language,
|
|
image {
|
|
${imageFields}
|
|
},
|
|
},
|
|
}
|
|
`;
|
|
export const reusableSection = `
|
|
_type == 'reusableSection' => {
|
|
disabled,
|
|
_type,
|
|
title,
|
|
section {
|
|
existingSection-> {
|
|
section {
|
|
sectionType[] {
|
|
${modules}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
`;
|
|
|
|
// Homepage query
|
|
export const homePageQuery = `*[_type == "home" && language == $locale][0] {
|
|
_type,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
"translations": *[_type == "translation.metadata" && references(^._id)].translations[].value->{
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language
|
|
},
|
|
content[] {
|
|
${modules},
|
|
${reusableSection}
|
|
},
|
|
seo {
|
|
${seoFields}
|
|
}
|
|
}`;
|
|
|
|
// Page query
|
|
export const pageQuery = `*[_type == "page" && slug.current == $slug && language == $locale][0] {
|
|
_type,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
"translations": *[_type == "translation.metadata" && references(^._id)].translations[].value->{
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language
|
|
},
|
|
content[] {
|
|
${modules}
|
|
},
|
|
seo {
|
|
${seoFields}
|
|
}
|
|
}`;
|
|
|
|
// Product query
|
|
export const productQuery = `*[_type == "product" && slug.current == $slug && language == $locale][0] {
|
|
_type,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
"translations": *[_type == "translation.metadata" && references(^._id)].translations[].value->{
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language
|
|
},
|
|
id,
|
|
"name": title,
|
|
description,
|
|
"descriptionHtml": "",
|
|
images[] {
|
|
${imageFields}
|
|
},
|
|
price {
|
|
value,
|
|
currencyCode,
|
|
retailPrice
|
|
},
|
|
options[] {
|
|
id,
|
|
displayName,
|
|
values[] {
|
|
label,
|
|
"hexColors": hexColors.hex
|
|
}
|
|
},
|
|
"variants": [],
|
|
seo {
|
|
${seoFields}
|
|
}
|
|
}`;
|
|
|
|
// Category query
|
|
export const categoryQuery = `*[_type == "category" && slug.current == $slug && language == $locale][0] {
|
|
_type,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
image {
|
|
${imageFields}
|
|
},
|
|
"translations": *[_type == "translation.metadata" && references(^._id)].translations[].value->{
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language
|
|
},
|
|
seo {
|
|
${seoFields}
|
|
}
|
|
}`;
|
|
|
|
// Categories query
|
|
export const categoriesQuery = `*[_type == "category" && language == $locale] | order(title asc) {
|
|
_type,
|
|
title,
|
|
"slug": slug.current,
|
|
"locale": language,
|
|
}`;
|
|
|
|
// Footer menu query
|
|
export const footerMenusQuery = `*[_type == "footerMenu" && language == $locale] | order(title asc) {
|
|
_type,
|
|
title,
|
|
"locale": language,
|
|
menu {
|
|
title,
|
|
links[] {
|
|
_type,
|
|
title,
|
|
reference-> {
|
|
slug,
|
|
"locale": language
|
|
},
|
|
url,
|
|
newWindow
|
|
}
|
|
}
|
|
}`;
|
|
|
|
// Site settings query
|
|
export const siteSettingsQuery = `*[_type == "settings" && language == $locale][0] {
|
|
menuMain {
|
|
links[] {
|
|
title,
|
|
"link": reference->
|
|
}
|
|
},
|
|
seo,
|
|
socialMedia,
|
|
"locale": language,
|
|
notFoundPage {
|
|
title,
|
|
body,
|
|
category->{title},
|
|
"products": *[_type == "product" && ^.category->title in categories[]->title] | order(publishedAt desc, _createdAt desc) [0...4] {
|
|
id,
|
|
title,
|
|
"slug": slug.current,
|
|
price,
|
|
images[] {
|
|
${imageFields}
|
|
},
|
|
price {
|
|
value,
|
|
currencyCode,
|
|
retailPrice
|
|
},
|
|
}
|
|
},
|
|
cookieConsent {
|
|
title,
|
|
description,
|
|
consentText,
|
|
link {
|
|
reference->
|
|
}
|
|
}
|
|
}`;
|