From f8dfa5a6e0ea51daeb803882728611f569b34b0d Mon Sep 17 00:00:00 2001
From: Matiss Janis Aboltins <matiss@mja.lv>
Date: Thu, 15 Jun 2023 20:45:04 +0100
Subject: [PATCH] :bug:  disable 'all payees' checkbox while schedules are
 loading (#1136)

Closes #1125

Disables (hides) the "all payees" checkbox when schedules are loading.

Reproduction:
1. open `/schedule/discover`
2. while the data is still loading - click on the checkbox in the table
header
3. after loading finishes - the page crashes with an error
---
 .../components/schedules/DiscoverSchedules.js | 20 ++++---------
 .../src/hooks/useSendPlatformRequest.ts       | 28 +++++++++++++++++++
 upcoming-release-notes/1136.md                |  6 ++++
 3 files changed, 40 insertions(+), 14 deletions(-)
 create mode 100644 packages/desktop-client/src/hooks/useSendPlatformRequest.ts
 create mode 100644 upcoming-release-notes/1136.md

diff --git a/packages/desktop-client/src/components/schedules/DiscoverSchedules.js b/packages/desktop-client/src/components/schedules/DiscoverSchedules.js
index c03c81065..4978e64bc 100644
--- a/packages/desktop-client/src/components/schedules/DiscoverSchedules.js
+++ b/packages/desktop-client/src/components/schedules/DiscoverSchedules.js
@@ -1,4 +1,4 @@
-import React, { useState, useEffect } from 'react';
+import React, { useState } from 'react';
 import { useHistory } from 'react-router-dom';
 
 import q, { runQuery } from 'loot-core/src/client/query-helpers';
@@ -10,6 +10,7 @@ import useSelected, {
   useSelectedItems,
   SelectedProvider,
 } from '../../hooks/useSelected';
+import useSendPlatformRequest from '../../hooks/useSendPlatformRequest';
 import { colors } from '../../style';
 import { View, Stack, ButtonWithLoading, P } from '../common';
 import { Page, usePageType } from '../Page';
@@ -73,7 +74,7 @@ function DiscoverSchedulesTable({ schedules, loading }) {
     <View style={{ flex: 1 }}>
       <TableHeader height={ROW_HEIGHT} inset={15} version="v2">
         <SelectCell
-          exposed={true}
+          exposed={!loading}
           focused={false}
           selected={selectedItems.size > 0}
           onSelect={e => dispatchSelected({ type: 'select-all', event: e })}
@@ -109,18 +110,12 @@ function DiscoverSchedulesTable({ schedules, loading }) {
 export default function DiscoverSchedules() {
   let pageType = usePageType();
   let history = useHistory();
-  let [schedules, setSchedules] = useState();
+  let { data: schedules = [], isLoading } =
+    useSendPlatformRequest('schedule/discover');
   let [creating, setCreating] = useState(false);
 
   let selectedInst = useSelected('discover-schedules', schedules, []);
 
-  useEffect(() => {
-    async function run() {
-      setSchedules(await send('schedule/discover'));
-    }
-    run();
-  }, []);
-
   async function onCreate() {
     let selected = schedules.filter(s => selectedInst.items.has(s.id));
     setCreating(true);
@@ -165,10 +160,7 @@ export default function DiscoverSchedules() {
       </P>
 
       <SelectedProvider instance={selectedInst}>
-        <DiscoverSchedulesTable
-          loading={schedules == null}
-          schedules={schedules}
-        />
+        <DiscoverSchedulesTable loading={isLoading} schedules={schedules} />
       </SelectedProvider>
 
       <Stack
diff --git a/packages/desktop-client/src/hooks/useSendPlatformRequest.ts b/packages/desktop-client/src/hooks/useSendPlatformRequest.ts
new file mode 100644
index 000000000..aa621589d
--- /dev/null
+++ b/packages/desktop-client/src/hooks/useSendPlatformRequest.ts
@@ -0,0 +1,28 @@
+import { useEffect, useState } from 'react';
+
+import { send } from 'loot-core/src/platform/client/fetch';
+import type { Handlers } from 'loot-core/src/types/handlers';
+
+export default function useSendPlatformRequest<K extends keyof Handlers>(
+  name: K,
+  args?: Parameters<Handlers[K]>[0],
+  options?: { catchErrors?: boolean },
+) {
+  const [data, setData] = useState<unknown>(null);
+  const [isLoading, setIsLoading] = useState<boolean | null>(null);
+
+  useEffect(() => {
+    async function run() {
+      setIsLoading(true);
+      setData(await send(name, args, options));
+      setIsLoading(false);
+    }
+
+    run();
+  }, [name, args, options]);
+
+  return {
+    data,
+    isLoading,
+  };
+}
diff --git a/upcoming-release-notes/1136.md b/upcoming-release-notes/1136.md
new file mode 100644
index 000000000..7fb79894e
--- /dev/null
+++ b/upcoming-release-notes/1136.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [MatissJanis]
+---
+
+Fix "find schedules" page crashing if interction is made before loading data finishes
-- 
GitLab