Skip to content

Commit 035602a

Browse files
committed
does this work on touch devices?
1 parent f6567a8 commit 035602a

File tree

2 files changed

+113
-2
lines changed

2 files changed

+113
-2
lines changed

src/components/SyntheticDataSettings.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
TooltipProvider,
1919
TooltipTrigger,
2020
TooltipContent,
21-
} from './ui/tooltip';
21+
} from './ui/touch-tooltip';
2222
import Markdown from 'react-markdown';
2323

2424
const createFormSchema = (t: (key: string) => string) =>
@@ -155,8 +155,9 @@ export default function SyntheticDataSettings({
155155
{t(
156156
'syntheticData.form.fieldset.sdgMethod.title'
157157
)}
158+
158159
<TooltipProvider>
159-
<Tooltip delayDuration={250}>
160+
<Tooltip>
160161
<TooltipTrigger
161162
onClick={event => {
162163
event.preventDefault();
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
2+
import * as React from 'react';
3+
4+
import { cn } from '@/lib/utils';
5+
6+
const TooltipProvider = TooltipPrimitive.Provider;
7+
8+
const Tooltip = ({
9+
alwaysOpen,
10+
children,
11+
}: {
12+
alwaysOpen?: boolean;
13+
children: React.ReactNode;
14+
}) => {
15+
const [open, setOpen] = React.useState(false);
16+
17+
return (
18+
<TooltipPrimitive.Root open={alwaysOpen || open} onOpenChange={setOpen}>
19+
<div
20+
onClick={() => {
21+
setOpen(true);
22+
}}
23+
onKeyUp={e => {
24+
if (e.key === 'Enter' || e.key === ' ') {
25+
setOpen(true);
26+
}
27+
}}
28+
onKeyDown={e => {
29+
if (e.key === 'Enter' || e.key === ' ') {
30+
setOpen(true);
31+
}
32+
}}
33+
>
34+
{children}
35+
</div>
36+
</TooltipPrimitive.Root>
37+
);
38+
};
39+
40+
const TooltipTrigger = ({
41+
onClick,
42+
onFocus,
43+
onBlur,
44+
onKeyUp,
45+
onKeyDown,
46+
children,
47+
}: {
48+
onClick?: React.MouseEventHandler<HTMLDivElement>;
49+
onFocus?: React.FocusEventHandler<HTMLDivElement>;
50+
onBlur?: React.FocusEventHandler<HTMLDivElement>;
51+
onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;
52+
onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;
53+
children: React.ReactNode;
54+
}) => {
55+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
56+
const [_open, setOpen] = React.useState(false);
57+
58+
const handleKeyEvents = (event: React.KeyboardEvent<HTMLDivElement>) => {
59+
if (onKeyUp) onKeyUp(event);
60+
if (onKeyDown) onKeyDown(event);
61+
if (event.key === 'Enter' || event.key === ' ') {
62+
setOpen(prevOpen => !prevOpen);
63+
}
64+
};
65+
66+
return (
67+
<TooltipPrimitive.Trigger asChild>
68+
<div
69+
tabIndex={0}
70+
role="button"
71+
onClick={e => {
72+
setOpen(prevOpen => !prevOpen);
73+
if (onClick) onClick(e);
74+
}}
75+
onFocus={e => {
76+
setTimeout(() => setOpen(true), 0);
77+
if (onFocus) onFocus(e);
78+
}}
79+
onBlur={e => {
80+
setOpen(false);
81+
if (onBlur) onBlur(e);
82+
}}
83+
onKeyUp={handleKeyEvents}
84+
onKeyDown={handleKeyEvents}
85+
>
86+
{children}
87+
</div>
88+
</TooltipPrimitive.Trigger>
89+
);
90+
};
91+
92+
const TooltipContent = React.forwardRef<
93+
React.ElementRef<typeof TooltipPrimitive.Content>,
94+
React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>
95+
>(({ className, sideOffset = 4, ...props }, ref) => (
96+
<TooltipPrimitive.Content
97+
ref={ref}
98+
sideOffset={sideOffset}
99+
className={cn(
100+
`z-50 overflow-hidden
101+
rounded-md border
102+
bg-white 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`,
103+
className
104+
)}
105+
{...props}
106+
/>
107+
));
108+
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
109+
110+
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider };

0 commit comments

Comments
 (0)