Skip to content

Commit 6b6c938

Browse files
committed
fix(frontend): auto-select the newly created strategy
1 parent e5fe7c3 commit 6b6c938

File tree

4 files changed

+41
-30
lines changed

4 files changed

+41
-30
lines changed

frontend/src/app/agent/components/agent-view/strategy-agent-area.tsx

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Plus } from "lucide-react";
2-
import { type FC, useEffect, useState } from "react";
2+
import { type FC, useEffect } from "react";
33
import { useTranslation } from "react-i18next";
4+
import { useNavigate, useParams } from "react-router";
45
import {
56
useDeleteStrategy,
67
useGetStrategyDetails,
@@ -13,7 +14,6 @@ import {
1314
import CreateStrategyModal from "@/app/agent/components/strategy-items/modals/create-strategy-modal";
1415
import { Button } from "@/components/ui/button";
1516
import type { AgentViewProps } from "@/types/agent";
16-
import type { Strategy } from "@/types/strategy";
1717
import {
1818
PortfolioPositionsGroup,
1919
StrategyComposeList,
@@ -38,9 +38,19 @@ const StrategyAgentArea: FC<AgentViewProps> = () => {
3838
const { t } = useTranslation();
3939
const { data: strategies = [], isLoading: isLoadingStrategies } =
4040
useGetStrategyList();
41-
const [selectedStrategy, setSelectedStrategy] = useState<Strategy | null>(
42-
null,
43-
);
41+
42+
const navigate = useNavigate();
43+
const { strategyId } = useParams();
44+
45+
useEffect(() => {
46+
if (strategies.length > 0 && !strategyId) {
47+
navigate(`/agent/StrategyAgent/Strategies/${strategies[0].strategy_id}`);
48+
}
49+
}, [strategies, strategyId, navigate]);
50+
51+
const selectedStrategy = strategyId
52+
? strategies.find((s) => s.strategy_id.toString() === strategyId) || null
53+
: null;
4454

4555
const { data: composes = [] } = useGetStrategyDetails(
4656
selectedStrategy?.strategy_id,
@@ -59,23 +69,6 @@ const StrategyAgentArea: FC<AgentViewProps> = () => {
5969
const { mutateAsync: stopStrategy } = useStopStrategy();
6070
const { mutateAsync: deleteStrategy } = useDeleteStrategy();
6171

62-
useEffect(() => {
63-
if (strategies.length === 0) {
64-
setSelectedStrategy(null);
65-
return;
66-
}
67-
68-
const hasSelectedStrategy =
69-
selectedStrategy &&
70-
strategies.some(
71-
(strategy) => strategy.strategy_id === selectedStrategy.strategy_id,
72-
);
73-
74-
if (!selectedStrategy || !hasSelectedStrategy) {
75-
setSelectedStrategy(strategies[0]);
76-
}
77-
}, [strategies, selectedStrategy]);
78-
7972
if (isLoadingStrategies) return null;
8073

8174
return (
@@ -88,12 +81,17 @@ const StrategyAgentArea: FC<AgentViewProps> = () => {
8881
<TradeStrategyGroup
8982
strategies={strategies}
9083
selectedStrategy={selectedStrategy}
91-
onStrategySelect={setSelectedStrategy}
9284
onStrategyStop={async (strategyId) =>
9385
await stopStrategy(strategyId)
9486
}
9587
onStrategyDelete={async (strategyId) => {
9688
await deleteStrategy(strategyId);
89+
if (selectedStrategy?.strategy_id === strategyId) {
90+
navigate("/agent/StrategyAgent/Strategies");
91+
}
92+
}}
93+
onStrategyCreated={(strategyId) => {
94+
navigate(`/agent/StrategyAgent/Strategies/${strategyId}`);
9795
}}
9896
/>
9997
) : (

frontend/src/app/agent/components/strategy-items/modals/create-strategy-modal.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,17 @@ import type { CreateStrategy, Strategy } from "@/types/strategy";
4040
export interface CreateStrategyModelRef {
4141
open: (data?: CreateStrategy) => void;
4242
}
43+
4344
interface CreateStrategyModalProps {
4445
children?: React.ReactNode;
4546
ref?: RefObject<CreateStrategyModelRef | null>;
47+
onStrategyCreated?: (strategyId: string) => void;
4648
}
4749

4850
const CreateStrategyModal: FC<CreateStrategyModalProps> = ({
4951
ref,
5052
children,
53+
onStrategyCreated,
5154
}) => {
5255
const { t } = useTranslation();
5356
const [open, setOpen] = useState(false);
@@ -145,13 +148,16 @@ const CreateStrategyModal: FC<CreateStrategyModalProps> = ({
145148
trading_config: value,
146149
};
147150

148-
const { code, msg } = await createStrategy(payload);
151+
const { code, msg, data } = await createStrategy(payload);
149152
if (code !== 0) {
150153
setError(msg);
151154
return;
152155
}
153156

154157
tracker.send("use", { agent_name: "StrategyAgent" });
158+
if (data?.strategy_id) {
159+
onStrategyCreated?.(data.strategy_id);
160+
}
155161
resetAll();
156162
},
157163
});

frontend/src/app/agent/components/strategy-items/trade-strategy-group.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Copy, Eye, MoreVertical, Plus, TrendingUp } from "lucide-react";
22
import { type FC, memo, useRef, useState } from "react";
33
import { useTranslation } from "react-i18next";
4+
import { useNavigate } from "react-router";
45
import { useStrategyPerformance } from "@/api/strategy";
56
import { DeleteStrategy, StrategyStatus } from "@/assets/svg";
67
import {
@@ -50,9 +51,9 @@ interface TradeStrategyCardProps {
5051
interface TradeStrategyGroupProps {
5152
strategies: Strategy[];
5253
selectedStrategy?: Strategy | null;
53-
onStrategySelect?: (strategy: Strategy) => void;
5454
onStrategyStop?: (strategyId: number) => void;
5555
onStrategyDelete?: (strategyId: number) => void;
56+
onStrategyCreated?: (strategyId: string) => void;
5657
}
5758

5859
const TradeStrategyCard: FC<TradeStrategyCardProps> = ({
@@ -65,6 +66,7 @@ const TradeStrategyCard: FC<TradeStrategyCardProps> = ({
6566
const { t } = useTranslation();
6667
const stockColors = useStockColors();
6768
const changeType = getChangeType(strategy.total_pnl_pct);
69+
const navigate = useNavigate();
6870

6971
const [isDeleting, setIsDeleting] = useState(false);
7072
const strategyDetailModalRef = useRef<StrategyDetailModalRef>(null);
@@ -76,7 +78,9 @@ const TradeStrategyCard: FC<TradeStrategyCardProps> = ({
7678

7779
return (
7880
<div
79-
onClick={onClick}
81+
onClick={() => {
82+
navigate(`/agent/StrategyAgent/Strategies/${strategy.strategy_id}`);
83+
}}
8084
data-active={isSelected}
8185
className="flex cursor-pointer flex-col gap-2 rounded-lg border border-gradient border-solid px-3 py-4"
8286
>
@@ -271,11 +275,11 @@ const TradeStrategyCard: FC<TradeStrategyCardProps> = ({
271275
};
272276

273277
const TradeStrategyGroup: FC<TradeStrategyGroupProps> = ({
274-
strategies,
278+
strategies = [],
275279
selectedStrategy,
276-
onStrategySelect,
277280
onStrategyStop,
278281
onStrategyDelete,
282+
onStrategyCreated,
279283
}) => {
280284
const { t } = useTranslation();
281285
const hasStrategies = strategies.length > 0;
@@ -291,7 +295,6 @@ const TradeStrategyGroup: FC<TradeStrategyGroupProps> = ({
291295
isSelected={
292296
selectedStrategy?.strategy_id === strategy.strategy_id
293297
}
294-
onClick={() => onStrategySelect?.(strategy)}
295298
onStop={() => onStrategyStop?.(strategy.strategy_id)}
296299
onDelete={() => onStrategyDelete?.(strategy.strategy_id)}
297300
/>
@@ -316,7 +319,7 @@ const TradeStrategyGroup: FC<TradeStrategyGroupProps> = ({
316319
)}
317320

318321
<div>
319-
<CreateStrategyModal>
322+
<CreateStrategyModal onStrategyCreated={onStrategyCreated}>
320323
<Button
321324
variant="outline"
322325
className="w-full gap-3 rounded-lg py-4 text-base"

frontend/src/routes.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export default [
2121
route("/ranking", "app/rank/board.tsx"),
2222

2323
...prefix("/agent", [
24+
route(
25+
"/StrategyAgent/Strategies/:strategyId?",
26+
"app/agent/components/agent-view/strategy-agent-area.tsx",
27+
),
2428
route("/:agentName", "app/agent/chat.tsx"),
2529
route("/:agentName/config", "app/agent/config.tsx"),
2630
]),

0 commit comments

Comments
 (0)