From e10d50c55a98820d738d0c795cdd32f1015336ba Mon Sep 17 00:00:00 2001
From: Bel Curcio <bel@vercel.com>
Date: Thu, 25 Feb 2021 06:27:56 -0300
Subject: [PATCH] shopify: changes

---
 framework/commerce/with-config.js             |  2 +-
 framework/shopify/api/index.ts                |  1 -
 .../shopify/api/utils/fetch-graphql-api.ts    |  2 +-
 framework/shopify/cart/use-cart.tsx           | 11 ++++--
 framework/shopify/config.json                 |  5 +++
 framework/shopify/next.config.js              | 11 ++++++
 framework/shopify/product/use-price.tsx       |  4 +--
 framework/shopify/provider.ts                 | 34 +++++++++++++++++++
 8 files changed, 62 insertions(+), 8 deletions(-)
 create mode 100644 framework/shopify/config.json
 create mode 100644 framework/shopify/next.config.js
 create mode 100644 framework/shopify/provider.ts

diff --git a/framework/commerce/with-config.js b/framework/commerce/with-config.js
index 6dcf08986..da6705cef 100644
--- a/framework/commerce/with-config.js
+++ b/framework/commerce/with-config.js
@@ -4,7 +4,7 @@
 
 const merge = require('deepmerge')
 
-const PROVIDERS = ['bigcommerce']
+const PROVIDERS = ['bigcommerce', 'shopify']
 
 function getProviderName() {
   return process.env.BIGCOMMERCE_STOREFRONT_API_URL ? 'bigcommerce' : null
diff --git a/framework/shopify/api/index.ts b/framework/shopify/api/index.ts
index 0402cfccc..1da7f31c6 100644
--- a/framework/shopify/api/index.ts
+++ b/framework/shopify/api/index.ts
@@ -3,7 +3,6 @@ import fetchGraphqlApi from './utils/fetch-graphql-api'
 
 export interface ShopifyConfig extends CommerceAPIConfig {}
 
-// TODO(bc)
 const API_URL =
   process.env.SHOPIFY_STORE_DOMAIN ||
   process.env.NEXT_PUBLIC_SHOPIFY_STORE_DOMAIN
diff --git a/framework/shopify/api/utils/fetch-graphql-api.ts b/framework/shopify/api/utils/fetch-graphql-api.ts
index 946242c93..f3f8b9a17 100644
--- a/framework/shopify/api/utils/fetch-graphql-api.ts
+++ b/framework/shopify/api/utils/fetch-graphql-api.ts
@@ -21,7 +21,7 @@ const fetchGraphqlApi: GraphQLFetcher = async (
   fetchOptions
 ) => {
   const config = getConfig()
-  const url = `https://${config.commerceUrl}/api/2020-10/graphql.json`
+  const url = `https://${config.commerceUrl}/api/2021-01/graphql.json`
 
   const res = await fetch(url, {
     ...fetchOptions,
diff --git a/framework/shopify/cart/use-cart.tsx b/framework/shopify/cart/use-cart.tsx
index f067b520d..e69afda0c 100644
--- a/framework/shopify/cart/use-cart.tsx
+++ b/framework/shopify/cart/use-cart.tsx
@@ -1,9 +1,16 @@
 import { useCommerce } from '../index'
+import useCart, { UseCart, FetchCartInput } from '@commerce/cart/use-cart'
+import type { Cart } from '../types'
 
-export function emptyHook() {
+// export default useCart as UseCart<typeof handler>
+export default useCart as UseCart
+
+export const handler = () => {
   const { checkout } = useCommerce()
   const { lineItems, totalPriceV2 } = checkout || {}
 
+  console.log(checkout)
+
   return {
     data: {
       subTotal: totalPriceV2?.amount || 0,
@@ -38,5 +45,3 @@ export function emptyHook() {
     isLoading: false,
   }
 }
-
-export default emptyHook
diff --git a/framework/shopify/config.json b/framework/shopify/config.json
new file mode 100644
index 000000000..17ef37e25
--- /dev/null
+++ b/framework/shopify/config.json
@@ -0,0 +1,5 @@
+{
+  "features": {
+    "wishlist": false
+  }
+}
diff --git a/framework/shopify/next.config.js b/framework/shopify/next.config.js
new file mode 100644
index 000000000..0f9bc31ff
--- /dev/null
+++ b/framework/shopify/next.config.js
@@ -0,0 +1,11 @@
+const providerConfig = require('./config.json')
+
+module.exports = {
+  commerce: {
+    provider: 'shopify',
+    ...providerConfig,
+  },
+  images: {
+    domains: ['cdn.shopify.com'],
+  },
+}
diff --git a/framework/shopify/product/use-price.tsx b/framework/shopify/product/use-price.tsx
index a79940a76..0174faf5e 100644
--- a/framework/shopify/product/use-price.tsx
+++ b/framework/shopify/product/use-price.tsx
@@ -1,2 +1,2 @@
-export * from '@commerce/use-price'
-export { default } from '@commerce/use-price'
+export * from '@commerce/product/use-price'
+export { default } from '@commerce/product/use-price'
diff --git a/framework/shopify/provider.ts b/framework/shopify/provider.ts
new file mode 100644
index 000000000..31b958a21
--- /dev/null
+++ b/framework/shopify/provider.ts
@@ -0,0 +1,34 @@
+import { handler as useCart } from './cart/use-cart'
+import { handler as useAddItem } from './cart/use-add-item'
+import { handler as useUpdateItem } from './cart/use-update-item'
+import { handler as useRemoveItem } from './cart/use-remove-item'
+
+import { handler as useWishlist } from './wishlist/use-wishlist'
+import { handler as useWishlistAddItem } from './wishlist/use-add-item'
+import { handler as useWishlistRemoveItem } from './wishlist/use-remove-item'
+
+import { handler as useCustomer } from './customer/use-customer'
+import { handler as useSearch } from './product/use-search'
+
+import { handler as useLogin } from './auth/use-login'
+import { handler as useLogout } from './auth/use-logout'
+import { handler as useSignup } from './auth/use-signup'
+
+import fetcher from './fetcher'
+
+export const shopifyProvider = {
+  locale: 'en-us',
+  cartCookie: 'sp_cartId',
+  fetcher,
+  cart: { useCart, useAddItem, useUpdateItem, useRemoveItem },
+  wishlist: {
+    useWishlist,
+    useAddItem: useWishlistAddItem,
+    useRemoveItem: useWishlistRemoveItem,
+  },
+  customer: { useCustomer },
+  products: { useSearch },
+  auth: { useLogin, useLogout, useSignup },
+}
+
+export type ShopifyProvider = typeof shopifyProvider