diff --git a/ui/src/api/queries/admin/apps.ts b/ui/src/api/queries/admin/apps.ts index ede1e8bf..188f220c 100644 --- a/ui/src/api/queries/admin/apps.ts +++ b/ui/src/api/queries/admin/apps.ts @@ -203,3 +203,27 @@ export function usePromoteDeployment() { onSuccess: () => qc.invalidateQueries({ queryKey: ['apps'] }), }); } + +// --- Dirty State --- + +export interface DirtyStateDifference { + field: string; + staged: string; + deployed: string; +} + +export interface DirtyState { + dirty: boolean; + lastSuccessfulDeploymentId: string | null; + differences: DirtyStateDifference[]; +} + +export function useDirtyState(envSlug: string | undefined, appSlug: string | undefined) { + return useQuery({ + queryKey: ['apps', envSlug, appSlug, 'dirty-state'], + queryFn: () => apiFetch( + `${envBase(envSlug!)}/${encodeURIComponent(appSlug!)}/dirty-state`, + ), + enabled: !!envSlug && !!appSlug, + }); +} diff --git a/ui/src/api/queries/commands.ts b/ui/src/api/queries/commands.ts index 99fcc1c4..818b4f3e 100644 --- a/ui/src/api/queries/commands.ts +++ b/ui/src/api/queries/commands.ts @@ -83,9 +83,13 @@ export interface ConfigUpdateResponse { export function useUpdateApplicationConfig() { const queryClient = useQueryClient() return useMutation({ - mutationFn: async ({ config, environment }: { config: ApplicationConfig; environment: string }) => { + mutationFn: async ({ config, environment, apply = 'live' }: { + config: ApplicationConfig; + environment: string; + apply?: 'staged' | 'live'; + }) => { const res = await authFetch( - `/environments/${encodeURIComponent(environment)}/apps/${encodeURIComponent(config.application)}/config`, { + `/environments/${encodeURIComponent(environment)}/apps/${encodeURIComponent(config.application)}/config?apply=${apply}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(config),