Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

♻️ (tooltip) refactoring to react-aria (vol.4) #2724

Merged
merged 11 commits into from
May 15, 2024
4 changes: 2 additions & 2 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,8 @@ module.exports = {
'./packages/desktop-client/src/components/budget/DynamicBudgetTable.tsx',
'./packages/desktop-client/src/components/budget/index.tsx',
'./packages/desktop-client/src/components/budget/MobileBudget.tsx',
'./packages/desktop-client/src/components/budget/rollover/HoldTooltip.tsx',
'./packages/desktop-client/src/components/budget/rollover/TransferTooltip.tsx',
'./packages/desktop-client/src/components/budget/rollover/HoldMenu.tsx',
'./packages/desktop-client/src/components/budget/rollover/TransferMenu.tsx',
'./packages/desktop-client/src/components/common/Menu.tsx',
'./packages/desktop-client/src/components/FinancesApp.tsx',
'./packages/desktop-client/src/components/GlobalKeys.ts',
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
78 changes: 39 additions & 39 deletions packages/desktop-client/src/components/budget/BudgetTotals.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import React, { type ComponentProps, memo, useState } from 'react';
import React, { type ComponentProps, memo, useRef, useState } from 'react';

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Recommendation when reviewing:
Screenshot 2024-05-07 at 17 28 22

import { SvgDotsHorizontalTriple } from '../../icons/v1';
import { theme, styles } from '../../style';
import { Button } from '../common/Button';
import { Menu } from '../common/Menu';
import { Popover } from '../common/Popover';
import { View } from '../common/View';
import { Tooltip } from '../tooltips';

import { RenderMonths } from './RenderMonths';
import { getScrollbarWidth } from './util';
Expand All @@ -24,6 +24,8 @@ export const BudgetTotals = memo(function BudgetTotals({
collapseAllCategories,
}: BudgetTotalsProps) {
const [menuOpen, setMenuOpen] = useState(false);
const triggerRef = useRef(null);

return (
<View
data-testid="budget-totals"
Expand Down Expand Up @@ -54,6 +56,7 @@ export const BudgetTotals = memo(function BudgetTotals({
>
<View style={{ flexGrow: '1' }}>Category</View>
<Button
ref={triggerRef}
type="bare"
aria-label="Menu"
onClick={() => {
Expand All @@ -66,44 +69,41 @@ export const BudgetTotals = memo(function BudgetTotals({
height={15}
style={{ color: theme.pageTextLight }}
/>
{menuOpen && (
<Tooltip
position="bottom-right"
width={200}
style={{ padding: 0 }}
onClose={() => {
setMenuOpen(false);
}}
>
<Menu
onMenuSelect={type => {
if (type === 'toggle-visibility') {
toggleHiddenCategories();
} else if (type === 'expandAllCategories') {
expandAllCategories();
} else if (type === 'collapseAllCategories') {
collapseAllCategories();
}
setMenuOpen(false);
}}
items={[
{
name: 'toggle-visibility',
text: 'Toggle hidden categories',
},
{
name: 'expandAllCategories',
text: 'Expand all',
},
{
name: 'collapseAllCategories',
text: 'Collapse all',
},
]}
/>
</Tooltip>
)}
</Button>

<Popover
triggerRef={triggerRef}
isOpen={menuOpen}
onOpenChange={() => setMenuOpen(false)}
style={{ width: 200 }}
>
<Menu
onMenuSelect={type => {
if (type === 'toggle-visibility') {
toggleHiddenCategories();
} else if (type === 'expandAllCategories') {
expandAllCategories();
} else if (type === 'collapseAllCategories') {
collapseAllCategories();
}
setMenuOpen(false);
}}
items={[
{
name: 'toggle-visibility',
text: 'Toggle hidden categories',
},
{
name: 'expandAllCategories',
text: 'Expand all',
},
{
name: 'collapseAllCategories',
text: 'Collapse all',
},
]}
/>
</Popover>
</View>
<RenderMonths component={MonthComponent} />
</View>
Expand Down
67 changes: 34 additions & 33 deletions packages/desktop-client/src/components/budget/SidebarCategory.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
// @ts-strict-ignore
import React, { type CSSProperties, type Ref, useState } from 'react';
import React, { type CSSProperties, type Ref, useRef, useState } from 'react';

import {
type CategoryGroupEntity,
Expand All @@ -10,10 +10,10 @@ import { SvgCheveronDown } from '../../icons/v1';
import { theme } from '../../style';
import { Button } from '../common/Button';
import { Menu } from '../common/Menu';
import { Popover } from '../common/Popover';
import { View } from '../common/View';
import { NotesButton } from '../NotesButton';
import { InputCell } from '../table';
import { Tooltip } from '../tooltips';

type SidebarCategoryProps = {
innerRef: Ref<HTMLDivElement>;
Expand All @@ -26,7 +26,7 @@ type SidebarCategoryProps = {
borderColor?: string;
isLast?: boolean;
onEditName: (id: string) => void;
onSave: (group) => void;
onSave: (category: CategoryEntity) => void;
onDelete: (id: string) => Promise<void>;
onHideNewCategory?: () => void;
};
Expand All @@ -47,6 +47,7 @@ export function SidebarCategory({
}: SidebarCategoryProps) {
const temporary = category.id === 'new';
const [menuOpen, setMenuOpen] = useState(false);
const triggerRef = useRef(null);

const displayed = (
<View
Expand All @@ -69,7 +70,7 @@ export function SidebarCategory({
>
{category.name}
</div>
<View style={{ flexShrink: 0, marginLeft: 5 }}>
<View style={{ flexShrink: 0, marginLeft: 5 }} ref={triggerRef}>
<Button
type="bare"
className="hover-visible"
Expand All @@ -85,35 +86,35 @@ export function SidebarCategory({
style={{ color: 'currentColor' }}
/>
</Button>
{menuOpen && (
<Tooltip
position="bottom-left"
width={200}
style={{ padding: 0 }}
onClose={() => setMenuOpen(false)}
>
<Menu
onMenuSelect={type => {
if (type === 'rename') {
onEditName(category.id);
} else if (type === 'delete') {
onDelete(category.id);
} else if (type === 'toggle-visibility') {
onSave({ ...category, hidden: !category.hidden });
}
setMenuOpen(false);
}}
items={[
!categoryGroup?.hidden && {
name: 'toggle-visibility',
text: category.hidden ? 'Show' : 'Hide',
},
{ name: 'rename', text: 'Rename' },
{ name: 'delete', text: 'Delete' },
]}
/>
</Tooltip>
)}

<Popover
triggerRef={triggerRef}
placement="bottom start"
isOpen={menuOpen}
onOpenChange={() => setMenuOpen(false)}
style={{ width: 200 }}
>
<Menu
onMenuSelect={type => {
if (type === 'rename') {
onEditName(category.id);
} else if (type === 'delete') {
onDelete(category.id);
} else if (type === 'toggle-visibility') {
onSave({ ...category, hidden: !category.hidden });
}
setMenuOpen(false);
}}
items={[
!categoryGroup?.hidden && {
name: 'toggle-visibility',
text: category.hidden ? 'Show' : 'Hide',
},
{ name: 'rename', text: 'Rename' },
{ name: 'delete', text: 'Delete' },
]}
/>
</Popover>
</View>
<View style={{ flex: 1 }} />
<NotesButton
Expand Down
71 changes: 36 additions & 35 deletions packages/desktop-client/src/components/budget/SidebarGroup.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
// @ts-strict-ignore
import React, { type CSSProperties, useState } from 'react';
import React, { type CSSProperties, useRef, useState } from 'react';
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 { Menu } from '../common/Menu';
import { Popover } from '../common/Popover';
import { Text } from '../common/Text';
import { View } from '../common/View';
import { NotesButton } from '../NotesButton';
import { InputCell } from '../table';
import { Tooltip } from '../tooltips';

type SidebarGroupProps = {
group: {
Expand Down Expand Up @@ -52,6 +52,7 @@ export function SidebarGroup({
}: SidebarGroupProps) {
const temporary = group.id === 'new';
const [menuOpen, setMenuOpen] = useState(false);
const triggerRef = useRef(null);

const displayed = (
<View
Expand Down Expand Up @@ -91,7 +92,7 @@ export function SidebarGroup({
</div>
{!dragPreview && (
<>
<View style={{ marginLeft: 5, flexShrink: 0 }}>
<View style={{ marginLeft: 5, flexShrink: 0 }} ref={triggerRef}>
<Button
type="bare"
className="hover-visible"
Expand All @@ -103,38 +104,38 @@ export function SidebarGroup({
>
<SvgCheveronDown width={14} height={14} />
</Button>
{menuOpen && (
<Tooltip
position="bottom-left"
width={200}
style={{ padding: 0 }}
onClose={() => setMenuOpen(false)}
>
<Menu
onMenuSelect={type => {
if (type === 'rename') {
onEdit(group.id);
} else if (type === 'add-category') {
onShowNewCategory(group.id);
} else if (type === 'delete') {
onDelete(group.id);
} else if (type === 'toggle-visibility') {
onSave({ ...group, hidden: !group.hidden });
}
setMenuOpen(false);
}}
items={[
{ name: 'add-category', text: 'Add category' },
!group.is_income && {
name: 'toggle-visibility',
text: group.hidden ? 'Show' : 'Hide',
},
{ name: 'rename', text: 'Rename' },
onDelete && { name: 'delete', text: 'Delete' },
]}
/>
</Tooltip>
)}

<Popover
triggerRef={triggerRef}
placement="bottom start"
isOpen={menuOpen}
onOpenChange={() => setMenuOpen(false)}
style={{ width: 200 }}
>
<Menu
onMenuSelect={type => {
if (type === 'rename') {
onEdit(group.id);
} else if (type === 'add-category') {
onShowNewCategory(group.id);
} else if (type === 'delete') {
onDelete(group.id);
} else if (type === 'toggle-visibility') {
onSave({ ...group, hidden: !group.hidden });
}
setMenuOpen(false);
}}
items={[
{ name: 'add-category', text: 'Add category' },
!group.is_income && {
name: 'toggle-visibility',
text: group.hidden ? 'Show' : 'Hide',
},
{ name: 'rename', text: 'Rename' },
onDelete && { name: 'delete', text: 'Delete' },
]}
/>
</Popover>
</View>
<View style={{ flex: 1 }} />
<NotesButton
Expand Down