2018-11-14 14:24:56 -08:00
|
|
|
|
import BN from 'bn.js';
|
2018-11-16 15:05:17 -08:00
|
|
|
|
import { socialMediaToUrl } from 'utils/social';
|
2018-11-26 17:14:00 -08:00
|
|
|
|
import { User, CrowdFund, ProposalWithCrowdFund, UserProposal } from 'types';
|
2018-11-21 19:17:49 -08:00
|
|
|
|
import { AppState } from 'store/reducers';
|
2018-09-27 13:39:37 -07:00
|
|
|
|
|
2018-11-16 15:05:17 -08:00
|
|
|
|
export function formatUserForPost(user: User) {
|
2018-09-27 13:39:37 -07:00
|
|
|
|
return {
|
2018-11-16 15:05:17 -08:00
|
|
|
|
...user,
|
2018-11-26 17:14:00 -08:00
|
|
|
|
avatar: user.avatar ? user.avatar.imageUrl : null,
|
2018-11-19 12:23:56 -08:00
|
|
|
|
socialMedias: user.socialMedias.map(sm => socialMediaToUrl(sm.service, sm.username)),
|
2018-09-27 13:39:37 -07:00
|
|
|
|
};
|
|
|
|
|
}
|
2018-11-07 09:33:19 -08:00
|
|
|
|
|
2018-11-21 19:17:49 -08:00
|
|
|
|
export function formatCrowdFundFromGet(crowdFund: CrowdFund, base = 10): CrowdFund {
|
2018-11-14 14:24:56 -08:00
|
|
|
|
const bnKeys = ['amountVotingForRefund', 'balance', 'funded', 'target'] as Array<
|
|
|
|
|
keyof CrowdFund
|
|
|
|
|
>;
|
|
|
|
|
bnKeys.forEach(k => {
|
2018-11-21 19:17:49 -08:00
|
|
|
|
crowdFund[k] = new BN(crowdFund[k] as string, base);
|
2018-11-14 14:24:56 -08:00
|
|
|
|
});
|
|
|
|
|
crowdFund.milestones = crowdFund.milestones.map(ms => {
|
2018-11-21 19:17:49 -08:00
|
|
|
|
ms.amount = new BN(ms.amount, base);
|
|
|
|
|
ms.amountAgainstPayout = new BN(ms.amountAgainstPayout, base);
|
2018-11-14 14:24:56 -08:00
|
|
|
|
return ms;
|
|
|
|
|
});
|
|
|
|
|
crowdFund.contributors = crowdFund.contributors.map(c => {
|
2018-11-21 19:17:49 -08:00
|
|
|
|
c.contributionAmount = new BN(c.contributionAmount, base);
|
2018-11-14 14:24:56 -08:00
|
|
|
|
return c;
|
|
|
|
|
});
|
|
|
|
|
return crowdFund;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export function formatProposalFromGet(proposal: ProposalWithCrowdFund) {
|
2018-11-21 19:17:49 -08:00
|
|
|
|
proposal.proposalUrlId = generateProposalUrl(proposal.proposalId, proposal.title);
|
|
|
|
|
proposal.crowdFund = formatCrowdFundFromGet(proposal.crowdFund);
|
2018-11-14 14:24:56 -08:00
|
|
|
|
for (let i = 0; i < proposal.crowdFund.milestones.length; i++) {
|
|
|
|
|
proposal.milestones[i] = {
|
|
|
|
|
...proposal.milestones[i],
|
|
|
|
|
...proposal.crowdFund.milestones[i],
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
return proposal;
|
|
|
|
|
}
|
|
|
|
|
|
2018-11-07 09:33:19 -08:00
|
|
|
|
// 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;
|
|
|
|
|
}
|
2018-11-21 19:17:49 -08:00
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
}
|