Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
B
bit-pm
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
燕伟桐
bit-pm
Commits
0793fc29
Unverified
提交
0793fc29
authored
7月 31, 2025
作者:
Will Chen
提交者:
GitHub
7月 31, 2025
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix vercel deployment fetching (#758)
上级
867ea28f
显示空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
75 行增加
和
54 行删除
+75
-54
VercelConnector.tsx
src/components/VercelConnector.tsx
+14
-35
useVercelDeployments.ts
src/hooks/useVercelDeployments.ts
+50
-0
vercel_handlers.ts
src/ipc/handlers/vercel_handlers.ts
+2
-10
ipc_types.ts
src/ipc/ipc_types.ts
+9
-9
没有找到文件。
src/components/VercelConnector.tsx
浏览文件 @
0793fc29
...
@@ -4,6 +4,7 @@ import { Globe } from "lucide-react";
...
@@ -4,6 +4,7 @@ import { Globe } from "lucide-react";
import
{
IpcClient
}
from
"@/ipc/ipc_client"
;
import
{
IpcClient
}
from
"@/ipc/ipc_client"
;
import
{
useSettings
}
from
"@/hooks/useSettings"
;
import
{
useSettings
}
from
"@/hooks/useSettings"
;
import
{
useLoadApp
}
from
"@/hooks/useLoadApp"
;
import
{
useLoadApp
}
from
"@/hooks/useLoadApp"
;
import
{
useVercelDeployments
}
from
"@/hooks/useVercelDeployments"
;
import
{
import
{
Select
,
Select
,
SelectContent
,
SelectContent
,
...
@@ -14,7 +15,7 @@ import {
...
@@ -14,7 +15,7 @@ import {
import
{}
from
"@/components/ui/dialog"
;
import
{}
from
"@/components/ui/dialog"
;
import
{
Input
}
from
"@/components/ui/input"
;
import
{
Input
}
from
"@/components/ui/input"
;
import
{
Label
}
from
"@/components/ui/label"
;
import
{
Label
}
from
"@/components/ui/label"
;
import
{
App
,
VercelDeployment
}
from
"@/ipc/ipc_types"
;
import
{
App
}
from
"@/ipc/ipc_types"
;
interface
VercelConnectorProps
{
interface
VercelConnectorProps
{
appId
:
number
|
null
;
appId
:
number
|
null
;
...
@@ -46,41 +47,19 @@ function ConnectedVercelConnector({
...
@@ -46,41 +47,19 @@ function ConnectedVercelConnector({
app
,
app
,
refreshApp
,
refreshApp
,
}:
ConnectedVercelConnectorProps
)
{
}:
ConnectedVercelConnectorProps
)
{
const
[
isLoadingDeployments
,
setIsLoadingDeployments
]
=
useState
(
false
);
const
{
const
[
deploymentsError
,
setDeploymentsError
]
=
useState
<
string
|
null
>
(
null
);
deployments
,
const
[
deployments
,
setDeployments
]
=
useState
<
VercelDeployment
[]
>
([]);
isLoading
:
isLoadingDeployments
,
const
[
isDisconnecting
,
setIsDisconnecting
]
=
useState
(
false
);
error
:
deploymentsError
,
const
[
disconnectError
,
setDisconnectError
]
=
useState
<
string
|
null
>
(
null
);
getDeployments
:
handleGetDeployments
,
disconnectProject
,
isDisconnecting
,
disconnectError
,
}
=
useVercelDeployments
(
appId
);
const
handleDisconnectProject
=
async
()
=>
{
const
handleDisconnectProject
=
async
()
=>
{
setIsDisconnecting
(
true
);
await
disconnectProject
();
setDisconnectError
(
null
);
try
{
await
IpcClient
.
getInstance
().
disconnectVercelProject
({
appId
});
refreshApp
();
refreshApp
();
}
catch
(
err
:
any
)
{
setDisconnectError
(
err
.
message
||
"Failed to disconnect project."
);
}
finally
{
setIsDisconnecting
(
false
);
}
};
const
handleGetDeployments
=
async
()
=>
{
setIsLoadingDeployments
(
true
);
setDeploymentsError
(
null
);
try
{
const
result
=
await
IpcClient
.
getInstance
().
getVercelDeployments
({
appId
,
});
setDeployments
(
result
);
}
catch
(
err
:
any
)
{
setDeploymentsError
(
err
.
message
||
"Failed to get deployments from Vercel."
,
);
}
finally
{
setIsLoadingDeployments
(
false
);
}
};
};
return
(
return
(
...
@@ -154,7 +133,7 @@ function ConnectedVercelConnector({
...
@@ -154,7 +133,7 @@ function ConnectedVercelConnector({
Getting Deployments...
Getting Deployments...
</>
</>
)
:
(
)
:
(
"
Get
Deployments"
"
Refresh
Deployments"
)
}
)
}
</
Button
>
</
Button
>
<
Button
<
Button
...
@@ -193,7 +172,7 @@ function ConnectedVercelConnector({
...
@@ -193,7 +172,7 @@ function ConnectedVercelConnector({
{
deployment
.
readyState
}
{
deployment
.
readyState
}
</
span
>
</
span
>
<
span
className=
"text-sm text-gray-600 dark:text-gray-300"
>
<
span
className=
"text-sm text-gray-600 dark:text-gray-300"
>
{
new
Date
(
deployment
.
createdAt
*
1000
).
toLocaleString
()
}
{
new
Date
(
deployment
.
createdAt
).
toLocaleString
()
}
</
span
>
</
span
>
</
div
>
</
div
>
<
a
<
a
...
...
src/hooks/useVercelDeployments.ts
0 → 100644
浏览文件 @
0793fc29
import
{
useQuery
,
useMutation
,
useQueryClient
}
from
"@tanstack/react-query"
;
import
{
IpcClient
}
from
"@/ipc/ipc_client"
;
import
{
VercelDeployment
}
from
"@/ipc/ipc_types"
;
export
function
useVercelDeployments
(
appId
:
number
)
{
const
queryClient
=
useQueryClient
();
const
{
data
:
deployments
=
[],
isLoading
,
error
,
refetch
,
}
=
useQuery
<
VercelDeployment
[],
Error
>
({
queryKey
:
[
"vercel-deployments"
,
appId
],
queryFn
:
async
()
=>
{
const
ipcClient
=
IpcClient
.
getInstance
();
return
ipcClient
.
getVercelDeployments
({
appId
});
},
// enabled: false, // Don't auto-fetch, only fetch when explicitly requested
});
const
disconnectProjectMutation
=
useMutation
<
void
,
Error
,
void
>
({
mutationFn
:
async
()
=>
{
const
ipcClient
=
IpcClient
.
getInstance
();
return
ipcClient
.
disconnectVercelProject
({
appId
});
},
onSuccess
:
()
=>
{
// Clear deployments cache when project is disconnected
queryClient
.
removeQueries
({
queryKey
:
[
"vercel-deployments"
,
appId
]
});
},
});
const
getDeployments
=
async
()
=>
{
return
refetch
();
};
const
disconnectProject
=
async
()
=>
{
return
disconnectProjectMutation
.
mutateAsync
();
};
return
{
deployments
,
isLoading
,
error
:
error
?.
message
||
null
,
getDeployments
,
disconnectProject
,
isDisconnecting
:
disconnectProjectMutation
.
isPending
,
disconnectError
:
disconnectProjectMutation
.
error
?.
message
||
null
,
};
}
src/ipc/handlers/vercel_handlers.ts
浏览文件 @
0793fc29
...
@@ -15,6 +15,7 @@ import {
...
@@ -15,6 +15,7 @@ import {
CreateVercelProjectParams
,
CreateVercelProjectParams
,
IsVercelProjectAvailableParams
,
IsVercelProjectAvailableParams
,
SaveVercelAccessTokenParams
,
SaveVercelAccessTokenParams
,
VercelDeployment
,
VercelProject
,
VercelProject
,
}
from
"../ipc_types"
;
}
from
"../ipc_types"
;
import
{
ConnectToExistingVercelProjectParams
}
from
"../ipc_types"
;
import
{
ConnectToExistingVercelProjectParams
}
from
"../ipc_types"
;
...
@@ -400,16 +401,7 @@ async function handleConnectToExistingProject(
...
@@ -400,16 +401,7 @@ async function handleConnectToExistingProject(
async
function
handleGetVercelDeployments
(
async
function
handleGetVercelDeployments
(
event
:
IpcMainInvokeEvent
,
event
:
IpcMainInvokeEvent
,
{
appId
}:
GetVercelDeploymentsParams
,
{
appId
}:
GetVercelDeploymentsParams
,
):
Promise
<
):
Promise
<
VercelDeployment
[]
>
{
{
uid
:
string
;
url
:
string
;
state
:
string
;
createdAt
:
number
;
target
:
string
;
readyState
:
string
;
}[]
>
{
try
{
try
{
const
settings
=
readSettings
();
const
settings
=
readSettings
();
const
accessToken
=
settings
.
vercelAccessToken
?.
value
;
const
accessToken
=
settings
.
vercelAccessToken
?.
value
;
...
...
src/ipc/ipc_types.ts
浏览文件 @
0793fc29
...
@@ -272,15 +272,6 @@ export interface GetAppEnvVarsParams {
...
@@ -272,15 +272,6 @@ export interface GetAppEnvVarsParams {
appId
:
number
;
appId
:
number
;
}
}
export
interface
VercelDeployment
{
uid
:
string
;
url
:
string
;
state
:
string
;
createdAt
:
number
;
target
:
string
;
readyState
:
string
;
}
export
interface
ConnectToExistingVercelProjectParams
{
export
interface
ConnectToExistingVercelProjectParams
{
projectId
:
string
;
projectId
:
string
;
appId
:
number
;
appId
:
number
;
...
@@ -300,6 +291,15 @@ export interface GetVercelDeploymentsParams {
...
@@ -300,6 +291,15 @@ export interface GetVercelDeploymentsParams {
appId
:
number
;
appId
:
number
;
}
}
export
interface
VercelDeployment
{
uid
:
string
;
url
:
string
;
state
:
string
;
createdAt
:
number
;
target
:
string
;
readyState
:
string
;
}
export
interface
DisconnectVercelProjectParams
{
export
interface
DisconnectVercelProjectParams
{
appId
:
number
;
appId
:
number
;
}
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论