]> git.immae.eu Git - perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git/blame - cmd/web/js/account.jsx
JS clean.
[perso/Immae/Projets/Cryptomonnaies/Cryptoportfolio/Front.git] / cmd / web / js / account.jsx
CommitLineData
16e43cc7 1import Api from './api.js';
2import React from 'react';
d5b8f0ff 3import Panel from './panel.js';
d1c0ccfc 4
5class AccountInformation extends React.Component {
6 constructor(props) {
7 super(props);
8 this.state = {'email': null};
9 }
10
11 loadAccount = () => {
12 Api.Call('USER_ACCOUNT', {}, function(err, status, data) {
13 if (err) {
14 console.error(err, data);
15 return;
16 }
17
18 this.setState({'email': data.email});
19 }.bind(this));
20 }
21
22 componentDidMount = () => {
23 this.loadAccount();
24 }
25
26 render = () => {
27 var component = <p>Loading...</p>;
28 if (this.state.email !== null) {
29 component = <p>Email: {this.state.email}</p>;
30 }
31
32 return component;
33 }
34
35}
16e43cc7 36
37class PoloniexConfiguration extends React.Component {
38 constructor(props) {
39 super(props);
d1c0ccfc 40 this.state = {'apiKey': '', 'apiSecret': '', 'status': 'loading', 'editMode': false};
16e43cc7 41 }
42
43 checkCredentials = () => {
24e47979 44 Api.Call('MARKET_TEST_CREDENTIALS', {'name': 'poloniex'}, function(err, status, data) {
16e43cc7 45 if (err) {
46 console.error(err, data);
47 if (err.code === 'invalid_market_credentials') {
48 this.setState({'status': 'invalidCredentials'});
49 } else if (err.code === 'ip_restricted_api_key') {
50 this.setState({'status': 'ipRestricted'});
c6aa553f 51 } else if (err.code === 'market_credentials_not_configured') {
52 this.setState({'status': 'emptyCredentials'});
16e43cc7 53 }
54 return;
55 }
56
57 this.setState({'status': 'ok'});
58 }.bind(this));
59 }
60
61 handleCredentialsChange = (key, secret) => {
62 this.setState({'apiKey': key, 'apiSecret': secret});
63 }
64
65 handleCredentialsSubmit = () => {
c6aa553f 66 this.setState({'status': 'loading', 'editMode': false});
16e43cc7 67 Api.Call('UPDATE_MARKET', {'key': this.state.apiKey, 'secret': this.state.apiSecret, 'name': 'poloniex'}, function(err, status, data) {
68 if (err) {
69 console.error(err, data);
299b6b6d 70 if (err.code === 'invalid_market_credentials') {
71 this.setState({'status': 'invalidCredentials'});
72 } else if (err.code === 'ip_restricted_api_key') {
73 this.setState({'status': 'ipRestricted'});
74 }
16e43cc7 75 return;
76 }
77
16e43cc7 78 this.checkCredentials();
79 }.bind(this));
80 }
81
82 componentDidMount = () => {
c6aa553f 83 this.checkCredentials();
84 }
85
86 onEditClick = () => {
87 Api.Call('MARKET', {'name': 'poloniex'}, function(err, status, data) {
d1c0ccfc 88 this.setState({'editMode': true});
16e43cc7 89 if (err) {
90 console.error(err, data);
91 return;
92 }
93
94 var newStatus = this.state.status;
95 if (!data.key || !data.secret) {
96 newStatus = 'emptyCredentials';
16e43cc7 97 }
98
99 this.setState({'apiKey': data.key, 'apiSecret': data.secret, 'status': newStatus});
100 }.bind(this));
101 }
102
103 render = () => {
104 var displayText = null;
105 switch (this.state.status) {
106 case 'loading':
107 displayText = 'Checking Poloniex credentials...';
108 break;
109 case 'invalidCredentials':
110 displayText = 'Invalid poloniex credentials';
111 break;
112 case 'ipRestricted':
113 displayText = 'Your API key is IP restricted.';
114 break;
115 case 'emptyCredentials':
116 displayText = 'Please provide poloniex credentials';
117 break;
118 case 'ok':
119 displayText = 'You are all set !';
120 break;
121 default:
122 console.error('unknown status', this.state.status);
123 displayText = null;
124 }
d1c0ccfc 125
16e43cc7 126 return (
16e43cc7 127 <PoloniexCredentialsForm onLoadCredentials={this.onLoadCredentials}
128 onCredentialsSubmit={this.handleCredentialsSubmit}
129 onCredentialsChange={this.handleCredentialsChange}
130 apiSecret={this.state.apiSecret}
131 apiKey={this.state.apiKey}
132 status={this.state.status}
c6aa553f 133 statusMessage={displayText}
134 editMode={this.state.editMode}
135 onEditClick={this.onEditClick}/>
16e43cc7 136 );
137 }
138}
139
140class PoloniexCredentialsForm extends React.Component {
16e43cc7 141 handleSubmit = (e) => {
142 this.props.onCredentialsSubmit();
16e43cc7 143 e.preventDefault();
144 }
145
146 handleApiKeyChange = (event) => {
147 this.props.onCredentialsChange(event.target.value, this.props.apiSecret);
148 }
149
150 handleApiSecretChange = (event) => {
151 this.props.onCredentialsChange(this.props.apiKey, event.target.value);
152 }
153
16e43cc7 154 render = () => {
c6aa553f 155 var submitType = this.props.editMode === true ? 'submit' : 'hidden';
156 var buttonDisplay = this.props.editMode === true ? 'none' : 'inline';
157 var secretDisplayed = this.props.editMode === true ? this.props.apiSecret : 'XXXXXXX';
158 var keyDisplayed = this.props.editMode === true ? this.props.apiKey : 'XXXXXXX';
16e43cc7 159
160 var iconName = 'icon-cancel-circled';
161 switch (this.props.status) {
162 case 'loading':
163 iconName = 'icon-hourglass-2';
164 break;
165 case 'ok':
166 iconName = 'icon-ok-circled';
167 break;
168 }
169
170 return (
d1c0ccfc 171 <React.Fragment>
172 <div className="row config-status">
173 <div className="col-12">
174 <span><i className={iconName}></i>{this.props.statusMessage}</span>
16e43cc7 175 </div>
176 </div>
d1c0ccfc 177 <div className="row">
178 <div className="col-12">
179 <form role="form" onSubmit={this.handleSubmit}>
a6820180 180 <label className="w-100">Key:</label>
181 <input className="form-control" type="text" value={keyDisplayed} onChange={this.handleApiKeyChange} disabled={!this.props.editMode}/>
182 <label className="w-100">Secret:</label>
183 <input className="form-control" type="text" value={secretDisplayed} onChange={this.handleApiSecretChange} disabled={!this.props.editMode}/>
d1c0ccfc 184 <input className="form-control submit" type={submitType} value="Save" />
185 <button className="form-control submit" style={{display: buttonDisplay}} onSubmit={null} onClick={this.props.onEditClick} type="button">Show/Edit</button>
186 </form>
187 </div>
188 </div>
189 </React.Fragment>
16e43cc7 190 );
191 }
192}
193
d1c0ccfc 194class UserAccount extends React.Component {
195 render = () => {
196 return (
197 <React.Fragment>
198 <Panel component={<AccountInformation/>} title="Account" />
199 <Panel component={<PoloniexConfiguration/>} title="Poloniex credentials" topClassName="api-credentials-form" />
200 </React.Fragment>
201 );
202 }
203}
204
205export default UserAccount;