Skip to content

Commit 0793fc2

Browse files
authored
Fix vercel deployment fetching (#758)
1 parent 867ea28 commit 0793fc2

File tree

4 files changed

+76
-55
lines changed

4 files changed

+76
-55
lines changed

src/components/VercelConnector.tsx

Lines changed: 15 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { Globe } from "lucide-react";
44
import { IpcClient } from "@/ipc/ipc_client";
55
import { useSettings } from "@/hooks/useSettings";
66
import { useLoadApp } from "@/hooks/useLoadApp";
7+
import { useVercelDeployments } from "@/hooks/useVercelDeployments";
78
import {
89
Select,
910
SelectContent,
@@ -14,7 +15,7 @@ import {
1415
import {} from "@/components/ui/dialog";
1516
import { Input } from "@/components/ui/input";
1617
import { Label } from "@/components/ui/label";
17-
import { App, VercelDeployment } from "@/ipc/ipc_types";
18+
import { App } from "@/ipc/ipc_types";
1819

1920
interface VercelConnectorProps {
2021
appId: number | null;
@@ -46,41 +47,19 @@ function ConnectedVercelConnector({
4647
app,
4748
refreshApp,
4849
}: ConnectedVercelConnectorProps) {
49-
const [isLoadingDeployments, setIsLoadingDeployments] = useState(false);
50-
const [deploymentsError, setDeploymentsError] = useState<string | null>(null);
51-
const [deployments, setDeployments] = useState<VercelDeployment[]>([]);
52-
const [isDisconnecting, setIsDisconnecting] = useState(false);
53-
const [disconnectError, setDisconnectError] = useState<string | null>(null);
50+
const {
51+
deployments,
52+
isLoading: isLoadingDeployments,
53+
error: deploymentsError,
54+
getDeployments: handleGetDeployments,
55+
disconnectProject,
56+
isDisconnecting,
57+
disconnectError,
58+
} = useVercelDeployments(appId);
5459

5560
const handleDisconnectProject = async () => {
56-
setIsDisconnecting(true);
57-
setDisconnectError(null);
58-
try {
59-
await IpcClient.getInstance().disconnectVercelProject({ appId });
60-
refreshApp();
61-
} catch (err: any) {
62-
setDisconnectError(err.message || "Failed to disconnect project.");
63-
} finally {
64-
setIsDisconnecting(false);
65-
}
66-
};
67-
68-
const handleGetDeployments = async () => {
69-
setIsLoadingDeployments(true);
70-
setDeploymentsError(null);
71-
72-
try {
73-
const result = await IpcClient.getInstance().getVercelDeployments({
74-
appId,
75-
});
76-
setDeployments(result);
77-
} catch (err: any) {
78-
setDeploymentsError(
79-
err.message || "Failed to get deployments from Vercel.",
80-
);
81-
} finally {
82-
setIsLoadingDeployments(false);
83-
}
61+
await disconnectProject();
62+
refreshApp();
8463
};
8564

8665
return (
@@ -154,7 +133,7 @@ function ConnectedVercelConnector({
154133
Getting Deployments...
155134
</>
156135
) : (
157-
"Get Deployments"
136+
"Refresh Deployments"
158137
)}
159138
</Button>
160139
<Button
@@ -193,7 +172,7 @@ function ConnectedVercelConnector({
193172
{deployment.readyState}
194173
</span>
195174
<span className="text-sm text-gray-600 dark:text-gray-300">
196-
{new Date(deployment.createdAt * 1000).toLocaleString()}
175+
{new Date(deployment.createdAt).toLocaleString()}
197176
</span>
198177
</div>
199178
<a

src/hooks/useVercelDeployments.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
2+
import { IpcClient } from "@/ipc/ipc_client";
3+
import { VercelDeployment } from "@/ipc/ipc_types";
4+
5+
export function useVercelDeployments(appId: number) {
6+
const queryClient = useQueryClient();
7+
8+
const {
9+
data: deployments = [],
10+
isLoading,
11+
error,
12+
refetch,
13+
} = useQuery<VercelDeployment[], Error>({
14+
queryKey: ["vercel-deployments", appId],
15+
queryFn: async () => {
16+
const ipcClient = IpcClient.getInstance();
17+
return ipcClient.getVercelDeployments({ appId });
18+
},
19+
// enabled: false, // Don't auto-fetch, only fetch when explicitly requested
20+
});
21+
22+
const disconnectProjectMutation = useMutation<void, Error, void>({
23+
mutationFn: async () => {
24+
const ipcClient = IpcClient.getInstance();
25+
return ipcClient.disconnectVercelProject({ appId });
26+
},
27+
onSuccess: () => {
28+
// Clear deployments cache when project is disconnected
29+
queryClient.removeQueries({ queryKey: ["vercel-deployments", appId] });
30+
},
31+
});
32+
33+
const getDeployments = async () => {
34+
return refetch();
35+
};
36+
37+
const disconnectProject = async () => {
38+
return disconnectProjectMutation.mutateAsync();
39+
};
40+
41+
return {
42+
deployments,
43+
isLoading,
44+
error: error?.message || null,
45+
getDeployments,
46+
disconnectProject,
47+
isDisconnecting: disconnectProjectMutation.isPending,
48+
disconnectError: disconnectProjectMutation.error?.message || null,
49+
};
50+
}

src/ipc/handlers/vercel_handlers.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
CreateVercelProjectParams,
1616
IsVercelProjectAvailableParams,
1717
SaveVercelAccessTokenParams,
18+
VercelDeployment,
1819
VercelProject,
1920
} from "../ipc_types";
2021
import { ConnectToExistingVercelProjectParams } from "../ipc_types";
@@ -400,16 +401,7 @@ async function handleConnectToExistingProject(
400401
async function handleGetVercelDeployments(
401402
event: IpcMainInvokeEvent,
402403
{ appId }: GetVercelDeploymentsParams,
403-
): Promise<
404-
{
405-
uid: string;
406-
url: string;
407-
state: string;
408-
createdAt: number;
409-
target: string;
410-
readyState: string;
411-
}[]
412-
> {
404+
): Promise<VercelDeployment[]> {
413405
try {
414406
const settings = readSettings();
415407
const accessToken = settings.vercelAccessToken?.value;

src/ipc/ipc_types.ts

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -272,15 +272,6 @@ export interface GetAppEnvVarsParams {
272272
appId: number;
273273
}
274274

275-
export interface VercelDeployment {
276-
uid: string;
277-
url: string;
278-
state: string;
279-
createdAt: number;
280-
target: string;
281-
readyState: string;
282-
}
283-
284275
export interface ConnectToExistingVercelProjectParams {
285276
projectId: string;
286277
appId: number;
@@ -300,6 +291,15 @@ export interface GetVercelDeploymentsParams {
300291
appId: number;
301292
}
302293

294+
export interface VercelDeployment {
295+
uid: string;
296+
url: string;
297+
state: string;
298+
createdAt: number;
299+
target: string;
300+
readyState: string;
301+
}
302+
303303
export interface DisconnectVercelProjectParams {
304304
appId: number;
305305
}

0 commit comments

Comments
 (0)