Align funds to OKX funding/trading only; fold rules; match settings width.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -115,6 +115,7 @@ export default function SettingsPage() {
|
||||
const [xferFrom, setXferFrom] = useState("funding");
|
||||
const [xferTo, setXferTo] = useState("trading");
|
||||
const [usdcRate, setUsdcRate] = useState<number | null>(null);
|
||||
const [fundsRulesOpen, setFundsRulesOpen] = useState(false);
|
||||
|
||||
function loadRuntime() {
|
||||
apiFetch<RuntimeSettings>("/api/settings/runtime")
|
||||
@@ -1061,13 +1062,24 @@ export default function SettingsPage() {
|
||||
<div className="card settings-card">
|
||||
{fundsErr ? <div className="err">{fundsErr}</div> : null}
|
||||
{fundsOk ? <div className="settings-ok">{fundsOk}</div> : null}
|
||||
|
||||
<RulesFold
|
||||
open={fundsRulesOpen}
|
||||
onToggle={() => setFundsRulesOpen((v) => !v)}
|
||||
>
|
||||
<p>
|
||||
币种兑换:对齐 OKX 现货市价 USDC-USDT,在<strong>资金账户</strong>
|
||||
内完成 USDT↔USDC。参考价{" "}
|
||||
{usdcRate != null ? `1 USDC ≈ ${usdcRate.toFixed(4)} USDT` : "—"}。
|
||||
</p>
|
||||
<p>
|
||||
账户划转:仅<strong>资金账户 ↔ 交易账户</strong>
|
||||
(USDT/USDC)。OKX 永续与期权均在交易账户,无单独期权资金/期权交易账户。
|
||||
</p>
|
||||
</RulesFold>
|
||||
|
||||
<section className="settings-section">
|
||||
<h3>币种兑换(USDT ↔ USDC)</h3>
|
||||
<p className="meta" style={{ marginTop: 0 }}>
|
||||
对齐 OKX 现货市价 USDC-USDT。参考价{" "}
|
||||
{usdcRate != null ? `1 USDC ≈ ${usdcRate.toFixed(4)} USDT` : "—"}
|
||||
。兑换发生在资金账户侧(USDT↔期权资金 USDC)。
|
||||
</p>
|
||||
<div className="settings-fields">
|
||||
<div className="field">
|
||||
<label htmlFor="convertDir">方向</label>
|
||||
@@ -1130,11 +1142,7 @@ export default function SettingsPage() {
|
||||
|
||||
<section className="settings-section">
|
||||
<h3>账户划转</h3>
|
||||
<p className="meta" style={{ marginTop: 0 }}>
|
||||
资金账户 ↔ 交易账户(USDT/USDC)。期权侧可用 options_funding /
|
||||
options_trading。
|
||||
</p>
|
||||
<div className="settings-fields">
|
||||
<div className="settings-xfer-row">
|
||||
<div className="field">
|
||||
<label htmlFor="xferCcy">币种</label>
|
||||
<select
|
||||
@@ -1153,12 +1161,14 @@ export default function SettingsPage() {
|
||||
<select
|
||||
id="xferFrom"
|
||||
value={xferFrom}
|
||||
onChange={(e) => setXferFrom(e.target.value)}
|
||||
onChange={(e) => {
|
||||
const v = e.target.value === "trading" ? "trading" : "funding";
|
||||
setXferFrom(v);
|
||||
setXferTo(v === "funding" ? "trading" : "funding");
|
||||
}}
|
||||
>
|
||||
<option value="funding">资金账户</option>
|
||||
<option value="trading">交易账户</option>
|
||||
<option value="options_funding">期权资金</option>
|
||||
<option value="options_trading">期权交易</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="field">
|
||||
@@ -1166,12 +1176,14 @@ export default function SettingsPage() {
|
||||
<select
|
||||
id="xferTo"
|
||||
value={xferTo}
|
||||
onChange={(e) => setXferTo(e.target.value)}
|
||||
onChange={(e) => {
|
||||
const v = e.target.value === "trading" ? "trading" : "funding";
|
||||
setXferTo(v);
|
||||
setXferFrom(v === "funding" ? "trading" : "funding");
|
||||
}}
|
||||
>
|
||||
<option value="funding">资金账户</option>
|
||||
<option value="trading">交易账户</option>
|
||||
<option value="options_funding">期权资金</option>
|
||||
<option value="options_trading">期权交易</option>
|
||||
</select>
|
||||
</div>
|
||||
<div className="field">
|
||||
@@ -1185,43 +1197,43 @@ export default function SettingsPage() {
|
||||
onChange={(e) => setXferAmt(Number(e.target.value))}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div className="settings-actions">
|
||||
<button
|
||||
className="btn"
|
||||
type="button"
|
||||
disabled={loading}
|
||||
onClick={async () => {
|
||||
setFundsErr("");
|
||||
setFundsOk("");
|
||||
setLoading(true);
|
||||
try {
|
||||
await apiFetch("/api/funds/transfer", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
ccy: xferCcy,
|
||||
amount: xferAmt,
|
||||
from_account: xferFrom,
|
||||
to_account: xferTo,
|
||||
}),
|
||||
});
|
||||
setFundsOk("划转成功,顶部资金条将刷新");
|
||||
} catch (e) {
|
||||
setFundsErr(e instanceof Error ? e.message : String(e));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}}
|
||||
>
|
||||
划转
|
||||
</button>
|
||||
<div className="settings-xfer-action">
|
||||
<button
|
||||
className="btn"
|
||||
type="button"
|
||||
disabled={loading}
|
||||
onClick={async () => {
|
||||
setFundsErr("");
|
||||
setFundsOk("");
|
||||
setLoading(true);
|
||||
try {
|
||||
await apiFetch("/api/funds/transfer", {
|
||||
method: "POST",
|
||||
body: JSON.stringify({
|
||||
ccy: xferCcy,
|
||||
amount: xferAmt,
|
||||
from_account: xferFrom,
|
||||
to_account: xferTo,
|
||||
}),
|
||||
});
|
||||
setFundsOk("划转成功,顶部资金条将刷新");
|
||||
} catch (e) {
|
||||
setFundsErr(e instanceof Error ? e.message : String(e));
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}}
|
||||
>
|
||||
划转
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
{tab === "account" ? (
|
||||
<div className="card settings-card settings-card-narrow">
|
||||
<div className="card settings-card">
|
||||
{err ? <div className="err">{err}</div> : null}
|
||||
{ok ? <div className="settings-ok">{ok}</div> : null}
|
||||
<form onSubmit={onSaveCreds} className="settings-account-form">
|
||||
|
||||
Reference in New Issue
Block a user