Skip to content

Commit c6236aa

Browse files
committed
Next portion of updates for payments segment
1 parent 8d03ef1 commit c6236aa

File tree

9 files changed

+453
-47
lines changed

9 files changed

+453
-47
lines changed

.exchange-rates.cache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"disclaimer":"Usage subject to terms: https://openexchangerates.org/terms","license":"https://openexchangerates.org/license","timestamp":1508252400,"base":"USD","rates":{"AED":3.67295,"AFN":68.196355,"ALL":113.805,"AMD":481.015,"ANG":1.785451,"AOA":165.9225,"ARS":17.4049,"AUD":1.27689,"AWG":1.789995,"AZN":1.6965,"BAM":1.6627,"BBD":2,"BDT":80.847,"BGN":1.665071,"BHD":0.377295,"BIF":1751,"BMD":1,"BND":1.357691,"BOB":6.911694,"BRL":3.179029,"BSD":1,"BTC":0.000179013155,"BTN":64.859789,"BWP":10.285155,"BYN":1.960449,"BZD":2.016196,"CAD":1.257377,"CDF":1570,"CHF":0.980124,"CLF":0.023185,"CLP":623.5,"CNH":6.61575,"CNY":6.622232,"COP":2943.44,"CRC":570.561142,"CUC":1,"CUP":25.5,"CVE":94.1,"CZK":21.927767,"DJF":178.77,"DKK":6.335027,"DOP":47.7,"DZD":114.2625,"EGP":17.6649,"ERN":15.328867,"ETB":27.25,"EUR":0.851,"FJD":2.028901,"FKP":0.759366,"GBP":0.759366,"GEL":2.479675,"GGP":0.759366,"GHS":4.397,"GIP":0.759366,"GMD":47.425,"GNF":9001,"GTQ":7.344248,"GYD":207.165,"HKD":7.80835,"HNL":23.451826,"HRK":6.3888,"HTG":62.983403,"HUF":261.97525,"IDR":13498.427033,"ILS":3.5147,"IMP":0.759366,"INR":65.0133,"IQD":1168.3,"IRR":33870.025328,"ISK":105.732492,"JEP":0.759366,"JMD":127.822183,"JOD":0.710005,"JPY":112.336375,"KES":103.3,"KGS":68.509873,"KHR":4045.75,"KMF":419.219527,"KPW":900,"KRW":1130.8475,"KWD":0.30216,"KYD":0.833536,"KZT":333.84,"LAK":8321,"LBP":1510,"LKR":153.63,"LRD":118.262619,"LSL":13.415629,"LYD":1.367153,"MAD":9.44245,"MDL":17.3597,"MGA":3065.25,"MKD":52.415,"MMK":1365.1,"MNT":2455.179651,"MOP":8.04209,"MRO":365.06315,"MUR":33.901,"MVR":15.409873,"MWK":725.645,"MXN":19.084733,"MYR":4.2221,"MZN":60.994761,"NAD":13.445,"NGN":357,"NIO":30.284298,"NOK":7.952578,"NPR":103.915774,"NZD":1.396724,"OMR":0.38502,"PAB":1,"PEN":3.244443,"PGK":3.196491,"PHP":51.33,"PKR":105.35,"PLN":3.596345,"PYG":5638.4,"QAR":3.805,"RON":3.900611,"RSD":101.409994,"RUB":57.458,"RWF":834.6,"SAR":3.749884,"SBD":7.798197,"SCR":13.658738,"SDG":6.678245,"SEK":8.158446,"SGD":1.356602,"SHP":0.759366,"SLL":7648.75,"SOS":591,"SRD":7.448,"SSP":130.0769,"STD":20801.590148,"SVC":8.7521,"SYP":514.98499,"SZL":13.418336,"THB":33.125,"TJS":8.80211,"TMT":3.499986,"TND":2.475901,"TOP":2.235236,"TRY":3.67093,"TTD":6.705696,"TWD":30.213,"TZS":2245,"UAH":26.460994,"UGX":3660.9,"USD":1,"UYU":29.415851,"UZS":8056,"VEF":10.03165,"VND":22726.06796,"VUV":104.954849,"WST":2.501332,"XAF":558.219707,"XAG":0.0587028,"XAU":0.00077817,"XCD":2.70255,"XDR":0.708893,"XOF":558.219707,"XPD":0.00101318,"XPF":101.551367,"XPT":0.0010747,"YER":250.3,"ZAR":13.446541,"ZMW":9.695,"ZWL":322.355011}}
1+
{"disclaimer":"Usage subject to terms: https://openexchangerates.org/terms","license":"https://openexchangerates.org/license","timestamp":1508320800,"base":"USD","rates":{"AED":3.673018,"AFN":68.128,"ALL":113.77,"AMD":480.465,"ANG":1.7834,"AOA":165.9225,"ARS":17.336766,"AUD":1.278672,"AWG":1.790501,"AZN":1.689,"BAM":1.6616,"BBD":2,"BDT":82.351,"BGN":1.665518,"BHD":0.377085,"BIF":1752.55,"BMD":1,"BND":1.357196,"BOB":6.903811,"BRL":3.1579,"BSD":1,"BTC":0.000186473497,"BTN":64.935987,"BWP":10.273488,"BYN":1.958245,"BZD":2.014074,"CAD":1.253285,"CDF":1562.881563,"CHF":0.981081,"CLF":0.023185,"CLP":622.423602,"CNH":6.624705,"CNY":6.62395,"COP":2949.33,"CRC":570.455,"CUC":1,"CUP":25.5,"CVE":93.95,"CZK":21.89831,"DJF":178.77,"DKK":6.339415,"DOP":47.313359,"DZD":114.3225,"EGP":17.634,"ERN":15.191062,"ETB":27.052062,"EUR":0.851629,"FJD":2.046698,"FKP":0.759579,"GBP":0.759579,"GEL":2.481206,"GGP":0.759579,"GHS":4.395998,"GIP":0.759579,"GMD":47.45,"GNF":8929.15,"GTQ":7.335827,"GYD":206.925,"HKD":7.807972,"HNL":23.424588,"HRK":6.392998,"HTG":62.9125,"HUF":262.505,"IDR":13508.120071,"ILS":3.511228,"IMP":0.759579,"INR":65.1415,"IQD":1166.95,"IRR":34216.446723,"ISK":105.64657,"JEP":0.759579,"JMD":127.68,"JOD":0.709001,"JPY":112.7525,"KES":103.46,"KGS":68.54048,"KHR":4035.45,"KMF":418.832027,"KPW":900,"KRW":1131.57,"KWD":0.302227,"KYD":0.832646,"KZT":333.424074,"LAK":8290.35,"LBP":1506.85,"LKR":153.545,"LRD":118.347343,"LSL":13.4005,"LYD":1.365585,"MAD":9.48341,"MDL":17.335624,"MGA":3056.2,"MKD":52.439856,"MMK":1363.5,"MNT":2453.525814,"MOP":8.036355,"MRO":364.675,"MUR":34.0805,"MVR":15.400126,"MWK":726.17,"MXN":18.80613,"MYR":4.22137,"MZN":60.880666,"NAD":13.4005,"NGN":356.5,"NIO":30.248971,"NOK":7.960645,"NPR":103.795,"NZD":1.403916,"OMR":0.38502,"PAB":1,"PEN":3.244494,"PGK":3.171515,"PHP":51.441,"PKR":105.28,"PLN":3.60395,"PYG":5631.85,"QAR":3.6391,"RON":3.903674,"RSD":101.517649,"RUB":57.371,"RWF":833.635,"SAR":3.7502,"SBD":7.792911,"SCR":13.381152,"SDG":6.670684,"SEK":8.171241,"SGD":1.358402,"SHP":0.759579,"SLL":7643.328121,"SOS":577.95,"SRD":7.448,"SSP":130.0769,"STD":20829.200481,"SVC":8.742198,"SYP":514.97499,"SZL":13.402242,"THB":33.14925,"TJS":8.79525,"TMT":3.50998,"TND":2.473794,"TOP":2.224732,"TRY":3.685404,"TTD":6.69697,"TWD":30.20775,"TZS":2248.5,"UAH":26.431,"UGX":3656.65,"USD":1,"UYU":29.382962,"UZS":8054.25,"VEF":10.104074,"VND":22720.753308,"VUV":106.413334,"WST":2.532373,"XAF":558.632113,"XAG":0.05896852,"XAU":0.00078099,"XCD":2.70255,"XDR":0.708893,"XOF":558.632113,"XPD":0.00102149,"XPF":101.626392,"XPT":0.00107992,"YER":250.319142,"ZAR":13.50018,"ZMW":9.676382,"ZWL":322.355011}}

