2018-09-10 09:55:26 -07:00
|
|
|
import axios from './axios';
|
2018-11-07 09:33:19 -08:00
|
|
|
import {
|
2018-11-16 10:50:47 -08:00
|
|
|
Proposal,
|
|
|
|
ProposalDraft,
|
2019-02-05 12:34:19 -08:00
|
|
|
ProposalPage,
|
2018-11-16 15:05:17 -08:00
|
|
|
User,
|
2018-11-16 10:50:47 -08:00
|
|
|
Update,
|
|
|
|
TeamInvite,
|
|
|
|
TeamInviteWithProposal,
|
2019-01-02 10:23:02 -08:00
|
|
|
SOCIAL_SERVICE,
|
2019-01-06 22:58:33 -08:00
|
|
|
ContributionWithAddresses,
|
2019-01-16 14:26:45 -08:00
|
|
|
EmailSubscriptions,
|
2019-01-30 09:59:15 -08:00
|
|
|
RFP,
|
2019-02-05 12:34:19 -08:00
|
|
|
ProposalPageParams,
|
2019-02-17 18:13:24 -08:00
|
|
|
PageParams,
|
2018-11-16 10:50:47 -08:00
|
|
|
} from 'types';
|
2019-01-31 14:56:16 -08:00
|
|
|
import {
|
|
|
|
formatUserForPost,
|
|
|
|
formatProposalFromGet,
|
|
|
|
formatUserFromGet,
|
|
|
|
formatRFPFromGet,
|
2019-02-05 12:34:19 -08:00
|
|
|
formatProposalPageParamsForGet,
|
|
|
|
formatProposalPageFromGet,
|
2019-01-31 14:56:16 -08:00
|
|
|
} from 'utils/api';
|
2018-09-10 09:55:26 -07:00
|
|
|
|
2019-02-05 12:34:19 -08:00
|
|
|
export function getProposals(page?: ProposalPageParams): Promise<{ data: ProposalPage }> {
|
|
|
|
let serverParams;
|
|
|
|
if (page) {
|
|
|
|
serverParams = formatProposalPageParamsForGet(page);
|
|
|
|
}
|
|
|
|
return axios.get('/api/v1/proposals/', { params: serverParams || {} }).then(res => {
|
|
|
|
res.data = formatProposalPageFromGet(res.data);
|
2018-09-27 13:39:37 -07:00
|
|
|
return res;
|
|
|
|
});
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
export function getProposal(proposalId: number | string): Promise<{ data: Proposal }> {
|
2018-09-27 13:39:37 -07:00
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}`).then(res => {
|
2018-11-14 14:24:56 -08:00
|
|
|
res.data = formatProposalFromGet(res.data);
|
2018-09-27 13:39:37 -07:00
|
|
|
return res;
|
|
|
|
});
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
|
|
|
|
2019-02-17 18:13:24 -08:00
|
|
|
export function getProposalComments(proposalId: number | string, params: PageParams) {
|
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}/comments`, { params });
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
|
|
|
|
2019-02-18 13:31:20 -08:00
|
|
|
export function reportProposalComment(proposalId: number, commentId: number) {
|
|
|
|
return axios.put(`/api/v1/proposals/${proposalId}/comments/${commentId}/report`);
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
export function getProposalUpdates(proposalId: number | string) {
|
2018-09-18 15:20:17 -07:00
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}/updates`);
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
|
|
|
|
2019-01-09 12:48:41 -08:00
|
|
|
export function getProposalContributions(proposalId: number | string) {
|
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}/contributions`);
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:43:00 -08:00
|
|
|
export function postProposal(payload: ProposalDraft) {
|
2018-09-25 13:09:25 -07:00
|
|
|
return axios.post(`/api/v1/proposals/`, {
|
|
|
|
...payload,
|
2018-09-27 13:25:49 -07:00
|
|
|
// Team has a different shape for POST
|
2018-11-16 15:05:17 -08:00
|
|
|
team: payload.team.map(formatUserForPost),
|
2018-09-25 13:09:25 -07:00
|
|
|
});
|
2018-09-10 09:55:26 -07:00
|
|
|
}
|
2018-10-01 16:22:56 -07:00
|
|
|
|
2018-11-16 15:05:17 -08:00
|
|
|
export function getUser(address: string): Promise<{ data: User }> {
|
2018-11-30 15:52:00 -08:00
|
|
|
return axios
|
|
|
|
.get(`/api/v1/users/${address}`, {
|
|
|
|
params: {
|
|
|
|
withProposals: true,
|
|
|
|
withComments: true,
|
|
|
|
withFunded: true,
|
2019-01-09 10:23:08 -08:00
|
|
|
withPending: true,
|
2019-02-06 14:37:45 -08:00
|
|
|
withArbitrated: true,
|
2018-11-30 15:52:00 -08:00
|
|
|
},
|
|
|
|
})
|
|
|
|
.then(res => {
|
|
|
|
res.data = formatUserFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
2018-10-01 16:22:56 -07:00
|
|
|
}
|
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
export function createUser(user: {
|
|
|
|
email: string;
|
|
|
|
password: string;
|
|
|
|
name: string;
|
2018-10-01 16:22:56 -07:00
|
|
|
title: string;
|
2018-11-16 15:05:17 -08:00
|
|
|
}): Promise<{ data: User }> {
|
2018-12-14 11:36:22 -08:00
|
|
|
const payload = {
|
|
|
|
emailAddress: user.email,
|
|
|
|
password: user.password,
|
|
|
|
displayName: user.name,
|
|
|
|
title: user.title,
|
|
|
|
};
|
2018-11-16 15:05:17 -08:00
|
|
|
return axios.post('/api/v1/users', payload);
|
2018-11-07 11:08:42 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
export function authUser(payload: {
|
2018-12-14 11:36:22 -08:00
|
|
|
email: string;
|
|
|
|
password: string;
|
2018-11-16 15:05:17 -08:00
|
|
|
}): Promise<{ data: User }> {
|
|
|
|
return axios.post('/api/v1/users/auth', payload);
|
2018-10-01 16:22:56 -07:00
|
|
|
}
|
2018-10-30 07:40:21 -07:00
|
|
|
|
2018-12-14 11:36:22 -08:00
|
|
|
export function logoutUser() {
|
|
|
|
return axios.post('/api/v1/users/logout');
|
|
|
|
}
|
|
|
|
|
|
|
|
export function checkUserAuth(): Promise<{ data: User }> {
|
|
|
|
return axios.get(`/api/v1/users/me`);
|
|
|
|
}
|
|
|
|
|
2018-12-17 10:33:33 -08:00
|
|
|
export function updateUserPassword(
|
|
|
|
currentPassword: string,
|
|
|
|
password: string,
|
|
|
|
): Promise<any> {
|
2019-01-24 10:53:26 -08:00
|
|
|
return axios.put(`/api/v1/users/me/password`, { currentPassword, password });
|
2018-12-14 11:36:22 -08:00
|
|
|
}
|
|
|
|
|
2019-01-24 10:53:26 -08:00
|
|
|
export function updateUserEmail(email: string, password: string): Promise<any> {
|
|
|
|
return axios.put('/api/v1/users/me/email', { email, password });
|
2019-01-23 14:28:27 -08:00
|
|
|
}
|
|
|
|
|
2018-11-16 15:05:17 -08:00
|
|
|
export function updateUser(user: User): Promise<{ data: User }> {
|
2018-12-14 11:36:22 -08:00
|
|
|
return axios.put(`/api/v1/users/${user.userid}`, formatUserForPost(user));
|
2018-10-30 07:40:21 -07:00
|
|
|
}
|
2018-11-02 09:07:06 -07:00
|
|
|
|
2019-01-16 14:26:45 -08:00
|
|
|
export function getUserSettings(userId: string | number): Promise<any> {
|
|
|
|
return axios.get(`/api/v1/users/${userId}/settings`);
|
|
|
|
}
|
|
|
|
|
2019-02-16 08:49:32 -08:00
|
|
|
interface SettingsArgs {
|
|
|
|
emailSubscriptions?: EmailSubscriptions;
|
|
|
|
refundAddress?: string;
|
|
|
|
}
|
2019-01-16 14:26:45 -08:00
|
|
|
export function updateUserSettings(
|
|
|
|
userId: string | number,
|
2019-02-16 08:49:32 -08:00
|
|
|
args?: SettingsArgs,
|
2019-01-16 14:26:45 -08:00
|
|
|
): Promise<any> {
|
2019-02-16 08:49:32 -08:00
|
|
|
return axios.put(`/api/v1/users/${userId}/settings`, args);
|
2019-01-16 14:26:45 -08:00
|
|
|
}
|
|
|
|
|
2019-02-09 19:03:19 -08:00
|
|
|
export function updateUserArbiter(
|
|
|
|
userId: number,
|
|
|
|
proposalId: number,
|
|
|
|
isAccept: boolean,
|
|
|
|
): Promise<any> {
|
|
|
|
return axios.put(`/api/v1/users/${userId}/arbiter/${proposalId}`, { isAccept });
|
|
|
|
}
|
|
|
|
|
2018-12-17 10:33:33 -08:00
|
|
|
export function requestUserRecoveryEmail(email: string): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/users/recover`, { email });
|
|
|
|
}
|
|
|
|
|
|
|
|
export function resetPassword(code: string, password: string): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/users/recover/${code}`, { password });
|
|
|
|
}
|
|
|
|
|
2018-11-02 09:07:06 -07:00
|
|
|
export function verifyEmail(code: string): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/email/${code}/verify`);
|
2018-11-02 09:24:28 -07:00
|
|
|
}
|
|
|
|
|
2019-01-16 14:26:45 -08:00
|
|
|
export function unsubscribeEmail(code: string): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/email/${code}/unsubscribe`);
|
|
|
|
}
|
|
|
|
|
2019-02-09 19:03:19 -08:00
|
|
|
export function arbiterEmail(code: string, proposalId: number): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/email/${code}/arbiter/${proposalId}`);
|
|
|
|
}
|
|
|
|
|
2019-01-02 10:23:02 -08:00
|
|
|
export function getSocialAuthUrl(service: SOCIAL_SERVICE): Promise<any> {
|
|
|
|
return axios.get(`/api/v1/users/social/${service}/authurl`);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function verifySocial(service: SOCIAL_SERVICE, code: string): Promise<any> {
|
|
|
|
return axios.post(`/api/v1/users/social/${service}/verify`, { code });
|
|
|
|
}
|
|
|
|
|
2018-11-21 15:24:33 -08:00
|
|
|
export async function fetchCrowdFundFactoryJSON(): Promise<any> {
|
|
|
|
const res = await axios.get(process.env.CROWD_FUND_FACTORY_URL as string);
|
|
|
|
return res.data;
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function fetchCrowdFundJSON(): Promise<any> {
|
|
|
|
const res = await axios.get(process.env.CROWD_FUND_URL as string);
|
|
|
|
return res.data;
|
|
|
|
}
|
|
|
|
|
2018-11-02 09:24:28 -07:00
|
|
|
export function postProposalUpdate(
|
2018-11-07 09:33:19 -08:00
|
|
|
proposalId: number,
|
2018-11-02 09:24:28 -07:00
|
|
|
title: string,
|
|
|
|
content: string,
|
|
|
|
): Promise<{ data: Update }> {
|
2018-11-07 09:33:19 -08:00
|
|
|
return axios.post(`/api/v1/proposals/${proposalId}/updates`, {
|
|
|
|
title,
|
|
|
|
content,
|
|
|
|
});
|
|
|
|
}
|
2018-11-08 10:29:29 -08:00
|
|
|
|
2018-11-13 08:07:09 -08:00
|
|
|
export function getProposalDrafts(): Promise<{ data: ProposalDraft[] }> {
|
2018-11-16 15:05:17 -08:00
|
|
|
return axios.get('/api/v1/proposals/drafts');
|
2018-11-13 08:07:09 -08:00
|
|
|
}
|
|
|
|
|
2019-02-01 11:13:30 -08:00
|
|
|
export function postProposalDraft(rfpId?: number): Promise<{ data: ProposalDraft }> {
|
|
|
|
return axios.post('/api/v1/proposals/drafts', { rfpId });
|
2018-11-13 08:07:09 -08:00
|
|
|
}
|
2018-11-14 08:43:00 -08:00
|
|
|
|
2018-11-15 08:02:16 -08:00
|
|
|
export function deleteProposalDraft(proposalId: number): Promise<any> {
|
|
|
|
return axios.delete(`/api/v1/proposals/${proposalId}`);
|
|
|
|
}
|
|
|
|
|
2018-11-14 08:43:00 -08:00
|
|
|
export function putProposal(proposal: ProposalDraft): Promise<{ data: ProposalDraft }> {
|
|
|
|
// Exclude some keys
|
2018-11-14 13:18:40 -08:00
|
|
|
const { proposalId, stage, dateCreated, team, ...rest } = proposal;
|
2018-11-14 08:43:00 -08:00
|
|
|
return axios.put(`/api/v1/proposals/${proposal.proposalId}`, rest);
|
|
|
|
}
|
2018-11-14 14:03:50 -08:00
|
|
|
|
2019-01-09 10:23:08 -08:00
|
|
|
export async function putProposalSubmitForApproval(
|
2019-01-04 11:03:37 -08:00
|
|
|
proposal: ProposalDraft,
|
|
|
|
): Promise<{ data: Proposal }> {
|
2019-01-09 10:23:08 -08:00
|
|
|
return axios
|
|
|
|
.put(`/api/v1/proposals/${proposal.proposalId}/submit_for_approval`)
|
|
|
|
.then(res => {
|
|
|
|
res.data = formatProposalFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function putProposalPublish(
|
|
|
|
proposalId: number,
|
|
|
|
): Promise<{ data: Proposal }> {
|
|
|
|
return axios.put(`/api/v1/proposals/${proposalId}/publish`).then(res => {
|
2018-12-28 15:05:34 -08:00
|
|
|
res.data = formatProposalFromGet(res.data);
|
|
|
|
return res;
|
2018-11-14 14:03:50 -08:00
|
|
|
});
|
|
|
|
}
|
2018-11-16 08:16:52 -08:00
|
|
|
|
2019-02-19 11:48:51 -08:00
|
|
|
export async function deleteProposalRFPLink(proposalId: number): Promise<any> {
|
|
|
|
return axios.delete(`/api/v1/proposals/${proposalId}/rfp`);
|
|
|
|
}
|
|
|
|
|
2019-02-11 21:10:09 -08:00
|
|
|
export async function requestProposalPayout(
|
|
|
|
proposalId: number,
|
|
|
|
milestoneId: number,
|
|
|
|
): Promise<{ data: Proposal }> {
|
|
|
|
return axios
|
|
|
|
.put(`/api/v1/proposals/${proposalId}/milestone/${milestoneId}/request`)
|
|
|
|
.then(res => {
|
|
|
|
res.data = formatProposalFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
export async function acceptProposalPayout(
|
|
|
|
proposalId: number,
|
|
|
|
milestoneId: number,
|
|
|
|
): Promise<{ data: Proposal }> {
|
|
|
|
return axios
|
|
|
|
.put(`/api/v1/proposals/${proposalId}/milestone/${milestoneId}/accept`)
|
|
|
|
.then(res => {
|
|
|
|
res.data = formatProposalFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
export async function rejectProposalPayout(
|
|
|
|
proposalId: number,
|
|
|
|
milestoneId: number,
|
|
|
|
reason: string,
|
|
|
|
): Promise<{ data: Proposal }> {
|
|
|
|
return axios
|
|
|
|
.put(`/api/v1/proposals/${proposalId}/milestone/${milestoneId}/reject`, { reason })
|
|
|
|
.then(res => {
|
|
|
|
res.data = formatProposalFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-11-16 08:16:52 -08:00
|
|
|
export function postProposalInvite(
|
|
|
|
proposalId: number,
|
|
|
|
address: string,
|
|
|
|
): Promise<{ data: TeamInvite }> {
|
|
|
|
return axios.post(`/api/v1/proposals/${proposalId}/invite`, { address });
|
|
|
|
}
|
|
|
|
|
|
|
|
export function deleteProposalInvite(
|
|
|
|
proposalId: number,
|
|
|
|
inviteIdOrAddress: number | string,
|
|
|
|
): Promise<{ data: TeamInvite }> {
|
|
|
|
return axios.delete(`/api/v1/proposals/${proposalId}/invite/${inviteIdOrAddress}`);
|
|
|
|
}
|
2018-11-16 10:50:47 -08:00
|
|
|
|
|
|
|
export function fetchUserInvites(
|
|
|
|
userid: string | number,
|
|
|
|
): Promise<{ data: TeamInviteWithProposal[] }> {
|
|
|
|
return axios.get(`/api/v1/users/${userid}/invites`);
|
|
|
|
}
|
|
|
|
|
|
|
|
export function putInviteResponse(
|
|
|
|
userid: string | number,
|
|
|
|
inviteid: string | number,
|
|
|
|
response: boolean,
|
|
|
|
): Promise<{ data: void }> {
|
|
|
|
return axios.put(`/api/v1/users/${userid}/invites/${inviteid}/respond`, {
|
|
|
|
response,
|
|
|
|
});
|
|
|
|
}
|
2018-11-26 17:14:00 -08:00
|
|
|
|
2018-11-21 19:18:22 -08:00
|
|
|
export function postProposalContribution(
|
|
|
|
proposalId: number,
|
|
|
|
amount: string,
|
2019-01-06 22:58:33 -08:00
|
|
|
): Promise<{ data: ContributionWithAddresses }> {
|
2018-11-21 19:18:22 -08:00
|
|
|
return axios.post(`/api/v1/proposals/${proposalId}/contributions`, {
|
|
|
|
amount,
|
|
|
|
});
|
|
|
|
}
|
2018-11-26 15:25:02 -08:00
|
|
|
|
2018-11-08 10:29:29 -08:00
|
|
|
export function postProposalComment(payload: {
|
|
|
|
proposalId: number;
|
|
|
|
parentCommentId?: number;
|
|
|
|
comment: string;
|
|
|
|
}): Promise<{ data: any }> {
|
|
|
|
const { proposalId, ...args } = payload;
|
|
|
|
return axios.post(`/api/v1/proposals/${proposalId}/comments`, args);
|
|
|
|
}
|
2019-01-09 13:32:51 -08:00
|
|
|
|
|
|
|
export function deleteProposalContribution(contributionId: string | number) {
|
|
|
|
return axios.delete(`/api/v1/proposals/contribution/${contributionId}`);
|
|
|
|
}
|
2019-01-09 14:26:28 -08:00
|
|
|
|
|
|
|
export function getProposalContribution(
|
|
|
|
proposalId: number,
|
|
|
|
contributionId: number,
|
|
|
|
): Promise<{ data: ContributionWithAddresses }> {
|
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}/contributions/${contributionId}`);
|
|
|
|
}
|
2019-01-30 09:59:15 -08:00
|
|
|
|
2019-01-31 14:56:16 -08:00
|
|
|
export function getProposalStakingContribution(
|
|
|
|
proposalId: number,
|
|
|
|
): Promise<{ data: ContributionWithAddresses }> {
|
|
|
|
return axios.get(`/api/v1/proposals/${proposalId}/stake`);
|
|
|
|
}
|
|
|
|
|
2019-01-30 09:59:15 -08:00
|
|
|
export function getRFPs(): Promise<{ data: RFP[] }> {
|
|
|
|
return axios.get('/api/v1/rfps/').then(res => {
|
|
|
|
res.data = res.data.map(formatRFPFromGet);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getRFP(rfpId: number | string): Promise<{ data: RFP }> {
|
|
|
|
return axios.get(`/api/v1/rfps/${rfpId}`).then(res => {
|
|
|
|
res.data = formatRFPFromGet(res.data);
|
|
|
|
return res;
|
|
|
|
});
|
|
|
|
}
|
2019-02-08 11:57:54 -08:00
|
|
|
|
|
|
|
export function resendEmailVerification(): Promise<{ data: void }> {
|
|
|
|
return axios.put(`/api/v1/users/me/resend-verification`);
|
|
|
|
}
|