summaryrefslogtreecommitdiff
path: root/src-migrate/modules/product-detail/components/Breadcrumb.tsx
blob: 0e263fe92798aa525189495ca8558c512c217a1c (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
127
128
129
130
131
132
133
134
135
136
137
138
139
import React, { Fragment } from 'react';
import { useQuery } from 'react-query';
import Link from 'next/link';
import { getProductCategoryBreadcrumb } from '~/services/product';
import { createSlug } from '~/libs/slug';
import useDevice from '@/core/hooks/useDevice';

type Props = { id: number; name: string };

const Breadcrumb = ({ id, name }: Props) => {
  const { isDesktop, isMobile } = useDevice();

  const { data: breadcrumbs = [] } = useQuery({
    queryKey: ['product-category-breadcrumb', id],
    queryFn: () => getProductCategoryBreadcrumb(id),
    refetchOnWindowFocus: false,
  });

  const total = breadcrumbs.length;
  const lastCat = total ? breadcrumbs[total - 1] : null;
  const hasHidden = total > 1;
  const hiddenText = hasHidden
    ? breadcrumbs
        .slice(0, total - 1)
        .map((c) => c.name)
        .join(' / ')
    : '';

  if (isMobile) {
    const crumbsMobile: React.ReactNode[] = [];

    crumbsMobile.push(
      <Link href='/' className='text-danger-500 shrink-0' key='home'>
        Home
      </Link>
    );

    if (hasHidden) {
      crumbsMobile.push(
        <span
          className='text-danger-500 shrink-0'
          title={hiddenText}
          aria-label='Kategori tersembunyi'
          key='hidden'
        >
          ..
        </span>
      );
    }

    // Kategori terakhir
    if (lastCat) {
      crumbsMobile.push(
        <Link
          key={`cat-${lastCat.id}`}
          href={createSlug('/shop/category/', lastCat.name, String(lastCat.id))}
          className='text-danger-500 shrink-0'
        >
          {lastCat.name}
        </Link>
      );
    }

    // Nama produk (dipotong kalau gk muat)
    crumbsMobile.push(
      <span className='truncate min-w-0 flex-1' title={name} key='product'>
        {name}
      </span>
    );

    return (
      <div className='flex items-center whitespace-nowrap overflow-hidden text-caption-1 leading-7'>
        {crumbsMobile.map((node, i) => (
          <Fragment key={i}>
            {node}
            {i < crumbsMobile.length - 1 && (
              <span className='mx-2 shrink-0'>/</span>
            )}
          </Fragment>
        ))}
      </div>
    );
  }

  // ===== DESKTOP =====
  if (isDesktop) {
    return (
      <div className='line-clamp-2 md:line-clamp-1 leading-7 text-caption-1'>
        <Link href='/' className='text-danger-500'>
          Home
        </Link>
        <span className='mx-2'>/</span>
        {breadcrumbs.map((category, index) => (
          <Fragment key={index}>
            <Link
              href={createSlug(
                '/shop/category/',
                category.name,
                category.id.toString()
              )}
              className='text-danger-500'
            >
              {category.name}
            </Link>
            <span className='mx-2'>/</span>
          </Fragment>
        ))}
        <span>{name}</span>
      </div>
    );
  }

  return (
    <div className='line-clamp-2 md:line-clamp-1 leading-7 text-caption-1'>
      <Link href='/' className='text-danger-500'>
        Home
      </Link>
      <span className='mx-2'>/</span>
      {breadcrumbs.map((category, index) => (
        <Fragment key={index}>
          <Link
            href={createSlug(
              '/shop/category/',
              category.name,
              category.id.toString()
            )}
            className='text-danger-500'
          >
            {category.name}
          </Link>
          <span className='mx-2'>/</span>
        </Fragment>
      ))}
      <span>{name}</span>
    </div>
  );
};

export default Breadcrumb;