mirror of
https://github.com/vercel/commerce.git
synced 2025-04-23 19:37:51 +00:00
Cleanup
This commit is contained in:
parent
72b5fb0c1a
commit
deadb1675b
@ -1,6 +1,6 @@
|
|||||||
import { FC, useEffect, useState, useCallback } from 'react'
|
import { FC, useEffect, useState, useCallback } from 'react'
|
||||||
import { Logo, Button, Input } from '@components/ui'
|
import { Logo, Button, Input } from '@components/ui'
|
||||||
import useLogin from '@framework/auth/use-login'
|
import { useLogin } from '@framework/auth'
|
||||||
import { useUI } from '@components/ui/context'
|
import { useUI } from '@components/ui/context'
|
||||||
import { validate } from 'email-validator'
|
import { validate } from 'email-validator'
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ import { validate } from 'email-validator'
|
|||||||
import { Info } from '@components/icons'
|
import { Info } from '@components/icons'
|
||||||
import { useUI } from '@components/ui/context'
|
import { useUI } from '@components/ui/context'
|
||||||
import { Logo, Button, Input } from '@components/ui'
|
import { Logo, Button, Input } from '@components/ui'
|
||||||
import useSignup from '@framework/auth/use-signup'
|
import { useSignup } from '@framework/auth'
|
||||||
|
|
||||||
interface Props {}
|
interface Props {}
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ import { Avatar } from '@components/common'
|
|||||||
import { Moon, Sun } from '@components/icons'
|
import { Moon, Sun } from '@components/icons'
|
||||||
import { useUI } from '@components/ui/context'
|
import { useUI } from '@components/ui/context'
|
||||||
import ClickOutside from '@lib/click-outside'
|
import ClickOutside from '@lib/click-outside'
|
||||||
|
import { useLogout } from '@framework/auth'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
disableBodyScroll,
|
disableBodyScroll,
|
||||||
@ -15,8 +16,6 @@ import {
|
|||||||
clearAllBodyScrollLocks,
|
clearAllBodyScrollLocks,
|
||||||
} from 'body-scroll-lock'
|
} from 'body-scroll-lock'
|
||||||
|
|
||||||
import useLogout from '@framework/auth/use-logout'
|
|
||||||
|
|
||||||
interface DropdownMenuProps {
|
interface DropdownMenuProps {
|
||||||
open?: boolean
|
open?: boolean
|
||||||
}
|
}
|
||||||
|
@ -1,49 +0,0 @@
|
|||||||
/**
|
|
||||||
* Generates definitions for REST API endpoints that are being
|
|
||||||
* used by ../api using https://github.com/drwpow/swagger-to-ts
|
|
||||||
*/
|
|
||||||
const { readFileSync, promises } = require('fs')
|
|
||||||
const path = require('path')
|
|
||||||
const fetch = require('node-fetch')
|
|
||||||
const swaggerToTS = require('@manifoldco/swagger-to-ts').default
|
|
||||||
|
|
||||||
async function getSchema(filename) {
|
|
||||||
const url = `https://next-api.stoplight.io/projects/8433/files/${filename}`
|
|
||||||
const res = await fetch(url)
|
|
||||||
|
|
||||||
if (!res.ok) {
|
|
||||||
throw new Error(`Request failed with ${res.status}: ${res.statusText}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json()
|
|
||||||
}
|
|
||||||
|
|
||||||
const schemas = Object.entries({
|
|
||||||
'../api/definitions/catalog.ts':
|
|
||||||
'BigCommerce_Catalog_API.oas2.yml?ref=version%2F20.930',
|
|
||||||
'../api/definitions/store-content.ts':
|
|
||||||
'BigCommerce_Store_Content_API.oas2.yml?ref=version%2F20.930',
|
|
||||||
'../api/definitions/wishlist.ts':
|
|
||||||
'BigCommerce_Wishlist_API.oas2.yml?ref=version%2F20.930',
|
|
||||||
// swagger-to-ts is not working for the schema of the cart API
|
|
||||||
// '../api/definitions/cart.ts':
|
|
||||||
// 'BigCommerce_Server_to_Server_Cart_API.oas2.yml',
|
|
||||||
})
|
|
||||||
|
|
||||||
async function writeDefinitions() {
|
|
||||||
const ops = schemas.map(async ([dest, filename]) => {
|
|
||||||
const destination = path.join(__dirname, dest)
|
|
||||||
const schema = await getSchema(filename)
|
|
||||||
const definition = swaggerToTS(schema.content, {
|
|
||||||
prettierConfig: 'package.json',
|
|
||||||
})
|
|
||||||
|
|
||||||
await promises.writeFile(destination, definition)
|
|
||||||
|
|
||||||
console.log(`✔️ Added definitions for: ${dest}`)
|
|
||||||
})
|
|
||||||
|
|
||||||
await Promise.all(ops)
|
|
||||||
}
|
|
||||||
|
|
||||||
writeDefinitions()
|
|
@ -46,9 +46,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@reach/portal": "^0.11.2",
|
"@reach/portal": "^0.11.2",
|
||||||
"@tailwindcss/ui": "^0.6.2",
|
"@tailwindcss/ui": "^0.6.2",
|
||||||
"@types/node-fetch": "2",
|
|
||||||
"@vercel/fetch": "^6.1.0",
|
"@vercel/fetch": "^6.1.0",
|
||||||
"@vercel/fetch-cached-dns": "^2.0.1",
|
|
||||||
"body-scroll-lock": "^3.1.5",
|
"body-scroll-lock": "^3.1.5",
|
||||||
"bowser": "^2.11.0",
|
"bowser": "^2.11.0",
|
||||||
"classnames": "^2.2.6",
|
"classnames": "^2.2.6",
|
||||||
@ -62,7 +60,6 @@
|
|||||||
"next": "^10.0.5-canary.11",
|
"next": "^10.0.5-canary.11",
|
||||||
"next-seo": "^4.11.0",
|
"next-seo": "^4.11.0",
|
||||||
"next-themes": "^0.0.4",
|
"next-themes": "^0.0.4",
|
||||||
"node-fetch": "^2.6.1",
|
|
||||||
"postcss-nesting": "^7.0.1",
|
"postcss-nesting": "^7.0.1",
|
||||||
"react": "^16.14.0",
|
"react": "^16.14.0",
|
||||||
"react-dom": "^16.14.0",
|
"react-dom": "^16.14.0",
|
||||||
|
152
pages/index2.tsx
152
pages/index2.tsx
@ -1,152 +0,0 @@
|
|||||||
import rangeMap from '@lib/range-map'
|
|
||||||
import { Layout } from '@components/common'
|
|
||||||
import { ProductCard } from '@components/product'
|
|
||||||
import { Grid, Marquee, Hero } from '@components/ui'
|
|
||||||
import HomeAllProductsGrid from '@components/common/HomeAllProductsGrid'
|
|
||||||
import type { GetStaticPropsContext, InferGetStaticPropsType } from 'next'
|
|
||||||
|
|
||||||
import { getConfig } from '@framework/api'
|
|
||||||
import getAllProducts from '@framework/api/operations/get-all-products'
|
|
||||||
import getSiteInfo from '@framework/api/operations/get-site-info'
|
|
||||||
import getAllPages from '@framework/api/operations/get-all-pages'
|
|
||||||
|
|
||||||
export async function getStaticProps({
|
|
||||||
preview,
|
|
||||||
locale,
|
|
||||||
}: GetStaticPropsContext) {
|
|
||||||
const config = getConfig({ locale })
|
|
||||||
|
|
||||||
// Get Featured Products
|
|
||||||
const { products: featuredProducts } = await getAllProducts({
|
|
||||||
variables: { field: 'featuredProducts', first: 6 },
|
|
||||||
config,
|
|
||||||
preview,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Get Best Selling Products
|
|
||||||
const { products: bestSellingProducts } = await getAllProducts({
|
|
||||||
variables: { field: 'bestSellingProducts', first: 6 },
|
|
||||||
config,
|
|
||||||
preview,
|
|
||||||
})
|
|
||||||
|
|
||||||
// Get Best Newest Products
|
|
||||||
const { products: newestProducts } = await getAllProducts({
|
|
||||||
variables: { field: 'newestProducts', first: 12 },
|
|
||||||
config,
|
|
||||||
preview,
|
|
||||||
})
|
|
||||||
|
|
||||||
const { categories, brands } = await getSiteInfo({ config, preview })
|
|
||||||
const { pages } = await getAllPages({ config, preview })
|
|
||||||
|
|
||||||
// These are the products that are going to be displayed in the landing.
|
|
||||||
// We prefer to do the computation at buildtime/servertime
|
|
||||||
const { featured, bestSelling } = (() => {
|
|
||||||
// Create a copy of products that we can mutate
|
|
||||||
const products = [...newestProducts]
|
|
||||||
// If the lists of featured and best selling products don't have enough
|
|
||||||
// products, then fill them with products from the products list, this
|
|
||||||
// is useful for new commerce sites that don't have a lot of products
|
|
||||||
return {
|
|
||||||
featured: rangeMap(6, (i) => featuredProducts[i] ?? products.shift())
|
|
||||||
.filter(nonNullable)
|
|
||||||
.sort((a, b) => a.node.prices.price.value - b.node.prices.price.value)
|
|
||||||
.reverse(),
|
|
||||||
bestSelling: rangeMap(
|
|
||||||
6,
|
|
||||||
(i) => bestSellingProducts[i] ?? products.shift()
|
|
||||||
).filter(nonNullable),
|
|
||||||
}
|
|
||||||
})()
|
|
||||||
|
|
||||||
return {
|
|
||||||
props: {
|
|
||||||
featured,
|
|
||||||
bestSelling,
|
|
||||||
newestProducts,
|
|
||||||
categories,
|
|
||||||
brands,
|
|
||||||
pages,
|
|
||||||
},
|
|
||||||
revalidate: 14400,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const nonNullable = (v: any) => v
|
|
||||||
|
|
||||||
export default function Home({
|
|
||||||
featured,
|
|
||||||
bestSelling,
|
|
||||||
brands,
|
|
||||||
categories,
|
|
||||||
newestProducts,
|
|
||||||
}: InferGetStaticPropsType<typeof getStaticProps>) {
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<Grid>
|
|
||||||
{featured.slice(0, 3).map(({ node }, i) => (
|
|
||||||
<ProductCard
|
|
||||||
key={node.path}
|
|
||||||
product={node}
|
|
||||||
imgWidth={i === 0 ? 1080 : 540}
|
|
||||||
imgHeight={i === 0 ? 1080 : 540}
|
|
||||||
imgPriority
|
|
||||||
imgLoading="eager"
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</Grid>
|
|
||||||
<Marquee variant="secondary">
|
|
||||||
{bestSelling.slice(3, 6).map(({ node }) => (
|
|
||||||
<ProductCard
|
|
||||||
key={node.path}
|
|
||||||
product={node}
|
|
||||||
variant="slim"
|
|
||||||
imgWidth={320}
|
|
||||||
imgHeight={320}
|
|
||||||
imgLayout="fixed"
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</Marquee>
|
|
||||||
<Hero
|
|
||||||
headline="Release Details: The Yeezy BOOST 350 V2 ‘Natural'"
|
|
||||||
description="
|
|
||||||
The Yeezy BOOST 350 V2 lineup continues to grow. We recently had the
|
|
||||||
‘Carbon’ iteration, and now release details have been locked in for
|
|
||||||
this ‘Natural’ joint. Revealed by Yeezy Mafia earlier this year, the
|
|
||||||
shoe was originally called ‘Abez’, which translated to ‘Tin’ in
|
|
||||||
Hebrew. It’s now undergone a name change, and will be referred to as
|
|
||||||
‘Natural’."
|
|
||||||
/>
|
|
||||||
<Grid layout="B">
|
|
||||||
{featured.slice(3, 6).map(({ node }, i) => (
|
|
||||||
<ProductCard
|
|
||||||
key={node.path}
|
|
||||||
product={node}
|
|
||||||
imgWidth={i === 1 ? 1080 : 540}
|
|
||||||
imgHeight={i === 1 ? 1080 : 540}
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</Grid>
|
|
||||||
<Marquee>
|
|
||||||
{bestSelling.slice(0, 3).map(({ node }) => (
|
|
||||||
<ProductCard
|
|
||||||
key={node.path}
|
|
||||||
product={node}
|
|
||||||
variant="slim"
|
|
||||||
imgWidth={320}
|
|
||||||
imgHeight={320}
|
|
||||||
imgLayout="fixed"
|
|
||||||
/>
|
|
||||||
))}
|
|
||||||
</Marquee>
|
|
||||||
<HomeAllProductsGrid
|
|
||||||
categories={categories}
|
|
||||||
brands={brands}
|
|
||||||
newestProducts={newestProducts}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
Home.Layout = Layout
|
|
@ -26,6 +26,12 @@
|
|||||||
"@framework": ["framework/bigcommerce"]
|
"@framework": ["framework/bigcommerce"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"include": ["next-env.d.ts", "**/*.d.ts", "**/*.ts", "**/*.tsx", "**/*.js"],
|
"include": [
|
||||||
|
"next-env.d.ts",
|
||||||
|
"framework/*.d.ts",
|
||||||
|
"**/*.ts",
|
||||||
|
"**/*.tsx",
|
||||||
|
"**/*.js"
|
||||||
|
],
|
||||||
"exclude": ["node_modules"]
|
"exclude": ["node_modules"]
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user