Skip to content

Commit ccacdcf

Browse files
committed
chore: transaction tooltip
1 parent 4991b6e commit ccacdcf

File tree

5 files changed

+106
-15
lines changed

5 files changed

+106
-15
lines changed

package-lock.json

Lines changed: 35 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
"@radix-ui/react-select": "^2.0.0",
2828
"@radix-ui/react-slot": "^1.0.2",
2929
"@radix-ui/react-tabs": "^1.0.4",
30+
"@radix-ui/react-tooltip": "^1.0.7",
3031
"@tauri-apps/api": "^1.5.3",
3132
"class-variance-authority": "^0.7.0",
3233
"clsx": "^2.1.0",

src/App.tsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ import { routes } from './App.routes'
33
import { RouterProvider, createBrowserRouter } from 'react-router-dom'
44
import { ThemeProvider } from './features/theme/context/theme-provider'
55
import { LayoutProvider } from './features/layout/context/layout-provider'
6+
import { TooltipProvider } from './features/common/components/tooltip'
67

78
const router = createBrowserRouter(routes)
89

910
function App() {
1011
return (
1112
<ThemeProvider defaultTheme="system" storageKey="vite-ui-theme">
12-
<LayoutProvider>
13-
<RouterProvider router={router} />
14-
</LayoutProvider>
13+
<TooltipProvider>
14+
<LayoutProvider>
15+
<RouterProvider router={router} />
16+
</LayoutProvider>
17+
</TooltipProvider>
1518
</ThemeProvider>
1619
)
1720
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import * as React from 'react'
2+
import * as TooltipPrimitive from '@radix-ui/react-tooltip'
3+
4+
import { cn } from '@/features/common/utils'
5+
6+
const TooltipProvider = TooltipPrimitive.Provider
7+
8+
const Tooltip = TooltipPrimitive.Root
9+
10+
const TooltipTrigger = TooltipPrimitive.Trigger
11+
12+
const TooltipContent = React.forwardRef<
13+
React.ElementRef<typeof TooltipPrimitive.Content>,
14+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
15+
>(({ className, sideOffset = 4, ...props }, ref) => (
16+
<TooltipPrimitive.Content
17+
ref={ref}
18+
sideOffset={sideOffset}
19+
className={cn(
20+
'z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',
21+
className
22+
)}
23+
{...props}
24+
/>
25+
))
26+
TooltipContent.displayName = TooltipPrimitive.Content.displayName
27+
28+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }

src/features/transactions/pages/group-page.tsx

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import SvgCircle from '@/features/common/components/svg/circle'
22
import SvgPointerLeft from '@/features/common/components/svg/pointer-left'
33
import SvgPointerRight from '@/features/common/components/svg/pointer-right'
4+
import { Tooltip, TooltipContent, TooltipTrigger } from '@/features/common/components/tooltip'
45
import { cn } from '@/features/common/utils'
6+
import { fixedForwardRef } from '@/utils/fixed-forward-ref'
57
import { isDefined } from '@/utils/is-defined'
68
import { useMemo } from 'react'
79

@@ -82,40 +84,42 @@ function ConnectionToChildren({ indentLevel }: { indentLevel: number | undefined
8284
)
8385
}
8486

85-
function DisplayArrow({ arrow: transactionArrow }: { arrow: Arrow }) {
87+
const DisplayArrow = fixedForwardRef(({ arrow, ...rest }: { arrow: Arrow }, ref?: React.LegacyRef<HTMLDivElement>) => {
8688
return (
8789
<div
8890
className={cn('flex items-center justify-center')}
8991
style={{
9092
// 2 and 3 are the number to offset the name column
91-
gridColumnStart: transactionArrow.from + 2,
92-
gridColumnEnd: transactionArrow.to + 3,
93+
gridColumnStart: arrow.from + 2,
94+
gridColumnEnd: arrow.to + 3,
9395
}}
96+
ref={ref}
97+
{...rest}
9498
>
9599
<SvgCircle width={graphConfig.circleDimension} height={graphConfig.circleDimension}></SvgCircle>
96100
<div
97101
style={{
98-
width: `calc(${(100 - 100 / (transactionArrow.to - transactionArrow.from + 1)).toFixed(2)}% - ${graphConfig.circleDimension}px)`,
102+
width: `calc(${(100 - 100 / (arrow.to - arrow.from + 1)).toFixed(2)}% - ${graphConfig.circleDimension}px)`,
99103
height: `${graphConfig.circleDimension}px`,
100104
}}
101105
className="relative text-primary"
102106
>
103-
{transactionArrow.direction === 'rightToLeft' && <SvgPointerLeft className={cn('absolute top-0 left-0')} />}
107+
{arrow.direction === 'rightToLeft' && <SvgPointerLeft className={cn('absolute top-0 left-0')} />}
104108
<div className={cn('border-primary h-1/2')} style={{ borderBottomWidth: graphConfig.lineWidth }}></div>
105-
{transactionArrow.direction === 'leftToRight' && <SvgPointerRight className={cn('absolute top-0 right-0')} />}
109+
{arrow.direction === 'leftToRight' && <SvgPointerRight className={cn('absolute top-0 right-0')} />}
106110
</div>
107111
<SvgCircle width={graphConfig.circleDimension} height={graphConfig.circleDimension}></SvgCircle>
108112
</div>
109113
)
110-
}
114+
})
111115

112-
function DisplaySelfTransaction() {
116+
const DisplaySelfTransaction = fixedForwardRef((props: object, ref?: React.LegacyRef<HTMLDivElement>) => {
113117
return (
114-
<div className={cn('flex items-center justify-center')}>
118+
<div ref={ref} className={cn('flex items-center justify-center')} {...props}>
115119
<SvgCircle width={graphConfig.circleDimension} height={graphConfig.circleDimension}></SvgCircle>
116120
</div>
117121
)
118-
}
122+
})
119123

120124
type TransactionRowProps = {
121125
transaction: Transaction
@@ -153,8 +157,28 @@ function TransactionRow({
153157
</div>
154158
{accounts.map((_, index) => {
155159
if (index < arrow.from || index > arrow.to) return <div key={index}></div>
156-
if (index === arrow.from && index === arrow.to) return <DisplaySelfTransaction key={index} />
157-
if (index === arrow.from) return <DisplayArrow key={index} arrow={arrow} />
160+
if (index === arrow.from && index === arrow.to)
161+
return (
162+
<Tooltip key={index}>
163+
<TooltipTrigger asChild>
164+
<DisplaySelfTransaction />
165+
</TooltipTrigger>
166+
<TooltipContent>
167+
<div className={cn('p-4')}>Transaction: {transaction.name}</div>
168+
</TooltipContent>
169+
</Tooltip>
170+
)
171+
if (index === arrow.from)
172+
return (
173+
<Tooltip key={index}>
174+
<TooltipTrigger asChild>
175+
<DisplayArrow key={index} arrow={arrow} />
176+
</TooltipTrigger>
177+
<TooltipContent>
178+
<div className={cn('p-4')}>Transaction: {transaction.name}</div>
179+
</TooltipContent>
180+
</Tooltip>
181+
)
158182
else return null
159183
})}
160184

0 commit comments

Comments
 (0)