src/shared/actions/page/sandbox/payments/editor.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,21 @@
44

55
import { createActions } from 'redux-actions';
66

7+
export const STATE = {
8+
NEW_PAYMENT: 'NEW_PAYMENT',
9+
PAID: 'PAID',
10+
WAITING: 'WAITING',
11+
};
12+
13+
/**
14+
* Payload creator for the action that selects the specified billing account.
15+
* @param {Number} accountId
16+
* @return {Number} Payload.
17+
*/
18+
function selectBillingAccount(accountId) {
19+
return accountId;
20+
}
21+
722
/**
823
* Payload creator for the action that selects the specified project.
924
* @param {String} projectId
@@ -13,12 +28,63 @@ function selectProject(projectId) {
1328
return projectId;
1429
}
1530

31+
/**
32+
* Payload creator for the action that switches page states. See STATE enum.
33+
* @param {String} state
34+
* @return {String}
35+
*/
36+
function setPageState(state) {
37+
return state;
38+
}
39+
40+
/**
41+
* Payload creator for the action that sets the payment amount.
42+
* @param {Number} amount Payment amount in USD.
43+
* @return {Number}
44+
*/
45+
function setPaymentAmount(amount) {
46+
return amount;
47+
}
48+
49+
/**
50+
* Payload creator for the action that sets the payment assignee.
51+
* @param {String} username
52+
* @return {String}
53+
*/
54+
function setPaymentAssignee(username) {
55+
return username;
56+
}
57+
58+
/**
59+
* Payload creator for the action that sets the payment description.
60+
* @param {String} description
61+
* @return {String} Action payload.
62+
*/
63+
function setPaymentDescription(description) {
64+
return description;
65+
}
66+
67+
/**
68+
* Payload creator for the action that sets the payment title.
69+
* @param {String} title
70+
* @return {String} Action payload.
71+
*/
72+
function setPaymentTitle(title) {
73+
return title;
74+
}
75+
1676
export default createActions({
1777
PAGE: {
1878
SANDBOX: {
1979
PAYMENTS: {
2080
EDITOR: {
81+
SELECT_BILLING_ACCOUNT: selectBillingAccount,
2182
SELECT_PROJECT: selectProject,
83+
SET_PAGE_STATE: setPageState,
84+
SET_PAYMENT_AMOUNT: setPaymentAmount,
85+
SET_PAYMENT_ASSIGNEE: setPaymentAssignee,
86+
SET_PAYMENT_DESCRIPTION: setPaymentDescription,
87+
SET_PAYMENT_TITLE: setPaymentTitle,
2288
},
2389
},
2490
},

src/shared/components/sandbox/payments/Confirmation/index.jsx

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22
* Payment confirmation.
33
*/
44

5+
import PT from 'prop-types';
56
import React from 'react';
67
import { Button, PrimaryButton } from 'components/buttons';
78
import Background from '../Background';
89

910
import './style.scss';
1011

11-
export default function Confirmation() {
12+
export default function Confirmation({
13+
amount,
14+
assignee,
15+
}) {
1216
return (
1317
<Background>
1418
<div styleName="container">
@@ -20,13 +24,14 @@ export default function Confirmation() {
2024
</p>
2125
<div styleName="paycheck">
2226
<div styleName="info">
23-
<p styleName="user"><strong>$200</strong> paid to <strong styleName="name">Sky</strong></p>
27+
<p styleName="user"><strong>${amount}</strong> paid to <strong styleName="name">{assignee}</strong></p>
2428
<p styleName="task">Develop a new project submit button logic for the main page.</p>
2529
</div>
2630
</div>
2731
<div styleName="actions">
2832
<Button
29-
to="/sandbox/payments/123"
33+
// TODO: Demands some more logic here.
34+
to="/sandbox/payments/new"
3035
>Make another payment</Button>
3136
<PrimaryButton
3237
to="/sandbox/payments"
@@ -37,3 +42,8 @@ export default function Confirmation() {
3742
</Background>
3843
);
3944
}
45+
46+
Confirmation.propTypes = {
47+
amount: PT.number.isRequired,
48+
assignee: PT.string.isRequired,
49+
};

src/shared/components/sandbox/payments/Editor/index.jsx

Lines changed: 111 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
* Payment editor.
33
*/
44

5+
import _ from 'lodash';
6+
import LoadingIndicator from 'components/LoadingIndicator';
57
import PT from 'prop-types';
68
import React from 'react';
79
import Select from 'components/Select';
@@ -13,10 +15,103 @@ import Background from '../Background';
1315
import './style.scss';
1416

1517
export default function Editor({
18+
makePayment,
19+
paymentAmount,
20+
paymentAssignee,
21+
paymentDescription,
22+
paymentTitle,
23+
projectDetails,
1624
projects,
25+
selectedBillingAccountId,
1726
selectedProjectId,
1827
selectProject,
28+
setPaymentAmount,
29+
setPaymentAssignee,
30+
setPaymentDescription,
31+
setPaymentTitle,
1932
}) {
33+
let content;
34+
if (!projectDetails) content = <LoadingIndicator />;
35+
else {
36+
const billingAccounts = _.get(projectDetails, 'billingAccountIds', [])
37+
.map(id => ({ label: id, value: id }));
38+
content = billingAccounts.length ? (
39+
<div styleName="field">
40+
<div styleName="field">
41+
<span styleName="label">Billing account</span>
42+
<Select
43+
autoBlur
44+
options={billingAccounts}
45+
value={selectedBillingAccountId}
46+
/>
47+
</div>
48+
<div styleName="fieldGap" />
49+
<div styleName="field">
50+
<span styleName="label">Title</span>
51+
<input
52+
onChange={e => setPaymentTitle(e.target.value)}
53+
placeholder="Topcoder payment"
54+
value={paymentTitle}
55+
/>
56+
</div>
57+
<div styleName="field">
58+
<span styleName="label">Description</span>
59+
<textarea
60+
onChange={e => setPaymentDescription(e.target.value)}
61+
placeholder="payment is for ..."
62+
rows={3}
63+
value={paymentDescription}
64+
/>
65+
</div>
66+
<div styleName="field">
67+
<span styleName="label">Assign to</span>
68+
<div styleName="withPrefix">
69+
<div styleName="prefix">
70+
<div styleName="avatarPrefix" >
71+
<Avatar />
72+
</div>
73+
</div>
74+
<input
75+
onChange={e => setPaymentAssignee(e.target.value)}
76+
placeholder="Type handle to assign member"
77+
value={paymentAssignee}
78+
/>
79+
</div>
80+
</div>
81+
<div styleName="field">
82+
<span styleName="label">Amount</span>
83+
<div styleName="withPrefix">
84+
<div styleName="prefix">
85+
<div styleName="textPrefix">$</div>
86+
</div>
87+
<input
88+
onChange={e => setPaymentAmount(Number(e.target.value))}
89+
placeholder="0"
90+
type="number"
91+
value={String(paymentAmount)}
92+
/>
93+
</div>
94+
</div>
95+
<div styleName="action">
96+
{ paymentAmount
97+
&& paymentAssignee
98+
&& paymentDescription
99+
&& paymentTitle ? (
100+
<PrimaryButton
101+
onClick={makePayment}
102+
// to="/sandbox/payments/123/done"
103+
>Pay now</PrimaryButton>
104+
) : null
105+
}
106+
</div>
107+
</div>
108+
) : (
109+
<div styleName="field">
110+
This project has no associated billing accounts yet
111+
</div>
112+
);
113+
}
114+
20115
return (
21116
<Background escapeButton>
22117
<div styleName="container">
@@ -33,52 +128,30 @@ export default function Editor({
33128
value={Number(selectedProjectId)}
34129
/>
35130
</div>
36-
<div styleName="field">
37-
<span styleName="label">Billing account</span>
38-
<Select autoBlur />
39-
</div>
40-
<div styleName="fieldGap" />
41-
<div styleName="field">
42-
<span styleName="label">Title</span>
43-
<input placeholder="Topcoder payment" />
44-
</div>
45-
<div styleName="field">
46-
<span styleName="label">Description</span>
47-
<textarea rows={3} placeholder="payment is for ..." />
48-
</div>
49-
<div styleName="field">
50-
<span styleName="label">Assign to</span>
51-
<div styleName="withPrefix">
52-
<div styleName="prefix">
53-
<div styleName="avatarPrefix" >
54-
<Avatar />
55-
</div>
56-
</div>
57-
<input placeholder="Type handle to assign member" />
58-
</div>
59-
</div>
60-
<div styleName="field">
61-
<span styleName="label">Amount</span>
62-
<div styleName="withPrefix">
63-
<div styleName="prefix">
64-
<div styleName="textPrefix">$</div>
65-
</div>
66-
<input placeholder="0" />
67-
</div>
68-
</div>
69-
<div styleName="action">
70-
<PrimaryButton
71-
to="/sandbox/payments/123/done"
72-
>Pay now</PrimaryButton>
73-
</div>
131+
{content}
74132
</div>
75133
</div>
76134
</Background>
77135
);
78136
}
79137

138+
Editor.defaultProps = {
139+
projectDetails: null,
140+
};
141+
80142
Editor.propTypes = {
143+
makePayment: PT.func.isRequired,
144+
paymentAmount: PT.number.isRequired,
145+
paymentAssignee: PT.string.isRequired,
146+
paymentDescription: PT.string.isRequired,
147+
paymentTitle: PT.string.isRequired,
148+
projectDetails: PT.shape(),
81149
projects: PT.arrayOf(PT.object).isRequired,
150+
selectedBillingAccountId: PT.number.isRequired,
82151
selectedProjectId: PT.number.isRequired,
83152
selectProject: PT.func.isRequired,
153+
setPaymentAmount: PT.func.isRequired,
154+
setPaymentAssignee: PT.func.isRequired,
155+
setPaymentDescription: PT.func.isRequired,
156+
setPaymentTitle: PT.func.isRequired,
84157
};

src/shared/components/sandbox/payments/Listing/PaymentRow/index.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Payment row in payments listing.
33
*/
44

5+
import _ from 'lodash';
56
import PT from 'prop-types';
67
import React from 'react';
78
import { Link } from 'react-router-dom';
@@ -27,7 +28,7 @@ export default function PaymentRow({ challenge }) {
2728
</TrackAbbreviationTooltip>
2829
</td>
2930
<td styleName="name"><Link to="/sandbox/payments/123">{challenge.name}</Link></td>
30-
<td styleName="price">{`$${challenge.prizes[0]}`}</td>
31+
<td styleName="price">{`$${_.get(challenge, 'prizes[0]', '-')}`}</td>
3132
<td><Avatar styleName="memberAvatar" /><span styleName="memberName">{challenge.member || 'TOPCODER'}</span></td>
3233
<td><PaymentStatus status={challenge.status} text={challenge.status} /></td>
3334
</tr>

0 commit comments

Comments
 (0)