diff --git a/.eslintrc b/.eslintrc
index acfa15464c596b9cdb22f86e4f3bd9adb5a710ce..8db623b85fc26abc113026782f77445e47a44b80 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -5,5 +5,31 @@
   },
   "extends": [
     "pubsweet"
-  ]
+  ],
+  "parser": "babel-eslint",
+  "parserOptions": {
+    "allowImportExportEverywhere": true
+  },
+  "rules": {
+    "camelcase": 0,
+    "consistent-return": 0,
+    "global-require": 0,
+    "jsx-a11y/anchor-is-valid": 0,
+    "jsx-a11y/click-events-have-key-events": 0,
+    "jsx-a11y/label-has-for": 0,
+    "jsx-a11y/no-static-element-interactions": 0,
+    "import/extensions": 0,
+    "import/no-dynamic-require": 0,
+    "import/no-extraneous-dependencies": 0,
+    "import/no-named-as-default": 0,
+    "import/no-named-as-default-member": 0,
+    "import/prefer-default-export": 0,
+    "no-console": ["error", { "allow": ["warn", "error"] }],
+    "no-param-reassign": 0,
+    "no-shadow": 0,
+    "no-underscore-dangle": 0,
+    "react/no-did-mount-set-state": 0,
+    "react/prop-types": 0,
+    "sort-keys": 0
+  }
 }
diff --git a/packages/component-app/src/components/App.js b/packages/component-app/src/components/App.js
index 4143e96108a863f049f6e5d8e66c06da19b75fe2..35f4a9d234fbfc6c75341ee2df9b5cb9f60a46dc 100644
--- a/packages/component-app/src/components/App.js
+++ b/packages/component-app/src/components/App.js
@@ -1,7 +1,7 @@
 import React from 'react'
 import { compose } from 'recompose'
 import { connect } from 'react-redux'
-import PropTypes from 'prop-types'
+// import PropTypes from 'prop-types'
 
 import { AppBar } from 'xpub-ui'
 import { withJournal } from 'xpub-journal'
