aboutsummaryrefslogtreecommitdiffstats
path: root/src/components/atoms/lists/description-list.tsx
blob: df2880f5b36a9891a8cf5cf1653c21ba360e307f (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
import { FC } from 'react';
import styles from './description-list.module.scss';

export type DescriptionListItem = {
  /**
   * The item id.
   */
  id: string;
  /**
   * A list term.
   */
  term: string;
  /**
   * An array of values for the list term.
   */
  value: any[];
};

export type DescriptionListProps = {
  /**
   * Set additional classes to the list wrapper.
   */
  classes?: string;
  /**
   * The list items.
   */
  items: DescriptionListItem[];
};

/**
 * DescriptionList component
 *
 * Render a description list.
 */
const DescriptionList: FC<DescriptionListProps> = ({ classes = '', items }) => {
  /**
   * Retrieve the description list items wrapped in a div element.
   *
   * @param {DescriptionListItem[]} listItems - An array of term and description couples.
   * @returns {JSX.Element[]} The description list items.
   */
  const getItems = (listItems: DescriptionListItem[]): JSX.Element[] => {
    return listItems.map(({ id, term, value }) => {
      return (
        <div key={id} className={styles.list__item}>
          <dt className={styles.list__term}>{term}</dt>
          {value.map((currentValue, index) => (
            <dd key={`${id}-${index}`} className={styles.list__description}>
              {currentValue}
            </dd>
          ))}
        </div>
      );
    });
  };

  return <dl className={`${styles.list} ${classes}`}>{getItems(items)}</dl>;
};

export default DescriptionList;