robosats/frontend/src/components/MakerForm/AmountRange.tsx

198 lines
5.8 KiB
TypeScript
Raw Normal View History

import React from 'react';
import { useTranslation } from 'react-i18next';
import {
SliderThumb,
Grid,
Typography,
TextField,
Select,
MenuItem,
Box,
useTheme,
} from '@mui/material';
Refactor and Init RoboSats PRO (#296) commit 9c6d55cfc77d42471da3e865f2729167597868e5 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Thu Oct 20 10:35:49 2022 -0700 Small fixes commit 23d6c00ccb5e78593e768c36b866d02f26031e7b Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Thu Oct 20 06:12:42 2022 -0700 Refactor frontend commit b2c21d4a98c49f6168bc3ff6e6a3d7b9f8943a12 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Wed Oct 19 07:26:00 2022 -0700 Small fixes (more) commit 78a8ab799dc33e8f8b8f14e22e155bbc7104c3a9 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Wed Oct 19 02:11:03 2022 -0700 Try out to revert depth chart commit ef73c980a8cfc4ae760e720e3bca99acc30b7270 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Tue Oct 18 11:43:37 2022 -0700 Small fixes commit fa3e60208f8f292256dd90813e7beff15db3057a Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Tue Oct 18 09:43:03 2022 -0700 Add old UserGen and BottomBar to new main.tsx commit 1e257d1924df20e2fa4feb7f6afce4f31f2a9acc Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Tue Oct 18 04:01:53 2022 -0700 Add Maker and Book page to new main.tsx commit 037d46ceef34df09530e645a2e01c9fbd9b3efd4 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Mon Oct 17 08:54:55 2022 -0700 Add Main component WIP commit e43b274c33a75ab5050be360a3d01f655e1e8142 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Mon Oct 17 04:32:43 2022 -0700 App as functional component
2022-10-20 18:06:16 +00:00
import { FlagWithProps } from '../Icons';
import RangeSlider from './RangeSlider';
import currencyDict from '../../../static/assets/currencies.json';
Add Nav Bar, Settings Page, large refactor (#308) commit a5b63aed93e084fae19d9e444e06238a52f24f3a Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Sun Oct 30 10:46:05 2022 -0700 Small fixes commit d64adfc2bf9b9c31dca47ab113c06a1268c347c6 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Sun Oct 30 06:02:06 2022 -0700 wip work on federation settings commit ca35d6b3d2776812b07109e197d2e1d46f9f4e81 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Sun Oct 30 04:05:33 2022 -0700 Refactor confirmation Dialogs commit c660a5b0d1345d4996efb10cb8999987689bede9 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Sat Oct 29 13:36:59 2022 -0700 refactor login (clean separation robot/info. Style navbar. commit b9dc7f7c95a683e3aca024ec6d7857176b4e3a25 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Fri Oct 28 09:54:38 2022 -0700 Add size slider and settings widget commit 20b2b3dcd6838b129741705f1c65d445271e231d Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Fri Oct 28 05:41:48 2022 -0700 Add show more and Dialogs commit da8b70091b5f28139cdec1a8895f4563d64d8e88 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Thu Oct 27 16:26:07 2022 -0700 Add sliding pages commit 6dd90aa1182a7a5e0f0189d1467ba474b68c28c2 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Thu Oct 27 06:34:58 2022 -0700 Add settings forms commit d3d0f3ee1a52bbf1829714050cc798d2542af8f6 Author: Reckless_Satoshi <reckless.satoshi@protonmail.com> Date: Wed Oct 26 04:16:06 2022 -0700 Refactor utils
2022-10-30 19:13:01 +00:00
import { pn } from '../../utils';
const RangeThumbComponent: React.FC<React.PropsWithChildren> = (props) => {
const { children, ...other } = props;
return (
<SliderThumb {...other}>
{children}
<span className='range-bar' />
<span className='range-bar' />
<span className='range-bar' />
</SliderThumb>
);
};
interface AmountRangeProps {
minAmount: string;
maxAmount: string;
type: number;
currency: number;
handleRangeAmountChange: (e: any, activeThumb: any) => void;
handleMaxAmountChange: (
e: React.ChangeEventHandler<HTMLInputElement | HTMLTextAreaElement>,
) => void;
handleMinAmountChange: (
e: React.ChangeEventHandler<HTMLInputElement | HTMLTextAreaElement>,
) => void;
handleCurrencyChange: (newCurrency: number) => void;
maxAmountError: boolean;
minAmountError: boolean;
currencyCode: string;
amountLimits: number[];
}
const AmountRange: React.FC<AmountRangeProps> = ({
minAmount,
handleRangeAmountChange,
currency,
currencyCode,
handleCurrencyChange,
amountLimits,
maxAmount,
minAmountError,
maxAmountError,
handleMinAmountChange,
handleMaxAmountChange,
}) => {
const theme = useTheme();
const { t } = useTranslation();
return (
<Grid item xs={12}>
<Box
sx={{
padding: '0.5em',
backgroundColor: 'background.paper',
border: '1px solid',
borderRadius: '4px',
borderColor: theme.palette.mode === 'dark' ? '#434343' : '#c4c4c4',
'&:hover': {
borderColor: theme.palette.mode === 'dark' ? '#ffffff' : '#2f2f2f',
},
}}
>
<Grid container direction='column' alignItems='center' spacing={0.5}>
<Grid item sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>
<Typography
sx={{
width: `${t('From').length * 0.56 + 0.6}em`,
textAlign: 'left',
color: 'text.secondary',
}}
variant='caption'
>
{t('From')}
</Typography>
<TextField
variant='standard'
type='number'
size='small'
value={minAmount}
onChange={handleMinAmountChange}
error={minAmountError}
sx={{
width: `${minAmount.toString().length * 0.56}em`,
minWidth: '0.56em',
maxWidth: '2.8em',
}}
/>
<Typography
sx={{
width: `${t('to').length * 0.56 + 0.6}em`,
textAlign: 'center',
color: 'text.secondary',
}}
variant='caption'
>
{t('to')}
</Typography>
<TextField
variant='standard'
size='small'
type='number'
value={maxAmount}
onChange={handleMaxAmountChange}
error={maxAmountError}
sx={{
width: `${maxAmount.toString().length * 0.56}em`,
minWidth: '0.56em',
maxWidth: '3.36em',
}}
/>
<div style={{ width: '0.5em' }} />
<Select
sx={{ width: '3.8em' }}
variant='standard'
size='small'
required={true}
inputProps={{
style: { textAlign: 'center' },
}}
value={currency === 0 ? 1 : currency}
renderValue={() => currencyCode}
onChange={(e) => {
handleCurrencyChange(Number(e.target.value));
}}
>
{Object.entries(currencyDict).map(([key, value]) => (
<MenuItem key={key} value={parseInt(key)}>
<div style={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>
<FlagWithProps code={value} />
{' ' + value}
</div>
</MenuItem>
))}
</Select>
</Grid>
<Grid
item
sx={{
width: `calc(100% - ${Math.abs(Math.log10(amountLimits[1]) * 0.65) + 2}em)`,
}}
>
<RangeSlider
disableSwap={true}
value={[Number(minAmount), Number(maxAmount)]}
step={(amountLimits[1] - amountLimits[0]) / 5000}
valueLabelDisplay='auto'
components={{ Thumb: RangeThumbComponent }}
componentsProps={{
thumb: { style: { backgroundColor: theme.palette.background.paper } },
}}
valueLabelFormat={(x) =>
pn(parseFloat(Number(x).toPrecision(x < 100 ? 2 : 3))) + ' ' + currencyCode
}
marks={[
{
value: amountLimits[0],
label: `${pn(
parseFloat(Number(amountLimits[0]).toPrecision(3)),
)} ${currencyCode}`,
},
{
value: amountLimits[1],
label: `${pn(
parseFloat(Number(amountLimits[1]).toPrecision(3)),
)} ${currencyCode}`,
},
]}
min={amountLimits[0]}
max={amountLimits[1]}
onChange={handleRangeAmountChange}
/>
</Grid>
</Grid>
</Box>
</Grid>
);
};
export default AmountRange;