/*
 * Copyright (C) 2022 Savoir-faire Linux Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation; either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public
 * License along with this program.  If not, see
 * <https://www.gnu.org/licenses/>.
 */

import { MenuItem, MenuItemProps, Select, SelectProps } from '@mui/material';

export interface CustomSelectOption {
  label: string;
  value: MenuItemProps['value'];
}

export interface CustomSelectProps extends Omit<SelectProps, 'label'> {
  value: CustomSelectOption['value'];
  options: CustomSelectOption[];
  onChange: SelectProps['onChange'];
}

const CustomSelect = ({ value, options, onChange }: CustomSelectProps) => {
  return (
    <Select onChange={onChange} value={value}>
      {options.map((option) => (
        <MenuItem key={option.label} value={option.value}>
          {option.label}
        </MenuItem>
      ))}
    </Select>
  );
};
export { CustomSelect };
