-
Notifications
You must be signed in to change notification settings - Fork 24
/
AnchorOrButton.tsx
52 lines (48 loc) · 1.15 KB
/
AnchorOrButton.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import React, {
ComponentPropsWithoutRef,
ForwardedRef,
forwardRef,
} from "react";
import {
Button as RACButton,
Link as RACLink,
type ButtonProps as RACButtonProps,
} from "react-aria-components";
type AnchorOrButtonSharedProps = {
children?: React.ReactNode;
href?: string;
};
export type AnchorOrButtonProps = (
| RACButtonProps
| ComponentPropsWithoutRef<typeof RACLink>
) &
AnchorOrButtonSharedProps;
function isAnchorProps(
props: AnchorOrButtonProps,
): props is AnchorOrButtonSharedProps &
ComponentPropsWithoutRef<typeof RACLink> {
return "href" in props;
}
export const AnchorOrButton = forwardRef(function AnchorOrButton(
props: AnchorOrButtonProps,
ref: ForwardedRef<HTMLElement>,
) {
const { style, ...sharedProps } = props;
return isAnchorProps(props) ? (
<RACLink
{...sharedProps}
className={props.className}
ref={ref as React.ForwardedRef<HTMLAnchorElement>}
>
{props.children}
</RACLink>
) : (
<RACButton
{...sharedProps}
className={props.className}
ref={ref as React.ForwardedRef<HTMLButtonElement>}
>
{props.children}
</RACButton>
);
});