diff --git a/packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.jsx b/packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.tsx similarity index 75% rename from packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.jsx rename to packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.tsx index d4ef4edc96a..164143cd73e 100644 --- a/packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.jsx +++ b/packages/desktop-client/src/components/modals/MergeUnusedPayeesModal.tsx @@ -1,10 +1,11 @@ -import React, { useState, useRef, useEffect } from 'react'; +import React, { useState, useRef, useEffect, useCallback } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { t } from 'i18next'; import { replaceModal } from 'loot-core/src/client/actions/modals'; import { send } from 'loot-core/src/platform/client/fetch'; +import { type PayeeEntity } from 'loot-core/types/models'; import { usePayees } from '../../hooks/usePayees'; import { theme } from '../../style'; @@ -17,13 +18,21 @@ import { View } from '../common/View'; const highlightStyle = { color: theme.pageTextPositive }; -export function MergeUnusedPayeesModal({ payeeIds, targetPayeeId }) { +type MergeUnusedPayeesModalProps = { + payeeIds: Array; + targetPayeeId: PayeeEntity['id']; +}; + +export function MergeUnusedPayeesModal({ + payeeIds, + targetPayeeId, +}: MergeUnusedPayeesModalProps) { const allPayees = usePayees(); const modalStack = useSelector(state => state.modals.modalStack); const isEditingRule = !!modalStack.find(m => m.name === 'edit-rule'); const dispatch = useDispatch(); const [shouldCreateRule, setShouldCreateRule] = useState(true); - const flashRef = useRef(null); + const flashRef = useRef(null); useEffect(() => { // Flash the scrollbar @@ -41,40 +50,46 @@ export function MergeUnusedPayeesModal({ payeeIds, targetPayeeId }) { // // TODO: I think a custom `useSelector` hook that doesn't bind would // be nice - const [payees] = useState(() => - payeeIds.map(id => allPayees.find(p => p.id === id)), + const [payees] = useState(() => + allPayees.filter(p => payeeIds.includes(p.id)), ); - const targetPayee = allPayees.find(p => p.id === targetPayeeId); - - if (!targetPayee) { - return null; - } - async function onMerge() { - await send('payees-merge', { - targetId: targetPayee.id, - mergeIds: payees.map(p => p.id), - }); - - let ruleId; - if (shouldCreateRule && !isEditingRule) { - const id = await send('rule-add-payee-rename', { - fromNames: payees.map(p => p.name), - to: targetPayee.id, + const onMerge = useCallback( + async (targetPayee: PayeeEntity) => { + await send('payees-merge', { + targetId: targetPayee.id, + mergeIds: payees.map(payee => payee.id), }); - ruleId = id; - } - return ruleId; - } + let ruleId; + if (shouldCreateRule && !isEditingRule) { + const id = await send('rule-add-payee-rename', { + fromNames: payees.map(payee => payee.name), + to: targetPayee.id, + }); + ruleId = id; + } + + return ruleId; + }, + [shouldCreateRule, isEditingRule, payees], + ); - async function onMergeAndCreateRule() { - const ruleId = await onMerge(); + const onMergeAndCreateRule = useCallback( + async (targetPayee: PayeeEntity) => { + const ruleId = await onMerge(targetPayee); - if (ruleId) { - const rule = await send('rule-get', { id: ruleId }); - dispatch(replaceModal('edit-rule', { rule })); - } + if (ruleId) { + const rule = await send('rule-get', { id: ruleId }); + dispatch(replaceModal('edit-rule', { rule })); + } + }, + [onMerge, dispatch], + ); + + const targetPayee = allPayees.find(p => p.id === targetPayeeId); + if (!targetPayee) { + return null; } return ( @@ -103,9 +118,9 @@ export function MergeUnusedPayeesModal({ payeeIds, targetPayeeId }) { overflow: 'auto', }} > - {payees.map(p => ( -
  • - {p.name} + {payees.map(payee => ( +
  • + {payee.name}
  • ))} @@ -157,7 +172,7 @@ export function MergeUnusedPayeesModal({ payeeIds, targetPayeeId }) { autoFocus style={{ marginRight: 10 }} onPress={() => { - onMerge(); + onMerge(targetPayee); close(); }} > @@ -167,7 +182,7 @@ export function MergeUnusedPayeesModal({ payeeIds, targetPayeeId }) {