vaulterm/frontend/components/ui/menu-button.tsx

72 lines
1.7 KiB
TypeScript
Raw Normal View History

2024-11-12 19:15:13 +07:00
import React from "react";
2024-11-15 04:08:37 +07:00
import { Platform } from "react-native";
2024-11-12 19:15:13 +07:00
import {
2024-11-15 04:08:37 +07:00
Adapt,
2024-11-12 19:15:13 +07:00
GetProps,
ListItem,
Popover,
withStaticProperties,
} from "tamagui";
type MenuButtonProps = GetProps<typeof Popover> & {
asChild?: boolean;
trigger?: React.ReactNode;
width?: string | number | null;
};
const MenuButtonFrame = ({
2024-11-15 04:08:37 +07:00
asChild = true,
2024-11-12 19:15:13 +07:00
trigger,
children,
width,
...props
}: MenuButtonProps) => {
return (
2024-11-14 17:58:19 +07:00
<Popover size="$1" {...props}>
2024-11-12 19:15:13 +07:00
<Popover.Trigger asChild={asChild}>{trigger}</Popover.Trigger>
2024-11-15 04:08:37 +07:00
<Adapt when="sm" platform="touch">
<Popover.Sheet modal dismissOnSnapToBottom snapPointsMode="fit">
<Popover.Sheet.Overlay
animation="quickest"
enterStyle={{ opacity: 0 }}
exitStyle={{ opacity: 0 }}
/>
<Popover.Sheet.Frame padding="$4">
{/* <Adapt.Contents /> */}
{children}
</Popover.Sheet.Frame>
</Popover.Sheet>
</Adapt>
2024-11-12 19:15:13 +07:00
<Popover.Content
bordered
enterStyle={{ y: -10, opacity: 0 }}
exitStyle={{ y: -10, opacity: 0 }}
animation={["quick", { opacity: { overshootClamping: true } }]}
width={width}
>
{children}
</Popover.Content>
</Popover>
);
};
2024-11-15 04:08:37 +07:00
const MenuButtonItem = (props: GetProps<typeof ListItem>) => {
if (Platform.OS === "android" || Platform.OS === "ios") {
return <ListItem hoverTheme pressTheme {...props} />;
}
return (
<Popover.Close asChild>
<ListItem hoverTheme pressTheme {...props} />
</Popover.Close>
);
};
2024-11-12 19:15:13 +07:00
const MenuButton = withStaticProperties(MenuButtonFrame, {
Item: MenuButtonItem,
});
export default MenuButton;