diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-05-16 12:46:38 +0200 | 
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-05-16 12:46:38 +0200 | 
| commit | 2155550fa36a3bc3c8f66e0926530123b4018cd4 (patch) | |
| tree | 1b7472d7ceeb9c95b2c6de6440b48b94405e155e /src/utils | |
| parent | 8a55aa83bd4b64d1d989cb49b7d9c3fdc1cc6ea5 (diff) | |
refactor: use custom hook for breadcrumb items and schema
Diffstat (limited to 'src/utils')
| -rw-r--r-- | src/utils/hooks/use-breadcrumb.tsx | 106 | 
1 files changed, 106 insertions, 0 deletions
| diff --git a/src/utils/hooks/use-breadcrumb.tsx b/src/utils/hooks/use-breadcrumb.tsx new file mode 100644 index 0000000..087d400 --- /dev/null +++ b/src/utils/hooks/use-breadcrumb.tsx @@ -0,0 +1,106 @@ +import { BreadcrumbItem } from '@components/molecules/nav/breadcrumb'; +import { slugify } from '@utils/helpers/strings'; +import { useIntl } from 'react-intl'; +import { BreadcrumbList } from 'schema-dts'; +import useSettings from './use-settings'; + +export type useBreadcrumbProps = { +  /** +   * The current page title. +   */ +  title: string; +  /** +   * The current page url. +   */ +  url: string; +}; + +export type useBreadcrumbReturn = { +  /** +   * The breadcrumb items. +   */ +  items: BreadcrumbItem[]; +  /** +   * The breadcrumb JSON schema. +   */ +  schema: BreadcrumbList['itemListElement'][]; +}; + +/** + * Retrieve the breadcrumb items. + * + * @param {useBreadcrumbProps} props - An object (the current page title & url). + * @returns {useBreadcrumbReturn} The breadcrumb items and its JSON schema. + */ +const useBreadcrumb = ({ +  title, +  url, +}: useBreadcrumbProps): useBreadcrumbReturn => { +  const intl = useIntl(); +  const { website } = useSettings(); +  const isArticle = url.startsWith('/article/'); +  const isHome = url === '/'; +  const isProject = url.startsWith('/projets/'); +  const isSearch = url.startsWith('/recherche'); +  const isThematic = url.startsWith('/thematique/'); +  const isTopic = url.startsWith('/sujet/'); + +  const homeLabel = intl.formatMessage({ +    defaultMessage: 'Home', +    description: 'Breadcrumb: home label', +    id: 'j5k9Fe', +  }); +  const items: BreadcrumbItem[] = [{ id: 'home', name: homeLabel, url: '/' }]; +  const schema: BreadcrumbList['itemListElement'][] = [ +    { +      '@type': 'ListItem', +      position: 1, +      name: homeLabel, +      item: website.url, +    }, +  ]; + +  if (isHome) return { items, schema }; + +  if (isArticle || isSearch || isThematic || isTopic) { +    const blogLabel = intl.formatMessage({ +      defaultMessage: 'Blog', +      description: 'Breadcrumb: blog label', +      id: 'Es52wh', +    }); +    items.push({ id: 'blog', name: blogLabel, url: '/blog' }); +    schema.push({ +      '@type': 'ListItem', +      position: 2, +      name: blogLabel, +      item: `${website.url}/blog`, +    }); +  } + +  if (isProject) { +    const projectsLabel = intl.formatMessage({ +      defaultMessage: 'Projects', +      description: 'Breadcrumb: projects label', +      id: '28GZdv', +    }); +    items.push({ id: 'blog', name: projectsLabel, url: '/projets' }); +    schema.push({ +      '@type': 'ListItem', +      position: 2, +      name: projectsLabel, +      item: `${website.url}/projets`, +    }); +  } + +  items.push({ id: slugify(title), name: title, url }); +  schema.push({ +    '@type': 'ListItem', +    position: schema.length + 1, +    name: title, +    item: `${website.url}${url}`, +  }); + +  return { items, schema }; +}; + +export default useBreadcrumb; | 
