From 5df02c19dce7ca77ebf68e0c14bc7170ea9858de Mon Sep 17 00:00:00 2001
From: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
Date: Mon, 22 Apr 2024 08:39:01 -0700
Subject: [PATCH] [Mobile] Add To Be Budgeted category to cover and transfer
 modal (#2635)

* Add To Be Budgeted category to cover and transfer modal

* Release notes

* Fix To Be Budgeted input selection

* Fix typecheck error

* Fix duplicate modals in firefox

* Fix lint error
---
 .../desktop-client/src/components/Modals.tsx  |  1 +
 .../src/components/modals/CoverModal.tsx      | 20 +++++++-------
 .../src/components/modals/TransferModal.tsx   | 27 +++++++++++--------
 upcoming-release-notes/2635.md                |  6 +++++
 4 files changed, 34 insertions(+), 20 deletions(-)
 create mode 100644 upcoming-release-notes/2635.md

diff --git a/packages/desktop-client/src/components/Modals.tsx b/packages/desktop-client/src/components/Modals.tsx
index 21845c0fb..999849eb9 100644
--- a/packages/desktop-client/src/components/Modals.tsx
+++ b/packages/desktop-client/src/components/Modals.tsx
@@ -286,6 +286,7 @@ export function Modals() {
               autocompleteProps={{
                 value: null,
                 onSelect: options.onSelect,
+                categoryGroups: options.categoryGroups,
                 showHiddenCategories: options.showHiddenCategories,
               }}
               month={options.month}
diff --git a/packages/desktop-client/src/components/modals/CoverModal.tsx b/packages/desktop-client/src/components/modals/CoverModal.tsx
index e11baeb6e..228c358d2 100644
--- a/packages/desktop-client/src/components/modals/CoverModal.tsx
+++ b/packages/desktop-client/src/components/modals/CoverModal.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useState } from 'react';
+import React, { useCallback, useEffect, useMemo, useState } from 'react';
 import { useDispatch } from 'react-redux';
 
 import { pushModal } from 'loot-core/client/actions';
@@ -26,10 +26,14 @@ export function CoverModal({
   month,
   onSubmit,
 }: CoverModalProps) {
-  const { grouped: originalCategoryGroups, list: categories } = useCategories();
-  const categoryGroups = addToBeBudgetedGroup(
-    originalCategoryGroups.filter(g => !g.is_income),
-  );
+  const { grouped: originalCategoryGroups } = useCategories();
+  const [categoryGroups, categories] = useMemo(() => {
+    const expenseGroups = addToBeBudgetedGroup(
+      originalCategoryGroups.filter(g => !g.is_income),
+    );
+    const expenseCategories = expenseGroups.flatMap(g => g.categories || []);
+    return [expenseGroups, expenseCategories];
+  }, [originalCategoryGroups]);
 
   const [fromCategoryId, setFromCategoryId] = useState<string | null>(null);
   const dispatch = useDispatch();
@@ -62,6 +66,7 @@ export function CoverModal({
     }
   }, [initialMount, onCategoryClick]);
 
+  const fromCategory = categories.find(c => c.id === fromCategoryId);
   const category = categories.find(c => c.id === categoryId);
 
   if (!category) {
@@ -86,10 +91,7 @@ export function CoverModal({
         <>
           <View>
             <FieldLabel title="Cover from category:" />
-            <TapField
-              value={categories.find(c => c.id === fromCategoryId)?.name}
-              onClick={onCategoryClick}
-            />
+            <TapField value={fromCategory?.name} onClick={onCategoryClick} />
           </View>
 
           <View
diff --git a/packages/desktop-client/src/components/modals/TransferModal.tsx b/packages/desktop-client/src/components/modals/TransferModal.tsx
index dae973f5a..43bf3995d 100644
--- a/packages/desktop-client/src/components/modals/TransferModal.tsx
+++ b/packages/desktop-client/src/components/modals/TransferModal.tsx
@@ -1,4 +1,4 @@
-import React, { useState } from 'react';
+import React, { useMemo, useState } from 'react';
 import { useDispatch } from 'react-redux';
 
 import { pushModal } from 'loot-core/client/actions';
@@ -32,11 +32,15 @@ export function TransferModal({
   showToBeBudgeted,
   onSubmit,
 }: TransferModalProps) {
-  const { grouped: originalCategoryGroups, list: categories } = useCategories();
-  let categoryGroups = originalCategoryGroups.filter(g => !g.is_income);
-  if (showToBeBudgeted) {
-    categoryGroups = addToBeBudgetedGroup(categoryGroups);
-  }
+  const { grouped: originalCategoryGroups } = useCategories();
+  const [categoryGroups, categories] = useMemo(() => {
+    let expenseGroups = originalCategoryGroups.filter(g => !g.is_income);
+    expenseGroups = showToBeBudgeted
+      ? addToBeBudgetedGroup(expenseGroups)
+      : expenseGroups;
+    const expenseCategories = expenseGroups.flatMap(g => g.categories || []);
+    return [expenseGroups, expenseCategories];
+  }, [originalCategoryGroups, showToBeBudgeted]);
 
   const _initialAmount = integerToCurrency(Math.max(initialAmount, 0));
   const [amount, setAmount] = useState<string | null>(null);
@@ -65,6 +69,8 @@ export function TransferModal({
     modalProps.onClose();
   };
 
+  const toCategory = categories.find(c => c.id === toCategoryId);
+
   return (
     <Modal
       title={title}
@@ -86,7 +92,7 @@ export function TransferModal({
             <InitialFocus>
               <InputField
                 inputMode="decimal"
-                tabIndex={1}
+                tabIndex={0}
                 defaultValue={_initialAmount}
                 onUpdate={setAmount}
                 onEnter={() => {
@@ -100,10 +106,9 @@ export function TransferModal({
 
           <FieldLabel title="To:" />
           <TapField
-            tabIndex={2}
-            value={categories.find(c => c.id === toCategoryId)?.name}
+            tabIndex={0}
+            value={toCategory?.name}
             onClick={openCategoryModal}
-            onFocus={openCategoryModal}
           />
 
           <View
@@ -115,7 +120,7 @@ export function TransferModal({
           >
             <Button
               type="primary"
-              tabIndex={3}
+              tabIndex={0}
               style={{
                 height: styles.mobileMinHeight,
                 marginLeft: styles.mobileEditingPadding,
diff --git a/upcoming-release-notes/2635.md b/upcoming-release-notes/2635.md
new file mode 100644
index 000000000..19fa5e5f9
--- /dev/null
+++ b/upcoming-release-notes/2635.md
@@ -0,0 +1,6 @@
+---
+category: Bugfix
+authors: [joel-jeremy]
+---
+
+Add To Be Budgeted category to cover and transfer modal
-- 
GitLab