🔒 fix: Robust Cache Reset on User Logout (#1324)

* refactor(Logout): rely on hooks for mutation behavior

* fix: logging out now correctly resets cache, disallowing any cache mixing between the next logged in user on the same browser

* chore: remove additional localStorage values on logout
This commit is contained in:
Danny Avila 2023-12-10 17:13:42 -05:00 committed by GitHub
parent 583e978a82
commit 968b8ccdbd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 109 additions and 90 deletions

View file

@ -1,5 +1,5 @@
import * as f from './types/files';
import * as p from './types/presets';
import * as m from './types/mutations';
import * as a from './types/assistants';
import * as t from './types';
import * as s from './schemas';
@ -82,7 +82,7 @@ export function updatePreset(payload: s.TPreset): Promise<s.TPreset> {
return request.post(endpoints.presets(), payload);
}
export function deletePreset(arg: s.TPreset | undefined): Promise<p.PresetDeleteResponse> {
export function deletePreset(arg: s.TPreset | undefined): Promise<m.PresetDeleteResponse> {
return request.post(endpoints.deletePreset(), arg);
}

View file

@ -2,7 +2,7 @@
export * from './types';
export * from './types/assistants';
export * from './types/files';
export * from './types/presets';
export * from './types/mutations';
/*
* react query
* TODO: move to client, or move schemas/types to their own package

View file

@ -23,4 +23,5 @@ export enum MutationKeys {
fileDelete = 'fileDelete',
updatePreset = 'updatePreset',
deletePreset = 'deletePreset',
logoutUser = 'logoutUser',
}

View file

@ -8,7 +8,7 @@ import {
} from '@tanstack/react-query';
import * as t from './types';
import * as s from './schemas';
import * as p from './types/presets';
import * as m from './types/mutations';
import * as dataService from './data-service';
import request from './request';
import { QueryKeys } from './keys';
@ -306,19 +306,8 @@ export const useUpdatePresetMutation = (): UseMutationResult<
});
};
export const useGetPresetsQuery = (
config?: UseQueryOptions<s.TPreset[]>,
): QueryObserverResult<s.TPreset[], unknown> => {
return useQuery<s.TPreset[]>([QueryKeys.presets], () => dataService.getPresets(), {
refetchOnWindowFocus: false,
refetchOnReconnect: false,
refetchOnMount: false,
...config,
});
};
export const useDeletePresetMutation = (): UseMutationResult<
p.PresetDeleteResponse,
m.PresetDeleteResponse,
unknown,
s.TPreset | undefined,
unknown
@ -370,14 +359,8 @@ export const useLoginUserMutation = (): UseMutationResult<
> => {
const queryClient = useQueryClient();
return useMutation((payload: t.TLoginUser) => dataService.login(payload), {
onSuccess: () => {
queryClient.invalidateQueries([QueryKeys.user]);
queryClient.invalidateQueries([QueryKeys.presets]);
queryClient.invalidateQueries([QueryKeys.conversation]);
queryClient.invalidateQueries([QueryKeys.allConversations]);
},
onMutate: () => {
queryClient.invalidateQueries([QueryKeys.models]);
queryClient.removeQueries();
},
});
};
@ -396,15 +379,6 @@ export const useRegisterUserMutation = (): UseMutationResult<
});
};
export const useLogoutUserMutation = (): UseMutationResult<unknown> => {
const queryClient = useQueryClient();
return useMutation(() => dataService.logout(), {
onSuccess: () => {
queryClient.invalidateQueries([QueryKeys.user]);
},
});
};
export const useRefreshTokenMutation = (): UseMutationResult<
t.TRefreshTokenResponse,
unknown,
@ -414,7 +388,12 @@ export const useRefreshTokenMutation = (): UseMutationResult<
const queryClient = useQueryClient();
return useMutation(() => request.refreshToken(), {
onMutate: () => {
queryClient.invalidateQueries([QueryKeys.models]);
queryClient.removeQueries();
localStorage.removeItem('lastConversationSetup');
localStorage.removeItem('lastSelectedModel');
localStorage.removeItem('lastSelectedTools');
localStorage.removeItem('filesToDelete');
localStorage.removeItem('lastAssistant');
},
});
};

View file

@ -20,3 +20,9 @@ export type DeletePresetOptions = {
onMutate?: (variables: TPreset | undefined) => void | Promise<unknown>;
onError?: (error: unknown, variables: TPreset | undefined, context?: unknown) => void;
};
export type LogoutOptions = {
onSuccess?: (data: unknown, variables: undefined, context?: unknown) => void;
onMutate?: (variables: undefined) => void | Promise<unknown>;
onError?: (error: unknown, variables: undefined, context?: unknown) => void;
};