import React, { useState, useRef, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { replaceModal } from 'loot-core/src/client/actions/modals';
import { send } from 'loot-core/src/platform/client/fetch';
import { Information } from 'loot-design/src/components/alerts';
import {
View,
Text,
Modal,
ModalButtons,
Button,
P
} from 'loot-design/src/components/common';
import { colors } from 'loot-design/src/style';
let highlightStyle = { color: colors.p5 };
export default function MergeUnusedPayees({
history,
modalProps,
payeeIds,
targetPayeeId
}) {
let { payees: allPayees, modalStack } = useSelector(state => ({
payees: state.queries.payees,
modalStack: state.modals.modalStack
}));
let isEditingRule = !!modalStack.find(m => m.name === 'edit-rule');
let dispatch = useDispatch();
let [shouldCreateRule, setShouldCreateRule] = useState(true);
let flashRef = useRef(null);
useEffect(() => {
// Flash the scrollbar
if (flashRef.current) {
let el = flashRef.current;
let top = el.scrollTop;
el.scrollTop = top + 1;
el.scrollTop = top;
}
}, [flashRef.current, true]);
// We store the orphaned payees into state because when we merge it,
// it will be deleted and this component will automatically
// rerender. Is there a better pattern for live bindings?
//
// TODO: I think a custom `useSelector` hook that doesn't bind would
// be nice
let [payees] = useState(() =>
payeeIds.map(id => allPayees.find(p => p.id === id))
);
let 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) {
let id = await send('rule-add-payee-rename', {
fromNames: payees.map(p => p.name),
to: targetPayee.id
});
ruleId = id;
}
modalProps.onClose();
return ruleId;
}
async function onMergeAndCreateRule() {
let ruleId = await onMerge();
if (ruleId) {
let rule = await send('rule-get', { id: ruleId });
dispatch(replaceModal('edit-rule', { rule }));
}
}
return (
{payees.length === 1 ? (
<>
The payee
{payees.map(p => (
>
)}