Clarify active strategy cadence in portfolio

This commit is contained in:
Thigazhezhilan J 2026-04-08 01:29:02 +05:30
parent d10bb3dd78
commit 8c160d6443

View File

@ -195,6 +195,16 @@ function getNetQuantity(item: any) {
return getEffectiveQuantity(item); return getEffectiveQuantity(item);
} }
function formatFrequencyLabel(value?: number | null, unit?: string | null) {
const safeValue = Number(value);
if (!Number.isFinite(safeValue) || safeValue <= 0 || !unit) {
return null;
}
const normalizedUnit = unit === "minutes" ? "minute" : unit === "days" ? "day" : unit;
const pluralizedUnit = safeValue === 1 ? normalizedUnit : `${normalizedUnit}s`;
return `${safeValue} ${pluralizedUnit}`;
}
function getAveragePrice(item: any) { function getAveragePrice(item: any) {
return firstNumber(item?.average_price, item?.avg_price); return firstNumber(item?.average_price, item?.avg_price);
} }
@ -762,6 +772,38 @@ export default function PortfolioSection() {
: strategyStatus === "WAITING" : strategyStatus === "WAITING"
? "WAITING" ? "WAITING"
: "STOPPED"; : "STOPPED";
const savedStrategyAmount = Number(strategyDetails?.config?.sip_amount);
const savedStrategyFrequencyValue = Number(strategyDetails?.config?.sip_frequency?.value);
const savedStrategyFrequencyUnit =
strategyDetails?.config?.sip_frequency?.unit === "minutes"
? "minutes"
: strategyDetails?.config?.sip_frequency?.unit === "days"
? "days"
: null;
const savedStrategyCadence = formatFrequencyLabel(
savedStrategyFrequencyValue,
savedStrategyFrequencyUnit,
);
const savedStrategyAmountLabel =
Number.isFinite(savedStrategyAmount) && savedStrategyAmount > 0
? formatCurrency(savedStrategyAmount)
: null;
const savedStrategyMode =
strategyDetails?.config?.mode === "LIVE"
? "Live"
: strategyDetails?.config?.mode === "PAPER"
? "Paper"
: null;
const savedStrategyBroker =
strategyDetails?.config?.broker ? formatBrokerName(strategyDetails.config.broker) : null;
const savedStrategySummary = [
savedStrategyAmountLabel ? `${savedStrategyAmountLabel} SIP` : null,
savedStrategyCadence ? `every ${savedStrategyCadence}` : null,
savedStrategyMode,
savedStrategyBroker,
]
.filter(Boolean)
.join(" · ");
const isStrategyActive = const isStrategyActive =
normalizedStrategyStatus === "RUNNING" || normalizedStrategyStatus === "RUNNING" ||
normalizedStrategyStatus === "WAITING"; normalizedStrategyStatus === "WAITING";
@ -1483,6 +1525,12 @@ export default function PortfolioSection() {
Minutes mode is for live testing only. The engine checks every few seconds in this mode. Minutes mode is for live testing only. The engine checks every few seconds in this mode.
</div> </div>
) : null} ) : null}
{savedStrategySummary ? (
<div className="rounded-lg border border-border/60 bg-background/40 px-3 py-2 text-xs text-muted-foreground">
{isStrategyActive ? "Current run" : showResumeStrategy ? "Resume will continue" : "Saved strategy config"}
: <span className="font-medium text-foreground"> {savedStrategySummary}</span>
</div>
) : null}
{showResumeStrategy ? ( {showResumeStrategy ? (
<div className="text-xs text-muted-foreground"> <div className="text-xs text-muted-foreground">
Resume uses the previously saved SIP configuration. Choose restart to begin a fresh cycle. Resume uses the previously saved SIP configuration. Choose restart to begin a fresh cycle.