summaryrefslogtreecommitdiff
path: root/src/pages/index.jsx
blob: d83bc990cf834c5aed99468b8a4d0af62928112e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import dynamic from 'next/dynamic'
import ImageSkeleton from '@/core/components/elements/Skeleton/ImageSkeleton'
import PopularProductSkeleton from '@/lib/home/components/Skeleton/PopularProductSkeleton'
import MobileView from '@/core/components/views/MobileView'
import DesktopView from '@/core/components/views/DesktopView'
import { useRef } from 'react'
import Seo from '@/core/components/Seo'
import { useQuery } from 'react-query'
import odooApi from '@/core/api/odooApi'
import Image from 'next/image'
import DelayRender from '@/core/components/elements/DelayRender/DelayRender'
import Link from '@/core/components/elements/Link/Link'

const BasicLayout = dynamic(() => import('@/core/components/layouts/BasicLayout'))
const FlashSale = dynamic(() => import('@/lib/flashSale/components/FlashSale'))
const BannerSection = dynamic(() => import('@/lib/home/components/BannerSection'))
const HeroBanner = dynamic(() => import('@/lib/home/components/HeroBanner'), {
  loading: () => <ImageSkeleton />
})
const PreferredBrand = dynamic(() => import('@/lib/home/components/PreferredBrand'), {
  loading: () => <PopularProductSkeleton />
})
const PopularProduct = dynamic(() => import('@/lib/home/components/PopularProduct'), {
  loading: () => <PopularProductSkeleton />
})
const CategoryHomeId = dynamic(() => import('@/lib/home/components/CategoryHomeId'), {
  loading: () => <PopularProductSkeleton />
})
const CustomerReviews = dynamic(() => import('@/lib/review/components/CustomerReviews'))

export default function Home() {
  const fetchSecondHeroBanner = async () => await odooApi('GET', '/api/v1/banner?type=index-a-2')
  const secondHeroBanner = useQuery('secondHeroBanner', fetchSecondHeroBanner)

  const bannerRef = useRef(null)
  const wrapperRef = useRef(null)

  const handleOnLoad = () => {
    wrapperRef.current.style.height =
      bannerRef.current.querySelector(':first-child').clientHeight + 'px'
  }

  return (
    <BasicLayout>
      <Seo
        title='Indoteknik.com: B2B Industrial Supply & Solution'
        description='Temukan pilihan produk B2B Industri &amp; Alat Teknik untuk Perusahaan, UMKM &amp; Pemerintah dengan lengkap, mudah dan transparan.'
        additionalMetaTags={[
          {
            name: 'keywords',
            content:
              'indoteknik, indoteknik.com, toko teknik, toko perkakas, jual genset, jual fogging, jual krisbow, harga krisbow, harga alat safety, harga pompa air'
          }
        ]}
      />

      <DesktopView>
        <div className='container mx-auto'>
          <div className='flex h-[360px]' ref={wrapperRef} onLoad={handleOnLoad}>
            <div className='w-2/12'>
              {secondHeroBanner.isFetched && (
                <Link href={secondHeroBanner.data[0].url}>
                  <Image
                    src={secondHeroBanner.data[0].image}
                    width={512}
                    height={1024}
                    alt={secondHeroBanner.data[0].name}
                    className='object-cover object-center h-full'
                  />
                </Link>
              )}
            </div>
            <div className='w-7/12 px-1' ref={bannerRef}>
              <HeroBanner />
            </div>
            <div className='w-3/12'>
              <DelayRender renderAfter={200}>
                <PopularProduct />
              </DelayRender>
            </div>
          </div>

          <div className='my-16 flex flex-col gap-y-16'>
            <DelayRender renderAfter={400}>
              <PreferredBrand />
            </DelayRender>
            <DelayRender renderAfter={600}>
              <FlashSale />
            </DelayRender>
            <DelayRender renderAfter={1000}>
              <CategoryHomeId />
              <BannerSection />
            </DelayRender>
            <DelayRender renderAfter={1200}>
              <CustomerReviews />
            </DelayRender>
          </div>
        </div>
      </DesktopView>

      <MobileView>
        <DelayRender renderAfter={200}>
          <HeroBanner />
        </DelayRender>
        <div className='flex flex-col gap-y-12 my-6'>
          <DelayRender renderAfter={400}>
            <PreferredBrand />
          </DelayRender>
          <DelayRender renderAfter={600}>
            <FlashSale />
          </DelayRender>
          <DelayRender renderAfter={800}>
            <PopularProduct />
          </DelayRender>
          <DelayRender renderAfter={1000}>
            <CategoryHomeId />
            <BannerSection />
          </DelayRender>
          <DelayRender renderAfter={1200}>
            <CustomerReviews />
          </DelayRender>
        </div>
      </MobileView>
    </BasicLayout>
  )
}