import PlumeMessageResolver from '@lib/plume-messages/MessageResolver'; import PlumeMessageResolverService from '@lib/plume-messages/MessageResolverService'; import useMessagesResolver from '@lib/plume-messages/messagesResolveHook'; import { SortOption, SortSelectProps } from '@lib/plume-search/sorts/SortTypes'; import { Icon, ListItemText, MenuItem, Select, SelectChangeEvent, } from '@mui/material'; import { getGlobalInstance } from 'plume-ts-di'; import { useMemo } from 'react'; import scss from './sort-select.module.scss'; const makeKey = (sortOption: SortOption): string => ( `${sortOption.id.toLowerCase()}_${sortOption.desc ? 'desc' : 'asc'}` ); const unmakeKey = (sort: string): SortOption => { const valueSplit: string[] = sort.split('_'); const label: string = valueSplit.slice(0, valueSplit.length - 1) .join('_') .toUpperCase(); const isDesc: boolean = valueSplit[valueSplit.length - 1] === 'desc'; return { id: label as S, desc: isDesc, }; }; const IconComponent = ({ className }: { className: string }) => expand_more; /** * Creates a Select input that displays all the sort possibilities available : * It creates a single key by sort possibility, combining the key and if it is desc or not with {@link makeKey} function * * @param messageKey message key of the menu that is under "sorts" entry in {@link Translations} * @param sortOptions the sort possibilities {@link SortOption} * @param onSort callback when selecting a sort * @param sort the current sort selected */ function SortSelect( { messageKey, sortOptions, onSort, sort, }: Readonly>, ) { const messages: PlumeMessageResolver = useMessagesResolver(getGlobalInstance(PlumeMessageResolverService)); const handleSortingBar = (event: SelectChangeEvent) => { const sortOption: SortOption = unmakeKey(event.target.value.toString()); const sortChoice: SortOption | undefined = sortOptions.find((element: SortOption) => ( element.id.localeCompare(sortOption.id) === 0 && element.desc === sortOption.desc )); if (!sortChoice) { return; } onSort(sortChoice); }; const sortedList: SortOption[] = useMemo( () => [...sortOptions].sort((sortElement: SortOption) => ( sort.id === sortElement.id && sort.desc === sortElement.desc ? -1 : 0 )), [sortOptions, sort], ); return (
sort
); } export default (SortSelect);