This commit is contained in:
Stephen Zhou 2026-04-30 14:41:39 +08:00
parent 63c0921936
commit 42d0b63891
No known key found for this signature in database
2 changed files with 66 additions and 72 deletions

View File

@ -14,6 +14,7 @@ import {
useRevokeDeploymentApiKey,
useSetEnvironmentAccessPolicy,
useToggleDeploymentAccessChannel,
useToggleDeploymentDeveloperAPI,
} from '../hooks/use-deployment-mutations'
import { deploymentEnvironmentDeploymentsQueryOptions } from '../queries'
import {
@ -51,6 +52,7 @@ const AccessTab: FC<AccessTabProps> = ({ instanceId: appId }) => {
const generateApiKey = useGenerateDeploymentApiKey()
const revokeApiKey = useRevokeDeploymentApiKey()
const toggleAccessChannel = useToggleDeploymentAccessChannel()
const toggleDeveloperAPI = useToggleDeploymentDeveloperAPI()
const setEnvironmentAccessPolicy = useSetEnvironmentAccessPolicy()
const deploymentRows = useMemo(
@ -141,14 +143,20 @@ const AccessTab: FC<AccessTabProps> = ({ instanceId: appId }) => {
webappRows={webappRows}
cliDomain={cliDomain}
cliDocsUrl={cliDocsUrl}
onToggle={enabled => toggleAccessChannel.mutate({ appId, channel: 'webapp', enabled })}
onToggle={enabled => toggleAccessChannel.mutate({
params: { appInstanceId: appId },
body: { enabled },
})}
/>
<DeveloperApiSection
apiEnabled={apiEnabled}
environments={deployedEnvs}
apiKeys={apiKeys}
createdToken={visibleCreatedApiToken}
onToggle={enabled => toggleAccessChannel.mutate({ appId, channel: 'api', enabled })}
onToggle={enabled => toggleDeveloperAPI.mutate({
params: { appInstanceId: appId },
body: { enabled },
})}
onGenerate={handleGenerateApiKey}
onRevoke={handleRevokeApiKey}
onClearCreatedToken={() => setCreatedApiToken(undefined)}

View File

@ -5,7 +5,6 @@ import type { ConsoleReleaseSummary } from '@/contract/console/deployments'
import { useMutation, useQueryClient } from '@tanstack/react-query'
import { consoleClient, consoleQuery } from '@/service/client'
import { DEPLOYMENT_PAGE_SIZE } from '../data'
import { deploymentReleaseHistoryQueryOptions } from '../queries'
export type CreateDeploymentInstanceResult = {
appInstanceId: string
@ -31,23 +30,21 @@ type UndeployDeploymentParams = {
isDeploying?: boolean
}
type ToggleAccessChannelParams = {
appId: string
channel: string
enabled: boolean
}
const DEPLOYMENT_READINESS_RETRY_DELAYS = [0, 300, 700, 1200]
const wait = (delay: number) => new Promise(resolve => setTimeout(resolve, delay))
const appInstanceInput = (appInstanceId: string) => ({
input: {
params: { appInstanceId },
},
const appInstanceQueryInput = (appInstanceId: string) => ({
params: { appInstanceId },
})
const environmentAccessPolicyInput = (appInstanceId: string, environmentId: string) => ({
const appInstanceQueryKey = (appInstanceId: string) => ({
type: 'query' as const,
input: appInstanceQueryInput(appInstanceId),
})
const environmentAccessPolicyQueryKey = (appInstanceId: string, environmentId: string) => ({
type: 'query' as const,
input: {
params: {
appInstanceId,
@ -56,38 +53,38 @@ const environmentAccessPolicyInput = (appInstanceId: string, environmentId: stri
},
})
const invalidateQueries = (queryClient: QueryClient, queryKeys: QueryKey[]) => {
void Promise.all(queryKeys.map(queryKey => queryClient.invalidateQueries({ queryKey })))
const invalidateQueries = async (queryClient: QueryClient, queryKeys: QueryKey[]): Promise<void> => {
await Promise.all(queryKeys.map(queryKey => queryClient.invalidateQueries({ queryKey })))
}
const invalidateInstanceList = (queryClient: QueryClient) => {
void queryClient.invalidateQueries({
queryKey: consoleQuery.deployments.list.key(),
const invalidateInstanceList = (queryClient: QueryClient): Promise<void> => {
return queryClient.invalidateQueries({
queryKey: consoleQuery.deployments.list.key({ type: 'query' }),
})
}
const invalidateInstanceIdentity = (queryClient: QueryClient, appInstanceId: string) => {
invalidateQueries(queryClient, [
consoleQuery.deployments.list.key(),
consoleQuery.deployments.overview.queryKey(appInstanceInput(appInstanceId)),
consoleQuery.deployments.settings.queryKey(appInstanceInput(appInstanceId)),
const invalidateInstanceIdentity = (queryClient: QueryClient, appInstanceId: string): Promise<void> => {
return invalidateQueries(queryClient, [
consoleQuery.deployments.list.key({ type: 'query' }),
consoleQuery.deployments.overview.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.settings.key(appInstanceQueryKey(appInstanceId)),
])
}
const invalidateDeploymentState = (queryClient: QueryClient, appInstanceId: string) => {
invalidateQueries(queryClient, [
consoleQuery.deployments.list.key(),
consoleQuery.deployments.overview.queryKey(appInstanceInput(appInstanceId)),
consoleQuery.deployments.environmentDeployments.queryKey(appInstanceInput(appInstanceId)),
deploymentReleaseHistoryQueryOptions(appInstanceId).queryKey,
consoleQuery.deployments.accessConfig.queryKey(appInstanceInput(appInstanceId)),
const invalidateDeploymentState = (queryClient: QueryClient, appInstanceId: string): Promise<void> => {
return invalidateQueries(queryClient, [
consoleQuery.deployments.list.key({ type: 'query' }),
consoleQuery.deployments.overview.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.environmentDeployments.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.releaseHistory.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.accessConfig.key(appInstanceQueryKey(appInstanceId)),
])
}
const invalidateAccessState = (queryClient: QueryClient, appInstanceId: string) => {
invalidateQueries(queryClient, [
consoleQuery.deployments.overview.queryKey(appInstanceInput(appInstanceId)),
consoleQuery.deployments.accessConfig.queryKey(appInstanceInput(appInstanceId)),
const invalidateAccessState = (queryClient: QueryClient, appInstanceId: string): Promise<void> => {
return invalidateQueries(queryClient, [
consoleQuery.deployments.overview.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.accessConfig.key(appInstanceQueryKey(appInstanceId)),
])
}
@ -95,11 +92,11 @@ const invalidateEnvironmentAccessPolicy = (
queryClient: QueryClient,
appInstanceId: string,
environmentId: string,
) => {
invalidateQueries(queryClient, [
consoleQuery.deployments.accessConfig.queryKey(appInstanceInput(appInstanceId)),
consoleQuery.deployments.environmentAccessPolicy.queryKey(
environmentAccessPolicyInput(appInstanceId, environmentId),
): Promise<void> => {
return invalidateQueries(queryClient, [
consoleQuery.deployments.accessConfig.key(appInstanceQueryKey(appInstanceId)),
consoleQuery.deployments.environmentAccessPolicy.key(
environmentAccessPolicyQueryKey(appInstanceId, environmentId),
),
])
}
@ -140,7 +137,7 @@ export const useCreateDeploymentInstance = () => {
}
},
onSuccess: () => {
invalidateInstanceList(queryClient)
return invalidateInstanceList(queryClient)
},
})
}
@ -150,7 +147,7 @@ export const useUpdateDeploymentInstance = () => {
return useMutation(consoleQuery.deployments.updateInstance.mutationOptions({
onSuccess: (_data, variables) => {
invalidateInstanceIdentity(queryClient, variables.params.appInstanceId)
return invalidateInstanceIdentity(queryClient, variables.params.appInstanceId)
},
}))
}
@ -160,7 +157,7 @@ export const useDeleteDeploymentInstance = () => {
return useMutation(consoleQuery.deployments.deleteInstance.mutationOptions({
onSuccess: () => {
invalidateInstanceList(queryClient)
return invalidateInstanceList(queryClient)
},
}))
}
@ -216,7 +213,7 @@ export const useStartDeployment = () => {
})
},
onSuccess: (_data, variables) => {
invalidateDeploymentState(queryClient, variables.appId)
return invalidateDeploymentState(queryClient, variables.appId)
},
})
}
@ -245,7 +242,7 @@ export const useUndeployDeployment = () => {
})
},
onSuccess: (_data, variables) => {
invalidateDeploymentState(queryClient, variables.appId)
return invalidateDeploymentState(queryClient, variables.appId)
},
})
}
@ -255,7 +252,7 @@ export const useGenerateDeploymentApiKey = () => {
return useMutation(consoleQuery.deployments.createEnvironmentAPIToken.mutationOptions({
onSuccess: (_data, variables) => {
invalidateAccessState(queryClient, variables.params.appInstanceId)
return invalidateAccessState(queryClient, variables.params.appInstanceId)
},
}))
}
@ -265,7 +262,7 @@ export const useRevokeDeploymentApiKey = () => {
return useMutation(consoleQuery.deployments.deleteEnvironmentAPIToken.mutationOptions({
onSuccess: (_data, variables) => {
invalidateAccessState(queryClient, variables.params.appInstanceId)
return invalidateAccessState(queryClient, variables.params.appInstanceId)
},
}))
}
@ -273,32 +270,21 @@ export const useRevokeDeploymentApiKey = () => {
export const useToggleDeploymentAccessChannel = () => {
const queryClient = useQueryClient()
return useMutation({
mutationKey: consoleQuery.deployments.patchAccessChannel.mutationKey(),
mutationFn: ({ appId, channel, enabled }: ToggleAccessChannelParams) => {
if (channel === 'api') {
return consoleClient.deployments.patchDeveloperAPI({
params: {
appInstanceId: appId,
},
body: {
enabled,
},
})
}
return consoleClient.deployments.patchAccessChannel({
params: {
appInstanceId: appId,
},
body: {
enabled,
},
})
},
return useMutation(consoleQuery.deployments.patchAccessChannel.mutationOptions({
onSuccess: (_data, variables) => {
invalidateAccessState(queryClient, variables.appId)
return invalidateAccessState(queryClient, variables.params.appInstanceId)
},
})
}))
}
export const useToggleDeploymentDeveloperAPI = () => {
const queryClient = useQueryClient()
return useMutation(consoleQuery.deployments.patchDeveloperAPI.mutationOptions({
onSuccess: (_data, variables) => {
return invalidateAccessState(queryClient, variables.params.appInstanceId)
},
}))
}
export const useSetEnvironmentAccessPolicy = () => {
@ -306,7 +292,7 @@ export const useSetEnvironmentAccessPolicy = () => {
return useMutation(consoleQuery.deployments.updateEnvironmentAccessPolicy.mutationOptions({
onSuccess: (_data, variables) => {
invalidateEnvironmentAccessPolicy(
return invalidateEnvironmentAccessPolicy(
queryClient,
variables.params.appInstanceId,
variables.params.environmentId,