You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

DropdownList.js 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. import React, { useEffect, useState } from "react";
  2. import {
  3. DropdownListContainer,
  4. DropdownHeader,
  5. DropdownIcon,
  6. DropdownTitle,
  7. ListContainer,
  8. ToggleIconClosed,
  9. ToggleIconOpened,
  10. DropdownOptions,
  11. ToggleContainer,
  12. } from "./DropdownList.styled";
  13. import PropTypes from "prop-types";
  14. import { useTranslation } from "react-i18next";
  15. const DropdownList = (props) => {
  16. const [listShown, setListShown] = useState(props.defaultOpen);
  17. const { t } = useTranslation();
  18. useEffect(() => {
  19. if (props.open !== null || props.open !== undefined)
  20. setListShown(props.open);
  21. }, [props.open]);
  22. const handleShow = () => {
  23. if (props.setIsOpened) props.setIsOpened(!listShown);
  24. if (!props.disabled) setListShown((prevState) => !prevState);
  25. if (!(props.open !== null || props.open !== undefined))
  26. setListShown((prevState) => !prevState);
  27. };
  28. return (
  29. <DropdownListContainer fullwidth={props.fullWidth ? 1 : 0}>
  30. <DropdownHeader>
  31. {props.dropdownIcon && (
  32. <DropdownIcon
  33. aria-label={t("labels.dropdownIcon")}
  34. onClick={!props.disabled ? () => handleShow() : () => {}}
  35. disabled={props.disabled}
  36. >
  37. {props.dropdownIcon}
  38. </DropdownIcon>
  39. )}
  40. <DropdownTitle
  41. onClick={!props.disabled ? () => handleShow() : () => {}}
  42. textcolor={props.textcolor}
  43. disabled={props.disabled}
  44. >
  45. {props.title}
  46. </DropdownTitle>
  47. {(
  48. props.open !== null && props.open !== undefined
  49. ? props.open
  50. : listShown
  51. ) ? (
  52. <ToggleIconOpened
  53. aria-label={t("labels.dropdownClose")}
  54. style={props.toggleIconStyles}
  55. onClick={!props.disabled ? () => handleShow() : () => {}}
  56. >
  57. {props.toggleIconOpened}
  58. </ToggleIconOpened>
  59. ) : (
  60. <ToggleIconClosed
  61. aria-label={t("labels.dropdownOpen")}
  62. style={props.toggleIconStyles}
  63. onClick={!props.disabled ? () => handleShow() : () => {}}
  64. disabled={props.disabled}
  65. >
  66. {props.toggleIconClosed}
  67. </ToggleIconClosed>
  68. )}
  69. </DropdownHeader>
  70. <ToggleContainer
  71. shouldShow={
  72. props.open !== null && props.open !== undefined
  73. ? props.open
  74. : listShown
  75. }
  76. >
  77. <DropdownOptions>{props.headerOptions}</DropdownOptions>
  78. <ListContainer>{props.children}</ListContainer>
  79. </ToggleContainer>
  80. </DropdownListContainer>
  81. );
  82. };
  83. export default DropdownList;
  84. DropdownList.propTypes = {
  85. title: PropTypes.string,
  86. dropdownIcon: PropTypes.node,
  87. toggleIconOpened: PropTypes.node,
  88. toggleIconClosed: PropTypes.node,
  89. children: PropTypes.node,
  90. fullWidth: PropTypes.bool,
  91. defaultOpen: PropTypes.bool,
  92. toggleIconStyles: PropTypes.any,
  93. headerOptions: PropTypes.node,
  94. textcolor: PropTypes.string,
  95. setIsOpened: PropTypes.func,
  96. open: PropTypes.bool,
  97. disabled: PropTypes.bool,
  98. };
  99. DropdownList.defaultProps = {
  100. fullWidth: false,
  101. defaultOpen: false,
  102. };