mirror of
https://github.com/Qortal/q-trade.git
synced 2025-06-19 12:41:21 +00:00
fixes
This commit is contained in:
parent
c609fbb054
commit
138a21644f
@ -27,8 +27,12 @@ import {
|
||||
DialogContent,
|
||||
DialogContentText,
|
||||
DialogTitle,
|
||||
FormControl,
|
||||
FormControlLabel,
|
||||
FormLabel,
|
||||
IconButton,
|
||||
Radio,
|
||||
RadioGroup,
|
||||
Snackbar,
|
||||
SnackbarCloseReason,
|
||||
Tooltip,
|
||||
@ -96,6 +100,7 @@ export const TradeOffers: React.FC<any> = ({
|
||||
selectedCoin,
|
||||
} = useContext(gameContext);
|
||||
const isRemoveOrdersWithoutUnlockingFees = useRef(false);
|
||||
const [isRemoveOrders, setIsRemoveOrders] = useState('remove');
|
||||
const listOfOngoingTradesAts = useMemo(() => {
|
||||
return (
|
||||
onGoingTrades
|
||||
@ -149,25 +154,14 @@ export const TradeOffers: React.FC<any> = ({
|
||||
const feeRef = useRef(fee);
|
||||
|
||||
const knownFees = useMemo(() => {
|
||||
const offersWithKnownFees = [];
|
||||
|
||||
selectedOffers.forEach((offer) => {
|
||||
const feeEntry = signedUnlockingFees.find(
|
||||
(item) => item?.atAddress === offer.qortalAtAddress
|
||||
);
|
||||
|
||||
if (feeEntry && typeof feeEntry.fee === "number") {
|
||||
offersWithKnownFees.push({ ...offer, fee: feeEntry.fee });
|
||||
}
|
||||
});
|
||||
const totalKnownFees = offersWithKnownFees.reduce((sum, offer) => {
|
||||
return sum + (offer.fee || 0);
|
||||
}, 0);
|
||||
const lengthOfOffers = selectedOffers.length
|
||||
const totalKnownFees = lengthOfOffers * fee
|
||||
const feeInLtc = totalKnownFees / 1e8;
|
||||
return +feeInLtc.toFixed(8);
|
||||
}, [selectedOffers, signedUnlockingFees]);
|
||||
}, [selectedOffers, fee]);
|
||||
|
||||
console.log("knownFees", knownFees);
|
||||
|
||||
const defaultColDef = {
|
||||
resizable: true, // Make columns resizable by default
|
||||
@ -175,6 +169,12 @@ export const TradeOffers: React.FC<any> = ({
|
||||
suppressMovable: true, // Prevent columns from being movable
|
||||
};
|
||||
|
||||
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
||||
const val = event.target.value
|
||||
isRemoveOrdersWithoutUnlockingFees.current = val === 'remove' ? true : false
|
||||
setIsRemoveOrders(val);
|
||||
};
|
||||
|
||||
const getName = async (address) => {
|
||||
try {
|
||||
const response = await fetch("/names/address/" + address);
|
||||
@ -278,7 +278,6 @@ export const TradeOffers: React.FC<any> = ({
|
||||
resizable: true,
|
||||
valueGetter: (params) => {
|
||||
if (params?.data?.qortalAtAddress) {
|
||||
console.log("22signedUnlockingFees", signedUnlockingFees);
|
||||
const hasSignedFee = signedUnlockingFees?.find(
|
||||
(item) => item?.atAddress === params.data.qortalAtAddress
|
||||
);
|
||||
@ -570,7 +569,6 @@ export const TradeOffers: React.FC<any> = ({
|
||||
}
|
||||
}, []);
|
||||
|
||||
console.log("signed", signedUnlockingFees);
|
||||
|
||||
useEffect(() => {
|
||||
getSignedUnlockingFees();
|
||||
@ -602,54 +600,54 @@ export const TradeOffers: React.FC<any> = ({
|
||||
const total = selectedOffers.reduce((acc: number, curr: any) => {
|
||||
return acc + (+curr.foreignAmount || 0); // Ensure qortAmount is defined
|
||||
}, 0);
|
||||
|
||||
if (selectedCoin === "PIRATECHAIN") return total;
|
||||
const totalWithKnownFees = +total + +knownFees;
|
||||
return totalWithKnownFees;
|
||||
}, [selectedOffers, knownFees]);
|
||||
}, [selectedOffers, knownFees, selectedCoin]);
|
||||
|
||||
const buyOrder = async () => {
|
||||
try {
|
||||
isRemoveOrdersWithoutUnlockingFees.current = false;
|
||||
if (+foreignCoinBalance < +selectedTotalLTC.toFixed(4)) {
|
||||
setOpen(true);
|
||||
setInfo({
|
||||
type: "error",
|
||||
message: `You don't have enough ${getCoinLabel()} or your balance was not retrieved`,
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// if (+foreignCoinBalance < +selectedTotalLTC.toFixed(4)) {
|
||||
// setOpen(true);
|
||||
// setInfo({
|
||||
// type: "error",
|
||||
// message: `You don't have enough ${getCoinLabel()} or your balance was not retrieved`,
|
||||
// });
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (selectedOffers?.length < 1) return;
|
||||
let offersWithKnownFees = [];
|
||||
const offersWithUnknownFees = [];
|
||||
if (selectedCoin !== "PIRATECHAIN") {
|
||||
selectedOffers.forEach((offer) => {
|
||||
const feeEntry = signedUnlockingFees.find(
|
||||
(item) => item?.atAddress === offer.qortalAtAddress
|
||||
);
|
||||
|
||||
selectedOffers.forEach((offer) => {
|
||||
const feeEntry = signedUnlockingFees.find(
|
||||
(item) => item?.atAddress === offer.qortalAtAddress
|
||||
);
|
||||
|
||||
if (feeEntry && typeof feeEntry.fee === "number") {
|
||||
offersWithKnownFees.push({ ...offer, fee: feeEntry.fee });
|
||||
} else {
|
||||
offersWithUnknownFees.push(offer);
|
||||
}
|
||||
});
|
||||
console.log("offersWithKnownFees", offersWithKnownFees);
|
||||
console.log("offersWithUnknownFees", offersWithUnknownFees);
|
||||
if (offersWithUnknownFees?.length > 0) {
|
||||
await showTradesUnknownFee({
|
||||
message: "",
|
||||
if (feeEntry && typeof feeEntry.fee === "number") {
|
||||
offersWithKnownFees.push({ ...offer, fee: feeEntry.fee });
|
||||
} else {
|
||||
offersWithUnknownFees.push(offer);
|
||||
}
|
||||
});
|
||||
if (offersWithUnknownFees?.length > 0) {
|
||||
await showTradesUnknownFee({
|
||||
message: "",
|
||||
});
|
||||
|
||||
if (!isRemoveOrdersWithoutUnlockingFees.current) {
|
||||
offersWithKnownFees = [
|
||||
...offersWithKnownFees,
|
||||
...offersWithUnknownFees,
|
||||
];
|
||||
if (!isRemoveOrdersWithoutUnlockingFees.current) {
|
||||
offersWithKnownFees = [
|
||||
...offersWithKnownFees,
|
||||
...offersWithUnknownFees,
|
||||
];
|
||||
}
|
||||
}
|
||||
} else {
|
||||
offersWithKnownFees = selectedOffers;
|
||||
}
|
||||
|
||||
console.log("offersWithKnownFees", offersWithKnownFees);
|
||||
|
||||
setIsShowBuyInProgress({ status: "buying" });
|
||||
|
||||
@ -742,11 +740,9 @@ export const TradeOffers: React.FC<any> = ({
|
||||
const hasSignedFee = signedUnlockingFees?.find(
|
||||
(item) => item?.atAddress === params.data.qortalAtAddress
|
||||
);
|
||||
console.log("hasSignedFee", hasSignedFee);
|
||||
if (hasSignedFee) {
|
||||
console.log("fee2fee", fee);
|
||||
if (fee && hasSignedFee?.fee > fee) {
|
||||
return { backgroundColor: "#ff6347" };
|
||||
return { backgroundColor: "#FF0000" };
|
||||
}
|
||||
}
|
||||
|
||||
@ -811,7 +807,6 @@ export const TradeOffers: React.FC<any> = ({
|
||||
feeRef.current = fee;
|
||||
|
||||
if (gridRef.current?.api) {
|
||||
console.log("Total rows:", gridRef.current.api.getDisplayedRowCount());
|
||||
|
||||
gridRef.current.api.forEachNode((rowNode: RowNode) => {
|
||||
const qortalAtAddress = rowNode.data?.qortalAtAddress;
|
||||
@ -829,8 +824,8 @@ export const TradeOffers: React.FC<any> = ({
|
||||
gridRef.current.api.refreshCells({ force: true });
|
||||
}
|
||||
}, [signedUnlockingFees, fee]);
|
||||
console.log("signedUnlockingFees", signedUnlockingFees, fee);
|
||||
if (!signedUnlockingFees || !fee) return null;
|
||||
if (!signedUnlockingFees || (!fee && selectedCoin !== "PIRATECHAIN"))
|
||||
return null;
|
||||
|
||||
return (
|
||||
<MainContainer>
|
||||
@ -863,11 +858,7 @@ export const TradeOffers: React.FC<any> = ({
|
||||
(item) => item?.atAddress === params.data.qortalAtAddress
|
||||
);
|
||||
if (!hasSignedFee) selectable = true;
|
||||
console.log(
|
||||
"fee",
|
||||
feeRef.current,
|
||||
signedUnlockingFeesRef.current
|
||||
);
|
||||
|
||||
if (hasSignedFee && hasSignedFee?.fee > feeRef.current)
|
||||
selectable = false;
|
||||
return selectable;
|
||||
@ -924,7 +915,9 @@ export const TradeOffers: React.FC<any> = ({
|
||||
style={{
|
||||
marginLeft: "auto",
|
||||
}}
|
||||
>{`${getCoinLabel()} (with known fees)`}</span>
|
||||
>{`${getCoinLabel()} ${
|
||||
selectedCoin !== "PIRATECHAIN" ? "with unlocking fees" : ""
|
||||
}`}</span>
|
||||
</Typography>
|
||||
</Box>
|
||||
<Typography
|
||||
@ -1026,37 +1019,49 @@ export const TradeOffers: React.FC<any> = ({
|
||||
</DialogContentText>
|
||||
|
||||
<Spacer height="20px" />
|
||||
<FormControlLabel
|
||||
sx={{
|
||||
margin: 0,
|
||||
}}
|
||||
control={
|
||||
<Checkbox
|
||||
onChange={(e) =>
|
||||
(isRemoveOrdersWithoutUnlockingFees.current =
|
||||
e.target.checked)
|
||||
<FormControl>
|
||||
<RadioGroup
|
||||
aria-labelledby="demo-controlled-radio-buttons-group"
|
||||
name="controlled-radio-buttons-group"
|
||||
value={isRemoveOrders}
|
||||
onChange={handleChange}
|
||||
>
|
||||
<FormControlLabel
|
||||
value={"remove"}
|
||||
control={
|
||||
<Radio
|
||||
sx={{
|
||||
"&.Mui-checked": {
|
||||
color: "white",
|
||||
},
|
||||
"& .MuiSvgIcon-root": {
|
||||
color: "white",
|
||||
},
|
||||
}}
|
||||
/>
|
||||
}
|
||||
edge="start"
|
||||
tabIndex={-1}
|
||||
disableRipple
|
||||
sx={{
|
||||
"&.Mui-checked": {
|
||||
color: "white",
|
||||
},
|
||||
"& .MuiSvgIcon-root": {
|
||||
color: "white",
|
||||
},
|
||||
}}
|
||||
label="Remove orders with unknown unlocking fees"
|
||||
/>
|
||||
}
|
||||
label={
|
||||
<Box sx={{ display: "flex", alignItems: "center" }}>
|
||||
<Typography sx={{ fontSize: "14px" }}>
|
||||
Remove orders with unknown unlocking fees
|
||||
</Typography>
|
||||
</Box>
|
||||
}
|
||||
/>
|
||||
<FormControlLabel
|
||||
value={'keep'}
|
||||
control={
|
||||
<Radio
|
||||
sx={{
|
||||
"&.Mui-checked": {
|
||||
color: "white",
|
||||
},
|
||||
"& .MuiSvgIcon-root": {
|
||||
color: "white",
|
||||
},
|
||||
}}
|
||||
/>
|
||||
}
|
||||
label="Keep orders with unknown unlocking fees"
|
||||
/>
|
||||
</RadioGroup>
|
||||
</FormControl>
|
||||
|
||||
|
||||
</DialogContent>
|
||||
<DialogActions>
|
||||
<Button
|
||||
|
@ -67,6 +67,7 @@ import { ReusableModal } from "../common/reusable-modal/ReusableModal";
|
||||
import { NotificationContext } from "../../contexts/notificationContext";
|
||||
import UnsignedFees from "../sell/UnsignedFees";
|
||||
import { FeeManager } from "../sell/FeeManager";
|
||||
import { Info } from "../sell/Info";
|
||||
|
||||
const checkIfLocal = async () => {
|
||||
try {
|
||||
@ -504,6 +505,7 @@ export const Header = ({
|
||||
<SelectRow coin="ARRR" />
|
||||
</MenuItem>
|
||||
</Select>
|
||||
<Info />
|
||||
{!isUsingGateway && selectedCoin !== 'PIRATECHAIN' && (
|
||||
<>
|
||||
<FeeManager selectedCoin={selectedCoin} fee={fee}
|
||||
|
@ -51,7 +51,6 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
const [openAlert, setOpenAlert] = useState(false);
|
||||
const [info, setInfo] = useState<any>(null);
|
||||
const { getCoinLabel } = useContext(gameContext);
|
||||
console.log("editFee", editFee);
|
||||
const handleCloseAlert = (
|
||||
event?: React.SyntheticEvent | Event,
|
||||
reason?: SnackbarCloseReason
|
||||
@ -73,7 +72,6 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
if (!coin) {
|
||||
return;
|
||||
}
|
||||
console.log("selectedCoin", coin);
|
||||
// const coinRequest = coin.current.toLowerCase();
|
||||
const typeRequest = "feerequired";
|
||||
|
||||
@ -90,7 +88,6 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
setFee(response);
|
||||
}
|
||||
|
||||
console.log("response", response);
|
||||
} catch (error) {
|
||||
setFee("");
|
||||
console.error(error);
|
||||
@ -99,7 +96,6 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
|
||||
useEffect(() => {
|
||||
establishUpdateFeeForm(coin);
|
||||
console.log("editFee or fetch changed");
|
||||
}, [coin, establishUpdateFeeForm]);
|
||||
|
||||
const recommendedFeeData = useMemo(() => {
|
||||
@ -114,8 +110,9 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
}, [resource?.data]);
|
||||
|
||||
const recommendedFeeDisplay = useMemo(() => {
|
||||
if (!selectedCoin || !recommendedFeeData) return;
|
||||
if (!selectedCoin || !recommendedFeeData) return null;
|
||||
const coin = getCoinLabel(selectedCoin)?.toUpperCase();
|
||||
if(!recommendedFeeData[coin]) return null
|
||||
return recommendedFeeData[coin][recommendedFee];
|
||||
}, [recommendedFeeData, recommendedFee, selectedCoin]);
|
||||
|
||||
@ -127,7 +124,6 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
if(recommendedFee !== 'custom'){
|
||||
feeToSave = calculateFeeFromRate(recommendedFeeDisplay, 300)
|
||||
}
|
||||
console.log('feeToSave', feeToSave)
|
||||
const response = await qortalRequestWithTimeout(
|
||||
{
|
||||
action: "UPDATE_FOREIGN_FEE",
|
||||
@ -205,7 +201,7 @@ export const FeeManager = ({ selectedCoin, setFee, fee }) => {
|
||||
},
|
||||
}}
|
||||
>
|
||||
<Typography>Fee: {fee}</Typography>
|
||||
<Typography>Fee: {fee} sats</Typography>
|
||||
|
||||
<ChangeCircleIcon
|
||||
sx={{
|
||||
|
94
src/components/sell/Info.tsx
Normal file
94
src/components/sell/Info.tsx
Normal file
@ -0,0 +1,94 @@
|
||||
import React, {
|
||||
useCallback,
|
||||
useContext,
|
||||
useEffect,
|
||||
useMemo,
|
||||
useState,
|
||||
} from "react";
|
||||
import gameContext from "../../contexts/gameContext";
|
||||
import {
|
||||
Alert,
|
||||
Box,
|
||||
ButtonBase,
|
||||
Snackbar,
|
||||
SnackbarCloseReason,
|
||||
ToggleButton,
|
||||
ToggleButtonGroup,
|
||||
Typography,
|
||||
} from "@mui/material";
|
||||
import ChangeCircleIcon from "@mui/icons-material/ChangeCircle";
|
||||
import { ReusableModal } from "../common/reusable-modal/ReusableModal";
|
||||
import QuestionMarkIcon from "@mui/icons-material/QuestionMark";
|
||||
import {
|
||||
CoinActionContainer,
|
||||
CoinActionRow,
|
||||
HeaderRow,
|
||||
} from "../header/Header-styles";
|
||||
import { CustomInput, CustomLabel } from "./CreateSell";
|
||||
import { Spacer } from "../common/Spacer";
|
||||
import { usePublish, Service, QortalGetMetadata } from "qapp-core";
|
||||
import { SetLeftFeature } from "ag-grid-community";
|
||||
|
||||
|
||||
export const Info = () => {
|
||||
const [openModal, setOpenModal] = useState(false)
|
||||
|
||||
return (
|
||||
<>
|
||||
<ButtonBase
|
||||
onClick={() => {
|
||||
setOpenModal(true);
|
||||
|
||||
}}
|
||||
sx={{
|
||||
minHeight: "42px",
|
||||
border: "1px solid gray",
|
||||
color: "white",
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
padding: "5px 5px",
|
||||
gap: "10px",
|
||||
borderRadius: "5px",
|
||||
"&:hover": {
|
||||
border: "1px solid white", // Border color on hover
|
||||
},
|
||||
}}
|
||||
>
|
||||
|
||||
<QuestionMarkIcon
|
||||
sx={{
|
||||
color: "white",
|
||||
}}
|
||||
/>
|
||||
</ButtonBase>
|
||||
{openModal && (
|
||||
<ReusableModal
|
||||
onClickClose={() => {
|
||||
setOpenModal(false);
|
||||
}}
|
||||
backdrop
|
||||
>
|
||||
<CoinActionContainer sx={{
|
||||
width: '450px',
|
||||
maxWidth: '95vw'
|
||||
}}>
|
||||
<CoinActionRow>
|
||||
<HeaderRow>
|
||||
<Typography
|
||||
variant="h4"
|
||||
sx={{
|
||||
color: "white",
|
||||
}}
|
||||
>
|
||||
Information on fees
|
||||
</Typography>
|
||||
</HeaderRow>
|
||||
</CoinActionRow>
|
||||
|
||||
</CoinActionContainer>
|
||||
</ReusableModal>
|
||||
)}
|
||||
|
||||
</>
|
||||
);
|
||||
};
|
@ -28,7 +28,6 @@ export default function UnsignedFees({ qortAddress }) {
|
||||
const [openModal, setOpenModal] = useState(false);
|
||||
const [openAlert, setOpenAlert] = useState(false);
|
||||
const [info, setInfo] = useState<any>(null);
|
||||
console.log("isPositive", isPositive);
|
||||
const qortAddressRef = useRef(null);
|
||||
|
||||
const handleCloseAlert = (
|
||||
|
Loading…
x
Reference in New Issue
Block a user