Files
suwayomi-material-you-webui/src/modules/core/components/buttons/ValueRotationButton.tsx

74 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-10-03 04:02:59 +02:00
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
import { useTranslation } from 'react-i18next';
2024-11-04 18:00:35 +01:00
import { ReactNode, useMemo } from 'react';
2024-10-03 04:02:59 +02:00
import Button from '@mui/material/Button';
import Tooltip from '@mui/material/Tooltip';
2024-11-04 18:00:35 +01:00
import { MultiValueButtonProps } from '@/modules/core/Core.types.ts';
2024-11-03 03:09:00 +01:00
import { getNextRotationValue } from '@/modules/core/utils/ValueRotationButton.utils.ts';
2024-10-03 04:02:59 +02:00
export const ValueRotationButton = <Value extends string | number>({
tooltip,
2024-10-03 04:02:59 +02:00
value,
values,
setValue,
valueToDisplayData,
2024-11-04 18:00:35 +01:00
isDefaultable,
onDefault,
defaultIcon,
}: MultiValueButtonProps<Value> & { defaultIcon?: ReactNode }) => {
2024-10-03 04:02:59 +02:00
const { t } = useTranslation();
2024-11-04 18:00:35 +01:00
const isDefault = value === undefined;
const indexOfValue = useMemo(() => {
if (isDefault) {
return -1;
}
return values.indexOf(value);
}, [value, values]);
2024-10-03 04:02:59 +02:00
return (
<Tooltip title={tooltip}>
{isDefault ? (
<Button
onClick={() => setValue(values[0])}
sx={{ justifyContent: 'start', textTransform: 'unset', flexGrow: 1 }}
variant="contained"
startIcon={defaultIcon}
size="large"
>
{t('global.label.default')}
</Button>
) : (
<Button
onClick={() => {
const nextValue = getNextRotationValue(indexOfValue, values, isDefaultable);
2024-11-04 18:00:35 +01:00
if (nextValue === undefined) {
onDefault?.();
return;
}
2024-11-04 18:00:35 +01:00
setValue(nextValue);
}}
sx={{ justifyContent: 'start', textTransform: 'unset', flexGrow: 1 }}
variant="contained"
startIcon={valueToDisplayData[value].icon}
size="large"
>
{valueToDisplayData[value].isTitleString
? valueToDisplayData[value].title
: t(valueToDisplayData[value].title)}
</Button>
)}
</Tooltip>
2024-10-03 04:02:59 +02:00
);
};