diff --git a/packages/desktop-client/package.json b/packages/desktop-client/package.json index b8a22ae1da926bfbac7e66f99310edb54f9a8eab..dfe5f5bf58639290c4c3029236c8ebe061f19b4e 100644 --- a/packages/desktop-client/package.json +++ b/packages/desktop-client/package.json @@ -14,7 +14,6 @@ "@react-aria/utils": "^3.13.3", "@react-stately/collections": "^3.4.3", "@react-stately/list": "^3.5.3", - "@reactions/component": "^2.0.2", "@svgr/cli": "^6.5.1", "@testing-library/react": "14.0.0", "@testing-library/user-event": "14.4.3", diff --git a/packages/desktop-client/src/components/Modals.js b/packages/desktop-client/src/components/Modals.js index 361de99e0f7e786ed3bdaf764575e02f9146c0fd..46df9f5b2887f7f08ac562fc10b23149da695a54 100644 --- a/packages/desktop-client/src/components/Modals.js +++ b/packages/desktop-client/src/components/Modals.js @@ -2,12 +2,11 @@ import React from 'react'; import { connect } from 'react-redux'; import { Route, Switch } from 'react-router-dom'; -import Component from '@reactions/component'; import { createLocation } from 'history'; import { bindActionCreators } from 'redux'; import * as actions from 'loot-core/src/client/actions'; -import { send, listen, unlisten } from 'loot-core/src/platform/client/fetch'; +import { send } from 'loot-core/src/platform/client/fetch'; import useFeatureFlag from '../hooks/useFeatureFlag'; import useSyncServerStatus from '../hooks/useSyncServerStatus'; @@ -132,34 +131,14 @@ function Modals({ <Route path="/load-backup" - render={() => { - return ( - <Component - initialState={{ backups: [] }} - didMount={async ({ setState }) => { - setState({ - backups: await send('backups-get', { id: budgetId }), - }); - - listen('backups-updated', backups => { - setState({ backups }); - }); - }} - willUnmount={() => { - unlisten('backups-updated'); - }} - > - {({ state }) => ( - <LoadBackup - budgetId={budgetId} - modalProps={modalProps} - actions={actions} - backups={state.backups} - /> - )} - </Component> - ); - }} + render={() => ( + <LoadBackup + watchUpdates + budgetId={budgetId} + modalProps={modalProps} + actions={actions} + /> + )} /> <Route diff --git a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.js b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.js index 5edeb6f1fa3665a63664f1e016f552f3e3ae5160..d9f919fe4d650214dd08a5a4486dd5a43e2a741f 100644 --- a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.js +++ b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.js @@ -1,6 +1,5 @@ import React, { useState } from 'react'; -import Component from '@reactions/component'; import { css } from 'glamor'; import { rolloverBudget } from 'loot-core/src/client/queries'; @@ -135,6 +134,8 @@ function TotalsList({ prevMonthName, collapsed }) { } function ToBudget({ month, prevMonthName, collapsed, onBudgetAction }) { + let [menuOpen, setMenuOpen] = useState(null); + return ( <SheetValue binding={rolloverBudget.toBudget} initialValue={0}> {node => { @@ -145,97 +146,93 @@ function ToBudget({ month, prevMonthName, collapsed, onBudgetAction }) { return ( <View style={{ alignItems: 'center' }}> <Block>{isNegative ? 'Overbudgeted:' : 'To Budget:'}</Block> - <Component initialState={{ menuOpen: null }}> - {({ state, setState }) => ( - <View> - <HoverTarget - disabled={!collapsed || state.menuOpen} - renderContent={() => ( - <Tooltip position="bottom-center"> - <TotalsList - collapsed={true} - prevMonthName={prevMonthName} - /> - </Tooltip> - )} - > - <Block - onClick={() => setState({ menuOpen: 'actions' })} - data-cellname={node.name} - {...css([ - styles.veryLargeText, - { - fontWeight: 400, - userSelect: 'none', - cursor: 'pointer', - color: isNegative ? colors.r4 : colors.p5, - marginBottom: -1, - borderBottom: '1px solid transparent', - ':hover': { - borderColor: isNegative ? colors.r4 : colors.p5, - }, - }, - ])} - > - {format(num, 'financial')} - </Block> - </HoverTarget> - {state.menuOpen === 'actions' && ( - <Tooltip - position="bottom-center" - width={200} - style={{ padding: 0 }} - onClose={() => setState({ menuOpen: null })} - > - <Menu - onMenuSelect={type => { - if (type === 'reset-buffer') { - onBudgetAction(month, 'reset-hold'); - setState({ menuOpen: null }); - } else { - setState({ menuOpen: type }); - } - }} - items={[ - { - name: 'transfer', - text: 'Move to a category', - }, - { - name: 'buffer', - text: 'Hold for next month', - }, - { - name: 'reset-buffer', - text: 'Reset next month’s buffer', - }, - ]} - /> - </Tooltip> - )} - {state.menuOpen === 'buffer' && ( - <HoldTooltip - onClose={() => setState({ menuOpen: null })} - onSubmit={amount => { - onBudgetAction(month, 'hold', { amount }); - }} - /> - )} - {state.menuOpen === 'transfer' && ( - <TransferTooltip - initialAmount={availableValue} - onClose={() => setState({ menuOpen: null })} - onSubmit={(amount, category) => { - onBudgetAction(month, 'transfer-available', { - amount, - category, - }); - }} + <View> + <HoverTarget + disabled={!collapsed || menuOpen} + renderContent={() => ( + <Tooltip position="bottom-center"> + <TotalsList + collapsed={true} + prevMonthName={prevMonthName} /> - )} - </View> + </Tooltip> + )} + > + <Block + onClick={() => setMenuOpen('actions')} + data-cellname={node.name} + {...css([ + styles.veryLargeText, + { + fontWeight: 400, + userSelect: 'none', + cursor: 'pointer', + color: isNegative ? colors.r4 : colors.p5, + marginBottom: -1, + borderBottom: '1px solid transparent', + ':hover': { + borderColor: isNegative ? colors.r4 : colors.p5, + }, + }, + ])} + > + {format(num, 'financial')} + </Block> + </HoverTarget> + {menuOpen === 'actions' && ( + <Tooltip + position="bottom-center" + width={200} + style={{ padding: 0 }} + onClose={() => setMenuOpen(null)} + > + <Menu + onMenuSelect={type => { + if (type === 'reset-buffer') { + onBudgetAction(month, 'reset-hold'); + setMenuOpen(null); + } else { + setMenuOpen(type); + } + }} + items={[ + { + name: 'transfer', + text: 'Move to a category', + }, + { + name: 'buffer', + text: 'Hold for next month', + }, + { + name: 'reset-buffer', + text: 'Reset next month’s buffer', + }, + ]} + /> + </Tooltip> + )} + {menuOpen === 'buffer' && ( + <HoldTooltip + onClose={() => setMenuOpen(null)} + onSubmit={amount => { + onBudgetAction(month, 'hold', { amount }); + }} + /> )} - </Component> + {menuOpen === 'transfer' && ( + <TransferTooltip + initialAmount={availableValue} + onClose={() => setMenuOpen(null)} + onSubmit={(amount, category) => { + onBudgetAction(month, 'transfer-available', { + amount, + category, + }); + }} + /> + )} + </View> </View> ); }} diff --git a/packages/desktop-client/src/components/manager/Modals.js b/packages/desktop-client/src/components/manager/Modals.js index ebd1bce5f5cf3c1bc6f3af4469dd5fae5ffb6a96..bbc46712217100e65e36c67b028eb29ecf27add0 100644 --- a/packages/desktop-client/src/components/manager/Modals.js +++ b/packages/desktop-client/src/components/manager/Modals.js @@ -1,11 +1,9 @@ import React from 'react'; import { connect } from 'react-redux'; -import Component from '@reactions/component'; import { bindActionCreators } from 'redux'; import * as actions from 'loot-core/src/client/actions'; -import { send } from 'loot-core/src/platform/client/fetch'; import { View } from '../common'; import CreateEncryptionKey from '../modals/CreateEncryptionKey'; @@ -70,28 +68,15 @@ function Modals({ ); case 'load-backup': { return ( - <Component - key={name} - initialState={{ backups: [] }} - didMount={async ({ setState }) => { - setState({ - backups: await send('backups-get', { id: options.budgetId }), - }); + <LoadBackup + budgetId={options.budgetId} + modalProps={{ + ...modalProps, + onClose: actions.popModal, }} - > - {({ state }) => ( - <LoadBackup - budgetId={options.budgetId} - modalProps={{ - ...modalProps, - onClose: actions.popModal, - }} - backupDisabled={true} - actions={actions} - backups={state.backups} - /> - )} - </Component> + backupDisabled={true} + actions={actions} + /> ); } case 'create-encryption-key': diff --git a/packages/desktop-client/src/components/modals/LoadBackup.js b/packages/desktop-client/src/components/modals/LoadBackup.js index 77e5cc80f60d10c91feff4d45f0bcc774a04b4cf..1582822e16759119b09926b37da427a9f00bb605 100644 --- a/packages/desktop-client/src/components/modals/LoadBackup.js +++ b/packages/desktop-client/src/components/modals/LoadBackup.js @@ -1,4 +1,6 @@ -import React, { Component } from 'react'; +import React, { Component, useState, useEffect } from 'react'; + +import { send, listen, unlisten } from 'loot-core/src/platform/client/fetch'; import { colors } from '../../style'; import { View, Text, Block, Modal, Button } from '../common'; @@ -43,11 +45,24 @@ class BackupTable extends Component { function LoadBackup({ budgetId, - backups, + watchUpdates, backupDisabled, actions, modalProps, }) { + let [backups, setBackups] = useState([]); + + useEffect(() => { + send('backups-get', { id: budgetId }).then(setBackups); + }, [budgetId]); + + useEffect(() => { + if (watchUpdates) { + listen('backups-updated', setBackups); + return () => unlisten('backups-updated', setBackups); + } + }, [watchUpdates]); + const latestBackup = backups.find(backup => backup.isLatest); const previousBackups = backups.filter(backup => !backup.isLatest); diff --git a/packages/desktop-client/src/components/payees/index.js b/packages/desktop-client/src/components/payees/index.js index ce152cf7bc5767f5871c3e0b4c408509a2dd8168..65a9c5e5e65710c391dd21a1c992a4da0cc93046 100644 --- a/packages/desktop-client/src/components/payees/index.js +++ b/packages/desktop-client/src/components/payees/index.js @@ -10,7 +10,6 @@ import React, { useImperativeHandle, } from 'react'; -import Component from '@reactions/component'; import memoizeOne from 'memoize-one'; import { groupById } from 'loot-core/src/shared/util'; @@ -475,6 +474,8 @@ export const ManagePayees = forwardRef( let payeesById = getPayeesById(payees); + let [menuOpen, setMenuOpen] = useState(false); + return ( <View style={{ height: '100%' }}> <View @@ -484,34 +485,30 @@ export const ManagePayees = forwardRef( padding: '0 10px 5px', }} > - <Component initialState={{ menuOpen: false }}> - {({ state, setState }) => ( - <View> - <Button - bare - style={{ marginRight: 10 }} - disabled={buttonsDisabled} - onClick={() => setState({ menuOpen: true })} - > - {buttonsDisabled - ? 'No payees selected' - : selected.items.size + - ' ' + - plural(selected.items.size, 'payee', 'payees')} - <ExpandArrow width={8} height={8} style={{ marginLeft: 5 }} /> - </Button> - {state.menuOpen && ( - <PayeeMenu - payeesById={payeesById} - selectedPayees={selected.items} - onClose={() => setState({ menuOpen: false })} - onDelete={onDelete} - onMerge={onMerge} - /> - )} - </View> + <View> + <Button + bare + style={{ marginRight: 10 }} + disabled={buttonsDisabled} + onClick={() => setMenuOpen(true)} + > + {buttonsDisabled + ? 'No payees selected' + : selected.items.size + + ' ' + + plural(selected.items.size, 'payee', 'payees')} + <ExpandArrow width={8} height={8} style={{ marginLeft: 5 }} /> + </Button> + {menuOpen && ( + <PayeeMenu + payeesById={payeesById} + selectedPayees={selected.items} + onClose={() => setMenuOpen(false)} + onDelete={onDelete} + onMerge={onMerge} + /> )} - </Component> + </View> <View> <Button bare diff --git a/upcoming-release-notes/1036.md b/upcoming-release-notes/1036.md new file mode 100644 index 0000000000000000000000000000000000000000..1c6ee006d8c1eb78556e9523eb9773bed139d850 --- /dev/null +++ b/upcoming-release-notes/1036.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [j-f1] +--- + +Remove dependency on `@reactions/component` diff --git a/yarn.lock b/yarn.lock index 83fcfba0d23c5da8baa3516e16724cfcb4dadedf..42323add1cae3c5305e80428d6ba092098fab301 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,7 +63,6 @@ __metadata: "@react-aria/utils": ^3.13.3 "@react-stately/collections": ^3.4.3 "@react-stately/list": ^3.5.3 - "@reactions/component": ^2.0.2 "@svgr/cli": ^6.5.1 "@testing-library/react": 14.0.0 "@testing-library/user-event": 14.4.3 @@ -2950,15 +2949,6 @@ __metadata: languageName: node linkType: hard -"@reactions/component@npm:^2.0.2": - version: 2.0.2 - resolution: "@reactions/component@npm:2.0.2" - peerDependencies: - react: 15.x || 16.x - checksum: 89d806e2b15974f213806e69a23b1ad2f6675cab93daf1fa56a7df2c74403be4adb5da9a5c64adb89e55e98d767fbe100c289ed615b15645894bef8c03ef87c6 - languageName: node - linkType: hard - "@remix-run/router@npm:1.0.1": version: 1.0.1 resolution: "@remix-run/router@npm:1.0.1"