zcash-grant-system/frontend/client/modules/users/actions.ts

129 lines
3.5 KiB
TypeScript

import { User } from 'types';
import types from './types';
import {
getUser,
updateUser as apiUpdateUser,
fetchUserInvites as apiFetchUserInvites,
putInviteResponse,
deleteProposalContribution,
deleteProposalDraft,
putProposalPublish,
} from 'api/api';
import { Dispatch } from 'redux';
import { cleanClone } from 'utils/helpers';
import { INITIAL_USER } from 'modules/users/reducers';
export function fetchUser(userFetchId: string) {
return async (dispatch: Dispatch<any>) => {
dispatch({ type: types.FETCH_USER_PENDING, payload: { userFetchId } });
try {
const { data: user } = await getUser(userFetchId);
dispatch({
type: types.FETCH_USER_FULFILLED,
payload: { userFetchId, user },
});
} catch (error) {
dispatch({ type: types.FETCH_USER_REJECTED, payload: { userFetchId, error } });
}
};
}
export function updateUser(user: User) {
const userClone = cleanClone(INITIAL_USER, user);
return async (dispatch: Dispatch<any>) => {
dispatch({ type: types.UPDATE_USER_PENDING, payload: { user } });
try {
const { data: updatedUser } = await apiUpdateUser(userClone);
dispatch({
type: types.UPDATE_USER_FULFILLED,
payload: { user: updatedUser },
});
} catch (error) {
dispatch({ type: types.UPDATE_USER_REJECTED, payload: { user, error } });
}
};
}
export function fetchUserInvites(userFetchId: string) {
return async (dispatch: Dispatch<any>) => {
dispatch({
type: types.FETCH_USER_INVITES_PENDING,
payload: { userFetchId },
});
try {
const res = await apiFetchUserInvites(userFetchId);
const invites = res.data.sort((a, b) => (a.dateCreated > b.dateCreated ? -1 : 1));
dispatch({
type: types.FETCH_USER_INVITES_FULFILLED,
payload: { userFetchId, invites },
});
} catch (error) {
dispatch({
type: types.FETCH_USER_INVITES_REJECTED,
payload: { userFetchId, error },
});
}
};
}
export function respondToInvite(
userId: string | number,
inviteId: string | number,
response: boolean,
) {
return async (dispatch: Dispatch<any>) => {
dispatch({
type: types.RESPOND_TO_INVITE_PENDING,
payload: { userId, inviteId, response },
});
try {
await putInviteResponse(userId, inviteId, response);
dispatch({
type: types.RESPOND_TO_INVITE_FULFILLED,
payload: { userId, inviteId, response },
});
} catch (error) {
dispatch({
type: types.RESPOND_TO_INVITE_REJECTED,
payload: { userId, inviteId, error },
});
}
};
}
export function deleteContribution(userId: string | number, contributionId: string | number) {
// Fire and forget
deleteProposalContribution(contributionId);
return {
type: types.DELETE_CONTRIBUTION,
payload: {
userId,
contributionId,
},
};
}
export function deletePendingProposal(userId: number, proposalId: number) {
return async (dispatch: Dispatch<any>) => {
await dispatch({
type: types.USER_DELETE_PROPOSAL,
payload: deleteProposalDraft(proposalId).then(_ => ({ userId, proposalId })),
});
};
}
export function publishPendingProposal(userId: number, proposalId: number) {
return async (dispatch: Dispatch<any>) => {
await dispatch({
type: types.USER_PUBLISH_PROPOSAL,
payload: putProposalPublish(proposalId).then(res => ({
userId,
proposalId,
proposal: res.data,
})),
});
};
}