zcash-grant-system/frontend/client/utils/api.ts

93 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import BN from 'bn.js';
import { socialMediaToUrl } from 'utils/social';
import { User, CrowdFund, ProposalWithCrowdFund, UserProposal } from 'types';
import { AppState } from 'store/reducers';
export function formatUserForPost(user: User) {
return {
...user,
avatar: user.avatar ? user.avatar.imageUrl : null,
socialMedias: user.socialMedias.map(sm => socialMediaToUrl(sm.service, sm.username)),
};
}
export function formatCrowdFundFromGet(crowdFund: CrowdFund, base = 10): CrowdFund {
const bnKeys = ['amountVotingForRefund', 'balance', 'funded', 'target'] as Array<
keyof CrowdFund
>;
bnKeys.forEach(k => {
crowdFund[k] = new BN(crowdFund[k] as string, base);
});
crowdFund.milestones = crowdFund.milestones.map(ms => {
ms.amount = new BN(ms.amount, base);
ms.amountAgainstPayout = new BN(ms.amountAgainstPayout, base);
return ms;
});
crowdFund.contributors = crowdFund.contributors.map(c => {
c.contributionAmount = new BN(c.contributionAmount, base);
return c;
});
return crowdFund;
}
export function formatProposalFromGet(proposal: ProposalWithCrowdFund) {
proposal.proposalUrlId = generateProposalUrl(proposal.proposalId, proposal.title);
proposal.crowdFund = formatCrowdFundFromGet(proposal.crowdFund);
for (let i = 0; i < proposal.crowdFund.milestones.length; i++) {
proposal.milestones[i] = {
...proposal.milestones[i],
...proposal.crowdFund.milestones[i],
};
}
return proposal;
}
// TODO: i18n on case-by-case basis
export function generateProposalUrl(id: number, title: string) {
const slug = title
.toLowerCase()
.replace(/[\s_]+/g, '-')
.replace(/['"]+/g, '')
.replace(/[^\w\-]+/g, '-')
.replace(/\-{2,}/g, '-')
.replace(/^\-*|\-*$/g, '');
return `${id}-${slug}`;
}
export function extractProposalIdFromUrl(slug: string) {
const proposalId = parseInt(slug, 10);
if (isNaN(proposalId)) {
console.error('extractProposalIdFromUrl could not find id in : ' + slug);
}
return proposalId;
}
// pre-hydration massage (BNify JSONed BNs)
export function massageSerializedState(state: AppState) {
// proposals
state.proposal.proposals.forEach(p => {
formatCrowdFundFromGet(p.crowdFund, 16);
for (let i = 0; i < p.crowdFund.milestones.length; i++) {
p.milestones[i] = {
...p.milestones[i],
...p.crowdFund.milestones[i],
};
}
});
// users
const bnUserProp = (p: UserProposal) => {
p.funded = new BN(p.funded, 16);
p.target = new BN(p.target, 16);
return p;
};
Object.values(state.users.map).forEach(user => {
user.createdProposals.forEach(bnUserProp);
user.fundedProposals.forEach(bnUserProp);
user.comments.forEach(c => {
c.proposal = bnUserProp(c.proposal);
});
});
return state;
}