diff --git a/apps/web/pages/settings/security/impersonation.tsx b/apps/web/pages/settings/security/impersonation.tsx index aeadb582e1..4ef5f00b07 100644 --- a/apps/web/pages/settings/security/impersonation.tsx +++ b/apps/web/pages/settings/security/impersonation.tsx @@ -23,8 +23,24 @@ const ProfileImpersonationView = () => { const mutation = trpc.viewer.updateProfile.useMutation({ onSuccess: () => { showToast(t("profile_updated_successfully"), "success"); + reset(getValues()); }, - onError: (error) => { + onSettled: () => { + utils.viewer.me.invalidate(); + }, + onMutate: async ({ disableImpersonation }) => { + await utils.viewer.me.cancel(); + const previousValue = utils.viewer.me.getData(); + + if (previousValue && disableImpersonation) { + utils.viewer.me.setData(undefined, { ...previousValue, disableImpersonation }); + } + return { previousValue }; + }, + onError: (error, variables, context) => { + if (context?.previousValue) { + utils.viewer.me.setData(undefined, context.previousValue); + } showToast(`${t("error")}, ${error.message}`, "error"); }, }); @@ -36,10 +52,13 @@ const ProfileImpersonationView = () => { }); const { - formState: { isSubmitting }, + formState: { isSubmitting, isDirty }, setValue, + reset, + getValues, } = formMethods; + const isDisabled = isSubmitting || !isDirty; return ( <> @@ -47,14 +66,12 @@ const ProfileImpersonationView = () => { form={formMethods} handleSubmit={({ disableImpersonation }) => { mutation.mutate({ disableImpersonation }); - utils.viewer.me.invalidate(); }}>