diff --git a/frontend/src/TakerApp.tsx b/frontend/src/TakerApp.tsx index 9223f29..4cb0c1e 100644 --- a/frontend/src/TakerApp.tsx +++ b/frontend/src/TakerApp.tsx @@ -15,7 +15,7 @@ import { useToast, VStack, } from "@chakra-ui/react"; -import React, { useState } from "react"; +import React, { useEffect, useState } from "react"; import { useAsync } from "react-async"; import { useEventSource } from "react-sse-hooks"; import { CfdTable } from "./components/cfdtables/CfdTable"; @@ -58,6 +58,8 @@ async function getMargin(payload: MarginRequestPayload): Promise } export default function App() { + const toast = useToast(); + document.title = "Hermes Taker"; let source = useEventSource({ source: "/api/feed" }); @@ -67,9 +69,11 @@ export default function App() { const order = useLatestEvent(source, "order", intoOrder); const walletInfo = useLatestEvent(source, "wallet"); - const toast = useToast(); let [quantity, setQuantity] = useState("0"); let [margin, setMargin] = useState("0"); + let [userHasEdited, setUserHasEdited] = useState(false); + + let quantityToShow = userHasEdited ? quantity : (order?.min_quantity.toString() || "0"); let { run: calculateMargin } = useAsync({ deferFn: async ([payload]: any[]) => { @@ -90,6 +94,23 @@ export default function App() { }, }); + useEffect(() => { + if (!order) { + return; + } + let quantity = quantityToShow ? Number.parseFloat(quantityToShow) : 0; + let payload: MarginRequestPayload = { + leverage: order.leverage, + price: order.price, + quantity, + }; + calculateMargin(payload); + }, // Eslint demands us to include `calculateMargin` in the list of dependencies. + // We don't want that as we will end up in an endless loop. It is safe to ignore `calculateMargin` because + // nothing in `calculateMargin` depends on outside values, i.e. is guaranteed to be stable. + // eslint-disable-next-line react-hooks/exhaustive-deps + [margin, quantityToShow, order]); + const format = (val: any) => `$` + val; const parse = (val: any) => val.replace(/^\$/, ""); @@ -135,6 +156,7 @@ export default function App() { Quantity: { + setUserHasEdited(true); setQuantity(parse(valueString)); if (!order) { return; @@ -147,7 +169,7 @@ export default function App() { }; calculateMargin(payload); }} - value={format(quantity)} + value={format(quantityToShow)} min={order?.min_quantity} max={order?.max_quantity} />