/
paymentMethodForm.ts
112 lines (104 loc) · 3.15 KB
/
paymentMethodForm.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import Debug from 'debug';
import { flow, getEnv, types } from 'mobx-state-tree';
import uuid from 'uuid/v4';
import * as validate from 'validate.js';
import { FieldDefinition } from '../../../components/models';
import { ApiClientType } from '../../../stores';
import { DTOs } from '../../../utils/eShop.dtos';
import rules from '../validation';
const debug = new Debug('buyer payment method');
export interface PaymentMethodFormType {
id: string;
alias: string;
cardNumber: string;
securityNumber: string;
cardholderName: string;
expiration: string;
cardType: string;
readonly form: { [idx: string]: FieldDefinition };
submit: () => Promise<{}>;
}
export const PaymentMethodFormModel = types
.model({
id: types.optional(types.identifier(types.string), uuid),
alias: types.maybe(types.string),
cardNumber: types.maybe(types.string),
securityNumber: types.maybe(types.string),
cardholderName: types.maybe(types.string),
expiration: types.maybe(types.string),
cardType: types.maybe(types.string)
})
.views(self => ({
get validation() {
const validation = {
alias: rules.paymentMethodForm.alias,
cardNumber: rules.paymentMethodForm.cardNumber,
securityNumber: rules.paymentMethodForm.securityNumber,
cardholderName: rules.paymentMethodForm.cardholderName,
expiration: rules.paymentMethodForm.expiration,
cardType: rules.paymentMethodForm.cardType
};
return validate(self, validation);
}
}))
.views(self => ({
get form(): {[idx: string]: FieldDefinition} {
return ({
alias: {
input: 'text',
label: 'Alias',
required: true,
},
cardNumber: {
input: 'text',
label: 'Card Number',
required: true,
},
securityNumber: {
input: 'text',
label: 'Security Number',
required: true,
},
cardholderName: {
input: 'text',
label: 'Cardholder Name',
required: true,
},
expiration: {
input: 'text',
label: 'Expiration',
required: true
},
cardType: {
input: 'dropdown',
label: 'Card Type',
required: true,
options: [
{ value: 'VISA', label: 'Visa' },
{ value: 'AMEX', label: 'Amex' },
{ value: 'MASTERCARD', label: 'Mastercard' },
]
}
});
}
}))
.actions(self => {
const submit = flow(function*() {
const request = new DTOs.AddBuyerPaymentMethod();
request.paymentMethodId = self.id;
request.alias = self.alias;
request.cardNumber = self.cardNumber;
request.securityNumber = self.securityNumber;
request.cardholderName = self.cardholderName;
request.expiration = self.expiration;
request.cardType = self.cardType;
try {
const client = getEnv(self).api as ApiClientType;
const result: DTOs.CommandResponse = yield client.command(request);
} catch (error) {
debug('received http error: ', error);
throw error;
}
});
return { submit };
});