From f99e0aba70efad0deb907d8e27f09fc9f527c8a4 Mon Sep 17 00:00:00 2001 From: Rafi Zadanly Date: Fri, 17 Feb 2023 17:07:50 +0700 Subject: Refactor --- src/pages/404.js | 27 --- src/pages/_app.js | 31 ---- src/pages/_app.jsx | 36 ++++ src/pages/_error.js | 11 -- src/pages/activate.js | 111 ------------ src/pages/api/activation-request.js | 31 ---- src/pages/api/activation.js | 16 -- src/pages/api/login.js | 15 -- src/pages/api/register.js | 15 -- src/pages/api/shop/search.js | 80 ++++----- src/pages/api/shop/suggest.js | 9 +- src/pages/api/token.js | 10 -- src/pages/faqs.js | 91 ---------- src/pages/index.js | 106 ------------ src/pages/index.jsx | 20 +++ src/pages/login.js | 97 ----------- src/pages/logout.js | 14 -- src/pages/my/address/[id]/edit.js | 249 --------------------------- src/pages/my/address/create.js | 234 -------------------------- src/pages/my/address/index.js | 84 ---------- src/pages/my/invoice/[id].js | 149 ----------------- src/pages/my/invoices.js | 180 -------------------- src/pages/my/menu.js | 82 --------- src/pages/my/profile.js | 134 --------------- src/pages/my/transaction/[id].js | 265 ----------------------------- src/pages/my/transactions.js | 198 ---------------------- src/pages/my/wishlist.js | 60 ------- src/pages/register.js | 100 ----------- src/pages/shop/brands/[slug].js | 178 -------------------- src/pages/shop/brands/[slug].jsx | 23 +++ src/pages/shop/brands/index.js | 79 --------- src/pages/shop/cart.js | 282 ------------------------------- src/pages/shop/cart.jsx | 10 ++ src/pages/shop/checkout/finish.js | 47 ------ src/pages/shop/checkout/index.js | 325 ------------------------------------ src/pages/shop/product/[slug].js | 305 --------------------------------- src/pages/shop/product/[slug].jsx | 29 ++++ src/pages/shop/quotation/finish.js | 39 ----- src/pages/shop/quotation/index.js | 140 ---------------- src/pages/shop/search.js | 125 -------------- src/pages/shop/search.jsx | 19 +++ 41 files changed, 184 insertions(+), 3872 deletions(-) delete mode 100644 src/pages/404.js delete mode 100644 src/pages/_app.js create mode 100644 src/pages/_app.jsx delete mode 100644 src/pages/_error.js delete mode 100644 src/pages/activate.js delete mode 100644 src/pages/api/activation-request.js delete mode 100644 src/pages/api/activation.js delete mode 100644 src/pages/api/login.js delete mode 100644 src/pages/api/register.js delete mode 100644 src/pages/api/token.js delete mode 100644 src/pages/faqs.js delete mode 100644 src/pages/index.js create mode 100644 src/pages/index.jsx delete mode 100644 src/pages/login.js delete mode 100644 src/pages/logout.js delete mode 100644 src/pages/my/address/[id]/edit.js delete mode 100644 src/pages/my/address/create.js delete mode 100644 src/pages/my/address/index.js delete mode 100644 src/pages/my/invoice/[id].js delete mode 100644 src/pages/my/invoices.js delete mode 100644 src/pages/my/menu.js delete mode 100644 src/pages/my/profile.js delete mode 100644 src/pages/my/transaction/[id].js delete mode 100644 src/pages/my/transactions.js delete mode 100644 src/pages/my/wishlist.js delete mode 100644 src/pages/register.js delete mode 100644 src/pages/shop/brands/[slug].js create mode 100644 src/pages/shop/brands/[slug].jsx delete mode 100644 src/pages/shop/brands/index.js delete mode 100644 src/pages/shop/cart.js create mode 100644 src/pages/shop/cart.jsx delete mode 100644 src/pages/shop/checkout/finish.js delete mode 100644 src/pages/shop/checkout/index.js delete mode 100644 src/pages/shop/product/[slug].js create mode 100644 src/pages/shop/product/[slug].jsx delete mode 100644 src/pages/shop/quotation/finish.js delete mode 100644 src/pages/shop/quotation/index.js delete mode 100644 src/pages/shop/search.js create mode 100644 src/pages/shop/search.jsx (limited to 'src/pages') diff --git a/src/pages/404.js b/src/pages/404.js deleted file mode 100644 index 1e1850f2..00000000 --- a/src/pages/404.js +++ /dev/null @@ -1,27 +0,0 @@ -import Image from "next/image"; -import Link from "@/components/elements/Link"; -import Header from "@/components/layouts/Header"; -import Layout from "@/components/layouts/Layout"; -import PageNotFoundImage from "../images/page-not-found.png"; - -export default function PageNotFound() { - return ( - <> -
- -
- Halaman Tidak Ditemukan - Indoteknik -

Halaman tidak ditemukan

-
- - Kembali ke beranda - - - Tanya admin - -
-
-
- - ); -} \ No newline at end of file diff --git a/src/pages/_app.js b/src/pages/_app.js deleted file mode 100644 index 6a40f4e6..00000000 --- a/src/pages/_app.js +++ /dev/null @@ -1,31 +0,0 @@ -import '../styles/globals.css'; -import NextProgress from 'next-progress'; -import { useRouter } from 'next/router'; -import { AnimatePresence } from 'framer-motion'; -import { Toaster } from "react-hot-toast"; - -function MyApp({ Component, pageProps }) { - const router = useRouter(); - - return ( - <> - - - window.scrollTo(0, 0)} - > - - - - ) -} - -export default MyApp diff --git a/src/pages/_app.jsx b/src/pages/_app.jsx new file mode 100644 index 00000000..33573480 --- /dev/null +++ b/src/pages/_app.jsx @@ -0,0 +1,36 @@ +import '../styles/globals.css' +import NextProgress from 'next-progress' +import { useRouter } from 'next/router' +import { AnimatePresence } from 'framer-motion' +import { Toaster } from "react-hot-toast" +import { QueryClient, QueryClientProvider } from 'react-query' + +const queryClient = new QueryClient() + +function MyApp({ Component, pageProps }) { + const router = useRouter() + + return ( + <> + + + + window.scrollTo(0, 0)} + > + + + + + ) +} + +export default MyApp diff --git a/src/pages/_error.js b/src/pages/_error.js deleted file mode 100644 index 107ddf46..00000000 --- a/src/pages/_error.js +++ /dev/null @@ -1,11 +0,0 @@ -import Header from "@/components/layouts/Header"; -import Layout from "@/components/layouts/Layout"; - -export default function Error() { - return ( - -
- - - ); -} \ No newline at end of file diff --git a/src/pages/activate.js b/src/pages/activate.js deleted file mode 100644 index d9b41bf4..00000000 --- a/src/pages/activate.js +++ /dev/null @@ -1,111 +0,0 @@ -import axios from "axios"; -import Head from "next/head"; -import Image from "next/image"; -import Link from "@/components/elements/Link"; -import { useRouter } from "next/router"; -import { useEffect, useState } from "react"; -import Alert from "@/components/elements/Alert"; -import Layout from "@/components/layouts/Layout"; -import Spinner from "@/components/elements/Spinner"; -import { setAuth } from "@/core/utils/auth"; -import Logo from "@/images/logo.png"; - -export default function Activate() { - const [email, setEmail] = useState(''); - const [isInputFulfilled, setIsInputFulfilled] = useState(false); - const [isLoading, setIsLoading] = useState(false); - const [alert, setAlert] = useState(); - const router = useRouter(); - const { token } = router.query; - - useEffect(() => { - if (router.query.email) setEmail(router.query.email); - }, [router]) - - useEffect(() => { - const activateIfTokenExist = async () => { - if (token) { - let activation = await axios.post(`${process.env.SELF_HOST}/api/activation`, {token}); - if (activation.data.activation) { - setAuth(activation.data.user); - setAlert({ - component: <>Selamat, akun anda berhasil diaktifkan, kembali ke beranda., - type: 'success' - }); - } else { - setAlert({ - component: <>Mohon maaf token sudah tidak aktif, lakukan permintaan aktivasi akun kembali atau masuk jika sudah memiliki akun., - type: 'info' - }); - } - } - } - activateIfTokenExist(); - }, [token]); - - useEffect(() => { - setIsInputFulfilled(email != ''); - }, [email]); - - const activationRequest = async (e) => { - e.preventDefault(); - setIsLoading(true); - let activationRequest = await axios.post(`${process.env.SELF_HOST}/api/activation-request`, {email}); - if (activationRequest.data.activation_request) { - setAlert({ - component: <>Mohon cek email anda untuk aktivasi akun Indoteknik, - type: 'success' - }); - } else { - switch (activationRequest.data.reason) { - case 'NOT_FOUND': - setAlert({ - component: <>Email tersebut belum terdaftar, daftar sekarang., - type: 'info' - }); - break; - case 'ACTIVE': - setAlert({ - component: <>Email tersebut sudah terdaftar dan sudah aktif, masuk sekarang., - type: 'info' - }); - break; - } - } - setIsLoading(false); - } - return ( - <> - - Aktivasi Akun Indoteknik - - - - Logo Indoteknik - -

Aktivasi Akun Indoteknik Anda

-

Link aktivasi akan dikirimkan melalui email

- {alert ? ( - {alert.component} - ) : ''} -
- setEmail(e.target.value)} - autoFocus - /> - -
-
- - ) -} \ No newline at end of file diff --git a/src/pages/api/activation-request.js b/src/pages/api/activation-request.js deleted file mode 100644 index 3f33875c..00000000 --- a/src/pages/api/activation-request.js +++ /dev/null @@ -1,31 +0,0 @@ -import apiOdoo from "@/core/utils/apiOdoo"; -import mailer from "@/core/utils/mailer"; - -export default async function handler(req, res) { - try { - const { email } = req.body; - let result = await apiOdoo( - 'POST', - '/api/v1/user/activation-request', - {email} - ); - if (result.activation_request) { - mailer.sendMail({ - from: 'sales@indoteknik.com', - to: result.user.email, - subject: 'Permintaan Aktivasi Akun Indoteknik', - html: ` -

Permintaan Aktivasi Akun Indoteknik

-
-

Aktivasi akun anda melalui link berikut: Aktivasi Akun

- ` - }); - } - delete result.user; - delete result.token; - res.status(200).json(result); - } catch (error) { - console.log(error); - res.status(400).json({ error: error.message }); - } -} \ No newline at end of file diff --git a/src/pages/api/activation.js b/src/pages/api/activation.js deleted file mode 100644 index 8b22af8d..00000000 --- a/src/pages/api/activation.js +++ /dev/null @@ -1,16 +0,0 @@ -import apiOdoo from "@/core/utils/apiOdoo"; - -export default async function handler(req, res) { - try { - const { token } = req.body; - let result = await apiOdoo( - 'POST', - '/api/v1/user/activation', - {token} - ); - res.status(200).json(result); - } catch (error) { - console.log(error); - res.status(400).json({ error: error.message }); - } -} \ No newline at end of file diff --git a/src/pages/api/login.js b/src/pages/api/login.js deleted file mode 100644 index e02a73cb..00000000 --- a/src/pages/api/login.js +++ /dev/null @@ -1,15 +0,0 @@ -import apiOdoo from "@/core/utils/apiOdoo"; - -export default async function handler(req, res) { - try { - const { email, password } = req.body; - let result = await apiOdoo( - 'POST', - '/api/v1/user/login', - {email, password} - ); - res.status(200).json(result); - } catch (error) { - res.status(400).json({ error: error.message }); - } -} \ No newline at end of file diff --git a/src/pages/api/register.js b/src/pages/api/register.js deleted file mode 100644 index 7c8d8b39..00000000 --- a/src/pages/api/register.js +++ /dev/null @@ -1,15 +0,0 @@ -import apiOdoo from "@/core/utils/apiOdoo"; - -export default async function handler(req, res) { - try { - const { email, name, password } = req.body; - let result = await apiOdoo( - 'POST', - '/api/v1/user/register', - {email, name, password} - ); - res.status(200).json(result); - } catch (error) { - res.status(400).json({ error: error.message }); - } -} \ No newline at end of file diff --git a/src/pages/api/shop/search.js b/src/pages/api/shop/search.js index ad986c86..5e5f1b6a 100644 --- a/src/pages/api/shop/search.js +++ b/src/pages/api/shop/search.js @@ -1,4 +1,5 @@ -import axios from "axios"; +import axios from "axios" +import camelcaseObjectDeep from "camelcase-object-deep" const productResponseMap = (products) => { return products.map((product) => { @@ -7,23 +8,23 @@ const productResponseMap = (products) => { image: product.image ? product.image[0] : '', code: product.default_code ? product.default_code[0] : '', name: product.product_name ? product.product_name[0] : '', - lowest_price: { + lowestPrice: { price: product.price ? product.price[0] : 0, - price_discount: product.price_discount ? product.price_discount[0] : 0, - discount_percentage: product.discount ? product.discount[0] : 0, + priceDiscount: product.price_discount ? product.price_discount[0] : 0, + discountPercentage: product.discount ? product.discount[0] : 0, }, - variant_total: product.variant_total ? product.variant_total[0] : 0, - stock_total: product.stock_total ? product.stock_total[0] : 0, + variantTotal: product.variant_total ? product.variant_total[0] : 0, + stockTotal: product.stock_total ? product.stock_total[0] : 0, weight: product.weight ? product.weight[0] : 0, manufacture: {}, categories: [], - }; + } if (product.manufacture_id && product.brand) { productMapped.manufacture = { id: product.manufacture_id ? product.manufacture_id[0] : '', name: product.brand ? product.brand[0] : '', - }; + } } productMapped.categories = [ @@ -31,41 +32,41 @@ const productResponseMap = (products) => { id: product.category_id ? product.category_id[0] : '', name: product.category_name ? product.category_name[0] : '', } - ]; + ] - return productMapped; - }); + return productMapped + }) } export default async function handler(req, res) { const { - q, + q = '*', page = 1, brand = '', category = '', - price_from = 0, - price_to = 0, - order_by = '' - } = req.query; + priceFrom = 0, + priceTo = 0, + orderBy = '' + } = req.query - let paramOrderBy = ''; - switch (order_by) { + let paramOrderBy = '' + switch (orderBy) { case 'price-asc': - paramOrderBy = ', price_discount ASC'; - break; + paramOrderBy = ', price_discount ASC' + break case 'price-desc': - paramOrderBy = ', price_discount DESC'; - break; + paramOrderBy = ', price_discount DESC' + break case 'popular': - paramOrderBy = ', search_rank DESC'; - break; + paramOrderBy = ', search_rank DESC' + break case 'stock': - paramOrderBy = ', stock_total DESC'; - break; + paramOrderBy = ', stock_total DESC' + break } - let limit = 30; - let offset = (page - 1) * limit; + let limit = 30 + let offset = (page - 1) * limit let parameter = [ `facet.query=${q}`, 'facet=true', @@ -77,20 +78,21 @@ export default async function handler(req, res) { `start=${offset}`, `rows=${limit}`, `sort=product_rating DESC ${paramOrderBy}`, - `fq=price_discount:[${price_from == '' ? '*' : price_from} TO ${price_to == '' ? '*' : price_to}]` - ]; + `fq=price_discount:[${priceFrom == '' ? '*' : priceFrom} TO ${priceTo == '' ? '*' : priceTo}]` + ] - if (brand) parameter.push(`fq=brand:${brand}`); - if (category) parameter.push(`fq=category_name:${category}`); + if (brand) parameter.push(`fq=brand:${brand}`) + if (category) parameter.push(`fq=category_name:${category}`) - let result = await axios(process.env.SOLR_HOST + '/solr/products/select?' + parameter.join('&')); + let result = await axios(process.env.SOLR_HOST + '/solr/products/select?' + parameter.join('&')) try { - result.data.response.products = productResponseMap(result.data.response.docs); - result.data.responseHeader.params.start = parseInt(result.data.responseHeader.params.start); - result.data.responseHeader.params.rows = parseInt(result.data.responseHeader.params.rows); - delete result.data.response.docs; - res.status(200).json(result.data); + result.data.response.products = productResponseMap(result.data.response.docs) + result.data.responseHeader.params.start = parseInt(result.data.responseHeader.params.start) + result.data.responseHeader.params.rows = parseInt(result.data.responseHeader.params.rows) + delete result.data.response.docs + result.data = camelcaseObjectDeep(result.data) + res.status(200).json(result.data) } catch (error) { - res.status(400).json({ error: error.message }); + res.status(400).json({ error: error.message }) } } \ No newline at end of file diff --git a/src/pages/api/shop/suggest.js b/src/pages/api/shop/suggest.js index 6db1a851..4e373a92 100644 --- a/src/pages/api/shop/suggest.js +++ b/src/pages/api/shop/suggest.js @@ -1,12 +1,15 @@ import axios from "axios"; export default async function handler(req, res) { - const { q } = req.query; + const { q = '' } = req.query; let result = await axios(process.env.SOLR_HOST + `/solr/products/suggest?suggest=true&suggest.dictionary=mySuggester&suggest.q=${q}`); try { - res.status(200).json(result.data); + res.status(200).json(result.data.suggest.mySuggester[q]); } catch (error) { - res.status(400).json({ error: error.message }); + res.status(400).json({ + numFound: 0, + suggestions: [] + }); } } \ No newline at end of file diff --git a/src/pages/api/token.js b/src/pages/api/token.js deleted file mode 100644 index ec048158..00000000 --- a/src/pages/api/token.js +++ /dev/null @@ -1,10 +0,0 @@ -import axios from "axios"; - -export default async function handler(req, res) { - try { - let result = await axios.get(process.env.ODOO_HOST + '/api/token'); - res.status(200).json(result.data.result); - } catch (error) { - res.status(400).json({ error: error.message }); - } -} \ No newline at end of file diff --git a/src/pages/faqs.js b/src/pages/faqs.js deleted file mode 100644 index cdb8ef52..00000000 --- a/src/pages/faqs.js +++ /dev/null @@ -1,91 +0,0 @@ -import AppBar from "@/components/layouts/AppBar"; -import Layout from "@/components/layouts/Layout"; -import { ChevronDownIcon, ChevronUpIcon } from "@heroicons/react/24/outline"; -import { useEffect, useState } from "react"; - -const dataFaqs = [ - { - id: 1, - name: 'Akun', - description: 'Bantuan tentang pengelolaan fitur dan akun' - }, - { - id: 2, - name: 'Pembelian', - description: 'Bantuan seputar status stock, layanan pengiriman & asuransi hingga seluruh indonesia' - }, - { - id: 3, - name: 'Metode Pembayaran', - description: 'Bantuan terkait layanan metode pembayaran' - }, - { - id: 4, - name: 'Quotation', - description: 'Bantuan fitur RFQ & quotation Express' - }, - { - id: 5, - name: 'Faktur Pajak & Invoice', - description: 'Bantuan seputar layanan terbit faktur pajak & invoice' - }, - { - id: 6, - name: 'Pengembalian & Garansi', - description: 'Bantuan cara pengembalian produk & garansi produk' - } -]; - -export default function Faqs() { - const [ faqs, setFaqs ] = useState([]); - - useEffect(() => { - if (faqs.length == 0) { - setFaqs(dataFaqs.map((dataFaq) => ({ - ...dataFaq, - isOpen: false - }))); - } - }, [ faqs ]); - - const toggleFaq = (id) => { - const faqsToUpdate = faqs.map(faq => { - if (faq.id == id) faq.isOpen = !faq.isOpen; - return faq; - }); - setFaqs(faqsToUpdate); - }; - - return ( - - - -
- { faqs.map((faq, index) => ( -
-
-
-

{ faq.name }

-

- { faq.description } -

-
- -
- { faq.isOpen && ( -

- { faq?.content || 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.' } -

- ) } -
- )) } -
-
- ) -} \ No newline at end of file diff --git a/src/pages/index.js b/src/pages/index.js deleted file mode 100644 index 65999ff6..00000000 --- a/src/pages/index.js +++ /dev/null @@ -1,106 +0,0 @@ -import { useEffect, useState } from "react"; -import { Pagination, Autoplay } from "swiper"; -import axios from "axios"; -import { Swiper, SwiperSlide } from "swiper/react"; -import "swiper/css"; -import "swiper/css/pagination"; -import "swiper/css/autoplay"; - -// Helpers -import apiOdoo from "@/core/utils/apiOdoo"; - -// Components -import Header from "@/components/layouts/Header"; -import ProductSlider from "@/components/products/ProductSlider"; -import Layout from "@/components/layouts/Layout"; -import ManufactureCard from "@/components/manufactures/ManufactureCard"; -import Footer from "@/components/layouts/Footer"; -import Image from "@/components/elements/Image"; -import ProductCategories from "@/components/products/ProductCategories"; - -const swiperBanner = { - pagination: { dynamicBullets: true }, - autoplay: { - delay: 6000, - disableOnInteraction: false - }, - modules: [Pagination, Autoplay] -} - -export async function getServerSideProps() { - const heroBanners = await apiOdoo('GET', `/api/v1/banner?type=index-a-1`); - - return { props: { heroBanners } }; -} - -export default function Home({ heroBanners }) { - const [manufactures, setManufactures] = useState(null); - const [popularProducts, setPopularProducts] = useState(null); - - useEffect(() => { - const getManufactures = async () => { - const dataManufactures = await apiOdoo('GET', `/api/v1/manufacture?level=prioritas`); - setManufactures(dataManufactures); - } - getManufactures(); - - const getPopularProducts = async () => { - const dataPopularProducts = await axios(`${process.env.SELF_HOST}/api/shop/search?q=*&page=1&order_by=popular`); - setPopularProducts(dataPopularProducts.data.response); - } - getPopularProducts(); - }, []); - - return ( - <> -
- - - { - heroBanners?.map((banner, index) => ( - - {banner.name} - - )) - } - -
-

Brand Pilihan

- - { - manufactures?.manufactures?.map((manufacture, index) => ( - - - - )) - } - -
-
-

Produk Populer

- -
- - - -
-
Platform Belanja B2B Alat Teknik & Industri di Indonesia
-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est -

-
- -