Dispatcharr/frontend/src/components/theme/SizedInstallButton.jsx

97 lines
2.5 KiB
JavaScript

import React, { useState } from 'react';
import { Box, Button, Group } from '@mantine/core';
import { formatKB } from '../../utils/networkUtils.js';
const SizedInstallButton = ({
latest_size,
children,
color,
loading,
disabled,
onClick,
...buttonProps
}) => {
const [hovered, setHovered] = useState(false);
if (!Number.isFinite(latest_size) || latest_size <= 0) {
return (
<Button
color={color}
loading={loading}
disabled={disabled}
onClick={onClick}
{...buttonProps}
>
{children}
</Button>
);
}
const isDisabled = disabled || loading;
const colorVar = color
? `var(--mantine-color-${color}-filled)`
: 'var(--mantine-primary-color-filled)';
return (
<Group
gap={0}
align="stretch"
wrap="nowrap"
onMouseEnter={() => {
if (!isDisabled) setHovered(true);
}}
onMouseLeave={() => setHovered(false)}
>
<Button
color={color}
loading={loading}
disabled={disabled}
onClick={onClick}
styles={
hovered && !isDisabled
? {
root: {
background: color
? `var(--mantine-color-${color}-filled-hover)`
: 'var(--mantine-primary-color-filled-hover)',
},
}
: undefined
}
{...buttonProps}
style={{ borderTopRightRadius: 0, borderBottomRightRadius: 0 }}
>
{children}
</Button>
<Box
onClick={!isDisabled ? onClick : undefined}
style={{
background: isDisabled
? colorVar
: hovered
? color
? `var(--mantine-color-${color}-filled-hover)`
: 'var(--mantine-primary-color-filled-hover)'
: colorVar,
filter: isDisabled
? 'grayscale(1) brightness(0.55)'
: hovered
? 'brightness(0.86)'
: 'brightness(0.82)',
borderLeft: '1px solid rgba(0,0,0,0.2)',
borderTopRightRadius: 'var(--mantine-radius-sm)',
borderBottomRightRadius: 'var(--mantine-radius-sm)',
display: 'flex',
alignItems: 'center',
padding: '0 9px',
fontSize: 11,
color: '#fff',
cursor: isDisabled ? 'default' : 'pointer',
userSelect: 'none',
whiteSpace: 'nowrap',
}}
>
{formatKB(latest_size)}
</Box>
</Group>
);
};
export default SizedInstallButton;