diff --git a/src/app/(dashboard)/dashboard/providers/[id]/page.js b/src/app/(dashboard)/dashboard/providers/[id]/page.js
index d2ee0d3e..e034df7e 100644
--- a/src/app/(dashboard)/dashboard/providers/[id]/page.js
+++ b/src/app/(dashboard)/dashboard/providers/[id]/page.js
@@ -1,6 +1,6 @@
"use client";
-import { useState, useEffect, useCallback } from "react";
+import { useState, useEffect, useCallback, useRef } from "react";
import PropTypes from "prop-types";
import { useParams, useRouter } from "next/navigation";
import Link from "next/link";
@@ -364,35 +364,6 @@ export default function ProviderDetailPage() {
}
};
- const selectionToolbar = connections.length > 0 ? (
-
-
- toggleSelectConnection(conn.id)}
- className="size-4 rounded border-border bg-transparent"
- title="Select connection"
- aria-label={`Select ${conn.name || conn.email || conn.id}`}
- />
-
handleSwapPriority(conn, connections[index - 1])}
onMoveDown={() => handleSwapPriority(conn, connections[index + 1])}
onToggleActive={(isActive) => handleUpdateConnectionStatus(conn.id, isActive)}
+ onUpdateProxy={async (proxyPoolId) => {
+ try {
+ const res = await fetch(`/api/providers/${conn.id}`, {
+ method: "PUT",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ proxyPoolId: proxyPoolId || null }),
+ });
+ if (res.ok) {
+ setConnections(prev => prev.map(c =>
+ c.id === conn.id
+ ? { ...c, providerSpecificData: { ...c.providerSpecificData, proxyPoolId: proxyPoolId || null } }
+ : c
+ ));
+ }
+ } catch (error) {
+ console.log("Error updating proxy:", error);
+ }
+ }}
onEdit={() => {
setSelectedConnection(conn);
setShowEditModal(true);
@@ -770,7 +749,6 @@ export default function ProviderDetailPage() {
) : (
<>
- {selectionToolbar}
{connectionsList}
>
)}
@@ -1322,7 +1300,11 @@ CooldownTimer.propTypes = {
until: PropTypes.string.isRequired,
};
-function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMoveUp, onMoveDown, onToggleActive, onEdit, onDelete }) {
+function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMoveUp, onMoveDown, onToggleActive, onUpdateProxy, onEdit, onDelete }) {
+ const [showProxyDropdown, setShowProxyDropdown] = useState(false);
+ const [updatingProxy, setUpdatingProxy] = useState(false);
+ const proxyDropdownRef = useRef(null);
+
const proxyPoolMap = new Map((proxyPools || []).map((pool) => [pool.id, pool]));
const boundProxyPoolId = connection.providerSpecificData?.proxyPoolId || null;
const boundProxyPool = boundProxyPoolId ? proxyPoolMap.get(boundProxyPoolId) : null;
@@ -1336,13 +1318,6 @@ function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMov
? `Legacy: ${connection.providerSpecificData?.connectionProxyUrl}`
: "";
- let proxyBadgeVariant = "default";
- if (boundProxyPool?.isActive === true) {
- proxyBadgeVariant = "success";
- } else if (boundProxyPoolId || hasLegacyProxy) {
- proxyBadgeVariant = "error";
- }
-
let maskedProxyUrl = "";
if (boundProxyPool?.proxyUrl || connection.providerSpecificData?.connectionProxyUrl) {
const rawProxyUrl = boundProxyPool?.proxyUrl || connection.providerSpecificData?.connectionProxyUrl;
@@ -1356,6 +1331,35 @@ function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMov
const noProxyText = boundProxyPool?.noProxy || connection.providerSpecificData?.connectionNoProxy || "";
+ let proxyBadgeVariant = "default";
+ if (boundProxyPool?.isActive === true) {
+ proxyBadgeVariant = "success";
+ } else if (boundProxyPoolId || hasLegacyProxy) {
+ proxyBadgeVariant = "error";
+ }
+
+ // Close dropdown when clicking outside
+ useEffect(() => {
+ if (!showProxyDropdown) return;
+ const handler = (e) => {
+ if (proxyDropdownRef.current && !proxyDropdownRef.current.contains(e.target)) {
+ setShowProxyDropdown(false);
+ }
+ };
+ document.addEventListener("mousedown", handler);
+ return () => document.removeEventListener("mousedown", handler);
+ }, [showProxyDropdown]);
+
+ const handleSelectProxy = async (poolId) => {
+ setUpdatingProxy(true);
+ try {
+ await onUpdateProxy(poolId === "__none__" ? null : poolId);
+ } finally {
+ setUpdatingProxy(false);
+ setShowProxyDropdown(false);
+ }
+ };
+
const displayName = isOAuth
? connection.name || connection.email || connection.displayName || "OAuth Account"
: connection.name;
@@ -1464,20 +1468,56 @@ function ConnectionRow({ connection, proxyPools, isOAuth, isFirst, isLast, onMov