Reckless_Satoshi 1dea4e73b6 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 11:06:16 -07:00

236 lines
6.9 KiB
TypeScript

import React, { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { Button, Typography, Grid, ButtonGroup, Dialog, Box } from '@mui/material';
import { useHistory } from 'react-router-dom';
import currencyDict from '../../../static/assets/currencies.json';
import DepthChart from '../../components/Charts/DepthChart';
import { Book, Favorites, LimitList, Maker } from '../../models';
// Icons
import { BarChart, FormatListBulleted } from '@mui/icons-material';
import MakerForm from '../../components/MakerForm';
import BookTable from '../../components/BookTable';
interface BookPageProps {
book: Book;
limits: { list: LimitList; loading: boolean };
fetchLimits: () => void;
fav: Favorites;
setFav: (state: Favorites) => void;
fetchBook: () => void;
windowSize: { width: number; height: number };
lastDayPremium: number;
maker: Maker;
setMaker: (state: Maker) => void;
}
const BookPage = ({
lastDayPremium = 0,
limits,
book = { orders: [], loading: true },
fetchBook,
fetchLimits,
fav,
setFav,
maker,
setMaker,
windowSize,
}: BookPageProps): JSX.Element => {
const { t } = useTranslation();
const history = useHistory();
const [view, setView] = useState<'list' | 'depth'>('list');
const [openMaker, setOpenMaker] = useState<boolean>(false);
const doubleView = windowSize.width > 115;
const width = windowSize.width * 0.9;
const maxBookTableWidth = 85;
const chartWidthEm = width - maxBookTableWidth;
const defaultMaker: Maker = {
isExplicit: false,
amount: '',
paymentMethods: [],
paymentMethodsText: 'not specified',
badPaymentMethod: false,
premium: '',
satoshis: '',
publicExpiryTime: new Date(0, 0, 0, 23, 59),
publicDuration: 86340,
escrowExpiryTime: new Date(0, 0, 0, 3, 0),
escrowDuration: 10800,
bondSize: 3,
minAmount: '',
maxAmount: '',
badPremiumText: '',
badSatoshisText: '',
};
useEffect(() => {
if (book.orders.length < 1) {
fetchBook(true, false);
} else {
fetchBook(false, true);
}
}, []);
const handleCurrencyChange = function (e) {
const currency = e.target.value;
setFav({ ...fav, currency });
};
const handleTypeChange = function (mouseEvent, val) {
setFav({ ...fav, type: val });
};
const NoOrdersFound = function () {
return (
<Grid
container
direction='column'
justifyContent='center'
alignItems='center'
sx={{ width: '100%', height: '100%' }}
>
<Grid item>
<Typography align='center' component='h5' variant='h5'>
{fav.type == 0
? t('No orders found to sell BTC for {{currencyCode}}', {
currencyCode:
fav.currency == 0 ? t('ANY') : currencyDict[fav.currency.toString()],
})
: t('No orders found to buy BTC for {{currencyCode}}', {
currencyCode:
fav.currency == 0 ? t('ANY') : currencyDict[fav.currency.toString()],
})}
</Typography>
</Grid>
<Grid item>
<Typography align='center' color='primary' variant='h6'>
{t('Be the first one to create an order')}
</Typography>
</Grid>
</Grid>
);
};
const NavButtons = function () {
return (
<ButtonGroup variant='contained' color='inherit'>
<Button color='primary' onClick={() => setOpenMaker(true)}>
{t('Create Order')}
</Button>
{doubleView ? (
<></>
) : (
<Button
color='inherit'
style={{ color: '#111111' }}
onClick={() => setView(view === 'depth' ? 'list' : 'depth')}
>
{view == 'depth' ? (
<>
<FormatListBulleted /> {t('List')}
</>
) : (
<>
<BarChart /> {t('Chart')}
</>
)}
</Button>
)}
<Button color='secondary' onClick={() => history.push('/')}>
{t('Back')}
</Button>
</ButtonGroup>
);
};
return (
<Grid container direction='column' alignItems='center' spacing={1} sx={{ minWidth: 400 }}>
{openMaker ? (
<Dialog open={openMaker} onClose={() => setOpenMaker(false)}>
<Box sx={{ maxWidth: '18em', padding: '0.5em' }}>
<MakerForm
limits={limits}
fetchLimits={fetchLimits}
pricingMethods={false}
maker={maker}
setMaker={setMaker}
fav={fav}
setFav={setFav}
/>
</Box>
</Dialog>
) : null}
<Grid item xs={12}>
{doubleView ? (
<Grid
container
alignItems='center'
justifyContent='center'
spacing={1}
direction='row'
style={{ width: `${windowSize.width}em` }}
>
<Grid item>
<BookTable
clickRefresh={() => fetchBook()}
book={book}
fav={fav}
maxWidth={maxBookTableWidth} // EM units
maxHeight={windowSize.height * 0.825 - 5} // EM units
fullWidth={windowSize.width} // EM units
fullHeight={windowSize.height} // EM units
defaultFullscreen={false}
onCurrencyChange={handleCurrencyChange}
onTypeChange={handleTypeChange}
noResultsOverlay={NoOrdersFound}
/>
</Grid>
<Grid item>
<DepthChart
orders={book.orders}
lastDayPremium={lastDayPremium}
currency={fav.currency}
limits={limits.list}
maxWidth={chartWidthEm} // EM units
maxHeight={windowSize.height * 0.825 - 5} // EM units
/>
</Grid>
</Grid>
) : view === 'depth' ? (
<DepthChart
orders={book.orders}
lastDayPremium={lastDayPremium}
currency={fav.currency}
limits={limits.list}
maxWidth={windowSize.width * 0.8} // EM units
maxHeight={windowSize.height * 0.825 - 5} // EM units
/>
) : (
<BookTable
book={book}
clickRefresh={() => fetchBook()}
fav={fav}
maxWidth={windowSize.width * 0.97} // EM units
maxHeight={windowSize.height * 0.825 - 5} // EM units
fullWidth={windowSize.width} // EM units
fullHeight={windowSize.height} // EM units
defaultFullscreen={false}
onCurrencyChange={handleCurrencyChange}
onTypeChange={handleTypeChange}
noResultsOverlay={NoOrdersFound}
/>
)}
</Grid>
<Grid item xs={12}>
<NavButtons />
</Grid>
</Grid>
);
};
export default BookPage;