From 716e83844243697b4e2cf830f6d95c5fbb11ee22 Mon Sep 17 00:00:00 2001 From: Reckless_Satoshi Date: Sun, 30 Jan 2022 11:45:37 -0800 Subject: [PATCH] Add in order user activity status badge --- api/models.py | 2 ++ api/views.py | 28 ++++++++++++++++++++-- frontend/src/components/OrderPage.js | 35 ++++++++++++++++++++-------- 3 files changed, 53 insertions(+), 12 deletions(-) diff --git a/api/models.py b/api/models.py index b3837a91..e45707e6 100644 --- a/api/models.py +++ b/api/models.py @@ -147,6 +147,8 @@ class Order(models.Model): # order participants maker = models.ForeignKey(User, related_name='maker', on_delete=models.SET_NULL, null=True, default=None) # unique = True, a maker can only make one order taker = models.ForeignKey(User, related_name='taker', on_delete=models.SET_NULL, null=True, default=None, blank=True) # unique = True, a taker can only take one order + maker_last_seen = models.DateTimeField(null=True,default=None, blank=True) + taker_last_seen = models.DateTimeField(null=True,default=None, blank=True) maker_asked_cancel = models.BooleanField(default=False, null=False) # When collaborative cancel is needed and one partner has cancelled. taker_asked_cancel = models.BooleanField(default=False, null=False) # When collaborative cancel is needed and one partner has cancelled. is_fiat_sent = models.BooleanField(default=False, null=False) diff --git a/api/views.py b/api/views.py index b4168400..2074f4e9 100644 --- a/api/views.py +++ b/api/views.py @@ -125,6 +125,32 @@ class OrderView(viewsets.ViewSet): if not data['is_participant'] and order.status != Order.Status.PUB: return Response({'bad_request':'You are not allowed to see this order'},status.HTTP_403_FORBIDDEN) + # WRITE Update last_seen for maker and taker. + # Note down that the taker/maker was here recently, so counterpart knows if the user is paying attention. + if order.maker == request.user: + order.maker_last_seen = timezone.now() + order.save() + if order.taker == request.user: + order.taker_last_seen = timezone.now() + order.save() + + # Add activity status of participants based on last_seen + if order.taker_last_seen != None: + if order.taker_last_seen > (timezone.now() - timedelta(minutes=2)): + data['taker_status'] = 'active' + elif order.taker_last_seen > (timezone.now() - timedelta(minutes=10)): + data['taker_status'] = 'seen_recently' + else: + data['taker_status'] = 'inactive' + + if order.maker_last_seen != None: + if order.maker_last_seen > (timezone.now() - timedelta(minutes=2)): + data['maker_status'] = 'active' + elif order.maker_last_seen > (timezone.now() - timedelta(minutes=10)): + data['maker_status'] = 'seen_recently' + else: + data['maker_status'] = 'inactive' + # 3.b If order is between public and WF2 if order.status >= Order.Status.PUB and order.status < Order.Status.WF2: data['price_now'], data['premium_now'] = Logics.price_and_premium_now(order) @@ -221,10 +247,8 @@ class OrderView(viewsets.ViewSet): if order.maker_bond.status == order.taker_bond.status == order.trade_escrow.status == LNPayment.Status.LOCKED: # add whether a collaborative cancel is pending or has been asked if (data['is_maker'] and order.taker_asked_cancel) or (data['is_taker'] and order.maker_asked_cancel): - print('PENDING') data['pending_cancel'] = True elif (data['is_maker'] and order.maker_asked_cancel) or (data['is_taker'] and order.taker_asked_cancel): - print('ASKED') data['asked_for_cancel'] = True else: data['asked_for_cancel'] = False diff --git a/frontend/src/components/OrderPage.js b/frontend/src/components/OrderPage.js index 8c712aee..36d2a292 100644 --- a/frontend/src/components/OrderPage.js +++ b/frontend/src/components/OrderPage.js @@ -1,6 +1,5 @@ import React, { Component } from "react"; -import PropTypes from 'prop-types'; -import { Tab, Tabs, Alert, Paper, CircularProgress, Button , Grid, Typography, List, ListItem, ListItemIcon, ListItemText, ListItemAvatar, Avatar, Divider, Box, LinearProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle} from "@mui/material" +import { Badge, Tab, Tabs, Alert, Paper, CircularProgress, Button , Grid, Typography, List, ListItem, ListItemIcon, ListItemText, ListItemAvatar, Avatar, Divider, Box, LinearProgress, Dialog, DialogActions, DialogContent, DialogContentText, DialogTitle} from "@mui/material" import Countdown, { zeroPad, calcTimeDelta } from 'react-countdown'; import MediaQuery from 'react-responsive' @@ -341,6 +340,18 @@ export default class OrderPage extends Component { return(null) } + // Colors for the status badges + statusBadgeColor(status){ + if(status=='active'){ + return("success") + } + if(status=='seen_recently'){ + return("warning") + } + if(status=='inactive'){ + return('error') + } + } orderBox=()=>{ return( @@ -354,10 +365,12 @@ export default class OrderPage extends Component { - + + + @@ -370,10 +383,12 @@ export default class OrderPage extends Component { - + + +