diff --git a/src/web/pages/token-routes/RouteCard.tsx b/src/web/pages/token-routes/RouteCard.tsx index 58a0cc8..fc751bd 100644 --- a/src/web/pages/token-routes/RouteCard.tsx +++ b/src/web/pages/token-routes/RouteCard.tsx @@ -1,4 +1,4 @@ -import { useState, type ReactNode } from 'react'; +import { memo, useState, type ReactNode } from 'react'; import { DndContext, KeyboardSensor, @@ -30,10 +30,10 @@ type RouteCardProps = { route: RouteSummaryRow; brand: BrandInfo | null; expanded: boolean; - onToggleExpand: () => void; - onEdit: () => void; - onDelete: () => void; - onToggleEnabled: () => void; + onToggleExpand: (routeId: number) => void; + onEdit: (route: RouteSummaryRow) => void; + onDelete: (routeId: number) => void; + onToggleEnabled: (route: RouteSummaryRow) => void; // Channel data (loaded on demand) channels: RouteChannel[] | undefined; loadingChannels: boolean; @@ -46,14 +46,14 @@ type RouteCardProps = { updatingChannel: Record; savingPriority: boolean; onTokenDraftChange: (channelId: number, tokenId: number) => void; - onSaveToken: (channelId: number, accountId: number) => void; - onDeleteChannel: (channelId: number) => void; - onChannelDragEnd: (event: DragEndEvent) => void; + onSaveToken: (routeId: number, channelId: number, accountId: number) => void; + onDeleteChannel: (channelId: number, routeId: number) => void; + onChannelDragEnd: (routeId: number, event: DragEndEvent) => void; // Missing token hints missingTokenSiteItems: MissingTokenRouteSiteActionItem[]; onCreateTokenForMissing: (accountId: number, modelName: string) => void; // Add channel - onAddChannel: () => void; + onAddChannel: (routeId: number) => void; // Source group expansion expandedSourceGroupMap: Record; onToggleSourceGroup: (groupKey: string) => void; @@ -71,7 +71,7 @@ function AnimatedCollapseSection({ open, children }: { open: boolean; children: ); } -export default function RouteCard({ +function RouteCardInner({ route, brand, expanded, @@ -135,11 +135,11 @@ export default function RouteCard({ return (
onToggleExpand(route.id)} style={{ cursor: 'pointer' }} > -
- +
+ {routeIcon.kind === 'brand' ? ( ) : routeIcon.kind === 'text' ? ( @@ -151,32 +151,30 @@ export default function RouteCard({ )} - + {title} {route.displayName && route.displayName.trim() !== route.modelPattern ? ( - {route.modelPattern} + {route.modelPattern} ) : null} - + {route.channelCount} {tr('通道')} -
- @@ -212,7 +210,7 @@ export default function RouteCard({
{!exactRoute && ( - + )} - +
) :
}
) : channels && channels.length > 0 ? (
- + onChannelDragEnd(route.id, event)}>
{channelGroups.map((group) => { const groupKey = buildSourceGroupKey(route.id, group.sourceModel || ''); @@ -357,8 +355,8 @@ export default function RouteCard({ activeTokenId={activeTokenId} isUpdatingToken={!!updatingChannel[channel.id]} onTokenDraftChange={onTokenDraftChange} - onSaveToken={() => onSaveToken(channel.id, channel.accountId)} - onDeleteChannel={() => onDeleteChannel(channel.id)} + onSaveToken={() => onSaveToken(route.id, channel.id, channel.accountId)} + onDeleteChannel={() => onDeleteChannel(channel.id, route.id)} /> ); })} @@ -381,3 +379,6 @@ export default function RouteCard({
); } + +const RouteCard = memo(RouteCardInner); +export default RouteCard;