Skip to content

Commit 136f976

Browse files
authored
Merge pull request #10 from fergarrui/create-versions-dropdown
Create versions dropdown
2 parents 5a70bd3 + 1e4c917 commit 136f976

File tree

31 files changed

+1074
-843
lines changed

31 files changed

+1074
-843
lines changed

package-lock.json

Lines changed: 13 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
"react-svg-inline": "^2.1.1",
8383
"react-transition-group": "^1.2.1",
8484
"recursive-readdir": "^2.2.2",
85+
"redux-logger": "^3.0.6",
8586
"redux-thunk": "^2.3.0",
8687
"reflect-metadata": "^0.1.12",
8788
"solc": "^0.5.8",

src/client/App.js

Lines changed: 59 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,35 @@ import React from 'react';
22
import { connect } from 'react-redux';
33
import { CSSTransitionGroup } from 'react-transition-group';
44

5-
import { showLoadingMessage, showErrorMessage, hideLoadingMessage, getErrorMessage } from './components/Store/Actions.js';
5+
import { showLoadingMessage, showErrorMessage, hideLoadingMessage } from './components/Store/Actions.js';
6+
7+
import { baseUrl } from './utils/baseUrl';
68

79
import TopNavBar from './components/TopNavBar/TopNavBar';
810
import Form from './components/Form/Form';
911
import Tab from './components/Tab/Tab';
1012
import MessageComp from './components/MessageComp/MessageComp';
11-
import SettingsBar from './components/SettingsBar/SettingsBar';
13+
import TabPanel from './components/Tab/TabPanel/TabPanel';
14+
import Main from './components/Main/Main';
1215

1316
import styles from './styles/App.scss';
1417
import fade from './styles/transitions/fade.scss';
1518
import scale from './styles/transitions/scale.scss';
1619

1720
const mapStateToProps = state => {
1821
return {
19-
showLoadingMessage: state.toggleLoadingMessage,
20-
showErrorMessage: state.toggleErrorMessage,
21-
errorMessage: state.toggleErrorMessage,
22+
showLoadingMessage: state.loadingMessage.isLoading,
23+
loadingMessage: state.loadingMessage.message,
24+
showErrorMessage: state.errorMessage.hasError,
25+
errorMessage: state.errorMessage.message
2226
}
2327
}
2428

2529
const mapDispatchToProps = dispatch => {
2630
return {
27-
loadingMessageOn: () => dispatch(showLoadingMessage()),
31+
loadingMessageOn: message => dispatch(showLoadingMessage(message)),
2832
loadingMessageOff: () => dispatch(hideLoadingMessage()),
29-
errorMessageOn: () => dispatch(showErrorMessage()),
30-
getErrorMessage: message => dispatch(getErrorMessage(message)),
33+
errorMessageOn: message => dispatch(showErrorMessage(message)),
3134
}
3235
}
3336

@@ -40,11 +43,13 @@ class App extends React.Component {
4043
parameter: '',
4144
fetchRequestStatus: undefined,
4245
contracts: [],
43-
settingsVisible: false,
4446
}
4547

4648
this.handleMenuItemIconClick = this.handleMenuItemIconClick.bind(this);
47-
this.handleOutsideClick = this.handleOutsideClick.bind(this);
49+
}
50+
51+
componentDidMount() {
52+
this.fetchData(baseUrl + 'solc/list');
4853
}
4954

5055
handleMenuItemIconClick(index) {
@@ -74,13 +79,14 @@ class App extends React.Component {
7479
settingsVisible: false,
7580
});
7681

77-
this.fetchData(parameter);
82+
const url = `http://localhost:9090/files/${encodeURIComponent(parameter) || ' '}?extension=sol`;
83+
this.fetchData(url);
7884
}
7985