diff --git a/packages/component-authentication/src/components/Login.js b/packages/component-authentication/src/components/Login.js
index 9b6f5763fe2b6b60eab3df24af8709402ffb194f..7441bbd33f141a8661da829422f6221046c3f0d2 100644
--- a/packages/component-authentication/src/components/Login.js
+++ b/packages/component-authentication/src/components/Login.js
@@ -24,7 +24,7 @@ const Login = ({ errorMessage, handleSubmit }) => (
     </form>
 
     <div className={classes.alternate}>
-      <span className={classes.message}>You don't have an account?</span>
+      <span className={classes.message}>You don&apos;t have an account?</span>
       <Link className={classes.link} to="/signup">
         Sign up
       </Link>
diff --git a/packages/component-authentication/src/redux/currentUser.js b/packages/component-authentication/src/redux/currentUser.js
index c752a9bb34a35b331843b2e2f498a1f47fd80e0e..93b4c12a858104bcd8a7db7fce1774f277902cab 100644
--- a/packages/component-authentication/src/redux/currentUser.js
+++ b/packages/component-authentication/src/redux/currentUser.js
@@ -27,9 +27,7 @@ export const getCurrentUserFailure = error => ({
 export const getCurrentUser = () => dispatch => {
   dispatch(getCurrentUserRequest())
   return api.get('/users/authenticate').then(
-    user => {
-      return dispatch(getCurrentUserSuccess(user))
-    },
+    user => dispatch(getCurrentUserSuccess(user)),
     error => {
       dispatch(getCurrentUserFailure(error))
       throw error
diff --git a/packages/component-dashboard/src/components/EmptySubmissions.js b/packages/component-dashboard/src/components/EmptySubmissions.js
index 48e63c789761e88f4f3e3de94d177477a81d84bc..3b3f86b1335d38e06a205c6de9196b740af8e5c3 100644
--- a/packages/component-dashboard/src/components/EmptySubmissions.js
+++ b/packages/component-dashboard/src/components/EmptySubmissions.js
@@ -3,7 +3,7 @@ import classes from './EmptySubmissions.local.scss'
 
 const EmptySubmissions = () => (
   <div className={classes.root}>
-    <div>You haven't submitted any manuscripts yet.</div>
+    <div>You haven&apos;t submitted any manuscripts yet.</div>
   </div>
 )
 
diff --git a/packages/component-dashboard/src/components/metadata/MetadataOwners.js b/packages/component-dashboard/src/components/metadata/MetadataOwners.js
index 6971063fe5168c9f36598193529052d0a483aa22..40bb90e45ccbb5ca2b6e8abc2302c37361ae5aaa 100644
--- a/packages/component-dashboard/src/components/metadata/MetadataOwners.js
+++ b/packages/component-dashboard/src/components/metadata/MetadataOwners.js
@@ -3,7 +3,7 @@ import React from 'react'
 const MetadataOwners = ({ owners }) => (
   <span>
     {owners.map((owner, index) => [
-      index === 0 ? null : <span>{', '}</span>,
+      index === 0 ? null : <span>, </span>,
       <span>{owner.name || 'Anonymous'}</span>,
     ])}
   </span>
diff --git a/packages/component-dashboard/src/components/metadata/MetadataSections.js b/packages/component-dashboard/src/components/metadata/MetadataSections.js
index ca7e7ddb6ca4facaac2064bebf99a15b3e7b4383..84594432b4a99a984e9e059be153a8d19d77dc17 100644
--- a/packages/component-dashboard/src/components/metadata/MetadataSections.js
+++ b/packages/component-dashboard/src/components/metadata/MetadataSections.js
@@ -4,7 +4,7 @@ import { withJournal } from 'xpub-journal'
 const MetadataSections = ({ journal, sections }) => (
   <span>
     {sections.map((section, index) => [
-      index === 0 ? null : <span>{', '}</span>,
+      index === 0 ? null : <span>, </span>,
       <span>
         {journal.articleSections.find(item => item.value === section).label}
       </span>,
diff --git a/packages/component-dashboard/src/components/sections/Divider.js b/packages/component-dashboard/src/components/sections/Divider.js
index 0f64884bb356c70d79beb8ecb309826c72de0945..78f33a31662a5d0900da4d6b44e5453c4520eefb 100644
--- a/packages/component-dashboard/src/components/sections/Divider.js
+++ b/packages/component-dashboard/src/components/sections/Divider.js
@@ -2,5 +2,5 @@ import React from 'react'
 import classes from './Divider.local.scss'
 
 export default ({ separator }) => (
-  <span className={classes.root}>{' ' + separator + ' '}</span>
+  <span className={classes.root}>{` ${separator} `}</span>
 )
diff --git a/packages/component-dashboard/src/components/sections/EditorItem.js b/packages/component-dashboard/src/components/sections/EditorItem.js
index bac28d3f5822378f3b93e6ebde6ccf1a06656a93..902cec169cb1fffac36a2694f0311ff41b340d1e 100644
--- a/packages/component-dashboard/src/components/sections/EditorItem.js
+++ b/packages/component-dashboard/src/components/sections/EditorItem.js
@@ -30,13 +30,13 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => (
     </div>
 
     <div className={classes.main}>
-      <VersionTitle version={version} className={classes.versionTitle} />
+      <VersionTitle className={classes.versionTitle} version={version} />
 
       <div className={classes.links}>
         <div className={classes.link}>
           {(!version.decision || version.decision.status !== 'submitted') && (
             <span>
-              <ProjectLink project={project} version={version} page="reviewers">
+              <ProjectLink page="reviewers" project={project} version={version}>
                 Assign Reviewers
               </ProjectLink>
 
@@ -45,10 +45,10 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => (
           )}
 
           <ProjectLink
+            id={project.id}
+            page="decisions"
             project={project}
             version={version}
-            page="decisions"
-            id={project.id}
           >
             {version.decision && version.decision.status === 'submitted'
               ? `Decision: ${version.decision.recommendation}`
@@ -63,17 +63,17 @@ const EditorItem = ({ AssignEditor, project, version, addUserToTeam }) => (
     <div className={classes.roles}>
       <div className={classes.role}>
         <AssignEditor
+          addUserToTeam={addUserToTeam}
           project={project}
           teamTypeName="seniorEditor"
-          addUserToTeam={addUserToTeam}
         />
       </div>
 
       <div className={classes.role}>
         <AssignEditor
+          addUserToTeam={addUserToTeam}
           project={project}
           teamTypeName="handlingEditor"
-          addUserToTeam={addUserToTeam}
         />
       </div>
     </div>
diff --git a/packages/component-dashboard/src/components/sections/OwnerItem.js b/packages/component-dashboard/src/components/sections/OwnerItem.js
index c1836e4bc849043b7584fecadb77d89ed789ab53..d122fccc2214e4ad47da4c717175febf47c86ee3 100644
--- a/packages/component-dashboard/src/components/sections/OwnerItem.js
+++ b/packages/component-dashboard/src/components/sections/OwnerItem.js
@@ -12,11 +12,11 @@ const OwnerItem = ({ project, version, deleteProject }) => (
     </div>
 
     <div className={classes.main}>
-      <VersionTitle version={version} className={classes.versionTitle} />
+      <VersionTitle className={classes.versionTitle} version={version} />
 
       <div className={classes.links}>
         <div className={classes.link}>
-          <ProjectLink project={project} version={version} page="submit">
+          <ProjectLink page="submit" project={project} version={version}>
             Submission
           </ProjectLink>
         </div>
@@ -24,7 +24,7 @@ const OwnerItem = ({ project, version, deleteProject }) => (
         <Divider separator="|" />
 
         <div className={classes.link}>
-          <ProjectLink project={project} version={version} page="manuscript">
+          <ProjectLink page="manuscript" project={project} version={version}>
             Manuscript
           </ProjectLink>
         </div>
diff --git a/packages/component-dashboard/src/components/sections/ReviewerItem.js b/packages/component-dashboard/src/components/sections/ReviewerItem.js
index 74e2ec261a50f483035a88842d7766a4b84ba83f..a4e5f7f082aa8acbe08b85fca0a4eef5fb89fff8 100644
--- a/packages/component-dashboard/src/components/sections/ReviewerItem.js
+++ b/packages/component-dashboard/src/components/sections/ReviewerItem.js
@@ -16,7 +16,7 @@ const ReviewerItem = ({ project, version, currentUser, reviewerResponse }) => {
   return (
     <div className={classes.root}>
       <div className={classes.main}>
-        <VersionTitle version={version} className={classes.versionTitle} />
+        <VersionTitle className={classes.versionTitle} version={version} />
 
         {reviewer && (
           <div>
@@ -24,10 +24,10 @@ const ReviewerItem = ({ project, version, currentUser, reviewerResponse }) => {
               <div className={classes.links}>
                 <div className={classes.link}>
                   <ProjectLink
+                    id={reviewer.id}
+                    page="reviews"
                     project={project}
                     version={version}
-                    page="reviews"
-                    id={reviewer.id}
                   >
                     {reviewer.submitted ? 'Reviewed' : 'Do Review'}
                   </ProjectLink>
diff --git a/packages/component-dashboard/src/lib/title.js b/packages/component-dashboard/src/lib/title.js
index c31dca169c1cc95ebd6f438a1dc16a68ee1a63e9..7aae47d80f251b4a25f856dc77739ca626d280a9 100644
--- a/packages/component-dashboard/src/lib/title.js
+++ b/packages/component-dashboard/src/lib/title.js
@@ -1,8 +1,7 @@
-export const generateTitle = name => {
-  return name
+export const generateTitle = name =>
+  name
     .replace(/[_-]+/g, ' ') // convert hyphens/underscores to space
     .replace(/\.[^.]+$/, '') // remove file extension
-}
 
 // TODO: preserve italics (use parse5?)
 export const extractTitle = source => {
diff --git a/packages/component-manuscript/src/components/ManuscriptPage.js b/packages/component-manuscript/src/components/ManuscriptPage.js
index b4ae8eaaf46b86067433a35623959e32a96d7c0a..47ee62a0d974b4bf770aa3e4f9ce630c7a4e0ba0 100644
--- a/packages/component-manuscript/src/components/ManuscriptPage.js
+++ b/packages/component-manuscript/src/components/ManuscriptPage.js
@@ -33,12 +33,11 @@ export default compose(
     },
   ),
   withHandlers({
-    updateManuscript: ({ updateVersion, project, version }) => data => {
-      return updateVersion(project, {
+    updateManuscript: ({ updateVersion, project, version }) => data =>
+      updateVersion(project, {
         id: version.id,
         rev: version.rev,
         ...data,
-      })
-    },
+      }),
   }),
 )(Manuscript)
diff --git a/packages/component-review/src/components/DecisionPage.js b/packages/component-review/src/components/DecisionPage.js
index 6ab6c342b5550c42ee84e3b75bc6ff8b4f1a14d8..3067b621f2cc90c7f60a5c24843b33191f159a5b 100644
--- a/packages/component-review/src/components/DecisionPage.js
+++ b/packages/component-review/src/components/DecisionPage.js
@@ -15,14 +15,23 @@ import uploadFile from 'xpub-upload'
 import DecisionLayout from './decision/DecisionLayout'
 
 // TODO: this should happen on the server
-const handleDecision = (project, version) => dispatch => {
-  return dispatch(
+const handleDecision = (project, version) => dispatch =>
+  dispatch(
     actions.updateFragment(project, {
       decision: version.decision,
       id: version.id,
       rev: version.rev,
     }),
   ).then(() => {
+    const cloned = pick(version, [
+      'source',
+      'metadata',
+      'declarations',
+      'suggestions',
+      'files',
+      'notes',
+    ])
+
     switch (version.decision.recommendation) {
       case 'accept':
         return dispatch(
@@ -43,15 +52,6 @@ const handleDecision = (project, version) => dispatch => {
         )
 
       case 'revise':
-        const cloned = pick(version, [
-          'source',
-          'metadata',
-          'declarations',
-          'suggestions',
-          'files',
-          'notes',
-        ])
-
         return dispatch(
           actions.updateCollection({
             id: project.id,
@@ -73,7 +73,6 @@ const handleDecision = (project, version) => dispatch => {
         throw new Error('Unknown decision type')
     }
   })
-}
 
 const onSubmit = (values, dispatch, { project, version, history }) => {
   version.decision = {
@@ -131,11 +130,9 @@ export default compose(
     },
   ),
   withRouter,
-  withProps(({ decision }) => {
-    return {
-      initialValues: decision,
-    }
-  }),
+  withProps(({ decision }) => ({
+    initialValues: decision,
+  })),
   reduxForm({
     form: 'decision',
     onChange: debounce(onChange, 1000, { maxWait: 5000 }),
diff --git a/packages/component-review/src/components/ReviewPage.js b/packages/component-review/src/components/ReviewPage.js
index 9ff53e95333fc84f54a5ce5ea6337701ee9a79af..1666c989b6a8c2cf0f549cca347ad01791362d2f 100644
--- a/packages/component-review/src/components/ReviewPage.js
+++ b/packages/component-review/src/components/ReviewPage.js
@@ -103,11 +103,9 @@ export default compose(
     },
   ),
   withRouter,
-  withProps(({ reviewer }) => {
-    return {
-      initialValues: reviewer,
-    }
-  }),
+  withProps(({ reviewer }) => ({
+    initialValues: reviewer,
+  })),
   reduxForm({
     form: 'review',
     onChange: debounce(onChange, 1000, { maxWait: 5000 }),
diff --git a/packages/component-review/src/components/reviewers/Reviewer.js b/packages/component-review/src/components/reviewers/Reviewer.js
index ec48c6c349a6fed49809f78b19982310bad9e37a..8ecc11ca0062d0e279fa0535c1bedff88e97f254 100644
--- a/packages/component-review/src/components/reviewers/Reviewer.js
+++ b/packages/component-review/src/components/reviewers/Reviewer.js
@@ -5,9 +5,8 @@ import { Avatar, Button } from 'xpub-ui'
 
 import classes from './Reviewer.local.scss'
 
-const ordinalLetter = ordinal => {
-  return ordinal ? String.fromCharCode(96 + ordinal) : null
-}
+const ordinalLetter = ordinal =>
+  ordinal ? String.fromCharCode(96 + ordinal) : null
 
 const Reviewer = ({ reviewer, removeReviewer }) => (
   <div className={classes.root}>
diff --git a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js
index fd2255d5beaaf9d63856ba2dc49f92d5e9babc37..da8aa28b6ea1aa64fcbe09a1f88b389ceb3ab42e 100644
--- a/packages/component-review/src/components/reviewers/ReviewerFormContainer.js
+++ b/packages/component-review/src/components/reviewers/ReviewerFormContainer.js
@@ -46,10 +46,10 @@ const addReviewer = (props, projectReviewer) => {
     .then(() => reviewer)
 }
 
-const handleSubmit = props => reset => values => {
+const handleSubmit = props => reset => values =>
   // TODO: create a user account if values.user.id is null
 
-  return getProjectReviewer(props, values.user)
+  getProjectReviewer(props, values.user)
     .then(projectReviewer => {
       if (some(props.version.reviewers, { reviewer: projectReviewer.id })) {
         throw new SubmissionError('This reviewer has already been added')
@@ -58,7 +58,6 @@ const handleSubmit = props => reset => values => {
       return addReviewer(props, projectReviewer)
     })
     .then(() => reset())
-}
 
 const loadOptions = props => input => {
   const options = props.reviewerUsers
diff --git a/packages/component-review/src/components/tabs/Tab.js b/packages/component-review/src/components/tabs/Tab.js
index 96d92b928575bbff2564d3aa39a224efd126bf92..d54f5d35c2d7affc20258bc985af7a60b90c8260 100644
--- a/packages/component-review/src/components/tabs/Tab.js
+++ b/packages/component-review/src/components/tabs/Tab.js
@@ -1,6 +1,7 @@
+import classnames from 'classnames'
 import React from 'react'
+
 import classes from './Tab.local.scss'
-import classnames from 'classnames'
 
 const Tab = ({ active, children }) => (
   <div
diff --git a/packages/component-review/src/components/tabs/Tabs.js b/packages/component-review/src/components/tabs/Tabs.js
index fabd3fbb5a397ebd6db0bc38b4bfb7bb9abf4ec8..19493a37b7aa766c7df2955707c0e428af715386 100644
--- a/packages/component-review/src/components/tabs/Tabs.js
+++ b/packages/component-review/src/components/tabs/Tabs.js
@@ -27,7 +27,9 @@ class Tabs extends React.Component {
     }
   }
 
-  setActiveKey = activeKey => this.setState({ activeKey })
+  setActiveKey(activeKey) {
+    this.setState({ activeKey })
+  }
 
   render() {
     const { sections, title } = this.props
@@ -40,8 +42,8 @@ class Tabs extends React.Component {
 
           {sections.map(({ key, label }) => (
             <span
-              key={key}
               className={classes.tab}
+              key={key}
               onClick={() => this.setActiveKey(key)}
             >
               <Tab active={activeKey === key}>{label || key}</Tab>
diff --git a/packages/component-submit/src/components/Declarations.js b/packages/component-submit/src/components/Declarations.js
index 2ccced010392f442d79e3cbee660507f6429782d..55497f1aa7cd21512edfacba8d804f9ac3ec2771 100644
--- a/packages/component-submit/src/components/Declarations.js
+++ b/packages/component-submit/src/components/Declarations.js
@@ -8,27 +8,25 @@ import classes from './Declarations.local.scss'
 
 const DeclarationInput = input => <YesOrNo inline {...input} />
 
-const Declarations = ({ journal }) => {
-  return (
-    <FormSection name="declarations">
-      {journal.declarations.questions.map(question => (
-        <div
-          className={classnames(classes.section, classes.spread)}
-          id={`declarations.${question.id}`}
-          key={question.id}
-        >
-          <div className={classes.legend}>{question.legend}</div>
+const Declarations = ({ journal }) => (
+  <FormSection name="declarations">
+    {journal.declarations.questions.map(question => (
+      <div
+        className={classnames(classes.section, classes.spread)}
+        id={`declarations.${question.id}`}
+        key={question.id}
+      >
+        <div className={classes.legend}>{question.legend}</div>
 
-          <ValidatedField
-            component={DeclarationInput}
-            name={question.id}
-            required
-            validate={[required]}
-          />
-        </div>
-      ))}
-    </FormSection>
-  )
-}
+        <ValidatedField
+          component={DeclarationInput}
+          name={question.id}
+          required
+          validate={[required]}
+        />
+      </div>
+    ))}
+  </FormSection>
+)
 
 export default withJournal(Declarations)
diff --git a/packages/component-submit/src/components/SubmitPage.js b/packages/component-submit/src/components/SubmitPage.js
index 7cf7c29b179004cd6889e980403dabe87e6eecb9..5102acb77cdc205db1562d57072dc2dc8d2471c3 100644
--- a/packages/component-submit/src/components/SubmitPage.js
+++ b/packages/component-submit/src/components/SubmitPage.js
@@ -8,10 +8,10 @@ import { ConnectPage } from 'xpub-connect'
 import { selectCollection, selectFragment } from 'xpub-selectors'
 import Submit from './Submit'
 
-const onSubmit = (values, dispatch, { history, project, version }) => {
+const onSubmit = (values, dispatch, { history, project, version }) =>
   // console.log('submit', values)
 
-  return dispatch(
+  dispatch(
     actions.updateFragment(project, {
       id: version.id,
       rev: version.rev,
@@ -19,15 +19,15 @@ const onSubmit = (values, dispatch, { history, project, version }) => {
       ...values,
     }),
   )
-    .then(() => {
-      return dispatch(
+    .then(() =>
+      dispatch(
         actions.updateCollection({
           id: project.id,
           rev: project.rev,
           status: 'submitted',
         }),
-      )
-    })
+      ),
+    )
     .then(() => {
       history.push('/')
     })
@@ -36,7 +36,6 @@ const onSubmit = (values, dispatch, { history, project, version }) => {
         throw new SubmissionError()
       }
     })
-}
 
 // TODO: this is only here because prosemirror would save the title in the
 // metadata as html instead of plain text. we need to maybe find a better
diff --git a/packages/component-submit/src/components/Validots.js b/packages/component-submit/src/components/Validots.js
index 70b3d649e3377a7e72f57291afa3e71e6e750db7..1b8307e35297db6af05e1ca88294ab9604b62a80 100644
--- a/packages/component-submit/src/components/Validots.js
+++ b/packages/component-submit/src/components/Validots.js
@@ -1,9 +1,10 @@
+import { map } from 'lodash'
 import React from 'react'
 import { Field } from 'redux-form'
-import { map } from 'lodash'
-import Validot from './Validot'
 import { connect } from 'react-redux'
 
+import Validot from './Validot'
+
 // TODO: is the order of map(form.registeredFields) guaranteed to be the same?
 // TODO: use journal config instead of form.registeredFields once using it to build the form
 // TODO: the Field rendered here overrides the validation in the other Field with the same name
diff --git a/packages/xpub-collabra/app/app.js b/packages/xpub-collabra/app/app.js
index a31b4dd496837656eb0a7b5c119589d665f55d85..a66d52c4d600fda898fc31ebcb401081a1edf639 100644
--- a/packages/xpub-collabra/app/app.js
+++ b/packages/xpub-collabra/app/app.js
@@ -3,12 +3,14 @@ import ReactDOM from 'react-dom'
 import { AppContainer } from 'react-hot-loader'
 import { Provider as StoreProvider } from 'react-redux'
 import { Router } from 'react-router-dom'
-import { configureStore } from 'pubsweet-client'
 import createHistory from 'history/createBrowserHistory'
+
+import { configureStore } from 'pubsweet-client'
 import { JournalProvider } from 'xpub-journal'
+import 'xpub-theme'
+
 import * as journal from './config/journal'
 import Root from './routes'
-import 'xpub-theme'
 
 const history = createHistory()
 const store = configureStore(history, {})
diff --git a/packages/xpub-collabra/app/routes.js b/packages/xpub-collabra/app/routes.js
index 697d41e98d8ec6cb3aad52f4dbb6d45755f0bb65..88a0a092fe5d4c0636c872a1b82dea0365114429 100644
--- a/packages/xpub-collabra/app/routes.js
+++ b/packages/xpub-collabra/app/routes.js
@@ -39,39 +39,39 @@ const DecisionPage = loadable(() =>
 
 const Root = () => (
   <App>
-    <PrivateRoute exact path="/" component={DashboardPage} />
+    <PrivateRoute component={DashboardPage} exact path="/" />
     <PrivateRoute
+      component={SubmitPage}
       exact
       path="/projects/:project/versions/:version/submit"
-      component={SubmitPage}
     />
     <PrivateRoute
+      component={ManuscriptPage}
       exact
       path="/projects/:project/versions/:version/manuscript"
-      component={ManuscriptPage}
     />
     <PrivateRoute
+      component={ReviewersPage}
       exact
       path="/projects/:project/versions/:version/reviewers"
-      component={ReviewersPage}
     />
     <PrivateRoute
+      component={ReviewPage}
       exact
       path="/projects/:project/versions/:version/reviews/:review"
-      component={ReviewPage}
     />
     <PrivateRoute
+      component={DecisionPage}
       exact
       path="/projects/:project/versions/:version/decisions/:decision"
-      component={DecisionPage}
     />
 
-    <PrivateRoute exact path="/logout" component={LogoutPage} />
+    <PrivateRoute component={LogoutPage} exact path="/logout" />
 
-    <Route exact path="/signup" component={SignupPage} />
-    <Route exact path="/login" component={LoginPage} />
+    <Route component={SignupPage} exact path="/signup" />
+    <Route component={LoginPage} exact path="/login" />
 
-    {/*<Redirect from="/" to="/dashboard"/>*/}
+    {/* <Redirect from="/" to="/dashboard"/> */}
   </App>
 )
 
diff --git a/packages/xpub-collabra/config/authsome.js b/packages/xpub-collabra/config/authsome.js
index 316dac27440d44e314c06c2b8c3c3b7829f6109e..17447be2eaa63ecd8dc407122b67625b8676f1a1 100644
--- a/packages/xpub-collabra/config/authsome.js
+++ b/packages/xpub-collabra/config/authsome.js
@@ -1,4 +1,3 @@
-module.exports = (user, operation, project, version) => {
+module.exports = (user, operation, project, version) =>
   // console.log({ user, operation, project, version })
-  return true // TODO
-}
+  true // TODO
diff --git a/packages/xpub-collabra/webpack/common-rules.js b/packages/xpub-collabra/webpack/common-rules.js
index 543d3739dec0f10fb180903f458d300a793fe0c0..6abb4982adb068370ee63cc82260d764fd1fa83d 100644
--- a/packages/xpub-collabra/webpack/common-rules.js
+++ b/packages/xpub-collabra/webpack/common-rules.js
@@ -8,7 +8,7 @@ const requireComponentsString = components
     // "client" or "frontend" for backwards compatibility
     return component.client || component.frontend
   })
-  .map(name => "require('" + name + "')")
+  .map(name => `require('${name}')`)
   .join(', ')
 
 // paths that use ES6 scripts and CSS modules
@@ -31,7 +31,7 @@ module.exports = [
     loader: 'string-replace-loader',
     options: {
       search: 'PUBSWEET_COMPONENTS',
-      replace: '[' + requireComponentsString + ']',
+      replace: `[${requireComponentsString}]`,
     },
   },
 
diff --git a/packages/xpub-connect/src/components/ConnectPage.js b/packages/xpub-connect/src/components/ConnectPage.js
index 8d89bd3e21855233972b04057a44942d3f11dedf..6725f331de45458da1028a4647d7c23b3de98fc9 100644
--- a/packages/xpub-connect/src/components/ConnectPage.js
+++ b/packages/xpub-connect/src/components/ConnectPage.js
@@ -6,21 +6,25 @@ import classes from './ConnectPage.local.scss'
 
 const ConnectPage = requirements => WrappedComponent => {
   class ConnectedComponent extends React.Component {
-    state = {
-      fetching: false,
-      complete: false,
-      error: null
+    constructor(props) {
+      super(props)
+
+      this.state = {
+        complete: false,
+        error: null,
+        fetching: false,
+      }
     }
 
-    componentDidMount () {
+    componentDidMount() {
       this.fetch(this.props)
     }
 
-    componentWillReceiveProps (nextProps) {
+    componentWillReceiveProps(nextProps) {
       this.fetch(nextProps)
     }
 
-    fetch ({ isAuthenticated }) {
+    fetch({ isAuthenticated }) {
       if (!isAuthenticated) {
         return
       }
@@ -31,49 +35,45 @@ const ConnectPage = requirements => WrappedComponent => {
 
       this.setState({
         fetching: true,
-        complete: false
+        complete: false,
       })
 
       const requests = requirements(this.props).map(this.props.dispatch)
 
-      Promise.all(requests).then(() => {
-        this.setState({
-          fetching: false,
-          complete: true,
+      Promise.all(requests)
+        .then(() => {
+          this.setState({
+            fetching: false,
+            complete: true,
+          })
         })
-      }).catch(error => {
-        console.error(error)
+        .catch(error => {
+          console.error(error)
 
-        this.setState({
-          error: error.message
-        })
+          this.setState({
+            error: error.message,
+          })
 
-        throw error // rethrow
-      })
+          throw error // rethrow
+        })
     }
 
-    render () {
+    render() {
       const { complete, error } = this.state
 
-      if (error) return (
-        <div className={classes.error}>{error}</div>
-      )
+      if (error) return <div className={classes.error}>{error}</div>
 
-      if (!complete) return (
-        <div className={classes.bar}>loading…</div>
-      )
+      if (!complete) return <div className={classes.bar}>loading…</div>
 
-      return <WrappedComponent {...this.props}/>
+      return <WrappedComponent {...this.props} />
     }
   }
 
   return compose(
     withRouter,
-    connect(
-      state => ({
-        isAuthenticated: state.currentUser.isAuthenticated
-      })
-    )
+    connect(state => ({
+      isAuthenticated: state.currentUser.isAuthenticated,
+    })),
   )(ConnectedComponent)
 }
 
diff --git a/packages/xpub-edit/src/components/Editor.js b/packages/xpub-edit/src/components/Editor.js
index 4d7913beac5999bcc96b683e88ebb42128023811..a8a4672d5d0ddab6f497e9cf01935e09f3cc43cf 100644
--- a/packages/xpub-edit/src/components/Editor.js
+++ b/packages/xpub-edit/src/components/Editor.js
@@ -2,8 +2,9 @@ import React from 'react'
 import classnames from 'classnames'
 import { EditorState } from 'prosemirror-state'
 import { EditorView } from 'prosemirror-view'
-import MenuBar from './MenuBar'
 import baseClasses from 'prosemirror-view/style/prosemirror.css'
+
+import MenuBar from './MenuBar'
 import classes from './Editor.local.css'
 import decorations from '../decorations'
 
@@ -16,7 +17,7 @@ class Editor extends React.Component {
     }
   }
 
-  createEditorView = node => {
+  createEditorView(node) {
     const { state } = this.state
 
     this.view = new EditorView(node, {
@@ -43,7 +44,7 @@ class Editor extends React.Component {
     }
   }
 
-  dispatchTransaction = transaction => {
+  dispatchTransaction(transaction) {
     const state = this.view.state.apply(transaction)
     this.view.updateState(state)
     this.setState({ state })
@@ -58,10 +59,10 @@ class Editor extends React.Component {
       <div>
         {menu && (
           <MenuBar
+            dispatch={this.dispatchTransaction}
             menu={menu}
-            title={title}
             state={state}
-            dispatch={this.dispatchTransaction}
+            title={title}
           />
         )}
 
diff --git a/packages/xpub-edit/src/components/Viewer.js b/packages/xpub-edit/src/components/Viewer.js
index c61a6591cc29893dadc89856bcad600dd182d970..93c324c81fbac7e7e3267a5f27305f7ffef97233 100644
--- a/packages/xpub-edit/src/components/Viewer.js
+++ b/packages/xpub-edit/src/components/Viewer.js
@@ -14,7 +14,7 @@ class Viewer extends React.Component {
     }
   }
 
-  createEditorView = node => {
+  createEditorView(node) {
     const { state } = this.state
 
     this.view = new EditorView(node, {
diff --git a/packages/xpub-edit/src/components/abstract/config/menu.js b/packages/xpub-edit/src/components/abstract/config/menu.js
index 2e607f0dac6ac8928e1f53fd244bad95f641e50d..0763cb8ee054c729ade21eb87ecb3606dc378e15 100644
--- a/packages/xpub-edit/src/components/abstract/config/menu.js
+++ b/packages/xpub-edit/src/components/abstract/config/menu.js
@@ -22,15 +22,15 @@ const blockActive = (type, attrs = {}) => state => {
   return to <= $from.end() && $from.parent.hasMarkup(type, attrs)
 }
 
-const promptForURL = () => {
-  let url = window.prompt('Enter the URL', 'https://')
+// const promptForURL = () => {
+//   let url = window.prompt('Enter the URL', 'https://')
 
-  if (url && !/^https?:\/\//i.test(url)) {
-    url = 'http://' + url
-  }
+//   if (url && !/^https?:\/\//i.test(url)) {
+//     url = `http://${url}`
+//   }
 
-  return url
-}
+//   return url
+// }
 
 export default {
   blocks: {
diff --git a/packages/xpub-edit/src/components/abstract/config/nodes.js b/packages/xpub-edit/src/components/abstract/config/nodes.js
index 3d59ea01e69b1ac921df1958a6cf570a048618f3..13ab00922d753773f59854a52895e1678c887b58 100644
--- a/packages/xpub-edit/src/components/abstract/config/nodes.js
+++ b/packages/xpub-edit/src/components/abstract/config/nodes.js
@@ -17,7 +17,7 @@ const heading = {
   defining: true,
   group: 'block',
   parseDOM: [{ tag: 'h1', attrs: { level: 1 } }],
-  toDOM: node => ['h' + node.attrs.level, 0],
+  toDOM: node => [`h${node.attrs.level}`, 0],
 }
 
 const text = {
diff --git a/packages/xpub-edit/src/components/note/config/menu.js b/packages/xpub-edit/src/components/note/config/menu.js
index c336d13f091db143cdfd03b2f534cda227b1f9e6..45ee363be49130fd150a2efd04bf955c181ff0fa 100644
--- a/packages/xpub-edit/src/components/note/config/menu.js
+++ b/packages/xpub-edit/src/components/note/config/menu.js
@@ -1,4 +1,4 @@
-import { setBlockType, toggleMark } from 'prosemirror-commands'
+import { toggleMark } from 'prosemirror-commands'
 import { redo, undo } from 'prosemirror-history'
 import icons from './icons'
 import schema from './schema'
@@ -11,25 +11,25 @@ const markActive = type => state => {
     : state.doc.rangeHasMark(from, to, type)
 }
 
-const blockActive = (type, attrs = {}) => state => {
-  const { $from, to, node } = state.selection
+// const blockActive = (type, attrs = {}) => state => {
+//   const { $from, to, node } = state.selection
 
-  if (node) {
-    return node.hasMarkup(type, attrs)
-  }
+//   if (node) {
+//     return node.hasMarkup(type, attrs)
+//   }
 
-  return to <= $from.end() && $from.parent.hasMarkup(type, attrs)
-}
+//   return to <= $from.end() && $from.parent.hasMarkup(type, attrs)
+// }
 
-const promptForURL = () => {
-  let url = window.prompt('Enter the URL', 'https://')
+// const promptForURL = () => {
+//   let url = window.prompt('Enter the URL', 'https://')
 
-  if (url && !/^https?:\/\//i.test(url)) {
-    url = 'http://' + url
-  }
+//   if (url && !/^https?:\/\//i.test(url)) {
+//     url = `http://${url}`
+//   }
 
-  return url
-}
+//   return url
+// }
 
 export default {
   marks: {
diff --git a/packages/xpub-selectors/src/index.js b/packages/xpub-selectors/src/index.js
index 28fb48e7f17d9e6f45d70084a7557cddf6e90263..c6df763d95d2369aaaecc006d9cbcd02259ecc9e 100644
--- a/packages/xpub-selectors/src/index.js
+++ b/packages/xpub-selectors/src/index.js
@@ -15,9 +15,8 @@ export const selectFragments = (state, ids) =>
 
 export const selectFragment = (state, id) => state.fragments[id]
 
-export const selectCurrentVersion = (state, project) => {
-  return newestFirst(selectFragments(state, project.fragments))[0]
-}
+export const selectCurrentVersion = (state, project) =>
+  newestFirst(selectFragments(state, project.fragments))[0]
 
 export const getReviewerFromUser = (project, version, currentUser) => {
   if (!project.reviewers || !version.reviewers) return null
diff --git a/packages/xpub-styleguide/src/components/StyleGuideRenderer.js b/packages/xpub-styleguide/src/components/StyleGuideRenderer.js
index 0eb8109834c0e9bc421df5a8cd14950eaff2be23..b1a65700dfd22533f14e9ac59fc07e47849c3114 100644
--- a/packages/xpub-styleguide/src/components/StyleGuideRenderer.js
+++ b/packages/xpub-styleguide/src/components/StyleGuideRenderer.js
@@ -1,20 +1,18 @@
 import React from 'react'
 import classes from './StyleGuideRenderer.local.scss'
 
-const StyleGuideRenderer = ({ title, children, toc }) => {
-  return (
-    <div className={classes.root}>
-      <div className={classes.sidebar}>
-        <header className={classes.header}>
-          <h1 className={classes.title}>{title}</h1>
-        </header>
+const StyleGuideRenderer = ({ title, children, toc }) => (
+  <div className={classes.root}>
+    <div className={classes.sidebar}>
+      <header className={classes.header}>
+        <h1 className={classes.title}>{title}</h1>
+      </header>
 
-        <nav className={classes.nav}>{toc}</nav>
-      </div>
-
-      <div className={classes.content}>{children}</div>
+      <nav className={classes.nav}>{toc}</nav>
     </div>
-  )
-}
+
+    <div className={classes.content}>{children}</div>
+  </div>
+)
 
 export default StyleGuideRenderer
diff --git a/packages/xpub-styleguide/src/components/Wrapper.js b/packages/xpub-styleguide/src/components/Wrapper.js
index 638e124237ace8c32860b07a7a18cb2d47659505..b0df3e215880398c8f3c948ea2d3cab36ac5b270 100644
--- a/packages/xpub-styleguide/src/components/Wrapper.js
+++ b/packages/xpub-styleguide/src/components/Wrapper.js
@@ -4,10 +4,11 @@ import { BrowserRouter as Router } from 'react-router-dom'
 import { reducer as formReducer } from 'redux-form'
 import { createStore, combineReducers } from 'redux'
 import { JournalProvider } from 'xpub-journal'
-import * as journal from '../config/journal'
 
 import 'xpub-theme'
 
+import * as journal from '../config/journal'
+
 import classes from './Wrapper.local.scss'
 
 const rootReducer = combineReducers({
diff --git a/packages/xpub-ui/src/atoms/Avatar.js b/packages/xpub-ui/src/atoms/Avatar.js
index bd0256d21062c04c0429efd12e8cc945f56630f6..d30de999d717c895bce2afb93ef35a5877afd533 100644
--- a/packages/xpub-ui/src/atoms/Avatar.js
+++ b/packages/xpub-ui/src/atoms/Avatar.js
@@ -8,9 +8,9 @@ const Avatar = ({ status, width, height, reviewerLetter }) => {
   return (
     <svg
       className={classes[classValue]}
-      height={height ? height : '70'}
-      viewBox={`0 0 ${width ? width + 5 : '105'} ${height ? height : '70'}`}
-      width={width ? width : '100'}
+      height={height || '70'}
+      viewBox={`0 0 ${width ? width + 5 : '105'} ${height || '70'}`}
+      width={width || '100'}
       xmlns="http://www.w3.org/2000/svg"
     >
       <path
diff --git a/packages/xpub-ui/src/atoms/Menu.js b/packages/xpub-ui/src/atoms/Menu.js
index 466ef18523516e85a97f083f1a6bf4345483ec82..75c8d29399d446a5d09fe5cec86ebbb84901d345 100644
--- a/packages/xpub-ui/src/atoms/Menu.js
+++ b/packages/xpub-ui/src/atoms/Menu.js
@@ -15,22 +15,22 @@ class Menu extends React.Component {
     }
   }
 
-  toggleMenu = () => {
+  toggleMenu() {
     this.setState({
       open: !this.state.open,
     })
   }
 
-  handleSelect = selected => {
+  handleSelect(selected) {
     this.setState({
-      selected,
       open: false,
+      selected,
     })
 
     this.props.onChange(selected)
   }
 
-  optionLabel = value => {
+  optionLabel(value) {
     const { options } = this.props
 
     return options.find(option => option.value === value).label
@@ -51,9 +51,9 @@ class Menu extends React.Component {
         <div className={classes.main}>
           <div className={classes.openerContainer}>
             <button
-              type="button"
               className={classes.opener}
               onClick={this.toggleMenu}
+              type="button"
             >
               {selected ? (
                 <span>{this.optionLabel(selected)}</span>
@@ -69,10 +69,10 @@ class Menu extends React.Component {
               <div className={classes.options}>
                 {options.map(option => (
                   <div
-                    key={option.value}
                     className={classnames(classes.option, {
                       [classes.active]: option.value === selected,
                     })}
+                    key={option.value}
                     onClick={() => this.handleSelect(option.value)}
                   >
                     {option.label || option.value}
diff --git a/packages/xpub-ui/src/atoms/Tags.js b/packages/xpub-ui/src/atoms/Tags.js
index 1c863b81fc84d0bd96f76166e44dfa99b4d77552..70dbe35f7f3e6aaad2e5be6b2118e9009f80b38f 100644
--- a/packages/xpub-ui/src/atoms/Tags.js
+++ b/packages/xpub-ui/src/atoms/Tags.js
@@ -14,7 +14,7 @@ class Tags extends React.Component {
     }
   }
 
-  handleDelete = index => {
+  handleDelete(index) {
     const { tags } = this.state
 
     tags.splice(index, 1)
@@ -24,7 +24,7 @@ class Tags extends React.Component {
     this.props.onChange(tags)
   }
 
-  handleAddition = tag => {
+  handleAddition(tag) {
     const { tags } = this.state
 
     tags.push(tag)
@@ -40,17 +40,17 @@ class Tags extends React.Component {
 
     return (
       <ReactTags
-        name={name}
-        tags={tags}
-        suggestions={suggestions}
-        placeholder={placeholder}
+        allowNew
         autofocus={false}
-        allowNew={true}
         // TODO: enable these when react-tag-autocomplete update is released
         // delimiters={[]}
         // delimiterChars={[',', ';']}
-        handleDelete={this.handleDelete}
         handleAddition={this.handleAddition}
+        handleDelete={this.handleDelete}
+        name={name}
+        placeholder={placeholder}
+        suggestions={suggestions}
+        tags={tags}
       />
     )
   }
diff --git a/packages/xpub-ui/src/atoms/UploadingFile.js b/packages/xpub-ui/src/atoms/UploadingFile.js
index cc08f6fed15e2c2e651ac46c9ad1ab3595f10273..b5f6b6ad6ec878e14af98a0760cdbb81a0b3b28e 100644
--- a/packages/xpub-ui/src/atoms/UploadingFile.js
+++ b/packages/xpub-ui/src/atoms/UploadingFile.js
@@ -13,7 +13,7 @@ const UploadingFile = ({ file, error, progress }) => (
       {!!progress && (
         <div
           className={classes.progress}
-          style={{ top: progress * 100 + '%' }}
+          style={{ top: `${progress * 100}%` }}
         />
       )}
 
diff --git a/packages/xpub-ui/src/molecules/Attachments.js b/packages/xpub-ui/src/molecules/Attachments.js
index 8c7c62a6073c7af8cb942fc1c64a254c4b012586..c05eb487934d3afd84eb781165042e96655e562e 100644
--- a/packages/xpub-ui/src/molecules/Attachments.js
+++ b/packages/xpub-ui/src/molecules/Attachments.js
@@ -16,7 +16,7 @@ const Attachments = props => (
         <span className={classes.icon}>
           <Icon color="var(--color-primary)">paperclip</Icon>
         </span>
-        <span className={classes.filename}>{error ? error : 'Uploading…'}</span>
+        <span className={classes.filename}>{error || 'Uploading…'}</span>
       </div>
     )}
   />
diff --git a/packages/xpub-ui/src/molecules/CheckboxGroup.js b/packages/xpub-ui/src/molecules/CheckboxGroup.js
index 8874941661f4f3a47efbb429c25924eecbe3a51f..09c473a23f3596e4420ed466593ae9c0053072e9 100644
--- a/packages/xpub-ui/src/molecules/CheckboxGroup.js
+++ b/packages/xpub-ui/src/molecules/CheckboxGroup.js
@@ -2,18 +2,18 @@ import React from 'react'
 import Checkbox from '../atoms/Checkbox'
 
 class CheckboxGroup extends React.Component {
-  constructor (props) {
+  constructor(props) {
     super(props)
 
     this.state = {
-      values: props.value || []
+      values: props.value || [],
     }
   }
 
-  handleChange = event => {
+  handleChange(event) {
     const { values } = this.state
 
-    const value = event.target.value
+    const { value } = event.target
 
     if (event.target.checked) {
       values.push(value)
@@ -26,7 +26,7 @@ class CheckboxGroup extends React.Component {
     this.props.onChange(values)
   }
 
-  render () {
+  render() {
     const { inline, name, options, required } = this.props
     const { values } = this.state
 
@@ -34,14 +34,15 @@ class CheckboxGroup extends React.Component {
       <div>
         {options.map(option => (
           <Checkbox
+            checked={values.includes(option.value)}
+            inline={inline}
             key={option.value}
+            label={option.label}
             name={name}
+            onChange={this.handleChange}
             required={required}
-            inline={inline}
             value={option.value}
-            label={option.label}
-            checked={values.includes(option.value)}
-            onChange={this.handleChange}/>
+          />
         ))}
       </div>
     )
diff --git a/packages/xpub-ui/src/molecules/Files.js b/packages/xpub-ui/src/molecules/Files.js
index ed71b40748b3afd976afba45000626ae70bfeed2..438ba0b019048e7a057657c0167242dd3f1bbda8 100644
--- a/packages/xpub-ui/src/molecules/Files.js
+++ b/packages/xpub-ui/src/molecules/Files.js
@@ -12,11 +12,11 @@ class Files extends React.Component {
     }
   }
 
-  handleClick = () => {
+  handleClick() {
     this.fileInput.click()
   }
 
-  handleChange = event => {
+  handleChange(event) {
     const { uploads } = this.state
 
     Array.from(event.target.files).forEach(file => {
@@ -29,15 +29,15 @@ class Files extends React.Component {
     this.setState({ uploads })
   }
 
-  handleUploadedFile = ({ file, url }) => {
+  handleUploadedFile({ file, url }) {
     const values = this.state.values.concat({
       name: file.name,
       url,
     })
 
-    const uploads = this.state.uploads.filter(item => {
-      return item.file.name !== file.name
-    })
+    const uploads = this.state.uploads.filter(
+      item => item.file.name !== file.name,
+    )
 
     this.setState({ values, uploads })
 
@@ -52,20 +52,20 @@ class Files extends React.Component {
       <div className={classes.root}>
         <div className={classes.upload}>
           <button
-            type="button"
             className={classes.attach}
             onClick={() => this.fileInput.click()}
+            type="button"
           >
             {buttonText}
           </button>
 
           <input
             className={classes.input}
-            ref={input => (this.fileInput = input)}
-            type="file"
-            name={name}
             multiple
+            name={name}
             onChange={this.handleChange}
+            ref={input => (this.fileInput = input)}
+            type="file"
           />
         </div>
 
@@ -73,11 +73,11 @@ class Files extends React.Component {
           {uploads &&
             uploads.map(upload => (
               <Upload
-                key={upload.file.name}
                 file={upload.file}
-                request={upload.request}
                 handleUploadedFile={this.handleUploadedFile}
+                key={upload.file.name}
                 render={uploadingFile}
+                request={upload.request}
               />
             ))}
 
diff --git a/packages/xpub-ui/src/molecules/RadioGroup.js b/packages/xpub-ui/src/molecules/RadioGroup.js
index ecc19952f6931668e4c877b4ce152b9f45654bc9..f842a09b426660045e616c548871ec64c4e9616a 100644
--- a/packages/xpub-ui/src/molecules/RadioGroup.js
+++ b/packages/xpub-ui/src/molecules/RadioGroup.js
@@ -10,11 +10,9 @@ class RadioGroup extends React.Component {
     }
   }
 
-  handleChange = event => {
-    const value = event.target.value
-
+  handleChange(event) {
+    const { value } = event.target
     this.setState({ value })
-
     this.props.onChange(value)
   }
 
@@ -26,15 +24,15 @@ class RadioGroup extends React.Component {
       <div>
         {options.map(option => (
           <Radio
+            checked={option.value === value}
+            color={option.color}
+            inline={inline}
             key={option.value}
+            label={option.label}
             name={name}
+            onChange={this.handleChange}
             required={required}
-            inline={inline}
             value={option.value}
-            label={option.label}
-            color={option.color}
-            checked={option.value === value}
-            onChange={this.handleChange}
           />
         ))}
       </div>
diff --git a/packages/xpub-ui/src/molecules/Upload.js b/packages/xpub-ui/src/molecules/Upload.js
index b18c1332e665e77dd14ba21f00218a4b5371bae3..56c71639225f6f273ce1197cee7e850782d50c8a 100644
--- a/packages/xpub-ui/src/molecules/Upload.js
+++ b/packages/xpub-ui/src/molecules/Upload.js
@@ -4,9 +4,13 @@ import React from 'react'
 // TODO: make this a HOC for <UploadingFile>?
 
 class Upload extends React.Component {
-  state = {
-    progress: 0,
-    error: undefined,
+  constructor(props) {
+    super(props)
+
+    this.state = {
+      progress: 0,
+      error: undefined,
+    }
   }
 
   componentDidMount() {
@@ -19,7 +23,7 @@ class Upload extends React.Component {
   }
 
   // TODO: 'progress' event not being fired often enough?
-  handleProgress = event => {
+  handleProgress(event) {
     if (!event.lengthComputable) return
 
     this.setState({
@@ -27,7 +31,7 @@ class Upload extends React.Component {
     })
   }
 
-  handleLoad = event => {
+  handleLoad(event) {
     if (this.props.request.status === 200) {
       this.setState({
         progress: 1,
@@ -44,13 +48,13 @@ class Upload extends React.Component {
     }
   }
 
-  handleError = event => {
+  handleError(event) {
     this.setState({
       error: 'There was an error',
     })
   }
 
-  handleAbort = event => {
+  handleAbort(event) {
     this.setState({
       error: 'The upload was cancelled',
     })