SortControl.tsx 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. import React, { FC } from 'react';
  2. import { useTranslation } from 'next-i18next';
  3. import { SORT_AXIS, SORT_ORDER } from '../../interfaces/search';
  4. const { DESC, ASC } = SORT_ORDER;
  5. type Props = {
  6. sort: SORT_AXIS,
  7. order: SORT_ORDER,
  8. onChange?: (nextSort: SORT_AXIS, nextOrder: SORT_ORDER) => void,
  9. }
  10. const SortControl: FC <Props> = (props: Props) => {
  11. const { t } = useTranslation('');
  12. const { sort, order, onChange } = props;
  13. const onClickChangeSort = (nextSortAxis: SORT_AXIS, nextSortOrder: SORT_ORDER) => {
  14. if (onChange != null) {
  15. onChange(nextSortAxis, nextSortOrder);
  16. }
  17. };
  18. const renderOrderIcon = () => {
  19. const iconClassName = ASC === order ? 'fa fa-sort-amount-asc' : 'fa fa-sort-amount-desc';
  20. return <i className={iconClassName} aria-hidden="true" />;
  21. };
  22. return (
  23. <>
  24. <div className="input-group flex-nowrap">
  25. <div className="input-group-prepend">
  26. <div className="input-group-text border text-muted" id="btnGroupAddon">
  27. {renderOrderIcon()}
  28. </div>
  29. </div>
  30. <div className="border rounded-end">
  31. <button
  32. type="button"
  33. className="btn dropdown-toggle py-1"
  34. data-bs-toggle="dropdown"
  35. >
  36. <span className="me-2 text-secondary">{t(`search_result.sort_axis.${sort}`)}</span>
  37. </button>
  38. <div className="dropdown-menu dropdown-menu-right">
  39. {Object.values(SORT_AXIS).map((sortAxis) => {
  40. const nextOrder = (sort !== sortAxis || order === ASC) ? DESC : ASC;
  41. return (
  42. <button
  43. key={sortAxis}
  44. className="dropdown-item"
  45. type="button"
  46. onClick={() => { onClickChangeSort(sortAxis, nextOrder) }}
  47. >
  48. <span>{t(`search_result.sort_axis.${sortAxis}`)}</span>
  49. </button>
  50. );
  51. })}
  52. </div>
  53. </div>
  54. </div>
  55. </>
  56. );
  57. };
  58. export default SortControl;