Improved proxy selector view

This commit is contained in:
coolcoala
2025-08-23 03:10:46 +03:00
parent 3ecd73f430
commit 967f21cc23

View File

@@ -41,12 +41,14 @@ interface IProxyGroup {
} }
// --- Вспомогательная функция для цвета задержки --- // --- Вспомогательная функция для цвета задержки ---
function getDelayBadgeVariant( function getDelayColorClasses(delayValue: number): string {
delayValue: number, if (delayValue < 0) {
): "default" | "secondary" | "destructive" | "outline" { return "text-muted-foreground border-border";
if (delayValue < 0) return "secondary"; }
if (delayValue >= 150) return "destructive"; if (delayValue >= 150) {
return "default"; return "text-destructive border-destructive/40";
}
return "text-green-600 border-green-500/40 dark:text-green-400 dark:border-green-400/30";
} }
// --- Дочерний компонент для элемента списка с "живым" обновлением пинга --- // --- Дочерний компонент для элемента списка с "живым" обновлением пинга ---
@@ -82,16 +84,17 @@ const ProxySelectItem = ({
return ( return (
<SelectItem key={proxyName} value={proxyName}> <SelectItem key={proxyName} value={proxyName}>
<div className="flex items-center justify-between w-full"> <div className="flex items-center justify-between w-full">
<span className="truncate">{proxyName}</span>
<Badge <Badge
variant={getDelayBadgeVariant(delay)} variant="outline"
className={cn( className={cn(
"ml-4 flex-shrink-0 px-2 h-5 justify-center transition-colors duration-300", "mr-2 flex-shrink-0 px-2 h-5 w-8 justify-center transition-colors duration-300",
isJustUpdated && "bg-primary/20 border-primary/50", getDelayColorClasses(delay),
isJustUpdated && "bg-primary/10 border-primary/50",
)} )}
> >
{delay < 0 || delay > 10000 ? "---" : delay} {delay < 0 || delay > 10000 ? "---" : delay}
</Badge> </Badge>
<span className="truncate">{proxyName}</span>
</div> </div>
</SelectItem> </SelectItem>
); );
@@ -259,11 +262,21 @@ export const ProxySelectors: React.FC = () => {
?.all; ?.all;
if (sourceList) { if (sourceList) {
options = sourceList const rawOptions = sourceList
.map((proxy: any) => ({ .map((proxy: any) => ({
name: typeof proxy === "string" ? proxy : proxy.name, name: typeof proxy === "string" ? proxy : proxy.name,
})) }))
.filter((p: { name: string }) => p.name); .filter((p: { name: string }) => p.name);
// Удаляем дубли по имени прокси
const uniqueNames = new Set<string>();
options = rawOptions.filter((proxy: any) => {
if (!uniqueNames.has(proxy.name)) {
uniqueNames.add(proxy.name);
return true;
}
return false;
});
} }
if (sortType === "name") if (sortType === "name")
@@ -360,16 +373,9 @@ export const ProxySelectors: React.FC = () => {
onOpenChange={handleProxyListOpen} onOpenChange={handleProxyListOpen}
> >
<SelectTrigger className="w-100"> <SelectTrigger className="w-100">
<Tooltip>
<TooltipTrigger asChild>
<span className="truncate"> <span className="truncate">
<SelectValue placeholder={t("Select a proxy...")} /> <SelectValue placeholder={t("Select a proxy...")} />
</span> </span>
</TooltipTrigger>
<TooltipContent>
<p>{selectedProxy}</p>
</TooltipContent>
</Tooltip>
</SelectTrigger> </SelectTrigger>
<SelectContent> <SelectContent>
{proxyOptions.map((proxy) => ( {proxyOptions.map((proxy) => (