diff --git a/packages/loot-design/src/components/budget/index.js b/packages/loot-design/src/components/budget/index.js index 27b726422ef14b37d48f664bd1c5a4e49748568a..21c2297ffa4e0a95cf0a8813a6856230e7839d08 100644 --- a/packages/loot-design/src/components/budget/index.js +++ b/packages/loot-design/src/components/budget/index.js @@ -1,7 +1,5 @@ import React, { useContext, useState, useMemo } from 'react'; -import { scope } from '@jlongster/lively'; - import * as monthUtils from 'loot-core/src/shared/months'; import { styles, colors } from '../../style'; @@ -1243,182 +1241,159 @@ export const BudgetPageHeader = React.memo( }, ); -export const MonthPicker = scope(lively => { - function getRangeForYear(year) { - return monthUtils.rangeInclusive( - monthUtils.getYearStart(year), - monthUtils.getYearEnd(year), - ); - } - - function getMonth(year, idx) { - return monthUtils.addMonths(year, idx); - } - - function getCurrentMonthName(startMonth, currentMonth) { - return monthUtils.getYear(startMonth) === monthUtils.getYear(currentMonth) - ? monthUtils.format(currentMonth, 'MMM') - : null; - } - - function getInitialState({ props: { startMonth, monthBounds } }) { - const currentMonth = monthUtils.currentMonth(); - const range = getRangeForYear(currentMonth); - const monthNames = range.map(month => { - return monthUtils.format(month, 'MMM'); - }); +function getRangeForYear(year) { + return monthUtils.rangeInclusive( + monthUtils.getYearStart(year), + monthUtils.getYearEnd(year), + ); +} - return { - monthNames, - currentMonthName: getCurrentMonthName(startMonth, currentMonth), - }; - } +function getMonth(year, idx) { + return monthUtils.addMonths(year, idx); +} - function componentWillReceiveProps({ props }, nextProps) { - if ( - monthUtils.getYear(props.startMonth) !== - monthUtils.getYear(nextProps.startMonth) - ) { - return { - currentMonthName: getCurrentMonthName( - nextProps.startMonth, - monthUtils.currentMonth(), - ), - }; - } - } +function getCurrentMonthName(startMonth, currentMonth) { + return monthUtils.getYear(startMonth) === monthUtils.getYear(currentMonth) + ? monthUtils.format(currentMonth, 'MMM') + : null; +} - function MonthPicker({ - state: { monthNames, currentMonthName }, - props: { startMonth, numDisplayed, monthBounds, style, onSelect }, - }) { - const year = monthUtils.getYear(startMonth); - const selectedIndex = monthUtils.getMonthIndex(startMonth); +export const MonthPicker = ({ + startMonth, + numDisplayed, + monthBounds, + style, + onSelect, +}) => { + const currentMonth = monthUtils.currentMonth(); + const range = getRangeForYear(currentMonth); + const monthNames = range.map(month => { + return monthUtils.format(month, 'MMM'); + }); + const currentMonthName = getCurrentMonthName(startMonth, currentMonth); + const year = monthUtils.getYear(startMonth); + const selectedIndex = monthUtils.getMonthIndex(startMonth); - return ( + return ( + <View + style={[ + { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + }, + style, + ]} + > <View - style={[ - { - flexDirection: 'row', - alignItems: 'center', - justifyContent: 'space-between', - }, - style, + style={{ + padding: '3px 0px', + margin: '3px 0', + fontWeight: 'bold', + fontSize: 14, + flex: '0 0 40px', + }} + > + {monthUtils.format(year, 'yyyy')} + </View> + <ElementQuery + sizes={[ + { width: 320, size: 'small' }, + { width: 400, size: 'medium' }, + { size: 'big' }, ]} > - <View - style={{ - padding: '3px 0px', - margin: '3px 0', - fontWeight: 'bold', - fontSize: 14, - flex: '0 0 40px', - }} - > - {monthUtils.format(year, 'yyyy')} - </View> - <ElementQuery - sizes={[ - { width: 320, size: 'small' }, - { width: 400, size: 'medium' }, - { size: 'big' }, - ]} - > - {(matched, ref) => ( - <View - innerRef={ref} - style={{ - flexDirection: 'row', - flex: 1, - alignItems: 'center', - justifyContent: 'center', - }} - > - {monthNames.map((monthName, idx) => { - const lastSelectedIndex = selectedIndex + numDisplayed; - const selected = - idx >= selectedIndex && idx < lastSelectedIndex; - const current = monthName === currentMonthName; - const month = getMonth(year, idx); - const isMonthBudgeted = - month >= monthBounds.start && month <= monthBounds.end; - - return ( - <View - key={monthName} - style={[ - { - marginRight: 1, - padding: - matched && matched.size === 'big' - ? '3px 5px' - : '3px 3px', - textAlign: 'center', - cursor: 'default', - borderRadius: 2, - ':hover': isMonthBudgeted && { - backgroundColor: colors.p6, - color: 'white', - }, - }, - !isMonthBudgeted && { color: colors.n7 }, - styles.smallText, - selected && { + {(matched, ref) => ( + <View + innerRef={ref} + style={{ + flexDirection: 'row', + flex: 1, + alignItems: 'center', + justifyContent: 'center', + }} + > + {monthNames.map((monthName, idx) => { + const lastSelectedIndex = selectedIndex + numDisplayed; + const selected = idx >= selectedIndex && idx < lastSelectedIndex; + const current = monthName === currentMonthName; + const month = getMonth(year, idx); + const isMonthBudgeted = + month >= monthBounds.start && month <= monthBounds.end; + + return ( + <View + key={monthName} + style={[ + { + marginRight: 1, + padding: + matched && matched.size === 'big' + ? '3px 5px' + : '3px 3px', + textAlign: 'center', + cursor: 'default', + borderRadius: 2, + ':hover': isMonthBudgeted && { backgroundColor: colors.p6, color: 'white', - borderRadius: 0, }, - idx === selectedIndex && { - borderTopLeftRadius: 2, - borderBottomLeftRadius: 2, + }, + !isMonthBudgeted && { color: colors.n7 }, + styles.smallText, + selected && { + backgroundColor: colors.p6, + color: 'white', + borderRadius: 0, + }, + idx === selectedIndex && { + borderTopLeftRadius: 2, + borderBottomLeftRadius: 2, + }, + idx === lastSelectedIndex - 1 && { + borderTopRightRadius: 2, + borderBottomRightRadius: 2, + }, + idx >= selectedIndex && + idx < lastSelectedIndex - 1 && { + marginRight: 0, + borderRight: 'solid 1px', + borderColor: colors.p6, }, - idx === lastSelectedIndex - 1 && { - borderTopRightRadius: 2, - borderBottomRightRadius: 2, - }, - idx >= selectedIndex && - idx < lastSelectedIndex - 1 && { - marginRight: 0, - borderRight: 'solid 1px', - borderColor: colors.p6, - }, - current && { textDecoration: 'underline' }, - ]} - onClick={() => onSelect(month)} - > - {matched && matched.size === 'small' - ? monthName[0] - : monthName} - </View> - ); - })} - </View> - )} - </ElementQuery> - <View - style={{ - flexDirection: 'row', - alignItems: 'center', - flex: '0 0 50px', - justifyContent: 'flex-end', - }} + current && { textDecoration: 'underline' }, + ]} + onClick={() => onSelect(month)} + > + {matched && matched.size === 'small' + ? monthName[0] + : monthName} + </View> + ); + })} + </View> + )} + </ElementQuery> + <View + style={{ + flexDirection: 'row', + alignItems: 'center', + flex: '0 0 50px', + justifyContent: 'flex-end', + }} + > + <Button + onClick={() => onSelect(monthUtils.subMonths(startMonth, 1))} + bare > - <Button - onClick={() => onSelect(monthUtils.subMonths(startMonth, 1))} - bare - > - <ArrowThinLeft width={12} height={12} /> - </Button> - <Button - onClick={() => onSelect(monthUtils.addMonths(startMonth, 1))} - bare - > - <ArrowThinRight width={12} height={12} /> - </Button> - </View> + <ArrowThinLeft width={12} height={12} /> + </Button> + <Button + onClick={() => onSelect(monthUtils.addMonths(startMonth, 1))} + bare + > + <ArrowThinRight width={12} height={12} /> + </Button> </View> - ); - } - - return lively(MonthPicker, { getInitialState, componentWillReceiveProps }); -}); + </View> + ); +};