From 5e9b97667609f160a1e8373d00b5424632db443a Mon Sep 17 00:00:00 2001
From: Joel Jeremy Marquez <joeljeremy.marquez@gmail.com>
Date: Mon, 5 Aug 2024 19:45:30 -0700
Subject: [PATCH] [React Aria Button] - Migrate desktop and mobile budget page
 buttons (#3156)

* More components to use react aria Button

* Release notes

* vrt

* Fix typecheck error

* Fix account menu test

* Fix typecheck error

* Fix typecheck error

* Remove unnecessary aria-labels

* Fix payee icons and category notes

* vrt

* vrt

* Fix notes button

* Fix typecheck error

* Fix lint error

* VRT

* Remove default :focus on Button2

* Add Button2 defaultClassName

* Update className

* Fix typecheck error

* Cleanup

* VRT

* Fix typecheck error

* Fix typecheck error

* Fix typecheck error

* react-aria Button for budget pages

* Release notes
---
 .../src/components/budget/BudgetTotals.tsx    |   8 +-
 .../src/components/budget/IncomeHeader.tsx    |   4 +-
 .../src/components/budget/SidebarCategory.tsx |  10 +-
 .../src/components/budget/SidebarGroup.tsx    |   9 +-
 .../budget/report/ReportComponents.tsx        |   9 +-
 .../report/budgetsummary/BudgetSummary.tsx    |  10 +-
 .../components/budget/rollover/CoverMenu.tsx  |   6 +-
 .../components/budget/rollover/HoldMenu.tsx   |   6 +-
 .../budget/rollover/RolloverComponents.tsx    |   9 +-
 .../budget/rollover/TransferMenu.tsx          |   6 +-
 .../rollover/budgetsummary/BudgetSummary.tsx  |  10 +-
 .../components/mobile/budget/BudgetTable.jsx  | 170 +++++++-----------
 upcoming-release-notes/3156.md                |   6 +
 13 files changed, 109 insertions(+), 154 deletions(-)
 create mode 100644 upcoming-release-notes/3156.md

diff --git a/packages/desktop-client/src/components/budget/BudgetTotals.tsx b/packages/desktop-client/src/components/budget/BudgetTotals.tsx
index 7126ff4d6..65c2dff9a 100644
--- a/packages/desktop-client/src/components/budget/BudgetTotals.tsx
+++ b/packages/desktop-client/src/components/budget/BudgetTotals.tsx
@@ -2,7 +2,7 @@ import React, { type ComponentProps, memo, useRef, useState } from 'react';
 
 import { SvgDotsHorizontalTriple } from '../../icons/v1';
 import { theme, styles } from '../../style';
-import { Button } from '../common/Button';
+import { Button } from '../common/Button2';
 import { Menu } from '../common/Menu';
 import { Popover } from '../common/Popover';
 import { View } from '../common/View';
@@ -57,11 +57,9 @@ export const BudgetTotals = memo(function BudgetTotals({
         <View style={{ flexGrow: '1' }}>Category</View>
         <Button
           ref={triggerRef}
-          type="bare"
+          variant="bare"
           aria-label="Menu"
-          onClick={() => {
-            setMenuOpen(true);
-          }}
+          onPress={() => setMenuOpen(true)}
           style={{ color: 'currentColor', padding: 3 }}
         >
           <SvgDotsHorizontalTriple
diff --git a/packages/desktop-client/src/components/budget/IncomeHeader.tsx b/packages/desktop-client/src/components/budget/IncomeHeader.tsx
index 344a3f9d9..ad9fbda82 100644
--- a/packages/desktop-client/src/components/budget/IncomeHeader.tsx
+++ b/packages/desktop-client/src/components/budget/IncomeHeader.tsx
@@ -1,6 +1,6 @@
 import React from 'react';
 
-import { Button } from '../common/Button';
+import { Button } from '../common/Button2';
 import { View } from '../common/View';
 
 import { RenderMonths } from './RenderMonths';
@@ -23,7 +23,7 @@ export function IncomeHeader({
           justifyContent: 'flex-start',
         }}
       >
-        <Button onClick={onShowNewGroup} style={{ fontSize: 12, margin: 10 }}>
+        <Button onPress={onShowNewGroup} style={{ fontSize: 12, margin: 10 }}>
           Add Group
         </Button>
       </View>
diff --git a/packages/desktop-client/src/components/budget/SidebarCategory.tsx b/packages/desktop-client/src/components/budget/SidebarCategory.tsx
index 0504c8d03..fb4d860cf 100644
--- a/packages/desktop-client/src/components/budget/SidebarCategory.tsx
+++ b/packages/desktop-client/src/components/budget/SidebarCategory.tsx
@@ -8,7 +8,7 @@ import {
 
 import { SvgCheveronDown } from '../../icons/v1';
 import { theme } from '../../style';
-import { Button } from '../common/Button';
+import { Button } from '../common/Button2';
 import { Menu } from '../common/Menu';
 import { Popover } from '../common/Popover';
 import { View } from '../common/View';
@@ -57,6 +57,7 @@ export function SidebarCategory({
         userSelect: 'none',
         WebkitUserSelect: 'none',
         opacity: category.hidden || categoryGroup?.hidden ? 0.33 : undefined,
+        backgroundColor: 'transparent',
       }}
     >
       <div
@@ -72,13 +73,10 @@ export function SidebarCategory({
       </div>
       <View style={{ flexShrink: 0, marginLeft: 5 }} ref={triggerRef}>
         <Button
-          type="bare"
+          variant="bare"
           className="hover-visible"
-          onClick={e => {
-            e.stopPropagation();
-            setMenuOpen(true);
-          }}
           style={{ color: 'currentColor', padding: 3 }}
+          onPress={() => setMenuOpen(true)}
         >
           <SvgCheveronDown
             width={14}
diff --git a/packages/desktop-client/src/components/budget/SidebarGroup.tsx b/packages/desktop-client/src/components/budget/SidebarGroup.tsx
index c01ef2bc6..417dce8e6 100644
--- a/packages/desktop-client/src/components/budget/SidebarGroup.tsx
+++ b/packages/desktop-client/src/components/budget/SidebarGroup.tsx
@@ -5,7 +5,7 @@ import { type ConnectDragSource } from 'react-dnd';
 import { SvgExpandArrow } from '../../icons/v0';
 import { SvgCheveronDown } from '../../icons/v1';
 import { theme } from '../../style';
-import { Button } from '../common/Button';
+import { Button } from '../common/Button2';
 import { Menu } from '../common/Menu';
 import { Popover } from '../common/Popover';
 import { Text } from '../common/Text';
@@ -94,12 +94,9 @@ export function SidebarGroup({
         <>
           <View style={{ marginLeft: 5, flexShrink: 0 }} ref={triggerRef}>
             <Button
-              type="bare"
+              variant="bare"
               className="hover-visible"
-              onClick={e => {
-                e.stopPropagation();
-                setMenuOpen(true);
-              }}
+              onPress={() => setMenuOpen(true)}
               style={{ padding: 3 }}
             >
               <SvgCheveronDown width={14} height={14} />
diff --git a/packages/desktop-client/src/components/budget/report/ReportComponents.tsx b/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
index 5cd9480f8..02c49d315 100644
--- a/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
+++ b/packages/desktop-client/src/components/budget/report/ReportComponents.tsx
@@ -7,7 +7,7 @@ import { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';
 
 import { SvgCheveronDown } from '../../../icons/v1';
 import { styles, theme, type CSSProperties } from '../../../style';
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { Popover } from '../../common/Popover';
 import { Text } from '../../common/Text';
 import { View } from '../../common/View';
@@ -206,11 +206,8 @@ export const CategoryMonth = memo(function CategoryMonth({
           >
             <Button
               ref={triggerRef}
-              type="bare"
-              onClick={e => {
-                e.stopPropagation();
-                setMenuOpen(true);
-              }}
+              variant="bare"
+              onPress={() => setMenuOpen(true)}
               style={{
                 padding: 3,
               }}
diff --git a/packages/desktop-client/src/components/budget/report/budgetsummary/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/report/budgetsummary/BudgetSummary.tsx
index 990121924..6f524a60e 100644
--- a/packages/desktop-client/src/components/budget/report/budgetsummary/BudgetSummary.tsx
+++ b/packages/desktop-client/src/components/budget/report/budgetsummary/BudgetSummary.tsx
@@ -8,7 +8,7 @@ import * as monthUtils from 'loot-core/src/shared/months';
 import { SvgDotsHorizontalTriple } from '../../../../icons/v1';
 import { SvgArrowButtonDown1, SvgArrowButtonUp1 } from '../../../../icons/v2';
 import { theme, styles } from '../../../../style';
-import { Button } from '../../../common/Button';
+import { Button } from '../../../common/Button2';
 import { Popover } from '../../../common/Popover';
 import { Stack } from '../../../common/Stack';
 import { View } from '../../../common/View';
@@ -84,10 +84,10 @@ export function BudgetSummary({ month }: BudgetSummaryProps) {
             }}
           >
             <Button
-              type="bare"
+              variant="bare"
               aria-label={`${collapsed ? 'Expand' : 'Collapse'} month summary`}
               className="hover-visible"
-              onClick={onToggleSummaryCollapse}
+              onPress={onToggleSummaryCollapse}
             >
               <ExpandOrCollapseIcon
                 width={13}
@@ -133,9 +133,9 @@ export function BudgetSummary({ month }: BudgetSummaryProps) {
             <View style={{ userSelect: 'none' }}>
               <Button
                 ref={triggerRef}
-                type="bare"
+                variant="bare"
                 aria-label="Menu"
-                onClick={onMenuOpen}
+                onPress={onMenuOpen}
               >
                 <SvgDotsHorizontalTriple
                   width={15}
diff --git a/packages/desktop-client/src/components/budget/rollover/CoverMenu.tsx b/packages/desktop-client/src/components/budget/rollover/CoverMenu.tsx
index dd8de39fb..b15a28252 100644
--- a/packages/desktop-client/src/components/budget/rollover/CoverMenu.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/CoverMenu.tsx
@@ -2,7 +2,7 @@ import React, { useState } from 'react';
 
 import { useCategories } from '../../../hooks/useCategories';
 import { CategoryAutocomplete } from '../../autocomplete/CategoryAutocomplete';
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { InitialFocus } from '../../common/InitialFocus';
 import { View } from '../../common/View';
 import { addToBeBudgetedGroup } from '../util';
@@ -61,12 +61,12 @@ export function CoverMenu({
         }}
       >
         <Button
-          type="primary"
+          variant="primary"
           style={{
             fontSize: 12,
             paddingTop: 3,
           }}
-          onClick={submit}
+          onPress={submit}
         >
           Transfer
         </Button>
diff --git a/packages/desktop-client/src/components/budget/rollover/HoldMenu.tsx b/packages/desktop-client/src/components/budget/rollover/HoldMenu.tsx
index c935e7f10..3bf1a79df 100644
--- a/packages/desktop-client/src/components/budget/rollover/HoldMenu.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/HoldMenu.tsx
@@ -9,7 +9,7 @@ import { useSpreadsheet } from 'loot-core/src/client/SpreadsheetProvider';
 import { evalArithmetic } from 'loot-core/src/shared/arithmetic';
 import { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';
 
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { InitialFocus } from '../../common/InitialFocus';
 import { Input } from '../../common/Input';
 import { View } from '../../common/View';
@@ -66,13 +66,13 @@ export function HoldMenu({ onSubmit, onClose }: HoldMenuProps) {
         }}
       >
         <Button
-          type="primary"
+          variant="primary"
           style={{
             fontSize: 12,
             paddingTop: 3,
             paddingBottom: 3,
           }}
-          onClick={() => submit(amount)}
+          onPress={() => submit(amount)}
         >
           Hold
         </Button>
diff --git a/packages/desktop-client/src/components/budget/rollover/RolloverComponents.tsx b/packages/desktop-client/src/components/budget/rollover/RolloverComponents.tsx
index 597e137e9..7cd187d60 100644
--- a/packages/desktop-client/src/components/budget/rollover/RolloverComponents.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/RolloverComponents.tsx
@@ -7,7 +7,7 @@ import { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';
 
 import { SvgCheveronDown } from '../../../icons/v1';
 import { styles, theme, type CSSProperties } from '../../../style';
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { Popover } from '../../common/Popover';
 import { Text } from '../../common/Text';
 import { View } from '../../common/View';
@@ -200,11 +200,8 @@ export const ExpenseCategoryMonth = memo(function ExpenseCategoryMonth({
           >
             <Button
               ref={budgetMenuTriggerRef}
-              type="bare"
-              onClick={e => {
-                e.stopPropagation();
-                setBudgetMenuOpen(true);
-              }}
+              variant="bare"
+              onPress={() => setBudgetMenuOpen(true)}
               style={{
                 padding: 3,
               }}
diff --git a/packages/desktop-client/src/components/budget/rollover/TransferMenu.tsx b/packages/desktop-client/src/components/budget/rollover/TransferMenu.tsx
index 6d0dcf7aa..76df5c655 100644
--- a/packages/desktop-client/src/components/budget/rollover/TransferMenu.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/TransferMenu.tsx
@@ -5,7 +5,7 @@ import { integerToCurrency, amountToInteger } from 'loot-core/src/shared/util';
 
 import { useCategories } from '../../../hooks/useCategories';
 import { CategoryAutocomplete } from '../../autocomplete/CategoryAutocomplete';
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { InitialFocus } from '../../common/InitialFocus';
 import { Input } from '../../common/Input';
 import { View } from '../../common/View';
@@ -79,13 +79,13 @@ export function TransferMenu({
         }}
       >
         <Button
-          type="primary"
+          variant="primary"
           style={{
             fontSize: 12,
             paddingTop: 3,
             paddingBottom: 3,
           }}
-          onClick={() => _onSubmit(amount, categoryId)}
+          onPress={() => _onSubmit(amount, categoryId)}
         >
           Transfer
         </Button>
diff --git a/packages/desktop-client/src/components/budget/rollover/budgetsummary/BudgetSummary.tsx b/packages/desktop-client/src/components/budget/rollover/budgetsummary/BudgetSummary.tsx
index b4d8f704d..0ce4d5c88 100644
--- a/packages/desktop-client/src/components/budget/rollover/budgetsummary/BudgetSummary.tsx
+++ b/packages/desktop-client/src/components/budget/rollover/budgetsummary/BudgetSummary.tsx
@@ -7,7 +7,7 @@ import * as monthUtils from 'loot-core/src/shared/months';
 import { SvgDotsHorizontalTriple } from '../../../../icons/v1';
 import { SvgArrowButtonDown1, SvgArrowButtonUp1 } from '../../../../icons/v2';
 import { theme, styles } from '../../../../style';
-import { Button } from '../../../common/Button';
+import { Button } from '../../../common/Button2';
 import { Popover } from '../../../common/Popover';
 import { View } from '../../../common/View';
 import { NotesButton } from '../../../NotesButton';
@@ -85,10 +85,10 @@ export function BudgetSummary({ month }: BudgetSummaryProps) {
             }}
           >
             <Button
-              type="bare"
+              variant="bare"
               aria-label={`${collapsed ? 'Expand' : 'Collapse'} month summary`}
               className="hover-visible"
-              onClick={onToggleSummaryCollapse}
+              onPress={onToggleSummaryCollapse}
             >
               <ExpandOrCollapseIcon
                 width={13}
@@ -135,9 +135,9 @@ export function BudgetSummary({ month }: BudgetSummaryProps) {
             <View style={{ userSelect: 'none', marginLeft: 2 }}>
               <Button
                 ref={triggerRef}
-                type="bare"
+                variant="bare"
                 aria-label="Menu"
-                onClick={onMenuOpen}
+                onPress={onMenuOpen}
               >
                 <SvgDotsHorizontalTriple
                   width={15}
diff --git a/packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx b/packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx
index 5a520cd7a..3e8d031f9 100644
--- a/packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx
+++ b/packages/desktop-client/src/components/mobile/budget/BudgetTable.jsx
@@ -24,7 +24,7 @@ import { useResponsive } from '../../../ResponsiveProvider';
 import { theme, styles } from '../../../style';
 import { BalanceWithCarryover } from '../../budget/BalanceWithCarryover';
 import { makeAmountGrey, makeBalanceAmountStyle } from '../../budget/util';
-import { Button } from '../../common/Button';
+import { Button } from '../../common/Button2';
 import { Card } from '../../common/Card';
 import { Label } from '../../common/Label';
 import { Text } from '../../common/Text';
@@ -53,7 +53,7 @@ function getColumnWidth({ show3Cols, isSidebar = false, offset = 0 } = {}) {
   return show3Cols ? `${35 + offset}vw` : `${45 + offset}vw`;
 }
 
-function ToBudget({ toBudget, onClick, show3Cols }) {
+function ToBudget({ toBudget, onPress, show3Cols }) {
   const amount = useSheetValue(toBudget);
   const format = useFormat();
   const sidebarColumnWidth = getColumnWidth({ show3Cols, isSidebar: true });
@@ -68,12 +68,9 @@ function ToBudget({ toBudget, onClick, show3Cols }) {
       }}
     >
       <Button
-        type="bare"
+        variant="bare"
         style={{ maxWidth: sidebarColumnWidth }}
-        onPointerUp={e => {
-          e.stopPropagation();
-          onClick?.();
-        }}
+        onPress={onPress}
       >
         <View>
           <Label
@@ -121,7 +118,7 @@ function ToBudget({ toBudget, onClick, show3Cols }) {
   );
 }
 
-function Saved({ projected, onClick, show3Cols }) {
+function Saved({ projected, onPress, show3Cols }) {
   const binding = projected
     ? reportBudget.totalBudgetedSaved
     : reportBudget.totalSaved;
@@ -141,12 +138,9 @@ function Saved({ projected, onClick, show3Cols }) {
       }}
     >
       <Button
-        type="bare"
+        variant="bare"
         style={{ maxWidth: sidebarColumnWidth }}
-        onPointerUp={e => {
-          e.stopPropagation();
-          onClick?.();
-        }}
+        onPress={onPress}
       >
         <View>
           <View>
@@ -448,14 +442,11 @@ const ExpenseCategory = memo(function ExpenseCategory({
         }}
       >
         <Button
-          type="bare"
+          variant="bare"
           style={{
             maxWidth: sidebarColumnWidth,
           }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onEdit?.(category.id);
-          }}
+          onPress={() => onEdit?.(category.id)}
         >
           <View
             style={{
@@ -507,7 +498,7 @@ const ExpenseCategory = memo(function ExpenseCategory({
             onBudgetAction={onBudgetAction}
             formatter={value => (
               <Button
-                type="bare"
+                variant="bare"
                 style={{
                   ...PILL_STYLE,
                   maxWidth: columnWidth,
@@ -550,7 +541,7 @@ const ExpenseCategory = memo(function ExpenseCategory({
             }}
             formatter={value => (
               <Button
-                type="bare"
+                variant="bare"
                 style={{
                   ...PILL_STYLE,
                   maxWidth: columnWidth,
@@ -597,7 +588,7 @@ const ExpenseCategory = memo(function ExpenseCategory({
               longGoal={longGoal}
               formatter={value => (
                 <Button
-                  type="bare"
+                  variant="bare"
                   style={{
                     ...PILL_STYLE,
                     maxWidth: columnWidth,
@@ -727,22 +718,16 @@ const ExpenseGroupHeader = memo(function ExpenseGroupHeader({
         }}
       >
         <Button
-          type="bare"
-          style={{
+          variant="bare"
+          style={({ isPressed, isHovered }) => ({
             flexShrink: 0,
             color: theme.pageTextSubdued,
             ...styles.noTapHighlight,
-          }}
-          activeStyle={{
-            backgroundColor: 'transparent',
-          }}
-          hoveredStyle={{
-            backgroundColor: 'transparent',
-          }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onToggleCollapse?.(group.id);
-          }}
+            ...(isPressed || isHovered
+              ? { backgroundColor: 'transparent' }
+              : {}),
+          })}
+          onPress={() => onToggleCollapse?.(group.id)}
         >
           <SvgExpandArrow
             width={8}
@@ -755,14 +740,11 @@ const ExpenseGroupHeader = memo(function ExpenseGroupHeader({
           />
         </Button>
         <Button
-          type="bare"
+          variant="bare"
           style={{
             maxWidth: sidebarColumnWidth,
           }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onEdit?.(group.id);
-          }}
+          onPress={() => onEdit?.(group.id)}
         >
           <View
             style={{
@@ -960,22 +942,16 @@ const IncomeGroupHeader = memo(function IncomeGroupHeader({
         }}
       >
         <Button
-          type="bare"
-          style={{
+          variant="bare"
+          style={({ isPressed, isHovered }) => ({
             flexShrink: 0,
             color: theme.pageTextSubdued,
             ...styles.noTapHighlight,
-          }}
-          activeStyle={{
-            backgroundColor: 'transparent',
-          }}
-          hoveredStyle={{
-            backgroundColor: 'transparent',
-          }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onToggleCollapse?.(group.id);
-          }}
+            ...(isPressed || isHovered
+              ? { backgroundColor: 'transparent' }
+              : {}),
+          })}
+          onPress={() => onToggleCollapse?.(group.id)}
         >
           <SvgExpandArrow
             width={8}
@@ -988,14 +964,11 @@ const IncomeGroupHeader = memo(function IncomeGroupHeader({
           />
         </Button>
         <Button
-          type="bare"
+          variant="bare"
           style={{
             maxWidth: sidebarColumnWidth,
           }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onEdit?.(group.id);
-          }}
+          onPress={() => onEdit?.(group.id)}
         >
           <View
             style={{
@@ -1137,14 +1110,11 @@ const IncomeCategory = memo(function IncomeCategory({
         }}
       >
         <Button
-          type="bare"
+          variant="bare"
           style={{
             maxWidth: sidebarColumnWidth,
           }}
-          onPointerUp={e => {
-            e.stopPropagation();
-            onEdit?.(category.id);
-          }}
+          onPress={() => onEdit?.(category.id)}
         >
           <View
             style={{
@@ -1195,7 +1165,7 @@ const IncomeCategory = memo(function IncomeCategory({
               onBudgetAction={onBudgetAction}
               formatter={value => (
                 <Button
-                  type="bare"
+                  variant="bare"
                   style={{ ...PILL_STYLE, maxWidth: columnWidth }}
                 >
                   <AutoTextSize
@@ -1669,17 +1639,13 @@ export function BudgetTable({
           }
           leftContent={
             <Button
-              type="bare"
-              style={{
+              variant="bare"
+              style={({ isPressed, isHovered }) => ({
                 color: theme.mobileHeaderText,
                 margin: 10,
-              }}
-              hoveredStyle={noBackgroundColorStyle}
-              activeStyle={noBackgroundColorStyle}
-              onPointerUp={e => {
-                e.stopPropagation();
-                onOpenBudgetPageMenu?.();
-              }}
+                ...(isPressed || isHovered ? noBackgroundColorStyle : {}),
+              })}
+              onPress={onOpenBudgetPageMenu}
             >
               <SvgLogo width="20" height="20" />
               <SvgCheveronRight
@@ -1775,13 +1741,13 @@ function BudgetTableHeader({
         {type === 'report' ? (
           <Saved
             projected={month >= monthUtils.currentMonth()}
-            onClick={onShowBudgetSummary}
+            onPress={onShowBudgetSummary}
             show3Cols={show3Cols}
           />
         ) : (
           <ToBudget
             toBudget={rolloverBudget.toBudget}
-            onClick={onShowBudgetSummary}
+            onPress={onShowBudgetSummary}
             show3Cols={show3Cols}
           />
         )}
@@ -1801,12 +1767,9 @@ function BudgetTableHeader({
             }}
           >
             <Button
-              type="bare"
-              disabled={show3Cols}
-              onPointerUp={e => {
-                e.stopPropagation();
-                toggleSpentColumn();
-              }}
+              variant="bare"
+              isDisabled={show3Cols}
+              onPress={toggleSpentColumn}
               style={buttonStyle}
             >
               <View style={{ alignItems: 'flex-end' }}>
@@ -1865,12 +1828,9 @@ function BudgetTableHeader({
             }}
           >
             <Button
-              type="bare"
-              disabled={show3Cols}
-              onPointerUp={e => {
-                e.stopPropagation();
-                toggleSpentColumn();
-              }}
+              variant="bare"
+              isDisabled={show3Cols}
+              onPress={toggleSpentColumn()}
               style={buttonStyle}
             >
               <View style={{ alignItems: 'flex-end' }}>
@@ -1983,23 +1943,24 @@ function MonthSelector({
       }}
     >
       <Button
-        type="bare"
-        onPointerUp={e => {
-          e.stopPropagation();
+        variant="bare"
+        onPress={() => {
           if (prevEnabled) {
             onPrevMonth();
           }
         }}
-        style={{
+        style={({ isHovered }) => ({
           ...styles.noTapHighlight,
           ...arrowButtonStyle,
           opacity: prevEnabled ? 1 : 0.6,
           color: theme.mobileHeaderText,
-        }}
-        hoveredStyle={{
-          color: theme.mobileHeaderText,
-          background: theme.mobileHeaderTextHover,
-        }}
+          ...(isHovered
+            ? {
+                color: theme.mobileHeaderText,
+                background: theme.mobileHeaderTextHover,
+              }
+            : {}),
+        })}
       >
         <SvgArrowThinLeft width="15" height="15" style={{ margin: -5 }} />
       </Button>
@@ -2020,23 +1981,24 @@ function MonthSelector({
         {monthUtils.format(month, 'MMMM ‘yy')}
       </Text>
       <Button
-        type="bare"
-        onPointerUp={e => {
-          e.stopPropagation();
+        variant="bare"
+        onPress={() => {
           if (nextEnabled) {
             onNextMonth();
           }
         }}
-        style={{
+        style={({ isHovered }) => ({
           ...styles.noTapHighlight,
           ...arrowButtonStyle,
           opacity: nextEnabled ? 1 : 0.6,
           color: theme.mobileHeaderText,
-        }}
-        hoveredStyle={{
-          color: theme.mobileHeaderText,
-          background: theme.mobileHeaderTextHover,
-        }}
+          ...(isHovered
+            ? {
+                color: theme.mobileHeaderText,
+                background: theme.mobileHeaderTextHover,
+              }
+            : {}),
+        })}
       >
         <SvgArrowThinRight width="15" height="15" style={{ margin: -5 }} />
       </Button>
diff --git a/upcoming-release-notes/3156.md b/upcoming-release-notes/3156.md
new file mode 100644
index 000000000..3d7c88233
--- /dev/null
+++ b/upcoming-release-notes/3156.md
@@ -0,0 +1,6 @@
+---
+category: Maintenance
+authors: [joel-jeremy]
+---
+
+Use new react-aria-components based Button on desktop and mobile budget pages.
-- 
GitLab