1
1
import { useLoaderData , useSearchParams } from "@remix-run/react" ;
2
- import { Analytics , type Storefront , getSeoMeta } from "@shopify/hydrogen" ;
2
+ import { Analytics , getSeoMeta } from "@shopify/hydrogen" ;
3
3
import type {
4
4
ActionFunctionArgs ,
5
5
LoaderFunctionArgs ,
@@ -8,20 +8,13 @@ import type {
8
8
import { defer , json } from "@shopify/remix-oxygen" ;
9
9
import { getSelectedProductOptions } from "@weaverse/hydrogen" ;
10
10
import { useEffect } from "react" ;
11
- import type {
12
- ProductQuery ,
13
- ProductRecommendationsQuery ,
14
- } from "storefrontapi.generated" ;
11
+ import type { ProductQuery } from "storefrontapi.generated" ;
15
12
import invariant from "tiny-invariant" ;
13
+ import { PRODUCT_QUERY , VARIANTS_QUERY } from "~/graphql/queries" ;
16
14
import { routeHeaders } from "~/utils/cache" ;
17
- import {
18
- PRODUCT_QUERY ,
19
- RECOMMENDED_PRODUCTS_QUERY ,
20
- VARIANTS_QUERY ,
21
- } from "~/graphql/queries" ;
22
- import { createJudgemeReview , getJudgemeReviews } from "~/utils/judgeme" ;
15
+ import { createJudgeMeReview , getJudgemeReviews } from "~/utils/judgeme" ;
16
+ import { getRecommendedProducts } from "~/utils/product" ;
23
17
import { seoPayload } from "~/utils/seo.server" ;
24
- import type { I18nLocale } from "~/types/locale" ;
25
18
import { WeaverseContent } from "~/weaverse" ;
26
19
27
20
export let headers = routeHeaders ;
@@ -104,23 +97,26 @@ export async function loader({ params, request, context }: LoaderFunctionArgs) {
104
97
} ) ;
105
98
}
106
99
107
- export type ProductLoaderType = typeof loader ;
108
-
109
- export async function action ( { request, context } : ActionFunctionArgs ) {
110
- const formData = await request . formData ( ) ;
111
- let judgeme_API_TOKEN = context . env . JUDGEME_PRIVATE_API_TOKEN ;
112
- invariant ( judgeme_API_TOKEN , "Missing JUDGEME_PRIVATE_API_TOKEN" ) ;
113
- let response : any = {
114
- status : 201 ,
115
- } ;
116
- let shop_domain = context . env . PUBLIC_STORE_DOMAIN ;
117
- response = await createJudgemeReview (
118
- judgeme_API_TOKEN ,
119
- shop_domain ,
120
- formData
121
- ) ;
122
- const { status, ...rest } = response ;
123
- return json ( rest , { status } ) ;
100
+ export async function action ( {
101
+ request,
102
+ context : { env } ,
103
+ } : ActionFunctionArgs ) {
104
+ try {
105
+ invariant (
106
+ env . JUDGEME_PRIVATE_API_TOKEN ,
107
+ "Missing `JUDGEME_PRIVATE_API_TOKEN`"
108
+ ) ;
109
+
110
+ let response = await createJudgeMeReview ( {
111
+ formData : await request . formData ( ) ,
112
+ apiToken : env . JUDGEME_PRIVATE_API_TOKEN ,
113
+ shopDomain : env . PUBLIC_STORE_DOMAIN ,
114
+ } ) ;
115
+ return json ( response ) ;
116
+ } catch ( error ) {
117
+ console . error ( error ) ;
118
+ return json ( { error : "Failed to create review!" } , { status : 500 } ) ;
119
+ }
124
120
}
125
121
126
122
export let meta = ( { matches } : MetaArgs < typeof loader > ) => {
@@ -130,7 +126,7 @@ export let meta = ({ matches }: MetaArgs<typeof loader>) => {
130
126
/**
131
127
* We need to handle the route change from client to keep the view transition persistent
132
128
*/
133
- let useApplyFirstVariant = ( ) => {
129
+ function useApplyFirstVariant ( ) {
134
130
let { product } = useLoaderData < typeof loader > ( ) ;
135
131
let [ searchParams , setSearchParams ] = useSearchParams ( ) ;
136
132
@@ -146,7 +142,7 @@ let useApplyFirstVariant = () => {
146
142
} ) ;
147
143
}
148
144
} , [ product ?. id ] ) ;
149
- } ;
145
+ }
150
146
151
147
export default function Product ( ) {
152
148
useApplyFirstVariant ( ) ;
@@ -174,31 +170,3 @@ export default function Product() {
174
170
</ >
175
171
) ;
176
172
}
177
-
178
- async function getRecommendedProducts (
179
- storefront : Storefront < I18nLocale > ,
180
- productId : string
181
- ) {
182
- let products = await storefront . query < ProductRecommendationsQuery > (
183
- RECOMMENDED_PRODUCTS_QUERY ,
184
- {
185
- variables : { productId, count : 12 } ,
186
- }
187
- ) ;
188
-
189
- invariant ( products , "No data returned from Shopify API" ) ;
190
-
191
- let mergedProducts = ( products . recommended ?? [ ] )
192
- . concat ( products . additional . nodes )
193
- . filter ( ( prod , idx , arr ) => {
194
- return arr . findIndex ( ( { id } ) => id === prod . id ) === idx ;
195
- } ) ;
196
-
197
- let originalProduct = mergedProducts . findIndex (
198
- ( item ) => item . id === productId
199
- ) ;
200
-
201
- mergedProducts . splice ( originalProduct , 1 ) ;
202
-
203
- return { nodes : mergedProducts } ;
204
- }
0 commit comments