mirror of
https://github.com/RoboSats/robosats.git
synced 2025-07-19 17:23:19 +00:00

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
236 lines
6.9 KiB
TypeScript
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;
|