import React, { Component } from 'react';
import { withTranslation } from "react-i18next";
import { InputAdornment, LinearProgress, Dialog, IconButton, DialogActions, DialogContent, DialogContentText, DialogTitle, Accordion, AccordionDetails, AccordionSummary, Checkbox, Slider, Box, Tab, Tabs, SliderThumb, Tooltip, Paper, Button , Grid, Typography, TextField, Select, FormHelperText, MenuItem, FormControl, Radio, FormControlLabel, RadioGroup} from "@mui/material"
import { LocalizationProvider, TimePicker} from '@mui/lab';
import DateFnsUtils from "@date-io/date-fns";
import { Link as LinkRouter } from 'react-router-dom'
import { styled } from '@mui/material/styles';
import getFlags from './getFlags';
import AutocompletePayments from './AutocompletePayments';
import currencyDict from '../../static/assets/currencies.json';
//icons
import LockIcon from '@mui/icons-material/Lock';
import HourglassTopIcon from '@mui/icons-material/HourglassTop';
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import BuySatsIcon from "./icons/BuySatsIcon";
import BuySatsCheckedIcon from "./icons/BuySatsCheckedIcon";
import SellSatsIcon from "./icons/SellSatsIcon";
import SellSatsCheckedIcon from "./icons/SellSatsCheckedIcon";
import ContentCopy from "@mui/icons-material/ContentCopy";
import { getCookie } from "../utils/cookies";
import { pn } from "../utils/prettyNumbers";
class MakerPage extends Component {
defaultCurrency = 1;
defaultCurrencyCode = 'USD';
defaultPaymentMethod = "not specified";
defaultPremium = 0;
minTradeSats = 20000;
maxTradeSats = 1200000;
maxBondlessSats = 50000;
maxRangeAmountMultiple = 4.8;
minRangeAmountMultiple = 1.6;
constructor(props) {
super(props);
this.state={
is_explicit: false,
type: 0,
currency: this.defaultCurrency,
currencyCode: this.defaultCurrencyCode,
payment_method: this.defaultPaymentMethod,
premium: 0,
satoshis: null,
showAdvanced: false,
allowBondless: false,
publicExpiryTime: new Date(0, 0, 0, 23, 59),
escrowExpiryTime: new Date(0, 0, 0, 3, 0),
enableAmountRange: false,
minAmount: null,
bondSize: 1,
limits: null,
minAmount: null,
maxAmount: null,
loadingLimits: true,
}
this.getLimits()
}
getLimits() {
this.setState({loadingLimits:true})
fetch('/api/limits/')
.then((response) => response.json())
.then((data) => this.setState({
limits:data,
loadingLimits:false,
minAmount: this.state.amount ? parseFloat((this.state.amount/2).toPrecision(2)) : parseFloat(Number(data[this.state.currency]['max_amount']*0.25).toPrecision(2)),
maxAmount: this.state.amount ? this.state.amount : parseFloat(Number(data[this.state.currency]['max_amount']*0.75).toPrecision(2)),
}));
}
a11yProps(index) {
return {
id: `simple-tab-${index}`,
'aria-controls': `simple-tabpanel-${index}`,
};
}
handleTypeChange=(e)=>{
this.setState({
type: e.target.value,
});
}
handleCurrencyChange=(e)=>{
this.setState({
currency: e.target.value,
currencyCode: this.getCurrencyCode(e.target.value),
});
if(this.state.enableAmountRange){
this.setState({
minAmount: parseFloat(Number(this.state.limits[e.target.value]['max_amount']*0.25).toPrecision(2)),
maxAmount: parseFloat(Number(this.state.limits[e.target.value]['max_amount']*0.75).toPrecision(2)),
})
}
}
handleAmountChange=(e)=>{
this.setState({
amount: e.target.value,
});
}
handleMinAmountChange=(e)=>{
this.setState({
minAmount: parseFloat(Number(e.target.value).toPrecision(e.target.value < 100 ? 2 : 3)),
});
}
handleMaxAmountChange=(e)=>{
this.setState({
maxAmount: parseFloat(Number(e.target.value).toPrecision(e.target.value < 100 ? 2 : 3)),
});
}
handleRangeAmountChange = (e, newValue, activeThumb) => {
var maxAmount = this.getMaxAmount();
var minAmount = this.getMinAmount();
var lowerValue = e.target.value[0];
var upperValue = e.target.value[1];
var minRange = this.minRangeAmountMultiple;
var maxRange = this.maxRangeAmountMultiple;
if (lowerValue > maxAmount/minRange){
lowerValue = maxAmount/minRange
}
if (upperValue < minRange*minAmount){
upperValue = minRange*minAmount
}
if (lowerValue > upperValue/minRange) {
if (activeThumb === 0) {
upperValue = minRange*lowerValue
} else {
lowerValue = upperValue/minRange
}
}else if(lowerValue < upperValue/maxRange){
if (activeThumb === 0) {
upperValue = maxRange*lowerValue
} else {
lowerValue = upperValue/maxRange
}
}
this.setState({
minAmount: parseFloat(Number(lowerValue).toPrecision(lowerValue < 100 ? 2 : 3)),
maxAmount: parseFloat(Number(upperValue).toPrecision(upperValue < 100 ? 2 : 3)),
});
}
handlePaymentMethodChange=(value)=>{
if (value.length > 50){
this.setState({
badPaymentMethod: true,
});
}else{
this.setState({
payment_method: value.substring(0,53),
badPaymentMethod: value.length > 50,
});
}
}
handlePremiumChange=(e)=>{
const { t } = this.props;
var max = 999;
var min = -100;
if(e.target.value > 999){
var bad_premium = t("Must be less than {{max}}%", {max:max})
}
if(e.target.value <= -100){
var bad_premium = t("Must be more than {{min}}%", {min:min})
}
this.setState({
premium: e.target.value,
badPremium: bad_premium,
});
}
handleSatoshisChange=(e)=>{
const { t } = this.props;
if(e.target.value > this.maxTradeSats){
var bad_sats = t("Must be less than {{maxSats}",{maxSats: pn(this.maxTradeSats)})
}
if(e.target.value < this.minTradeSats){
var bad_sats = t("Must be more than {{minSats}}",{minSats: pn(this.minTradeSats)})
}
this.setState({
satoshis: e.target.value,
badSatoshis: bad_sats,
});
}
handleClickRelative=(e)=>{
this.setState({
is_explicit: false,
});
this.handlePremiumChange();
}
handleClickExplicit=(e)=>{
if(!this.state.enableAmountRange){
this.setState({
is_explicit: true,
});
this.handleSatoshisChange();
}
}
handleCreateOfferButtonPressed=()=>{
this.state.amount == null ? this.setState({amount: 0}) : null;
const requestOptions = {
method: 'POST',
headers: {'Content-Type':'application/json', 'X-CSRFToken': getCookie('csrftoken')},
body: JSON.stringify({
type: this.state.type,
currency: this.state.currency,
amount: this.state.has_range ? null : this.state.amount,
has_range: this.state.enableAmountRange,
min_amount: this.state.minAmount,
max_amount: this.state.maxAmount,
payment_method: this.state.payment_method,
is_explicit: this.state.is_explicit,
premium: this.state.is_explicit ? null: this.state.premium,
satoshis: this.state.is_explicit ? this.state.satoshis: null,
public_duration: this.state.publicDuration,
escrow_duration: this.state.escrowDuration,
bond_size: this.state.bondSize,
bondless_taker: this.state.allowBondless,
}),
};
fetch("/api/make/",requestOptions)
.then((response) => response.json())
.then((data) => (this.setState({badRequest:data.bad_request})
& (data.id ? this.props.history.push('/order/' + data.id) :"")));
this.setState({openStoreToken:false});
}
getCurrencyCode(val){
return currencyDict[val.toString()]
}
handleInputBondSizeChange = (event) => {
this.setState({bondSize: event.target.value === '' ? 1 : Number(event.target.value)});
};
priceNow = () => {
if (this.state.loadingLimits){
return "...";
}
else if (this.state.is_explicit & this.state.amount > 0 & this.state.satoshis > 0){
return parseFloat(Number(this.state.amount / (this.state.satoshis/100000000)).toPrecision(5));
}
else if (!this.state.is_explicit){
var price = this.state.limits[this.state.currency]['price'];
return parseFloat(Number(price*(1+this.state.premium/100)).toPrecision(5));
}
return "...";
}
StandardMakerOptions = () => {
const { t } = this.props;
return(