Skip to content

Commit 7e99b66

Browse files
committed
adding proptypes to all that require it. and also configured jest to do code coverage. yes!
1 parent d940be0 commit 7e99b66

11 files changed

Lines changed: 118 additions & 47 deletions

File tree

src/components/AddNote.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import React from 'react';
2+
import PropTypes from 'prop-types';
23
import Button from './stateless/Button';
34

45
function AddNote(props) {
@@ -13,4 +14,8 @@ function AddNote(props) {
1314
);
1415
}
1516

17+
AddNote.propTypes = {
18+
addNote: PropTypes.func.isRequired
19+
};
20+
1621
export default AddNote;

src/components/AddNotebook.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
24
import Input from './stateless/Input';
35
import CloseBtn from './stateless/CloseBtn';
46

@@ -9,12 +11,19 @@ const AddNotebook = ({ notebooks = [], ...props }) => {
911
name="notebook"
1012
className="new-notebook"
1113
placeholder="Notebook name"
12-
onBlur={(e) => props.addNotebook(e)}
13-
onKeyDown={(e) => props.keyPress(e)} />
14+
onBlur={event => props.addNotebook(event)}
15+
onKeyDown={event => props.keyPress(event)} />
1416

15-
{notebooks.length > 0 && <CloseBtn onClick={(e) => props.toggleAddState(e)} />}
17+
{(notebooks.length > 0) && <CloseBtn onClick={event => props.toggleAddState(event)} />}
1618
</span>
1719
);
1820
}
1921

22+
AddNotebook.propTypes = {
23+
notebooks: PropTypes.array.isRequired,
24+
addNotebook: PropTypes.func.isRequired,
25+
keyPress: PropTypes.func.isRequired,
26+
toggleAddState: PropTypes.func
27+
};
28+
2029
export default AddNotebook;

src/components/App.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,22 @@
11
import React from 'react';
22
import PropTypes from 'prop-types';
33
import { Provider } from 'react-redux';
4-
import { BrowserRouter as Router } from 'react-router-dom';
4+
import { BrowserRouter } from 'react-router-dom';
55

66
import PageContainer from '../containers/pageContainer';
77

8-
class App extends React.Component {
9-
render() {
10-
return (
11-
<Provider store={this.props.store}>
12-
<Router>
13-
<PageContainer page="home" />
14-
</Router>
15-
</Provider>
16-
);
17-
}
18-
}
8+
const App = (props) => {
9+
return (
10+
<Provider store={props.store}>
11+
<BrowserRouter>
12+
<PageContainer page="home" />
13+
</BrowserRouter>
14+
</Provider>
15+
);
16+
};
1917

2018
App.propTypes = {
21-
store: PropTypes.object.isRequired
19+
store: PropTypes.object
2220
};
2321

2422
export default App;

src/components/EditNote.js

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import { connect } from 'react-redux';
33
import { bindActionCreators } from 'redux';
44
import { withRouter } from 'react-router-dom';
5+
import PropTypes from 'prop-types';
56

67
import Input from './stateless/Input';
78
import Textarea from './stateless/Textarea';
@@ -44,10 +45,10 @@ class EditNote extends React.Component {
4445
this.InputComponent.focus();
4546
}
4647

