summaryrefslogtreecommitdiff
path: root/src/pages
diff options
context:
space:
mode:
authorRafi Zadanly <rafizadanly@gmail.com>2022-12-01 16:26:21 +0700
committerRafi Zadanly <rafizadanly@gmail.com>2022-12-01 16:26:21 +0700
commit0a0c497204acbac562700d80f38e74aa9ffcd94e (patch)
tree3c2387091b0733d33754fbc07d843f2deef2fa9e /src/pages
parent9e1321f7e35a58ba8ce136401a217d835aef15f0 (diff)
dynamic filter, dynamic pagination, detail brand, to title case
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/index.js18
-rw-r--r--src/pages/shop/brands.js12
-rw-r--r--src/pages/shop/brands/[slug].js122
-rw-r--r--src/pages/shop/product/[slug].js10
-rw-r--r--src/pages/shop/search.js3
5 files changed, 138 insertions, 27 deletions
diff --git a/src/pages/index.js b/src/pages/index.js
index 95d9161f..ee746519 100644
--- a/src/pages/index.js
+++ b/src/pages/index.js
@@ -10,6 +10,8 @@ import "swiper/css/pagination";
import "swiper/css/autoplay";
import ProductSlider from "../components/product/ProductSlider";
import Layout from "../components/Layout";
+import axios from "axios";
+import ManufactureCard from "../components/ManufactureCard";
export default function Home() {
const [heroBanners, setHeroBanners] = useState(null);
@@ -37,8 +39,8 @@ export default function Home() {
getReadyStockProducts();
const getPopularProducts = async () => {
- const dataPopularProducts = await apiOdoo('GET', `/api/v1/product?manufactures=10&limit=30`);
- setPopularProducts(dataPopularProducts);
+ const dataPopularProducts = await axios(`${process.env.SELF_HOST}/api/shop/search?q=*&page=1&order_by=popular`);
+ setPopularProducts(dataPopularProducts.data.response);
}
getPopularProducts();
}, []);
@@ -62,22 +64,20 @@ export default function Home() {
{
manufactures?.manufactures?.map((manufacture, index) => (
<SwiperSlide key={index}>
- <div className="border border-gray-300 p-1 rounded h-full bg-white">
- <LazyLoadImage effect="blur" src={manufacture.logo} alt={manufacture.name} className="w-full h-full object-contain object-center" />
- </div>
+ <ManufactureCard data={manufacture} key={index} />
</SwiperSlide>
))
}
</Swiper>
</div>
<div className="mt-6 px-4 mb-6">
- <h2 className="text-gray-900 font-bold mb-3">Produk Ready Stock</h2>
- <ProductSlider products={readyStockProducts} />
- </div>
- <div className="mt-6 px-4 mb-6">
<h2 className="text-gray-900 font-bold mb-3">Produk Populer</h2>
<ProductSlider products={popularProducts} />
</div>
+ <div className="mt-6 px-4 mb-6">
+ <h2 className="text-gray-900 font-bold mb-3">Produk Ready Stock</h2>
+ <ProductSlider products={readyStockProducts} />
+ </div>
</Layout>
</>
)
diff --git a/src/pages/shop/brands.js b/src/pages/shop/brands.js
index 5d93bf4b..6c1f1816 100644
--- a/src/pages/shop/brands.js
+++ b/src/pages/shop/brands.js
@@ -1,13 +1,10 @@
-import { LazyLoadImage } from "react-lazy-load-image-component";
import Header from "../../components/Header";
import apiOdoo from "../../helpers/apiOdoo";
-import "react-lazy-load-image-component/src/effects/blur.css";
-import Link from "../../components/Link";
-import { createSlug } from "../../helpers/slug";
import InfiniteScroll from "react-infinite-scroll-component";
import { useEffect, useState } from "react";
import Spinner from "../../components/Spinner";
import Layout from "../../components/Layout";
+import ManufactureCard from "../../components/ManufactureCard";
export async function getServerSideProps() {
let initialManufactures = await apiOdoo('GET', '/api/v1/manufacture?limit=31');
@@ -24,7 +21,6 @@ export default function Brands({ initialManufactures }) {
const getMoreManufactures = async () => {
const name = manufactureStartwith != '' ? `${manufactureStartwith}%` : '';
- console.log(manufactures, manufactures.length);
const result = await apiOdoo('GET', `/api/v1/manufacture?limit=30&offset=${manufactures.length}&name=${name}`);
setHasMoreManufacture(manufactures.length + 30 < result.manufacture_total)
setManufactures((manufactures) => [...manufactures, ...result.manufactures]);
@@ -69,11 +65,7 @@ export default function Brands({ initialManufactures }) {
>
{manufactures?.map((manufacture, index) => (
manufacture.name ? (
- <Link href={`/shop/brands/${createSlug(manufacture.name, manufacture.id)}`} className="flex justify-center items-center border border-gray-300 p-1 rounded h-16 text-gray-800 text-sm text-center bg-white" key={index}>
- {manufacture.logo ? (
- <LazyLoadImage effect="blur" src={manufacture.logo} alt={manufacture.name || ''} className="w-full max-h-full object-contain object-center" />
- ) : manufacture.name}
- </Link>
+ <ManufactureCard data={manufacture} key={index} />
) : ''
))}
</InfiniteScroll>
diff --git a/src/pages/shop/brands/[slug].js b/src/pages/shop/brands/[slug].js
new file mode 100644
index 00000000..b532e7a7
--- /dev/null
+++ b/src/pages/shop/brands/[slug].js
@@ -0,0 +1,122 @@
+import axios from "axios";
+import { useState } from "react";
+import Filter from "../../../components/Filter";
+import Header from "../../../components/Header";
+import Layout from "../../../components/Layout";
+import Pagination from "../../../components/Pagination";
+import ProductCard from "../../../components/ProductCard";
+import { getNameFromSlug } from "../../../helpers/slug";
+import FilterIcon from "../../../icons/filter.svg";
+
+export async function getServerSideProps(context) {
+ const {
+ slug,
+ page = 1,
+ category = '',
+ price_from = '0',
+ price_to = '0',
+ order_by = '',
+ } = context.query;
+
+ let urlParameter = [
+ 'q=*',
+ `page=${page}`,
+ `brand=${getNameFromSlug(slug)}`,
+ `category=${category}`,
+ `price_from=${price_from}`,
+ `price_to=${price_to}`,
+ `order_by=${order_by}`
+ ].join('&');
+ let searchResults = await axios(`${process.env.SELF_HOST}/api/shop/search?${urlParameter}`);
+ searchResults = searchResults.data;
+
+ return {
+ props: {
+ searchResults,
+ page,
+ slug,
+ category,
+ price_from,
+ price_to,
+ order_by
+ }
+ };
+}
+
+export default function BrandDetail({
+ searchResults,
+ page,
+ slug,
+ category,
+ price_from,
+ price_to,
+ order_by
+}) {
+ const pageCount = Math.ceil(searchResults.response.numFound / searchResults.responseHeader.params.rows);
+ const productStart = searchResults.responseHeader.params.start;
+ const productRows = searchResults.responseHeader.params.rows;
+ const productFound = searchResults.response.numFound;
+
+ const [activeFilter, setActiveFilter] = useState(false);
+
+ const route = () => {
+ let route = `/shop/brands/${slug}`;
+ if (category) route += `&category=${category}`;
+ if (price_from > 0) route += `&price_from=${price_from}`;
+ if (price_to > 0) route += `&price_to=${price_to}`;
+ if (order_by) route += `&order_by=${order_by}`;
+ return route;
+ }
+
+ return (
+ <>
+ <Header title={`Distributor ${getNameFromSlug(slug)} Indonesia Harga Official - Indoteknik`} />
+ <Filter
+ defaultRoute={`/shop/brands/${slug}`}
+ isActive={activeFilter}
+ closeFilter={() => setActiveFilter(false)}
+ defaultPriceFrom={price_from}
+ defaultPriceTo={price_to}
+ defaultBrand=''
+ defaultCategory={category}
+ defaultOrderBy={order_by}
+ searchResults={searchResults}
+ disableFilter={['brand']}
+ />
+ <Layout>
+ <div className="p-4">
+ <button className="btn-light py-2 flex items-center gap-x-2 mb-2" onClick={() => setActiveFilter(true)}>
+ <FilterIcon className="w-4 h-4" /> <span>Filter</span>
+ </button>
+ <h1>Produk</h1>
+ <div className="text-sm mb-4">
+ {productFound > 0 ? (
+ <>
+ Menampilkan&nbsp;
+ {pageCount > 1 ? (
+ <>
+ {productStart + 1}-{
+ (productStart + productRows) > productFound ? productFound : productStart + productRows
+ }
+ &nbsp;dari&nbsp;
+ </>
+ ) : ''}
+ {searchResults.response.numFound}
+ &nbsp;produk untuk brand <span className="font-semibold">{getNameFromSlug(slug)}</span>
+ </>
+ ) : 'Mungkin yang anda cari'}
+ </div>
+ <div className="grid grid-cols-2 gap-3">
+ {searchResults.response.products.map((product) => (
+ <ProductCard key={product.id} data={product} />
+ ))}
+ </div>
+
+ <div className="mt-4">
+ <Pagination pageCount={pageCount} currentPage={parseInt(page)} url={route()} />
+ </div>
+ </div>
+ </Layout>
+ </>
+ )
+} \ No newline at end of file
diff --git a/src/pages/shop/product/[slug].js b/src/pages/shop/product/[slug].js
index 598330f4..dd554660 100644
--- a/src/pages/shop/product/[slug].js
+++ b/src/pages/shop/product/[slug].js
@@ -3,23 +3,23 @@ import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import Header from "../../../components/Header";
import apiOdoo from "../../../helpers/apiOdoo";
-import { createSlug, getId } from "../../../helpers/slug";
+import { createSlug, getIdFromSlug } from "../../../helpers/slug";
import currencyFormat from "../../../helpers/currencyFormat";
import { LazyLoadImage } from "react-lazy-load-image-component";
import "react-lazy-load-image-component/src/effects/blur.css";
import ProductSlider from "../../../components/product/ProductSlider";
import Layout from "../../../components/Layout";
-export async function getServerSideProps(context) {
+export async function getServerSideProps( context ) {
const { slug } = context.query;
- let product = await apiOdoo('GET', '/api/v1/product/' + getId(slug));
+ let product = await apiOdoo('GET', '/api/v1/product/' + getIdFromSlug(slug));
if (product.length == 1) {
product = product[0];
}
return {props: {product}};
}
-export default function ProductDetail({product}) {
+export default function ProductDetail({ product }) {
const router = useRouter();
const { slug } = router.query;
const [selectedVariant, setSelectedVariant] = useState("");
@@ -43,7 +43,7 @@ export default function ProductDetail({product}) {
useEffect(() => {
setSimilarProducts(null);
const getSimilarProducts = async () => {
- const dataSimilarProducts = await apiOdoo('GET', `/api/v1/product/${getId(slug)}/similar?limit=20`);
+ const dataSimilarProducts = await apiOdoo('GET', `/api/v1/product/${getIdFromSlug(slug)}/similar?limit=20`);
setSimilarProducts(dataSimilarProducts);
}
if (slug) getSimilarProducts();
diff --git a/src/pages/shop/search.js b/src/pages/shop/search.js
index 6b24f2a9..2ae3cca4 100644
--- a/src/pages/shop/search.js
+++ b/src/pages/shop/search.js
@@ -6,7 +6,6 @@ import ProductCard from "../../components/ProductCard";
import FilterIcon from "../../icons/filter.svg";
import { useState } from "react";
import Filter from "../../components/Filter";
-import { useRouter } from "next/router";
export async function getServerSideProps(context) {
const {
@@ -42,8 +41,6 @@ export default function ShopSearch({
price_to,
order_by
}) {
- const router = useRouter();
-
const pageCount = Math.ceil(searchResults.response.numFound / searchResults.responseHeader.params.rows);
const productStart = searchResults.responseHeader.params.start;
const productRows = searchResults.responseHeader.params.rows;