Add dynamic refresh rate to OrderPage based on order status

This commit is contained in:
Reckless_Satoshi 2022-01-15 04:00:11 -08:00
parent a03cfdc01d
commit 8e609b9e47
No known key found for this signature in database
GPG Key ID: 9C4585B561315571
5 changed files with 53 additions and 30 deletions

View File

@ -1,4 +1,4 @@
# RoboSats: Buy and sell non-KYC Satoshis. # RoboSats: Buy and sell Satoshis Privately.
## What is RoboSats? ## What is RoboSats?
RoboSats is a simple and private way to exchange bitcoin for national currencies. Robosats aims to simplify the peer-to-peer experience and uses lightning hodl invoices to minimize the trust needed to trade. In addition, your Robotic Satoshi will help you stick to best privacy practices. RoboSats is a simple and private way to exchange bitcoin for national currencies. Robosats aims to simplify the peer-to-peer experience and uses lightning hodl invoices to minimize the trust needed to trade. In addition, your Robotic Satoshi will help you stick to best privacy practices.
@ -15,11 +15,11 @@ RoboSats is a simple and private way to exchange bitcoin for national currencies
- Url: testnet.robosats.com (Registered - Not active) - Url: testnet.robosats.com (Registered - Not active)
- Commit height: v0.0.0 Latest commit. - Commit height: v0.0.0 Latest commit.
*Use [Tor Browser](https://www.torproject.org/download/) and .onion for best anonymity.* *Always use [Tor Browser](https://www.torproject.org/download/) and .onion for best anonymity.*
## Contribute to the Robotic Satoshis Open Source Project ## Contribute to the Robotic Satoshis Open Source Project
See [CONTRIBUTING.md](CONTRIBUTING.md) See [CONTRIBUTING.md](CONTRIBUTING.md)
## License ## License
RoboSats is released under the terms of the AGPL3.0 license. See [LICENSE](LICENSE) for more details. The Robotic Satoshis Open Source Project is released under the terms of the AGPL3.0 license. See [LICENSE](LICENSE) for more details.

View File

@ -369,7 +369,8 @@ class Logics():
order.last_satoshis = cls.satoshis_now(order) order.last_satoshis = cls.satoshis_now(order)
bond_satoshis = int(order.last_satoshis * BOND_SIZE) bond_satoshis = int(order.last_satoshis * BOND_SIZE)
pos_text = 'Buying' if cls.is_buyer(order, user) else 'Selling' pos_text = 'Buying' if cls.is_buyer(order, user) else 'Selling'
description = f"RoboSats - Taking 'Order {order.id}' {pos_text} BTC for {order.amount} - This is a taker bond, it will freeze in your wallet temporarily and automatically return. It will be charged if you cheat or cancel." description = (f"RoboSats - Taking 'Order {order.id}' {pos_text} BTC for {float(order.amount) + Order.currency_dict[str(order.currency)]}"
+ " - This is a taker bond, it will freeze in your wallet temporarily and automatically return. It will be charged if you cheat or cancel.")
# Gen hold Invoice # Gen hold Invoice
hold_payment = LNNode.gen_hold_invoice(bond_satoshis, description, BOND_EXPIRY*3600) hold_payment = LNNode.gen_hold_invoice(bond_satoshis, description, BOND_EXPIRY*3600)
@ -482,8 +483,8 @@ class Logics():
def pay_buyer_invoice(order): def pay_buyer_invoice(order):
''' Pay buyer invoice''' ''' Pay buyer invoice'''
# TODO ERROR HANDLING # TODO ERROR HANDLING
if LNNode.pay_invoice(order.buyer_invoice.invoice, order.buyer_invoice.num_satoshis): suceeded, context = LNNode.pay_invoice(order.buyer_invoice.invoice, order.buyer_invoice.num_satoshis)
return True return suceeded, context
@classmethod @classmethod
def confirm_fiat(cls, order, user): def confirm_fiat(cls, order, user):

View File

@ -2,6 +2,7 @@
import requests, ring, os import requests, ring, os
from decouple import config from decouple import config
from statistics import median from statistics import median
market_cache = {} market_cache = {}
@ring.dict(market_cache, expire=30) #keeps in cache for 30 seconds @ring.dict(market_cache, expire=30) #keeps in cache for 30 seconds

View File

@ -38,7 +38,7 @@ export default class OrderPage extends Component {
super(props); super(props);
this.state = { this.state = {
isExplicit: false, isExplicit: false,
delay: 3000, // Refresh every 3 seconds by default delay: 60000, // Refresh every 60 seconds by default
currencies_dict: {"1":"USD"}, currencies_dict: {"1":"USD"},
total_secs_expiry: 300, total_secs_expiry: 300,
loading: true, loading: true,
@ -46,6 +46,28 @@ export default class OrderPage extends Component {
this.orderId = this.props.match.params.orderId; this.orderId = this.props.match.params.orderId;
this.getCurrencyDict(); this.getCurrencyDict();
this.getOrderDetails(); this.getOrderDetails();
// Change refresh delay according to Order status
this.statusToDelay = {
"0": 3000, //'Waiting for maker bond'
"1": 30000, //'Public'
"2": 999999, //'Deleted'
"3": 3000, //'Waiting for taker bond'
"4": 999999, //'Cancelled'
"5": 999999, //'Expired'
"6": 3000, //'Waiting for trade collateral and buyer invoice'
"7": 3000, //'Waiting only for seller trade collateral'
"8": 10000, //'Waiting only for buyer invoice'
"9": 10000, //'Sending fiat - In chatroom'
"10": 15000, //'Fiat sent - In chatroom'
"11": 300000, //'In dispute'
"12": 999999, //'Collaboratively cancelled'
"13": 120000, //'Sending satoshis to buyer'
"14": 999999, //'Sucessful trade'
"15": 15000, //'Failed lightning network routing'
"16": 999999, //'Maker lost dispute'
"17": 999999, //'Taker lost dispute'
}
} }
getOrderDetails() { getOrderDetails() {
@ -55,6 +77,7 @@ export default class OrderPage extends Component {
.then((data) => {console.log(data) & .then((data) => {console.log(data) &
this.setState({ this.setState({
loading: false, loading: false,
delay: this.statusToDelay[data.status.toString()],
id: data.id, id: data.id,
statusCode: data.status, statusCode: data.status,
statusText: data.status_message, statusText: data.status_message,
@ -99,12 +122,11 @@ export default class OrderPage extends Component {
componentDidMount() { componentDidMount() {
this.interval = setInterval(this.tick, this.state.delay); this.interval = setInterval(this.tick, this.state.delay);
} }
componentDidUpdate(prevProps, prevState) { componentDidUpdate() {
if (prevState.delay !== this.state.delay) { clearInterval(this.interval);
clearInterval(this.interval);
this.interval = setInterval(this.tick, this.state.delay); this.interval = setInterval(this.tick, this.state.delay);
}
} }
componentWillUnmount() { componentWillUnmount() {
clearInterval(this.interval); clearInterval(this.interval);
} }

View File

@ -5,7 +5,6 @@ import QRCode from "react-qr-code";
import Chat from "./Chat" import Chat from "./Chat"
// Icons // Icons
import LockIcon from '@mui/icons-material/Lock';
import SmartToyIcon from '@mui/icons-material/SmartToy'; import SmartToyIcon from '@mui/icons-material/SmartToy';
import PercentIcon from '@mui/icons-material/Percent'; import PercentIcon from '@mui/icons-material/Percent';
import BookIcon from '@mui/icons-material/Book'; import BookIcon from '@mui/icons-material/Book';
@ -238,24 +237,24 @@ export default class TradeBox extends Component {
valid invoice for {pn(this.props.data.invoiceAmount)} Satoshis. valid invoice for {pn(this.props.data.invoiceAmount)} Satoshis.
</Typography> </Typography>
</Grid> </Grid>
<form noValidate onSubmit={this.handleClickSubmitInvoiceButton}>
<Grid item xs={12} align="center"> <Grid item xs={12} align="center">
<TextField <TextField
error={this.state.badInvoice} error={this.state.badInvoice}
helperText={this.state.badInvoice ? this.state.badInvoice : "" } helperText={this.state.badInvoice ? this.state.badInvoice : "" }
label={"Payout Lightning Invoice"} label={"Payout Lightning Invoice"}
required required
inputProps={{ inputProps={{
style: {textAlign:"center"} style: {textAlign:"center"}
}} }}
multiline multiline
onChange={this.handleInputInvoiceChanged} onChange={this.handleInputInvoiceChanged}
/> />
</Grid> </Grid>
<Grid item xs={12} align="center"> <Grid item xs={12} align="center">
<Button variant='contained' color='primary'>Submit</Button> <Button onClick={this.handleClickSubmitInvoiceButton} variant='contained' color='primary'>Submit</Button>
</Grid> </Grid>
</form>
{this.showBondIsLocked()} {this.showBondIsLocked()}
</Grid> </Grid>
) )