import classNames from 'classnames'; import React, { useEffect, useState } from 'react'; import { Wrapper as MenuWrapper, Button, Menu, MenuItem } from 'react-aria-menubutton'; import { FaAngleDown, FaSort, FaSortDown, FaSortUp } from 'react-icons/fa'; import { sortDynamic } from '../../data-entry/utils'; /** * Component for rendering and filtering a list of citations in bibjson or crossref format * Expects bibjson in the format output by the bibtexparser library (https://bibtexparser.readthedocs.io/en/v1.1.0/tutorial.html#) * Expects crossref in the format returned by the Crossref API */ interface Props { id?: string; setProps?: (value: any) => any; className?: string; sortValues: any[]; setSortValues?: (value: any) => any; sortOptions: DropdownItem[]; sortField?: string; setSortField: (value: any) => any; sortAscending?: boolean; setSortAscending: (value: any) => any; sortFn?: (field: string, asc: boolean) => any; } export interface DropdownItem { label: string; value: string; } export const SortDropdown: React.FC = ({ sortAscending = false, sortFn = sortDynamic, sortOptions, sortField = sortOptions[0].value, ...otherProps }) => { const props = { sortAscending, sortFn, sortOptions, sortField, ...otherProps }; const getLabelByValue = (value: string) => { const option = props.sortOptions.find((d) => d.value === value); return option?.label; }; const handleSortFieldChange = (field: string) => { props.setSortField(field); }; const handleSort = () => { if (props.setSortValues) { const sortedValues = props.sortValues.sort( props.sortFn(props.sortField, props.sortAscending) ); props.setSortValues([...sortedValues]); } else { props.sortFn(props.sortField, props.sortAscending); } }; const handleSortDirection = () => { props.setSortAscending(!props.sortAscending); }; useEffect(() => { handleSort(); }, [props.sortAscending, props.sortField]); return (
    {props.sortOptions.map((item, i) => (
  • {item.label}
  • ))}
); };