From 44d95e768c1eccc191680175ad18599b1b3bb75a Mon Sep 17 00:00:00 2001 From: Reckless_Satoshi Date: Mon, 3 Jan 2022 14:52:46 -0800 Subject: [PATCH] Create simple book order page with cards and plaintext --- api/views.py | 7 +- frontend/src/components/BookPage.js | 173 ++++++++++++++++++++++++---- 2 files changed, 152 insertions(+), 28 deletions(-) diff --git a/api/views.py b/api/views.py index 0b402365..7b37be5a 100644 --- a/api/views.py +++ b/api/views.py @@ -99,7 +99,6 @@ class OrderView(APIView): return Response({'Bad Request':'Order ID parameter not found in request'}, status=status.HTTP_400_BAD_REQUEST) - class UserGenerator(APIView): lookup_url_kwarg = 'token' NickGen = NickGenerator( @@ -143,7 +142,8 @@ class UserGenerator(APIView): # generate avatar rh = Robohash(hash) rh.assemble(roboset='set1') # bgset='any' for backgrounds ON - + + # replaces image if existing (in of case nickname collusion avatar would change!) with open(avatar_path.joinpath(nickname+".png"), "wb") as f: rh.img.save(f, format="png") @@ -168,8 +168,6 @@ class UserGenerator(APIView): context['bad_request'] = 'Enter a different token' return Response(context, status=status.HTTP_403_FORBIDDEN) - - def delete(self,request): user = User.objects.get(id = request.user.id) @@ -201,7 +199,6 @@ class BookView(APIView): for order in queryset: data = OrderSerializer(order).data user = User.objects.filter(id=data['maker']) - print(user) if len(user) == 1: data['maker_nick'] = user[0].username # TODO avoid sending status and takers for book views diff --git a/frontend/src/components/BookPage.js b/frontend/src/components/BookPage.js index 706a2d06..0c2420c1 100644 --- a/frontend/src/components/BookPage.js +++ b/frontend/src/components/BookPage.js @@ -1,27 +1,154 @@ import React, { Component } from "react"; +import { Paper, Button , Card, CardActionArea, CardContent, Typography, Grid, Select, MenuItem, FormControl, FormHelperText, List, ListItem, ListItemText, Avatar, Link, RouterLink} from "@material-ui/core" export default class BookPage extends Component { - constructor(props) { - super(props); - this.state = { - orders: null, - }; - this.currency = 2; - this.type = 1; - this.getOrderDetails() - } - getOrderDetails() { - fetch('/api/book' + '?currency=' + this.currency + "&type=" + this.type) - .then((response) => response.json()) - .then((data) => console.log(data)); - // this.setState({orders: data})); - } - render() { - return ( -
-

Book

- {/* {this.state.orders.map(order =>
{order.maker_nick}
)} */} -
- ); - } + constructor(props) { + super(props); + this.state = { + orders: new Array(), + currency: 1, + type: 1, + }; + this.getOrderDetails() + this.state.currencyCode = this.getCurrencyCode(this.state.currency) + } + + // Fix needed to handle HTTP 404 error when no order is found + // Show message to be the first one to make an order + getOrderDetails() { + fetch('/api/book' + '?currency=' + this.state.currency + "&type=" + this.state.type) + .then((response) => response.json()) + .then((data) => //console.log(data)); + this.setState({orders: data})); + } + + handleCardClick=(orderId)=>{ + this.props.history.push('/order/' + orderId) + } + + // Make these two functions sequential. getOrderDetails needs setState to be finish beforehand. + handleTypeChange=(e)=>{ + this.setState({ + type: e.target.value, + }); + this.getOrderDetails(); + } + handleCurrencyChange=(e)=>{ + this.setState({ + currency: e.target.value, + currencyCode: this.getCurrencyCode(e.target.value), + }) + this.getOrderDetails(); + } + + // Gets currency 3 letters code from numeric (e.g., 1 -> USD) + // Improve this function so currencies are read from json + getCurrencyCode(val){ + var code = (this.state.currency== 1 ) ? "USD": ((this.state.currency == 2 ) ? "EUR":"ETH") + return (code) + } + + // pretty numbers + pn(x) { + return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","); + } + + render() { + return ( + + + + Order Book + + + + + + + I want to + + + + + + + + + And pay with + + + + + {this.state.orders.map((order) => + + + {/* Linking to order details not working yet as expected */} + {/* */} + + + + + {order.maker_nick} + + + + {/* CARD PARAGRAPH CONTENT */} + {order.type == 0 ? "Buys bitcoin for " : "Sells bitcoin for "} + {parseFloat(parseFloat(order.amount).toFixed(4))} + {" " +this.getCurrencyCode(order.currency)}. + + Prefers payment via {order.payment_method}. + + This offer is priced + {order.is_explicit ? + " explicitly at " + this.pn(order.satoshis) + " Sats" : ( + " relative to the market at a premium of " + + parseFloat(parseFloat(order.premium).toFixed(4)) + "%" + )}. + Currently that is {"42,354"} {this.getCurrencyCode(order.currency)}/BTC. + + + + + + )} + + + You are {this.state.type == 0 ? " selling " : " buying "} BTC for {this.state.currencyCode} + + + + + + + ); + }; } \ No newline at end of file