aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/molecules/layout/meta.tsx
blob: d05396e3f3c9003860e670a5460a3589369837a5 (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
import DescriptionList, {
  type DescriptionListProps,
  type DescriptionListItem,
} from '@components/atoms/lists/description-list';
import { FC, ReactNode } from 'react';
import styles from './meta.module.scss';

export type MetaItem = {
  /**
   * The meta name.
   */
  name: string;
  /**
   * The meta value.
   */
  value: ReactNode | ReactNode[];
};

export type MetaMap = {
  [key: string]: MetaItem | undefined;
};

export type MetaProps = {
  /**
   * Set additional classnames to the meta wrapper.
   */
  className?: DescriptionListProps['className'];
  /**
   * The meta data.
   */
  data: MetaMap;
  /**
   * The meta layout.
   */
  layout?: DescriptionListProps['layout'];
  /**
   * Determine if the layout should be responsive.
   */
  responsiveLayout?: DescriptionListProps['responsiveLayout'];
};

/**
 * Meta component
 *
 * Renders the page metadata.
 */
const Meta: FC<MetaProps> = ({ className, data, ...props }) => {
  /**
   * Transform the metadata to description list item format.
   *
   * @param {MetaMap} items - The meta.
   * @returns {DescriptionListItem[]} The formatted description list items.
   */
  const getItems = (items: MetaMap): DescriptionListItem[] => {
    const listItems: DescriptionListItem[] = Object.entries(items)
      .map(([key, item]) => {
        if (!item) return;

        const { name, value } = item;

        return {
          id: key,
          term: name,
          value: Array.isArray(value) ? value : [value],
        } as DescriptionListItem;
      })
      .filter((item): item is DescriptionListItem => !!item);

    return listItems;
  };

  return (
    <DescriptionList
      items={getItems(data)}
      className={`${styles.list} ${className}`}
      descriptionClassName={styles.value}
      {...props}
    />
  );
};

export default Meta;