80-
fetchData(parameter) {
86+
fetchData(url) {
8187
this.handleRequestPending();
8288

83-
fetch(`http://localhost:9090/files/${encodeURIComponent(parameter) || ' '}?extension=sol`)
89+
fetch(url)
8490
.then(res => res.json())
8591
.then(data => {
8692
data.error
@@ -92,68 +98,41 @@ class App extends React.Component {
9298
}
9399

94100
handleRequestPending() {
95-
this.props.loadingMessageOn();
101+
this.props.loadingMessageOn('Loading...');
96102
}
97103

98104
handleRequestSuccess(response) {
99-
this.setState({
100-
fetchRequestStatus: 'success',
101-
contracts: response,
102-
});
105+
106+
if(response.some(item => item.version)) {
107+
this.setState({
108+
fetchRequestStatus: 'success',
109+
versions: response,
110+
});
111+
} else {
112+
this.setState({
113+
fetchRequestStatus: 'success',
114+
contracts: response,
115+
});
116+
}
103117

104118
this.props.loadingMessageOff();
105119
}
106120

107121
handleRequestFail(message) {
108122
this.props.loadingMessageOff();
109-
this.props.errorMessageOn();
110-
this.props.getErrorMessage(message);
111-
}
112-
113-
handleSettingsiconClick() {
114-
this.toggleOutsideClick();
115-
116-
this.setState(prevState => ({
117-
settingsVisible: !prevState.settingsVisible,
118-
}))
119-
}
120-
121-
handleSettingsSaveButtonClick() {
122-
this.toggleOutsideClick();
123-
124-
this.setState({
125-
settingsVisible: false,
126-
});
127-
}
128-
129-
toggleOutsideClick() {
130-
if (!this.state.settingsVisible) {
131-
document.addEventListener('click', this.handleOutsideClick);
132-
} else {
133-
document.removeEventListener('click', this.handleOutsideClick);
134-
}
135-
}
136-
137-
handleOutsideClick(e) {
138-
if (this.node.contains(e.target)) {
139-
return;
140-
}
141-
142-
document.removeEventListener('click', this.handleOutsideClick);
143-
144-
this.setState({
145-
settingsVisible: false,
146-
});
123+
this.props.errorMessageOn(message);
147124
}
148125

149126
render() {
150127

151-
const { fetchRequestStatus, contracts, settingsVisible, configPlaceholder } = this.state;
152-
const { children, showLoadingMessage, showErrorMessage, errorMessage } = this.props;
128+
const { fetchRequestStatus, contracts, versions } = this.state;
129+
const { showLoadingMessage, showErrorMessage, errorMessage, loadingMessage } = this.props;
153130

154131
return (
155132
<div className={styles['app']}>
156-
<TopNavBar onIconClick={() => this.handleSettingsiconClick()}>
133+
<TopNavBar
134+
fetchRequestStatus={fetchRequestStatus}
135+
versions={versions}>
157136
<Form
158137
submitButton={true}
159138
inputTypes={[{ name: 'contractsPath', placeholder: 'Insert contracts path'}]}
@@ -163,28 +142,22 @@ class App extends React.Component {
163142
onInputKeyUp={() => this.handleInputSubmit()}
164143
/>
165144
</TopNavBar>
166-
<div ref={node => { this.node = node; }}>
167-
<SettingsBar
168-
active={!!settingsVisible}
169-
onSaveButtonClick={() => this.handleSettingsSaveButtonClick()}
170-
/>
171-
</div>
172145
<CSSTransitionGroup
173146
transitionName={fade}
174147
transitionAppear={true}
175148
transitionAppearTimeout={300}
176-
trnasitionEnterTimeout={300}
149+
transitionEnterTimeout={300}
177150
transitionLeaveTimeout={300}
178151
>
179152
{ showLoadingMessage &&
180-
<MessageComp message='Loading...' />
153+
<MessageComp message={loadingMessage} />
181154
}
182155
</CSSTransitionGroup>
183156
<CSSTransitionGroup
184157
transitionName={fade}
185158
transitionAppear={true}
186159
transitionAppearTimeout={300}
187-
trnasitionEnterTimeout={300}
160+
transitionEnterTimeout={300}
188161
transitionLeaveTimeout={300}
189162
>
190163
{ showErrorMessage &&
@@ -199,12 +172,26 @@ class App extends React.Component {
199172
transitionName={scale}
200173
transitionAppear={true}
201174
transitionAppearTimeout={300}
202-
trnasitionEnterTimeout={300}
175+
transitionEnterTimeout={300}
203176
transitionLeaveTimeout={300}
204177
>
205-
{fetchRequestStatus === 'success' &&
206-
<Tab data={contracts} onMenuItemIconClick={this.handleMenuItemIconClick}>
207-
{children}
178+
{fetchRequestStatus === 'success' && contracts.length &&
179+
<Tab onMenuItemIconClick={this.handleMenuItemIconClick}>
180+
{contracts.map((item, i) => {
181+
return (
182+
<TabPanel
183+
key={`id--${item.name}--${i}`}
184+
name={item.name}
185+
>
186+
<Main
187+
name={item.name}
188+
code={item.code}
189+
path={item.path}
190+
index={i}
191+
/>
192+
</TabPanel>
193+
)
194+
})}
208195
</Tab>
209196
}
210197
</CSSTransitionGroup>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import React from 'react';
2+
import classnames from 'classnames/bind';
3+
4+
import styles from './Dropdown.scss';
5+
6+
const cx = classnames.bind(styles);
7+
8+
const Dropdown = ({ active, children, versions, settings, onClick }) => {
9+
10+
const dropdownClasses = cx({
11+
'dropdown': true,
12+
'dropdown--active': !!active,
13+
'dropdown--versions': !!versions,
14+
'dropdown--settings': !!settings
15+
});
16+
17+
return (
18+
<div className={dropdownClasses} onClick={onClick}>
19+
{ children }
20+
</div>
21+
)
22+
}
23+
24+
export default Dropdown;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
.dropdown {
2+
width: 100%;
3+
position: absolute;
4+
right: 0;
5+
top: -262px;
6+
background: $color-dark-grey;
7+
z-index: -3;
8+
opacity: 0;
9+
padding: 10px 10px 20px 10px;
10+
transition: top 0.3s, opacity 0.4s;
11+
12+
&--settings {
13+
width: 330px;
14+
}
15+
16+
&--active {
17+
opacity: 1;
18+
top: 100%;
19+
}
20+
}

src/client/components/EVMTab/EVMTab.js

Lines changed: 0 additions & 56 deletions
This file was deleted.

src/client/components/EVMTab/EVMTabPanel.js

Lines changed: 0 additions & 23 deletions
This file was deleted.

0 commit comments

Comments
 (0)