Skip to content

Instantly share code, notes, and snippets.

@alldayalone
Last active September 17, 2020 09:09
Show Gist options
  • Save alldayalone/a6d25b5ca36a74a652b1e5dcf252b843 to your computer and use it in GitHub Desktop.
Save alldayalone/a6d25b5ca36a74a652b1e5dcf252b843 to your computer and use it in GitHub Desktop.
[My WET codebase trying] DRY part
import { useMutation, queryCache } from 'react-query';
import { useLocation, useHistory } from 'react-router-dom';
import { UserStatus, api, showSuccessMessage } from 'package';
const SuccessMessageByStatus = {
[UserStatus.BLOCKED]: 'User blocked',
[UserStatus.PROMOTED]: 'User promoted',
[UserStatus.ACTIVE]: 'User activated',
};
const getMutationOptions = (location, history) => ({
onSuccess: (data) => {
const status = get(data, 'status');
if (status) {
showSuccessMessage(SuccessMessageByStatus[status]);
if (
status === UserStatus.BLOCKED
&& location.pathname !== 'users'
) {
history.replace('users');
}
}
queryCache.invalidateQueries('users');
},
});
export function useUpdateUser(userId) {
return useMutation(
(data) => api.updateById(userId, data),
getMutationOptions(),
);
}
export function useUploadUserPhoto(userId) {
return useMutation(
(data) => api.uploadPhotoById(userId, data),
getMutationOptions(),
);
}
function useUpdateUserStatus(userId, status) {
const location = useLocation();
const history = useHistory();
return useMutation(
() => api.updateUserStatusById(userId, { status }),
getMutationOptions(location, history),
);
}
export function useActivateUser(userId) {
return useUpdateUserStatus(userId, UserStatus.ACTIVE);
}
export function useBlockUser(userId) {
return useUpdateUserStatus(userId, UserStatus.BLOCKED);
}
export function usePromoteUser(userId) {
return useUpdateUserStatus(userId, UserStatus.PROMOTED);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment