Просмотр исходного кода

feat module 6, 7 : pull material data from shopify

master
nadia 13 часов назад
Родитель
Сommit
2c0da03308
1 измененных файлов: 114 добавлений и 3 удалений
  1. 114
    3
      src/components/ProductDetails/ProductDetails.jsx

+ 114
- 3
src/components/ProductDetails/ProductDetails.jsx Просмотреть файл

38
   return Object.entries(target).every(([key, value]) => source[key] === value);
38
   return Object.entries(target).every(([key, value]) => source[key] === value);
39
 };
39
 };
40
 
40
 
41
+const renderShopifyRichTextNode = (node, key = "node") => {
42
+  if (!node) return null
43
+
44
+  if (node.type === "text") {
45
+    const textValue = node.value || ""
46
+
47
+    if (node.bold) {
48
+      return <Box component="strong" key={key} sx={{ fontWeight: 700 }}>{textValue}</Box>
49
+    }
50
+
51
+    return textValue
52
+  }
53
+
54
+  const children = (node.children || []).map((child, index) => renderShopifyRichTextNode(child, `${key}-${index}`))
55
+
56
+  if (node.type === "root") {
57
+    return <>{children}</>
58
+  }
59
+
60
+  if (node.type === "paragraph") {
61
+    return (
62
+      <Typography component="p" key={key} sx={{ mt: 0, mb: 1.5 }}>
63
+        {children}
64
+      </Typography>
65
+    )
66
+  }
67
+
68
+  if (node.type === "list") {
69
+    return (
70
+      <Box
71
+        component={node.listType === "ordered" ? "ol" : "ul"}
72
+        key={key}
73
+        sx={{ mt: 0, mb: 1.5, pl: 2.5 }}
74
+      >
75
+        {children}
76
+      </Box>
77
+    )
78
+  }
79
+
80
+  if (node.type === "list-item") {
81
+    return (
82
+      <Box component="li" key={key} sx={{ mb: 0.5 }}>
83
+        {children}
84
+      </Box>
85
+    )
86
+  }
87
+
88
+  if (node.type === "heading") {
89
+    return (
90
+      <Typography component={`h${node.level || 3}`} key={key} sx={{ mt: 0, mb: 1, fontWeight: 700 }}>
91
+        {children}
92
+      </Typography>
93
+    )
94
+  }
95
+
96
+  if (node.type === "link") {
97
+    return (
98
+      <Box component="a" key={key} href={node.url} target="_blank" rel="noreferrer" sx={{ color: "inherit" }}>
99
+        {children}
100
+      </Box>
101
+    )
102
+  }
103
+
104
+  return <Box key={key}>{children}</Box>
105
+}
106
+
107
+const renderShopifyRichText = (value) => {
108
+  if (!value) return null
109
+
110
+  try {
111
+    return renderShopifyRichTextNode(JSON.parse(value))
112
+  } catch (error) {
113
+    return (
114
+      <Typography component="p" sx={{ mt: 0, mb: 1.5 }}>
115
+        {value}
116
+      </Typography>
117
+    )
118
+  }
119
+}
120
+
41
 const ProductDetails = () => {
121
 const ProductDetails = () => {
42
 
122
 
43
   const dispatch = useDispatch()
123
   const dispatch = useDispatch()
307
   })
387
   })
308
 
388
 
309
   const emptyInfoPanel = (row) => (
389
   const emptyInfoPanel = (row) => (
310
-    // Old empty expanded panel kept for reference:
311
     // expandedInfoRows[row] && (
390
     // expandedInfoRows[row] && (
312
     //   <Box
391
     //   <Box
313
     //     sx={{
392
     //     sx={{
319
     null
398
     null
320
   )
399
   )
321
 
400
 
401
+  const materialMetafield = product?.metafields?.material
402
+
403
+  const materialPanel = (
404
+    <Box
405
+      sx={{
406
+        maxHeight: expandedInfoRows.material ? 600 : 0,
407
+        overflow: "hidden",
408
+        borderBottom: "1px solid #DDD",
409
+        transition: "max-height 0.25s ease-in-out"
410
+      }}
411
+    >
412
+      <Box
413
+        sx={{
414
+          color: "text.secondary",
415
+          minHeight: materialMetafield?.value ? 0 : 28,
416
+          fontSize: {
417
+            xs: "0.875rem",
418
+            md: "1rem"
419
+          },
420
+          lineHeight: 1.6
421
+        }}
422
+      >
423
+        {renderShopifyRichText(materialMetafield?.value)}
424
+      </Box>
425
+    </Box>
426
+  )
427
+
322
   const productDetailsPanel = (
428
   const productDetailsPanel = (
323
     <Box
429
     <Box
324
       sx={{
430
       sx={{
726
           {/* Material */}
832
           {/* Material */}
727
           <Box
833
           <Box
728
             onClick={() => toggleInfoRow("material")}
834
             onClick={() => toggleInfoRow("material")}
729
-            sx={infoRowSx(expandedInfoRows.material)}
835
+            sx={{
836
+              ...infoRowSx(expandedInfoRows.material),
837
+              pb: expandedInfoRows.material ? 5 : 2,
838
+              pb: 2,
839
+              borderBottom: "none"
840
+            }}
730
           >
841
           >
731
             <Typography variant="body2" sx={{ textTransform: "uppercase", fontWeight: "400", fontSize: { xs: "0.875rem", md: "1.1rem" } }}>
842
             <Typography variant="body2" sx={{ textTransform: "uppercase", fontWeight: "400", fontSize: { xs: "0.875rem", md: "1.1rem" } }}>
732
               Material
843
               Material
733
             </Typography>
844
             </Typography>
734
             {expandedInfoRows.material ? <RemoveIcon sx={{ fontSize: 18 }} /> : <AddIcon sx={{ fontSize: 18 }} />}
845
             {expandedInfoRows.material ? <RemoveIcon sx={{ fontSize: 18 }} /> : <AddIcon sx={{ fontSize: 18 }} />}
735
           </Box>
846
           </Box>
736
-          {emptyInfoPanel("material")}
847
+          {materialPanel}
737
 
848
 
738
           {/* Care Instruction */}
849
           {/* Care Instruction */}
739
           <Box
850
           <Box

Загрузка…
Отмена
Сохранить