Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

417 linhas
26 KiB

  1. import React, { useState } from 'react'
  2. //component
  3. import PageBanner from '@/components/Common/PageBanner';
  4. import * as Icon from 'react-feather'
  5. import { useSelector, useDispatch } from 'react-redux'
  6. import { useRouter } from 'next/router'
  7. import { useToasts } from 'react-toast-notifications'
  8. //addon library
  9. import { resetIdCounter, Tab, Tabs, TabList, TabPanel } from 'react-tabs';
  10. resetIdCounter();
  11. import dynamic from 'next/dynamic'
  12. const OwlCarousel = dynamic(import('react-owl-carousel3'))
  13. //library yarn
  14. import NumberFormat from 'react-number-format';
  15. import util from '../../../lib/util';
  16. //sweet alert
  17. import swal from 'sweetalert';
  18. const options = {
  19. loop: true,
  20. nav: true,
  21. dots: false,
  22. autoplay: true,
  23. items: 1,
  24. smartSpeed: 1000,
  25. autoplayTimeout: 5000,
  26. navText: [
  27. "<i className='bx bx-chevron-left'></i>",
  28. "<i className='bx bx-chevron-right'></i>"
  29. ],
  30. };
  31. const ProductDetails = function ({ detailproduct, backend, user, ...props }) {
  32. const [formValue, setFormValue] = React.useState({
  33. product_img: "",
  34. product_name: "",
  35. product_color: "",
  36. product_price: "",
  37. product_parts:"",
  38. });
  39. const [OTRProduct, setProductOTR] = useState((detailproduct.Product_prices.data&&detailproduct.Product_prices.data.length==1)?detailproduct.Product_prices.data[0].attributes.Price:'');
  40. const router = useRouter();
  41. const [displayOwl, setDisplay] = React.useState(false);
  42. React.useEffect(() => {
  43. setDisplay(true);
  44. }, [])
  45. return (
  46. <>
  47. <PageBanner pageTitle="Product Details"/>
  48. <div className="shop-details-area ptb-80">
  49. <div className="container">
  50. <div className="row align-items-start">
  51. <div className="col-lg-5">
  52. {(displayOwl)?<OwlCarousel
  53. className="products-details-image products-details-image-slides owl-carousel owl-theme"
  54. {...options}
  55. >
  56. {(detailproduct.Image.data)?detailproduct.Image.data.map((option,idx) => (
  57. <img key={`img${idx}`} src={`/api/util?img=${encodeURIComponent(option.attributes.url||'')}`} />
  58. )):''}
  59. </OwlCarousel>:''}
  60. </div>
  61. <div className="col-lg-7">
  62. <div className="products-details">
  63. <h2>
  64. {detailproduct.Name}
  65. </h2>
  66. <br/>
  67. <h5>
  68. <NumberFormat value={OTRProduct} displayType={'text'} thousandSeparator={true} prefix={'Rp.'} />
  69. </h5>
  70. {/* <h3>
  71. <NumberFormat value={data.product_otrs[0].price - data.product_otrs[0].price * data.discount} displayType={'text'} thousandSeparator={true} prefix={'Rp.'} />
  72. </h3>
  73. <h5>
  74. <div className="price" style={{ marginTop: "20px" }}>
  75. <NumberFormat
  76. style={{ color: "#EB1928" }}
  77. displayType={'text'}
  78. prefix={'%'}
  79. decimalScale={2}
  80. value={data.discount * 100}
  81. />
  82. <NumberFormat value={data.product_otrs[0].price} displayType={'text'} thousandSeparator={true} prefix={'Rp.'} />
  83. </div>
  84. </h5> */}
  85. {/* <p>{this.state.selectedOption}</p> */}
  86. {/* <ul className="rating">
  87. <li><i className="flaticon-star-1"></i></li>
  88. <li><i className="flaticon-star-1"></i></li>
  89. <li><i className="flaticon-star-1"></i></li>
  90. <li><i className="flaticon-star-1"></i></li>
  91. <li><i className="flaticon-star-1"></i></li>
  92. </ul> */}
  93. {/* <div className="availability">
  94. Availability: <span>{detailproduct.Stock}</span>
  95. </div> */}
  96. <form
  97. onSubmit={async (e) => {
  98. e.preventDefault();
  99. var newformValue = {
  100. ...formValue,
  101. product_name: detailproduct.Name,
  102. // product_img: detailproduct[0].backend.img[0],
  103. }
  104. setFormValue(newformValue)
  105. // console.log(JSON.stringify(newformValue));
  106. const response = await fetch(
  107. "/api/transaction/AddToCart",
  108. {
  109. method: "POST",
  110. headers: {
  111. 'Content-Type': 'application/json'
  112. },
  113. body: JSON.stringify(newformValue),
  114. }
  115. );
  116. if (response.ok) {
  117. var res = await response.json();
  118. // console.log("cek response :", res);
  119. if (res["STATUS"] === 1) {
  120. res["DATA"]["cart"];
  121. swal("Produk Berhasil Ditambah ke Keranjang", "Silahkan Cek Keranjang Belanja Anda", "success");
  122. router.push("/yamaha/Shop/Cart");
  123. }
  124. else {
  125. swal("Produk Gagal Ditambah ke Keranjang", "Silahkan Coba Lagi", "error");
  126. }
  127. } else {
  128. swal("Transaksi Gagal", "Silahkan Coba Lagi", "error");
  129. }
  130. return false;
  131. }}
  132. >
  133. {
  134. (detailproduct.Product_prices.data&&detailproduct.Product_prices.data.length>0)
  135. ?(
  136. <>
  137. <br />
  138. <label>Harga Product per Daerah <span className="required">*</span></label>
  139. <div className="select-box" placeholder="Pilih Harga OTR">
  140. <select className="form-select"
  141. name="product_otr"
  142. onInput={(e) => {
  143. setFormValue({
  144. ...formValue,
  145. product_price: e.target.value.toString(),
  146. })
  147. }}
  148. onChange={e => setProductOTR(e.target.value)}
  149. >
  150. <option value="-">- Harga per Daerah -</option>
  151. {
  152. (detailproduct.Product_prices.data.length>1)
  153. ?detailproduct.Product_prices.data.map((option,idx) => (
  154. <option key={idx} value={option.attributes.Price}>{(option.attributes.region.data)?option.attributes.region.data.attributes.Name:''}</option>
  155. ))
  156. :<option selected value={detailproduct.Product_prices.data[0].attributes.Price}>{(detailproduct.Product_prices.data[0].attributes.region.data)?detailproduct.Product_prices.data[0].attributes.region.data.attributes.Name:''}</option>
  157. }
  158. </select>
  159. </div>
  160. </>
  161. )
  162. :""
  163. }
  164. {
  165. (detailproduct.Product_parts.data&&detailproduct.Product_parts.data.length>0)
  166. ?(
  167. <>
  168. <br />
  169. <label>Sub-parts<span className="required">*</span></label>
  170. <div className="select-box" placeholder="Pilih Warna">
  171. <select className="form-select"
  172. name="product_parts"
  173. onChange={e => setProductOTR(e.target.value)}
  174. onInput={(e) => {
  175. setFormValue({
  176. ...formValue,
  177. product_parts: e.target.value.toString()
  178. })
  179. }}
  180. >
  181. <option value="0">- Pilih Parts -</option>
  182. {detailproduct.Product_parts.data.map((option,idx) => (
  183. <option key={idx} value={(option.attributes.Product_prices.data&& option.attributes.Product_prices.data.length>0)?option.attributes.Product_prices.data[0].attributes.Price:'-'}>{option.attributes.Name}({option.attributes.Part_Code})</option>
  184. ))}
  185. </select>
  186. </div>
  187. </>
  188. )
  189. :""
  190. }
  191. {
  192. (detailproduct.Product_colors.data&&detailproduct.Product_colors.data.length>0)
  193. ?(
  194. <>
  195. <br />
  196. <label>Tersedia dalam warna</label>
  197. <br/>
  198. {detailproduct.Product_colors.data.map((option,idx) => (
  199. <span key={idx}>{option.attributes.Color}{(idx==detailproduct.Product_colors.data.length-1)?'':','} </span>
  200. ))}
  201. </>
  202. )
  203. :""
  204. }
  205. {/* <label>Warna Product<span className="required">*</span></label>
  206. <div className="select-box" placeholder="Pilih Warna">
  207. <select className="form-select"
  208. name="product_color"
  209. onInput={(e) => {
  210. setFormValue({
  211. ...formValue,
  212. product_color: e.target.value.toString()
  213. })
  214. }}
  215. >
  216. <option value="0">- Pilih Product Color -</option>
  217. {detailproduct.Product_colors.data.map((option) => (
  218. <option value={option.attributes.Color}>{option.attributes.Color}</option>
  219. ))}
  220. </select>
  221. </div> */}
  222. <br />
  223. {/* <button type="submit">Add to Cart</button> */}
  224. {/*
  225. <a className="add-to-wishlist-btn" title="Add to Wishlist">
  226. <Icon.Heart />
  227. </a> */}
  228. </form>
  229. {/* <div className="custom-payment-options">
  230. <span>Metode Pembayaran : </span>
  231. <div className="payment-methods">
  232. <img src="/images/payment-image/Mastercard.svg" width="50px" alt="image" />
  233. <img src="/images/payment-image/Visa.svg" width="50px" alt="image" />
  234. <img src="/images/payment-image/BNI.svg" width="50px" alt="image" />
  235. <img src="/images/payment-image/BCA.svg" width="50px" alt="image" />
  236. <img src="/images/payment-image/Mandiri.svg" width="50px" alt="image" />
  237. <img src="/images/payment-image/BSI.svg" width="50px" alt="image" />
  238. <img src="/images/payment-image/Indomaret.svg" width="50px" alt="image" />
  239. </div>
  240. </div> */}
  241. {/* <div className="products-share-social">
  242. <span>Share:</span>
  243. <ul>
  244. <li>
  245. <a className="facebook" target="_blank">
  246. <Icon.Facebook />
  247. </a>
  248. </li>
  249. <li>
  250. <a className="twitter" target="_blank">
  251. <Icon.Twitter />
  252. </a>
  253. </li>
  254. <li>
  255. <a className="instagram" target="_blank">
  256. <Icon.Instagram />
  257. </a>
  258. </li>
  259. </ul>
  260. </div> */}
  261. </div>
  262. </div>
  263. <div className="col-lg-12 col-md-12">
  264. <div className="products-details-tabs">
  265. <Tabs>
  266. <TabList>
  267. <Tab>Deskripsi</Tab>
  268. {/* <Tab>Info Penting</Tab> */}
  269. {
  270. (detailproduct.Category.data && detailproduct.Category.data.attributes.Name == "Unit")
  271. ? <Tab>Spesifikasi</Tab>
  272. : ""
  273. }
  274. {/* <Tab>Review</Tab> */}
  275. </TabList>
  276. <TabPanel>
  277. <div className="products-description" align="left">
  278. <p>{util.htmlParse(detailproduct.Description)}</p>
  279. </div>
  280. </TabPanel>
  281. {/* <TabPanel>
  282. <div className="products-description" align="left">
  283. <p>
  284. <p><b>Informasi mengenai prosedur pengiriman, pembelian dan dokumen</b></p>
  285. <ul>
  286. <li>Kota Palembang, Kayu Agung, Prabumulih, Pangkalan Balai, Betung : 2-3 hari kerja*</li>
  287. <li>Untuk daerah Sungsang/daerah lain yang menggunakan kapal motor, maka motor diantar sampai di dermaga sesuai dengan jadwal yang diinformasikan</li>
  288. <li>Sekayu, Babat Toman, Pendopo, Baturaja, Martapura, Muara Dua, Lahat, Tanjung Enim, Tugu Mulyo, Belitang : 4-5 hari kerja*</li>
  289. <li>Lubuk Linggau, Curup, Pagar Alam : 6-7 hari kerja*</li>
  290. </ul>
  291. <p><b>Harga</b></p>
  292. <ul>
  293. <li>Harga OTR sudah termasuk biaya pengiriman dan BBN, kecuali tambahan pengenaan pajak progresif kepemilikan kendaraan bermotor (sesuai dengan peraturan yang telah ditetapkan oleh pemerintah)</li>
  294. <li>Harga OTR diatas berlaku untuk KTP domisili PALEMBANG, OGAN ILIR, dan BANYUASIN, diluar wilayah tersebut harap menghubungi kami untuk konfirmasi harga.</li>
  295. <li>Harga OTR sewaktu-waktu dapat berubah.</li>
  296. <li>Proses pemesanan sepeda motor tidak dapat dibatalkan dan warna yang sudah dipesan tidak dapat diubah.</li>
  297. <li>Proses pemesanan yang terkait waktu pengiriman produk dan kelengkapan dokumen yang dibutuhkan untuk pembuatan STNK dan BPKB akan diinformasikan oleh pihak Dealer.</li>
  298. <li>Proses pengiriman sepeda motor akan dilakukan setelah pelunasan transaksi dan dokumen yang dibutuhkan telah lengkap.</li>
  299. </ul>
  300. <p><b>Dokumen</b></p>
  301. <ul>
  302. <li>Proses pembuatan STNK setelah KTP diterima oleh pihak dealer adalah 19-25 hari kerja*.</li>
  303. <li>Proses pembuatan BPKB adalah 3-4 bulan.</li>
  304. <li>STNK dan BPKB wajib diambil sendiri oleh pihak yang bersangkutan sesuai dengan identitas yang tertera STNK di dealer yang ditunjuk.</li>
  305. <li>Untuk proses pembuatan STNK dan BPKB sepenuhnya menjadi tanggung jawab dealer terkait.</li>
  306. <li>Buku servis diterima bersamaan dengan pengiriman sepeda motor.</li>
  307. </ul>
  308. <p><b>*tidak termasuk Sabtu dan Minggu.</b></p>
  309. </p>
  310. </div>
  311. </TabPanel> */}
  312. <TabPanel>
  313. <div className="products-description">
  314. <ul className="additional-information">
  315. <h2>Spesifikasi Mesin</h2>
  316. {util.htmlParse(detailproduct.Machine)}<br /><br />
  317. <h2>Spesifikasi Dimensi</h2>
  318. {util.htmlParse(detailproduct.Dimension)}<br /><br />
  319. <h2>Spesifikasi Rangka</h2>
  320. {util.htmlParse(detailproduct.Structure)}<br /><br />
  321. <h2>Spesifikasi Kelistrikan</h2>
  322. {util.htmlParse(detailproduct.Voltage)}<br /><br />
  323. </ul>
  324. </div>
  325. </TabPanel>
  326. {/* <TabPanel>
  327. <div className="products-reviews">
  328. <h3>Customer Reviews</h3>
  329. <p>There are no reviews yet.</p>
  330. <form className="review-form">
  331. <p>Rate this item:</p>
  332. <div className="star-rating">
  333. <i className='bx bxs-star'></i>
  334. <i className='bx bxs-star'></i>
  335. <i className='bx bxs-star'></i>
  336. <i className='bx bxs-star'></i>
  337. <i className='bx bxs-star'></i>
  338. <p>Very good product!</p>
  339. </div>
  340. <div className="row">
  341. <div className="col-lg-12">
  342. <div className="form-group">
  343. <textarea name="review-message" id="message" cols="30" rows="4" placeholder="Write your review*" className="form-control"></textarea>
  344. </div>
  345. </div>
  346. <div className="col-lg-6 col-md-6">
  347. <div className="form-group">
  348. <input type="text" placeholder="Name*" className="form-control" />
  349. </div>
  350. </div>
  351. <div className="col-lg-6 col-md-6">
  352. <div className="form-group">
  353. <input type="email" placeholder="Email*" className="form-control" />
  354. </div>
  355. </div>
  356. <div className="col-lg-12 col-md-12">
  357. <button type="submit" className="btn btn-primary">Submit</button>
  358. </div>
  359. </div>
  360. </form>
  361. </div>
  362. </TabPanel> */}
  363. </Tabs>
  364. </div>
  365. </div>
  366. </div>
  367. </div>
  368. </div>
  369. </>
  370. )
  371. }
  372. export default ProductDetails;