47-
editNote(e) {
48+
editNote(event) {
4849
const { selectedNote } = this.props;
4950

50-
selectedNote[e.target.name] = e.target.value;
51+
selectedNote[event.target.name] = event.target.value;
5152

5253
this.setState({ selectedNote });
5354

@@ -88,10 +89,10 @@ class EditNote extends React.Component {
8889
ref={comp => { this.InputComponent = comp; }}
8990
value={selectedNote.title}
9091
onClick={this.focusTitleInput}
91-
onChange={(e) => this.editNote(e)} />
92+
onChange={event => this.editNote(event)} />
9293
<NotebookSelect
9394
canAddNotebook={true}
94-
editField={(notebook) => this.editField(notebook)}
95+
editField={notebook => this.editField(notebook)}
9596
selectedNotebook={this.state.notebook} />
9697
</div>
9798
<div className="mid">
@@ -102,22 +103,22 @@ class EditNote extends React.Component {
102103
placeholder="http://"
103104
pattern="^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?"
104105
value={selectedNote.url}
105-
onChange={(e) => this.editNote(e)} />
106+
onChange={event => this.editNote(event)} />
106107
<LabelPicker
107-
editField={(color) => this.editField({ label: color })}
108+
editField={color => this.editField({ label: color })}
108109
deleteNoteLabel={this.deleteNoteLabel} />
109110
</div>
110111
<div className="mid">
111112
<TagsInput
112113
noteTags={selectedNote.tags}
113-
editField={(tags) => this.editField({ tags: tags })} />
114+
editField={tags => this.editField({ tags: tags })} />
114115
</div>
115116
<div className="bottom">
116117
<Textarea
117118
name="description"
118119
className="description"
119120
value={selectedNote.description}
120-
onChange={(e) => this.editNote(e)}>
121+
onChange={event => this.editNote(event)}>
121122
</Textarea>
122123
</div>
123124
</form>
@@ -126,6 +127,12 @@ class EditNote extends React.Component {
126127
}
127128
}
128129

130+
EditNote.propTypes = {
131+
actions: PropTypes.object,
132+
selectedNote: PropTypes.object,
133+
deleteNoteLabel: PropTypes.func
134+
};
135+
129136
function mapStateToProps(state) {
130137
const newState = {
131138
selectedNote: state.noteData.selectedNote

src/components/Home.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import { connect } from 'react-redux';
33
import { bindActionCreators } from 'redux';
44
import { withRouter } from 'react-router-dom';
5+
import PropTypes from 'prop-types';
56

67
import Mousetrap from 'mousetrap';
78
import MuiThemeProvider from 'material-ui/styles/MuiThemeProvider';
@@ -63,13 +64,13 @@ class Home extends React.Component {
6364

6465
// Handle keyboard shortcuts
6566
componentDidMount() {
66-
Mousetrap.bind(['ctrl+n'], (e) => this.addNote(e));
67-
Mousetrap.bind(['command+b'], (e) => this.toggleNoteNav(e));
67+
Mousetrap.bind(['ctrl+n'], event => this.addNote(event));
68+
Mousetrap.bind(['command+b'], event => this.toggleNoteNav(event));
6869
}
6970

7071
componentWillUnmount() {
71-
Mousetrap.unbind(['ctrl+n'], (e) => this.addNote(e));
72-
Mousetrap.unbind(['command+b'], (e) => this.toggleNoteNav(e));
72+
Mousetrap.unbind(['ctrl+n'], event => this.addNote(event));
73+
Mousetrap.unbind(['command+b'], event => this.toggleNoteNav(event));
7374
}
7475

7576
updateData() {
@@ -124,8 +125,8 @@ class Home extends React.Component {
124125
this.props.actions.logoutUser();
125126
}
126127

127-
addNote(e) {
128-
e.preventDefault();
128+
addNote(event) {
129+
event.preventDefault();
129130
this.props.actions.resetSelectedNote();
130131
this.props.actions.addNote();
131132
}
@@ -166,6 +167,11 @@ class Home extends React.Component {
166167
}
167168
}
168169

170+
Home.propTypes = {
171+
actions: PropTypes.object,
172+
user: PropTypes.object
173+
};
174+
169175
function mapStateToProps(state) {
170176
const newState = {
171177
user: state.userData.user,

src/components/Note.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,34 @@
11
import React from 'react';
22
import FontAwesome from 'react-fontawesome';
3+
import PropTypes from 'prop-types';
4+
import { Link } from 'react-router-dom';
35

46
import CloseBtn from './stateless/CloseBtn';
57
import TagsList from './TagsList';
68

79
import { formatDate, shorten } from '../common/helpers';
810
import { sortNotes } from '../common/noteHelpers';
911

10-
const Note = ({ notes = [], isMobile = false, ...props }) => {
12+
const Note = ({ notes = [], match, isMobile = false, ...props }) => {
1113
if (!notes.length) {
1214
return <div className="empty"></div>;
1315
}
1416

1517
const note = sortNotes(notes).map(note =>
16-
<li className={(note.isEditing) ? 'note selected' : 'note'}
18+
<li className={ (note.isEditing) ? 'note selected' : 'note' }
1719
key={note.id} id={note.id}
18-
onClick={(e) => props.selectNote(note)}>
20+
onClick={() => props.selectNote(note)}>
1921

20-
{!isMobile && <CloseBtn onClick={(e) => props.deleteNote(note)} />}
21-
{(isMobile && note.url) && <a className="external-link" href={note.url} target="_blank"><FontAwesome name='external-link' /></a>}
22+
{!isMobile && <CloseBtn onClick={() => props.deleteNote(note)} />}
23+
{(isMobile && note.url) && <a href={ note.url } className="external-link" target="_blank"><FontAwesome name='external-link' /></a>}
2224

2325
{note.label && <div className="note-label" style={{ background: note.label.hex }}></div>}
2426

2527
{note.title && <h2 className="title">
2628
{(!isMobile && note.url) &&
27-
<a href={note.url} target="_blank">{shorten(note.title, 80)}</a>
29+
<a href={ note.url } target="_blank">
30+
{shorten(note.title, 80)}
31+
</a>
2832
}
2933
{(!isMobile && !note.url) && shorten(note.title, 80)}
3034
{(isMobile) && shorten(note.title, 80)}
@@ -41,16 +45,26 @@ const Note = ({ notes = [], isMobile = false, ...props }) => {
4145
{(note.notebook && note.notebook.name) &&
4246
<span className="notebook">
4347
<FontAwesome name='book' />
44-
<a href>{note.notebook.name}</a>
48+
<Link to={`${match.path}/${note.notebook.name}`}>
49+
{ note.notebook.name }
50+
</Link>
4551
</span>
4652
}
47-
<TagsList tags={note.tags} />
53+
<TagsList tags={ note.tags } />
4854
</div>
4955
</div>
5056
</li>
5157
);
5258

53-
return <div className="notes"><ul>{note}</ul></div>;
59+
return <div className="notes"><ul>{ note }</ul></div>;
60+
};
61+
62+
Note.propTypes = {
63+
match: PropTypes.object,
64+
notes: PropTypes.array,
65+
isMobile: PropTypes.bool,
66+
deleteNote: PropTypes.func,
67+
selectNote: PropTypes.func,
5468
};
5569

5670
export default Note;

src/components/NoteList.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import { withRouter } from 'react-router-dom';
33
import { connect } from 'react-redux';
44
import { bindActionCreators } from 'redux';
5+
import PropTypes from 'prop-types';
56

67
import WelcomeMsg from './stateless/WelcomeMsg';
78
import SearchFilter from './SearchFilter';
@@ -136,7 +137,8 @@ class NoteList extends React.Component {
136137
sort={this.state.sort}
137138
selectNote={(note) => this.selectNote(note)}
138139
deleteNote={(note) => this.deleteNote(note)}
139-
isMobile={isMobile} />
140+
isMobile={isMobile}
141+
{ ...this.props } />
140142
}
141143
</div>
142144
);
@@ -159,4 +161,15 @@ function mapDispatchToProps(dispatch) {
159161
};
160162
}
161163

164+
NoteList.propTypes = {
165+
notes: PropTypes.array,
166+
notebooks: PropTypes.array,
167+
notebookFilter: PropTypes.object,
168+
actions: PropTypes.object,
169+
addNote: PropTypes.func,
170+
deleteNote: PropTypes.func,
171+
filterNotes: PropTypes.func,
172+
showLoginModal: PropTypes.func
173+
};
174+
162175
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(NoteList));

src/components/__tests__/AddNote.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import * as setupTests from '../../setupFiles';
55
import AddNote from '../AddNote';
66

77
describe('AddNote component', () => {
8+
const props = {
9+
addNote: jest.fn(() => 'Note Added')
10+
};
811

912
it('renders without crashing', () => {
10-
shallow(<AddNote />);
13+
shallow(<AddNote { ...props } />);
1114
});
1215
});

src/components/__tests__/AddNotebook.test.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ import * as setupTests from '../../setupFiles';
55
import AddNotebook from '../AddNotebook';
66

77
describe('AddNotebook component', () => {
8+
const props = {
9+
addNotebook: jest.fn(() => 'Notebook Added')
10+
};
811

912
it('renders without crashing', () => {
10-
shallow(<AddNotebook />);
13+
shallow(<AddNotebook { ...props } />);
1114
});
1215
});

src/components/stateless/Button.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
import React from 'react';
2+
import PropTypes from 'prop-types';
23

34
const Button = ({ style = {}, ...props }) => {
45
return (
56
<button
67
type="button"
7-
style={style}
8-
className={props.className + ' btn'}
9-
onClick={(e) => props.onClick(e)}
10-
{...props}>
11-
{props.children}
8+
style={ style }
9+
className={ `${props.className} btn` }
10+
onClick={ event => props.onClick(event) }
11+
{ ...props }>
12+
{ props.children }
1213
</button>
1314
);
1415
}
1516

17+
Button.propTypes = {
18+
style: PropTypes.object,
19+
className: PropTypes.string,
20+
onClick: PropTypes.func,
21+
children: PropTypes.node
22+
};
23+
1624
export default Button;

0 commit comments

Comments
 (0)