diff --git a/.eslintrc.js b/.eslintrc.js
index 6a5e2ec2833d3c92220c739acd7ef0944ab34e99..687caf210893fc4a7b84ed4d47c213cc1fddbf51 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -17,7 +17,6 @@ module.exports = {
     // TODO: re-enable these rules
     'import/no-anonymous-default-export': 'off',
     'react/destructuring-assignment': 'off',
-    'react-hooks/rules-of-hooks': 'off',
     'react-hooks/exhaustive-deps': 'off',
 
     'import/no-useless-path-segments': 'error',
diff --git a/packages/desktop-client/src/components/accounts/AccountSyncCheck.js b/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
index 2eca69ce1f794c09eee3f8f799b9ef157d56bd9f..f1345eb30b04b10a9c3e6ea80818cd2cfb10d640 100644
--- a/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
+++ b/packages/desktop-client/src/components/accounts/AccountSyncCheck.js
@@ -69,6 +69,7 @@ function AccountSyncCheck({
   getAccounts,
   addNotification,
 }) {
+  let [open, setOpen] = useState(false);
   if (!failedAccounts) {
     return null;
   }
@@ -78,8 +79,6 @@ function AccountSyncCheck({
     return null;
   }
 
-  let [open, setOpen] = useState(false);
-
   let account = accounts.find(account => account.id === id);
   let { type, code } = error;
   let showAuth =
diff --git a/packages/desktop-client/src/components/reports/CashFlow.js b/packages/desktop-client/src/components/reports/CashFlow.js
index 802ce26d0abeb7c7b66c4de0cebec874fd4ab1f8..5d5e64219b048402767be5c62ae7f1ee7b60b0e6 100644
--- a/packages/desktop-client/src/components/reports/CashFlow.js
+++ b/packages/desktop-client/src/components/reports/CashFlow.js
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useMemo } from 'react';
 
 import * as d from 'date-fns';
 
@@ -19,7 +19,6 @@ import { cashFlowByDate } from './graphs/cash-flow-spreadsheet';
 import CashFlowGraph from './graphs/CashFlowGraph';
 import Header from './Header';
 import useReport from './useReport';
-import { useArgsMemo } from './util';
 
 function CashFlow() {
   const [allMonths, setAllMonths] = useState(null);
@@ -36,10 +35,11 @@ function CashFlow() {
     return numDays > 31 * 3;
   });
 
-  const data = useReport(
-    'cash_flow',
-    useArgsMemo(cashFlowByDate)(start, end, isConcise),
+  const params = useMemo(
+    () => cashFlowByDate(start, end, isConcise),
+    [start, end, isConcise],
   );
+  const data = useReport('cash_flow', params);
 
   useEffect(() => {
     async function run() {
diff --git a/packages/desktop-client/src/components/reports/NetWorth.js b/packages/desktop-client/src/components/reports/NetWorth.js
index 6c005433b07add9fd7558abea85582ecc4c25887..cc50c0a08806a156c28156148507a099db95b9b9 100644
--- a/packages/desktop-client/src/components/reports/NetWorth.js
+++ b/packages/desktop-client/src/components/reports/NetWorth.js
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState, useEffect, useMemo } from 'react';
 import { connect } from 'react-redux';
 
 import * as d from 'date-fns';
@@ -16,7 +16,7 @@ import netWorthSpreadsheet from './graphs/net-worth-spreadsheet';
 import NetWorthGraph from './graphs/NetWorthGraph';
 import Header from './Header';
 import useReport from './useReport';
-import { fromDateRepr, useArgsMemo } from './util';
+import { fromDateRepr } from './util';
 
 function NetWorth({ accounts }) {
   const [allMonths, setAllMonths] = useState(null);
@@ -25,10 +25,11 @@ function NetWorth({ accounts }) {
   );
   const [end, setEnd] = useState(monthUtils.currentMonth());
 
-  const data = useReport(
-    'net_worth',
-    useArgsMemo(netWorthSpreadsheet)(start, end, accounts),
+  const params = useMemo(
+    () => netWorthSpreadsheet(start, end, accounts),
+    [start, end, accounts],
   );
+  const data = useReport('net_worth', params);
 
   useEffect(() => {
     async function run() {
diff --git a/packages/desktop-client/src/components/reports/Overview.js b/packages/desktop-client/src/components/reports/Overview.js
index 4270d0bccc0cf5dfc0a6a1a00cf0cce1670ac239..a9e79c37a38005a0725872388b649c1083bc733c 100644
--- a/packages/desktop-client/src/components/reports/Overview.js
+++ b/packages/desktop-client/src/components/reports/Overview.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useMemo } from 'react';
 import { connect } from 'react-redux';
 
 import { bindActionCreators } from 'redux';
@@ -19,7 +19,6 @@ import netWorthSpreadsheet from './graphs/net-worth-spreadsheet';
 import NetWorthGraph from './graphs/NetWorthGraph';
 import Tooltip from './Tooltip';
 import useReport from './useReport';
-import { useArgsMemo } from './util';
 
 function Card({ flex, to, style, children }) {
   const containerProps = { flex, margin: 15 };
@@ -63,10 +62,11 @@ function NetWorthCard({ accounts }) {
   const end = monthUtils.currentMonth();
   const start = monthUtils.subMonths(end, 5);
 
-  const data = useReport(
-    'net_worth',
-    useArgsMemo(netWorthSpreadsheet)(start, end, accounts),
+  const params = useMemo(
+    () => netWorthSpreadsheet(start, end, accounts),
+    [start, end, accounts],
   );
+  const data = useReport('net_worth', params);
 
   if (!data) {
     return null;
@@ -114,10 +114,8 @@ function CashFlowCard() {
   const end = monthUtils.currentDay();
   const start = monthUtils.currentMonth() + '-01';
 
-  const data = useReport(
-    'cash_flow_simple',
-    useArgsMemo(simpleCashFlow)(start, end),
-  );
+  const params = useMemo(() => simpleCashFlow(start, end), [start, end]);
+  const data = useReport('cash_flow_simple', params);
   if (!data) {
     return null;
   }
diff --git a/packages/desktop-client/src/components/reports/util.js b/packages/desktop-client/src/components/reports/util.js
index dbe6bb1a3e14cf45ccbc937efb37d6317720e7d5..9866fca32b48ade9ea4234aa47eaeb7f58797d13 100644
--- a/packages/desktop-client/src/components/reports/util.js
+++ b/packages/desktop-client/src/components/reports/util.js
@@ -1,13 +1,5 @@
-import { useMemo } from 'react';
-
 import { runQuery } from 'loot-core/src/client/query-helpers';
 
-export function useArgsMemo(func) {
-  return (...args) => {
-    return useMemo(() => func(...args), args);
-  };
-}
-
 export function fromDateRepr(date) {
   return date.slice(0, 7);
 }
diff --git a/packages/loot-design/src/components/RecurringSchedulePicker.js b/packages/loot-design/src/components/RecurringSchedulePicker.js
index 537bd898698c07cc604773d3a8dee0dd41c767ed..67fdcc604bbdae52d8454abbae64b39a0905e18e 100644
--- a/packages/loot-design/src/components/RecurringSchedulePicker.js
+++ b/packages/loot-design/src/components/RecurringSchedulePicker.js
@@ -130,15 +130,16 @@ function reducer(state, action) {
 }
 
 function SchedulePreview({ previewDates }) {
+  const dateFormat = useSelector(state =>
+    (state.prefs.local.dateFormat || 'MM/dd/yyyy')
+      .replace('MM', 'M')
+      .replace('dd', 'd'),
+  );
+
   if (!previewDates) {
     return null;
   }
 
-  let dateFormat = useSelector(
-    state => state.prefs.local.dateFormat || 'MM/dd/yyyy',
-  );
-  dateFormat = dateFormat.replace('MM', 'M').replace('dd', 'd');
-
   let content = null;
   if (typeof previewDates === 'string') {
     content = <Text>{previewDates}</Text>;
diff --git a/packages/loot-design/src/components/sort.js b/packages/loot-design/src/components/sort.js
index e85ee646af553e050ccaa2b25b8f34d45c989a89..55c2abb99af0f2fa3960ab5ba3d8d0e91b2dedd6 100644
--- a/packages/loot-design/src/components/sort.js
+++ b/packages/loot-design/src/components/sort.js
@@ -109,11 +109,12 @@ export function useDroppable({ types, id, onDrop, onLongHover }) {
 export const DropHighlightPosContext = React.createContext(null);
 
 export function DropHighlight({ pos, offset = {} }) {
+  let itemPos = useContext(DropHighlightPosContext);
+
   if (pos == null) {
     return null;
   }
 
-  let itemPos = useContext(DropHighlightPosContext);
   let topOffset = (itemPos === 'first' ? 2 : 0) + (offset.top || 0);
   let bottomOffset = (itemPos === 'last' ? 2 : 0) + (offset.bottom || 0);