Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions ui/apps/pmm/src/api/settings.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import type { AxiosRequestConfig } from 'axios';
import {
GetFrontendSettingsResponse,
GetReadonlySettingsResponse,
Expand All @@ -8,8 +9,8 @@ import {
} from 'types/settings.types';
import { api, grafanaApi } from './api';

export const getSettings = async () => {
const res = await api.get<GetSettingsResponse>('/server/settings');
export const getSettings = async (config?: AxiosRequestConfig) => {
const res = await api.get<GetSettingsResponse>('/server/settings', config);
return res.data.settings;
};

Expand Down
27 changes: 25 additions & 2 deletions ui/apps/pmm/src/hooks/api/useSettings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ export const SETTINGS_QUERY_KEY = ['settings'] as const;
export const useSettings = (options?: Partial<UseQueryOptions<Settings>>) =>
useQuery({
queryKey: SETTINGS_QUERY_KEY,
queryFn: () => getSettings(),
queryFn: () => getSettings(options?.axios),
...options,
});

Expand All @@ -50,9 +50,32 @@ export const useUpdateSettings = (
options?: Partial<UseMutationOptions<Settings, Error, UpdateSettingsPayload>>
) => {
const queryClient = useQueryClient();
const settings = useSettings({
enabled: false,
retry: 24,
retryDelay: 2500,
axios: {
disableNotifications: true,
},
});

return useMutation({
mutationFn: (payload) => updateSettings(payload),
mutationFn: async (payload) => {
const prevAddress =
queryClient.getQueryData<Settings>(
SETTINGS_QUERY_KEY
)?.pmmPublicAddress;
const data = await updateSettings(payload);

// nginx is getting reset when public address is changing
// so we need to make sure the UI is accessible after the update
if (prevAddress !== data.pmmPublicAddress) {
await new Promise((resolve) => setTimeout(resolve, 2500));
await settings.refetch({ throwOnError: true });
}

return data;
},
...options,
onSuccess: (data, variables, onMutate, context) => {
void queryClient.invalidateQueries({ queryKey: SETTINGS_QUERY_KEY });
Expand Down
6 changes: 6 additions & 0 deletions ui/apps/pmm/src/types/api.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,10 @@ declare module 'axios' {
}
}

declare module '@tanstack/react-query' {
interface UseQueryOptions {
Comment thread
matejkubinec marked this conversation as resolved.
Outdated
axios?: import('axios').AxiosRequestConfig;
}
}

export interface ApiError extends AxiosError<ApiErrorResponse> {}
Loading