diff --git a/packages/desktop-client/src/components/accounts/Balance.js b/packages/desktop-client/src/components/accounts/Balance.js index 23f99530b8abb35d87f643974a3b64eddc5cd495..abc52b1a862e726dca388820f6f3d87f854a069b 100644 --- a/packages/desktop-client/src/components/accounts/Balance.js +++ b/packages/desktop-client/src/components/accounts/Balance.js @@ -12,11 +12,12 @@ import Text from '../common/Text'; import View from '../common/View'; import PrivacyFilter from '../PrivacyFilter'; import CellValue from '../spreadsheet/CellValue'; -import format from '../spreadsheet/format'; +import useFormat from '../spreadsheet/useFormat'; import useSheetValue from '../spreadsheet/useSheetValue'; import { isPreviewId } from '../transactions/TransactionsTable'; function DetailedBalance({ name, balance, isExactBalance = true }) { + const format = useFormat(); return ( <Text style={{ diff --git a/packages/desktop-client/src/components/accounts/Reconcile.js b/packages/desktop-client/src/components/accounts/Reconcile.js index 1a851601983cec4b4434d3f59f5af3bb0ea6128c..92615a9630ca3894d13656dbf1941433345f8d78 100644 --- a/packages/desktop-client/src/components/accounts/Reconcile.js +++ b/packages/desktop-client/src/components/accounts/Reconcile.js @@ -10,7 +10,7 @@ import InitialFocus from '../common/InitialFocus'; import Input from '../common/Input'; import Text from '../common/Text'; import View from '../common/View'; -import format from '../spreadsheet/format'; +import useFormat from '../spreadsheet/useFormat'; import useSheetValue from '../spreadsheet/useSheetValue'; import { Tooltip } from '../tooltips'; @@ -25,6 +25,7 @@ export function ReconcilingMessage({ value: 0, query: balanceQuery.query.filter({ cleared: true }), }); + let format = useFormat(); let targetDiff = targetBalance - cleared; return ( @@ -96,6 +97,7 @@ export function ReconcilingMessage({ export function ReconcileTooltip({ account, onReconcile, onClose }) { let balance = useSheetValue(queries.accountBalance(account)); + let format = useFormat(); function onSubmit(e) { e.preventDefault(); diff --git a/packages/desktop-client/src/components/budget/MobileBudgetTable.js b/packages/desktop-client/src/components/budget/MobileBudgetTable.js index 39c065ba58d37b1f84c96a9341c969593e4bcd2d..f1641a970206cff831e72605da480f400976f67a 100644 --- a/packages/desktop-client/src/components/budget/MobileBudgetTable.js +++ b/packages/desktop-client/src/components/budget/MobileBudgetTable.js @@ -1,4 +1,4 @@ -import React, { Component, memo, PureComponent } from 'react'; +import React, { Component, memo, PureComponent, useState } from 'react'; // import { // RectButton, // PanGestureHandler, @@ -24,8 +24,8 @@ import Text from '../common/Text'; import View from '../common/View'; import { useServerURL } from '../ServerContext'; import CellValue from '../spreadsheet/CellValue'; -import format from '../spreadsheet/format'; import NamespaceContext from '../spreadsheet/NamespaceContext'; +import useFormat from '../spreadsheet/useFormat'; import useSheetValue from '../spreadsheet/useSheetValue'; import { SyncButton } from '../Titlebar'; import { AmountInput } from '../util/AmountInput'; @@ -39,6 +39,7 @@ import { ListItem, ROW_HEIGHT } from './MobileTable'; function ToBudget({ toBudget, onClick }) { let amount = useSheetValue(toBudget); + let format = useFormat(); return ( <Button type="bare" @@ -67,6 +68,7 @@ function ToBudget({ toBudget, onClick }) { function Saved({ projected }) { let budgetedSaved = useSheetValue(reportBudget.totalBudgetedSaved) || 0; let totalSaved = useSheetValue(reportBudget.totalSaved) || 0; + let format = useFormat(); let saved = projected ? budgetedSaved : totalSaved; let isNegative = saved < 0; @@ -109,6 +111,7 @@ const BudgetCell = memo(function BudgetCell(props) { } = props; let sheetValue = useSheetValue(binding); + let format = useFormat(); return ( <View style={style}> @@ -572,7 +575,7 @@ class BudgetGroup extends PureComponent { group, // editingId, editMode, - gestures, + // gestures, month, onEditCategory, onReorderCategory, @@ -635,7 +638,7 @@ class BudgetGroup extends PureComponent { category={category} editing={undefined} //editing} editMode={editMode} - gestures={gestures} + // gestures={gestures} month={month} onEdit={onEditCategory} onReorder={onReorderCategory} @@ -764,249 +767,157 @@ class BudgetGroups extends Component { } } -export class BudgetTable extends Component { - // static contextType = AmountAccessoryContext; - state = { editingCategory: null }; - - // constructor(props) { - // super(props); - // this.gestures = { - // scroll: React.createRef(null), - // pan: React.createRef(null), - // rows: [] - // }; - // } - - // componentDidMount() { - // if (ACTScrollViewManager) { - // ACTScrollViewManager.activate( - // (this.list.getNode - // ? this.list.getNode() - // : this.list - // ).getScrollableNode() - // ); - // } - - // const removeFocus = this.props.navigation.addListener('focus', () => { - // if (ACTScrollViewManager) { - // ACTScrollViewManager.activate( - // (this.list.getNode - // ? this.list.getNode() - // : this.list - // ).getScrollableNode() - // ); - // } - // }); - - // const keyboardWillHide = e => { - // if (ACTScrollViewManager) { - // ACTScrollViewManager.setFocused(-1); - // } - // this.onEditCategory(null); - // }; - - // let keyListener = Keyboard.addListener( - // Platform.OS === 'ios' ? 'keyboardWillHide' : 'keyboardDidHide', - // keyboardWillHide - // ); - - // let emitter = this.context; - // emitter.on('done', this.onKeyboardDone); - // emitter.on('moveUp', this.onMoveUp); - // emitter.on('moveDown', this.onMoveDown); +export function BudgetTable(props) { + const [editingCategory, setEditingCategory] = useState(null); - // this.cleanup = () => { - // // removeFocus(); - // // keyListener.remove(); - - // emitter.off('done', this.onKeyboardDone); - // emitter.off('moveUp', this.onMoveUp); - // emitter.off('moveDown', this.onMoveDown); - // }; - // } - - // componentWillUnmount() { - // this.cleanup(); - // } - - onEditCategory = id => { - this.setState({ editingCategory: id }); - }; - - // onKeyboardDone = () => { - // Keyboard.dismiss(); - - // onMoveUp = () => { - // const { categories } = this.props; - // const { editingCategory } = this.state; - // const expenseCategories = categories.filter(cat => !cat.is_income); - - // const idx = expenseCategories.findIndex(cat => editingCategory === cat.id); - // if (idx - 1 >= 0) { - // this.onEditCategory(expenseCategories[idx - 1].id); - // } - // }; + function onEditCategory(id) { + setEditingCategory(id); + } - // onMoveDown = () => { - // const { categories } = this.props; - // const { editingCategory } = this.state; - // const expenseCategories = categories.filter(cat => !cat.is_income); + const { + type, + categoryGroups, + month, + monthBounds, + editMode, + // refreshControl, + onPrevMonth, + onNextMonth, + onAddCategory, + onEditMode, + onReorderCategory, + onReorderGroup, + onShowBudgetDetails, + onOpenActionSheet, + onBudgetAction, + } = props; - // const idx = expenseCategories.findIndex(cat => editingCategory === cat.id); - // if (idx + 1 < expenseCategories.length) { - // this.onEditCategory(expenseCategories[idx + 1].id); - // } - // }; + // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now + let currentMonth = monthUtils.currentMonth(); + let format = useFormat(); - render() { - const { - type, - categoryGroups, - month, - monthBounds, - editMode, - // refreshControl, - onPrevMonth, - onNextMonth, - onAddCategory, - onReorderCategory, - onReorderGroup, - onShowBudgetDetails, - onOpenActionSheet, - onBudgetAction, - } = this.props; - // let editMode = false; // neuter editMode -- sorry, not rewriting drag-n-drop right now - let { editingCategory } = this.state; - let currentMonth = monthUtils.currentMonth(); - - return ( - <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}> + return ( + <NamespaceContext.Provider value={monthUtils.sheetForMonth(month, type)}> + <View style={{ flex: 1, overflowY: 'hidden' }} data-testid="budget-table"> + <BudgetHeader + currentMonth={month} + monthBounds={monthBounds} + editMode={editMode} + onDone={() => onEditMode(false)} + onOpenActionSheet={onOpenActionSheet} + onPrevMonth={onPrevMonth} + onNextMonth={onNextMonth} + /> <View - style={{ flex: 1, overflowY: 'hidden' }} - data-testid="budget-table" + style={{ + flexDirection: 'row', + flex: '0 0 auto', + padding: 10, + paddingRight: 14, + backgroundColor: 'white', + borderBottomWidth: 1, + borderColor: colors.n9, + }} > - <BudgetHeader - currentMonth={month} - monthBounds={monthBounds} - editMode={editMode} - onDone={() => this.props.onEditMode(false)} - onOpenActionSheet={onOpenActionSheet} - onPrevMonth={onPrevMonth} - onNextMonth={onNextMonth} - /> + {type === 'report' ? ( + <Saved projected={month >= currentMonth} /> + ) : ( + <ToBudget + toBudget={rolloverBudget.toBudget} + onClick={onShowBudgetDetails} + /> + )} + <View style={{ flex: 1 }} /> + + <View style={{ width: 90, justifyContent: 'center' }}> + <Label title="BUDGETED" style={{ color: colors.n1 }} /> + <CellValue + binding={reportBudget.totalBudgetedExpense} + type="financial" + style={[ + styles.smallText, + { color: colors.n1, textAlign: 'right', fontWeight: '500' }, + ]} + formatter={value => { + return format(-parseFloat(value || '0'), 'financial'); + }} + /> + </View> <View style={{ - flexDirection: 'row', - flex: '0 0 auto', - padding: 10, - paddingRight: 14, - backgroundColor: 'white', - borderBottomWidth: 1, - borderColor: colors.n9, + width: 90, + justifyContent: 'center', }} > - {type === 'report' ? ( - <Saved projected={month >= currentMonth} /> - ) : ( - <ToBudget - toBudget={rolloverBudget.toBudget} - onClick={onShowBudgetDetails} - /> - )} - <View style={{ flex: 1 }} /> - - <View style={{ width: 90, justifyContent: 'center' }}> - <Label title="BUDGETED" style={{ color: colors.n1 }} /> - <CellValue - binding={reportBudget.totalBudgetedExpense} - type="financial" - style={[ - styles.smallText, - { color: colors.n1, textAlign: 'right', fontWeight: '500' }, - ]} - formatter={value => { - return format(-parseFloat(value || '0'), 'financial'); - }} - /> - </View> - <View - style={{ - width: 90, - justifyContent: 'center', - }} - > - <Label title="BALANCE" style={{ color: colors.n1 }} /> - <CellValue - binding={rolloverBudget.totalBalance} - type="financial" - style={[ - styles.smallText, - { color: colors.n1, textAlign: 'right', fontWeight: '500' }, - ]} - /> - </View> + <Label title="BALANCE" style={{ color: colors.n1 }} /> + <CellValue + binding={rolloverBudget.totalBalance} + type="financial" + style={[ + styles.smallText, + { color: colors.n1, textAlign: 'right', fontWeight: '500' }, + ]} + /> </View> + </View> - {/* <AndroidKeyboardAvoidingView includeStatusBar={true}> */} - <View style={{ overflowY: 'auto' }}> - {!editMode ? ( - // <ScrollView - // ref={el => (this.list = el)} - // keyboardShouldPersistTaps="always" - // refreshControl={refreshControl} - // style={{ backgroundColor: colors.n10 }} - // automaticallyAdjustContentInsets={false} - // > + <View style={{ overflowY: 'auto' }}> + {!editMode ? ( + // <ScrollView + // ref={el => (this.list = el)} + // keyboardShouldPersistTaps="always" + // refreshControl={refreshControl} + // style={{ backgroundColor: colors.n10 }} + // automaticallyAdjustContentInsets={false} + // > + <View> + <BudgetGroups + type={type} + categoryGroups={categoryGroups} + editingId={editingCategory} + editMode={editMode} + // gestures={gestures} + month={month} + onEditCategory={onEditCategory} + onAddCategory={onAddCategory} + onReorderCategory={onReorderCategory} + onReorderGroup={onReorderGroup} + onBudgetAction={onBudgetAction} + /> + </View> + ) : ( + // </ScrollView> + // <DragDrop> + // {({ + // dragging, + // onGestureEvent, + // onHandlerStateChange, + // scrollRef, + // onScroll + // }) => ( + <> <View> <BudgetGroups - type={type} categoryGroups={categoryGroups} editingId={editingCategory} editMode={editMode} - gestures={this.gestures} - month={month} - onEditCategory={this.onEditCategory} + // gestures={gestures} + onEditCategory={() => {}} //onEditCategory} onAddCategory={onAddCategory} onReorderCategory={onReorderCategory} onReorderGroup={onReorderGroup} - onBudgetAction={onBudgetAction} /> </View> - ) : ( - // </ScrollView> - // <DragDrop> - // {({ - // dragging, - // onGestureEvent, - // onHandlerStateChange, - // scrollRef, - // onScroll - // }) => ( - <> - <View> - <BudgetGroups - categoryGroups={categoryGroups} - editingId={editingCategory} - editMode={editMode} - gestures={this.gestures} - onEditCategory={() => {}} //this.onEditCategory} - onAddCategory={onAddCategory} - onReorderCategory={onReorderCategory} - onReorderGroup={onReorderGroup} - /> - </View> - - {/* <DragDropHighlight /> */} - </> - // )} - // </DragDrop> - )} - </View> - {/* </AndroidKeyboardAvoidingView> */} + + {/* <DragDropHighlight /> */} + </> + // )} + // </DragDrop> + )} </View> - </NamespaceContext.Provider> - ); - } + </View> + </NamespaceContext.Provider> + ); } function BudgetHeader({ diff --git a/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx index 6bf2f341eb4a37b517b5e3779ed5ddef816ee62f..3181b0101101e615c1722d97cf4ce05e6e589dd0 100644 --- a/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx +++ b/packages/desktop-client/src/components/budget/report/BudgetSummary.tsx @@ -26,8 +26,8 @@ import View from '../../common/View'; import NotesButton from '../../NotesButton'; import PrivacyFilter from '../../PrivacyFilter'; import CellValue from '../../spreadsheet/CellValue'; -import format from '../../spreadsheet/format'; import NamespaceContext from '../../spreadsheet/NamespaceContext'; +import useFormat from '../../spreadsheet/useFormat'; import useSheetValue from '../../spreadsheet/useSheetValue'; import { Tooltip } from '../../tooltips'; import { MONTH_BOX_SHADOW } from '../constants'; @@ -226,6 +226,7 @@ type SavedProps = { function Saved({ projected, style }: SavedProps) { let budgetedSaved = useSheetValue(reportBudget.totalBudgetedSaved) || 0; let totalSaved = useSheetValue(reportBudget.totalSaved) || 0; + let format = useFormat(); let saved = projected ? budgetedSaved : totalSaved; let isNegative = saved < 0; diff --git a/packages/desktop-client/src/components/budget/report/components.tsx b/packages/desktop-client/src/components/budget/report/components.tsx index 3c66b7802c6990f3ff8b50b829308b3f693dfc83..39e3161a8d99425a081e8834d0eea3d5320b360d 100644 --- a/packages/desktop-client/src/components/budget/report/components.tsx +++ b/packages/desktop-client/src/components/budget/report/components.tsx @@ -12,7 +12,7 @@ import Menu from '../../common/Menu'; import Text from '../../common/Text'; import View from '../../common/View'; import CellValue from '../../spreadsheet/CellValue'; -import format from '../../spreadsheet/format'; +import useFormat from '../../spreadsheet/useFormat'; import useSheetValue from '../../spreadsheet/useSheetValue'; import { Field, SheetCell } from '../../table'; import { Tooltip, useTooltip } from '../../tooltips'; @@ -25,6 +25,7 @@ export { BudgetSummary } from './BudgetSummary'; let headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' }; export const BudgetTotalsMonth = memo(function BudgetTotalsMonth() { + const format = useFormat(); return ( <View style={{ diff --git a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx index c67b4fa8ebc94891bad66f8305841d41fc8a5ed4..e2a7e796d72fa0229c70b11f60b54243b9c6e28c 100644 --- a/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx +++ b/packages/desktop-client/src/components/budget/rollover/BudgetSummary.tsx @@ -18,8 +18,8 @@ import View from '../../common/View'; import NotesButton from '../../NotesButton'; import PrivacyFilter from '../../PrivacyFilter'; import CellValue from '../../spreadsheet/CellValue'; -import format from '../../spreadsheet/format'; import NamespaceContext from '../../spreadsheet/NamespaceContext'; +import useFormat from '../../spreadsheet/useFormat'; import useSheetName from '../../spreadsheet/useSheetName'; import useSheetValue from '../../spreadsheet/useSheetValue'; import { Tooltip } from '../../tooltips'; @@ -34,6 +34,7 @@ type TotalsListProps = { collapsed?: boolean; }; function TotalsList({ prevMonthName, collapsed }: TotalsListProps) { + const format = useFormat(); return ( <View style={[ @@ -160,6 +161,7 @@ function ToBudget({ name: rolloverBudget.toBudget, value: 0, }); + let format = useFormat(); let availableValue = parseInt(sheetValue); let num = isNaN(availableValue) ? 0 : availableValue; let isNegative = num < 0; diff --git a/packages/desktop-client/src/components/budget/rollover/rollover-components.tsx b/packages/desktop-client/src/components/budget/rollover/rollover-components.tsx index fb824c13cb6c819cb63c7fc6fa7db92f81c750dc..5818259475870bc03ac8b7966cfd642a0a7f1d62 100644 --- a/packages/desktop-client/src/components/budget/rollover/rollover-components.tsx +++ b/packages/desktop-client/src/components/budget/rollover/rollover-components.tsx @@ -14,7 +14,7 @@ import Menu from '../../common/Menu'; import Text from '../../common/Text'; import View from '../../common/View'; import CellValue from '../../spreadsheet/CellValue'; -import format from '../../spreadsheet/format'; +import useFormat from '../../spreadsheet/useFormat'; import useSheetValue from '../../spreadsheet/useSheetValue'; import { Row, Field, SheetCell } from '../../table'; import { Tooltip, useTooltip } from '../../tooltips'; @@ -190,6 +190,7 @@ function BalanceTooltip({ let headerLabelStyle = { flex: 1, padding: '0 5px', textAlign: 'right' }; export const BudgetTotalsMonth = memo(function BudgetTotalsMonth() { + const format = useFormat(); return ( <View style={{ diff --git a/packages/desktop-client/src/components/modals/BudgetSummary.js b/packages/desktop-client/src/components/modals/BudgetSummary.js index 80d7c4fb459c5384fe4155f295fab17a11e81f4f..8491e3efdff90d19a2a53445d3e391a995492a38 100644 --- a/packages/desktop-client/src/components/modals/BudgetSummary.js +++ b/packages/desktop-client/src/components/modals/BudgetSummary.js @@ -9,12 +9,13 @@ import Modal from '../common/Modal'; import Text from '../common/Text'; import View from '../common/View'; import CellValue from '../spreadsheet/CellValue'; -import format from '../spreadsheet/format'; import NamespaceContext from '../spreadsheet/NamespaceContext'; +import useFormat from '../spreadsheet/useFormat'; import useSheetValue from '../spreadsheet/useSheetValue'; function ToBudget({ toBudget }) { let budgetAmount = useSheetValue(toBudget); + let format = useFormat(); return ( <View style={{ alignItems: 'center', marginBottom: 15 }}> <Text style={styles.text}> diff --git a/packages/desktop-client/src/components/spreadsheet/CellValue.tsx b/packages/desktop-client/src/components/spreadsheet/CellValue.tsx index 13a921f0a299d077847ad32a080a0f7a63b5e1a7..5a667e2d11e2451c683455ef04e8e857a500e77a 100644 --- a/packages/desktop-client/src/components/spreadsheet/CellValue.tsx +++ b/packages/desktop-client/src/components/spreadsheet/CellValue.tsx @@ -9,7 +9,7 @@ import { type ConditionalPrivacyFilterProps, } from '../PrivacyFilter'; -import { useFormat } from './format'; +import useFormat from './useFormat'; import useSheetName from './useSheetName'; import useSheetValue from './useSheetValue'; diff --git a/packages/desktop-client/src/components/spreadsheet/format.ts b/packages/desktop-client/src/components/spreadsheet/useFormat.ts similarity index 91% rename from packages/desktop-client/src/components/spreadsheet/format.ts rename to packages/desktop-client/src/components/spreadsheet/useFormat.ts index 0ec8fa4dedc3cc159d0f92413c43d81cd9278f79..b99667e5d67f310016954e2955b3d0471c9f5210 100644 --- a/packages/desktop-client/src/components/spreadsheet/format.ts +++ b/packages/desktop-client/src/components/spreadsheet/useFormat.ts @@ -4,10 +4,7 @@ import { useSelector } from 'react-redux'; import { selectNumberFormat } from 'loot-core/src/client/selectors'; import { integerToCurrency } from 'loot-core/src/shared/util'; -/** - * @deprecated Please do not use this directly. Use `useFormat` hook - */ -export default function format( +function format( value: unknown, type = 'string', formatter?: Intl.NumberFormat, @@ -48,7 +45,7 @@ export default function format( } } -export function useFormat() { +export default function useFormat() { const numberFormat = useSelector(selectNumberFormat); return useCallback( diff --git a/packages/desktop-client/src/components/table.tsx b/packages/desktop-client/src/components/table.tsx index cfc1b64b23d9043f3bd8e16dd8e146612c51617e..f9d84a59da28168e20cb3de7380d5906a505a7cf 100644 --- a/packages/desktop-client/src/components/table.tsx +++ b/packages/desktop-client/src/components/table.tsx @@ -41,7 +41,7 @@ import { type ConditionalPrivacyFilterProps, } from './PrivacyFilter'; import { type Binding } from './spreadsheet'; -import format from './spreadsheet/format'; +import useFormat from './spreadsheet/useFormat'; import useSheetValue from './spreadsheet/useSheetValue'; import { Tooltip, IntersectionBoundary } from './tooltips'; @@ -702,6 +702,7 @@ export function SheetCell({ inputProps.onBlur(e); } }); + let format = useFormat(); return ( <Cell diff --git a/upcoming-release-notes/1630.md b/upcoming-release-notes/1630.md new file mode 100644 index 0000000000000000000000000000000000000000..a9db734111de4eab31949da4079d0f0e0162bdf0 --- /dev/null +++ b/upcoming-release-notes/1630.md @@ -0,0 +1,6 @@ +--- +category: Maintenance +authors: [joel-jeremy] +--- + +Replace usage of format with useFormat hook