From 746593c60d7b37ddb1d92b188bf0b22858c76e72 Mon Sep 17 00:00:00 2001 From: Indrajith K L Date: Tue, 14 Apr 2026 23:23:23 +0530 Subject: [PATCH] Optimized package analysis --- src/PackageDetails.tsx | 104 +++++++++++++++++++++++++++-------------- 1 file changed, 69 insertions(+), 35 deletions(-) diff --git a/src/PackageDetails.tsx b/src/PackageDetails.tsx index c0f73e9..b8d4d7c 100644 --- a/src/PackageDetails.tsx +++ b/src/PackageDetails.tsx @@ -1,7 +1,7 @@ import { Button } from "./components/ui/button"; import { Label } from "./components/ui/label"; import { Input } from "./components/ui/input"; -import { useState, useEffect, useRef } from "react"; +import { useState, useEffect, useRef, useMemo, useCallback, memo } from "react"; import { Edit2, ChevronDown, ChevronUp, AlertCircle, Search, Package, Upload, CheckCircle2, XCircle, AlertTriangle, FileJson, TrendingUp, TrendingDown, Copy, Check, Terminal, X, Save, FolderOpen } from "lucide-react"; import { toast } from "sonner"; import { PackageSelector } from "./PackageSelector"; @@ -98,7 +98,7 @@ function satisfiesVersion(installedVersion: string, requiredRange: string): bool } } -function PackageResultCard({ result, onVersionChange, nodeVersion }: { +const PackageResultCard = memo(function PackageResultCard({ result, onVersionChange, nodeVersion }: { result: AnalysisResult; onVersionChange: (packageName: string, version: string) => void; nodeVersion: string; @@ -111,10 +111,23 @@ function PackageResultCard({ result, onVersionChange, nodeVersion }: { const hasVersionChange = result.selectedVersion && result.selectedVersion !== result.currentVersion; const hasCompatibilityIssue = !result.nodeCompatible || (result.peerConflicts && result.peerConflicts.length > 0); - const sortedVersions = result.availableVersions ? sortVersions([...result.availableVersions]) : []; - const filteredAvailableVersions = sortedVersions.filter(v => - v.toLowerCase().includes(versionSearchQuery.toLowerCase()) + const sortedVersions = useMemo(() => + result.availableVersions ? sortVersions([...result.availableVersions]) : [], + [result.availableVersions] ); + + const filteredAvailableVersions = useMemo(() => + sortedVersions.filter(v => + v.toLowerCase().includes(versionSearchQuery.toLowerCase()) + ), + [sortedVersions, versionSearchQuery] + ); + + const handleVersionChange = useCallback((version: string) => { + onVersionChange(result.name, version); + setVersionDropdownOpen(false); + setVersionSearchQuery(""); + }, [result.name, onVersionChange]); useEffect(() => { if (!versionDropdownOpen) return; @@ -233,11 +246,7 @@ function PackageResultCard({ result, onVersionChange, nodeVersion }: { filteredAvailableVersions.map((version) => (