You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
562 lines
14 KiB
562 lines
14 KiB
'use client';
|
|
|
|
import { H4 } from '@expo/html-elements';
|
|
import { createActionsheet } from '@gluestack-ui/actionsheet';
|
|
import {
|
|
Pressable,
|
|
View,
|
|
Text,
|
|
ScrollView,
|
|
VirtualizedList,
|
|
FlatList,
|
|
SectionList,
|
|
ViewStyle,
|
|
} from 'react-native';
|
|
import { PrimitiveIcon, UIIcon } from '@gluestack-ui/icon';
|
|
import { tva } from '@gluestack-ui/nativewind-utils/tva';
|
|
import type { VariantProps } from '@gluestack-ui/nativewind-utils';
|
|
import { withStyleContext } from '@gluestack-ui/nativewind-utils/withStyleContext';
|
|
import { cssInterop } from 'nativewind';
|
|
import {
|
|
Motion,
|
|
AnimatePresence,
|
|
createMotionAnimatedComponent,
|
|
MotionComponentProps,
|
|
} from '@legendapp/motion';
|
|
|
|
import React from 'react';
|
|
|
|
type IAnimatedPressableProps = React.ComponentProps<typeof Pressable> &
|
|
MotionComponentProps<typeof Pressable, ViewStyle, unknown, unknown, unknown>;
|
|
|
|
const AnimatedPressable = createMotionAnimatedComponent(
|
|
Pressable
|
|
) as React.ComponentType<IAnimatedPressableProps>;
|
|
|
|
type IMotionViewProps = React.ComponentProps<typeof View> &
|
|
MotionComponentProps<typeof View, ViewStyle, unknown, unknown, unknown>;
|
|
|
|
const MotionView = Motion.View as React.ComponentType<IMotionViewProps>;
|
|
|
|
export const UIActionsheet = createActionsheet({
|
|
Root: View,
|
|
Content: withStyleContext(MotionView),
|
|
Item: withStyleContext(Pressable),
|
|
ItemText: Text,
|
|
DragIndicator: View,
|
|
IndicatorWrapper: View,
|
|
Backdrop: AnimatedPressable,
|
|
ScrollView: ScrollView,
|
|
VirtualizedList: VirtualizedList,
|
|
FlatList: FlatList,
|
|
SectionList: SectionList,
|
|
SectionHeaderText: H4,
|
|
Icon: UIIcon,
|
|
AnimatePresence: AnimatePresence,
|
|
});
|
|
|
|
cssInterop(UIActionsheet, { className: 'style' });
|
|
cssInterop(UIActionsheet.Content, { className: 'style' });
|
|
cssInterop(UIActionsheet.Item, { className: 'style' });
|
|
cssInterop(UIActionsheet.ItemText, { className: 'style' });
|
|
cssInterop(UIActionsheet.DragIndicator, { className: 'style' });
|
|
cssInterop(UIActionsheet.DragIndicatorWrapper, { className: 'style' });
|
|
cssInterop(UIActionsheet.Backdrop, { className: 'style' });
|
|
cssInterop(UIActionsheet.ScrollView, {
|
|
className: 'style',
|
|
contentContainerClassName: 'contentContainerStyle',
|
|
indicatorClassName: 'indicatorStyle',
|
|
});
|
|
cssInterop(UIActionsheet.VirtualizedList, {
|
|
className: 'style',
|
|
ListFooterComponentClassName: 'ListFooterComponentStyle',
|
|
ListHeaderComponentClassName: 'ListHeaderComponentStyle',
|
|
contentContainerClassName: 'contentContainerStyle',
|
|
indicatorClassName: 'indicatorStyle',
|
|
});
|
|
cssInterop(UIActionsheet.FlatList, {
|
|
className: 'style',
|
|
ListFooterComponentClassName: 'ListFooterComponentStyle',
|
|
ListHeaderComponentClassName: 'ListHeaderComponentStyle',
|
|
columnWrapperClassName: 'columnWrapperStyle',
|
|
contentContainerClassName: 'contentContainerStyle',
|
|
indicatorClassName: 'indicatorStyle',
|
|
});
|
|
cssInterop(UIActionsheet.SectionList, { className: 'style' });
|
|
cssInterop(UIActionsheet.SectionHeaderText, { className: 'style' });
|
|
cssInterop(PrimitiveIcon, {
|
|
className: {
|
|
target: 'style',
|
|
nativeStyleToProp: {
|
|
height: true,
|
|
width: true,
|
|
fill: true,
|
|
color: 'classNameColor',
|
|
stroke: true,
|
|
},
|
|
},
|
|
});
|
|
|
|
const actionsheetStyle = tva({ base: 'w-full h-full web:pointer-events-none' });
|
|
|
|
const actionsheetContentStyle = tva({
|
|
base: 'items-center rounded-tl-3xl rounded-tr-3xl p-2 bg-background-0 web:pointer-events-auto web:select-none shadow-lg',
|
|
});
|
|
|
|
const actionsheetItemStyle = tva({
|
|
base: 'w-full flex-row items-center p-3 rounded-sm data-[disabled=true]:opacity-40 data-[disabled=true]:web:pointer-events-auto data-[disabled=true]:web:cursor-not-allowed hover:bg-background-50 active:bg-background-100 data-[focus=true]:bg-background-100 web:data-[focus-visible=true]:bg-background-100 data-[checked=true]:bg-background-100',
|
|
});
|
|
|
|
const actionsheetItemTextStyle = tva({
|
|
base: 'text-typography-700 font-normal font-body tracking-md text-left mx-2',
|
|
variants: {
|
|
isTruncated: {
|
|
true: '',
|
|
},
|
|
bold: {
|
|
true: 'font-bold',
|
|
},
|
|
underline: {
|
|
true: 'underline',
|
|
},
|
|
strikeThrough: {
|
|
true: 'line-through',
|
|
},
|
|
size: {
|
|
'2xs': 'text-2xs',
|
|
'xs': 'text-xs',
|
|
'sm': 'text-sm',
|
|
'md': 'text-base',
|
|
'lg': 'text-lg',
|
|
'xl': 'text-xl',
|
|
'2xl': 'text-2xl',
|
|
'3xl': 'text-3xl',
|
|
'4xl': 'text-4xl',
|
|
'5xl': 'text-5xl',
|
|
'6xl': 'text-6xl',
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
size: 'md',
|
|
},
|
|
});
|
|
|
|
const actionsheetDragIndicatorStyle = tva({
|
|
base: 'w-16 h-1 bg-background-400 rounded-full',
|
|
});
|
|
|
|
const actionsheetDragIndicatorWrapperStyle = tva({
|
|
base: 'w-full py-1 items-center',
|
|
});
|
|
|
|
const actionsheetBackdropStyle = tva({
|
|
base: 'absolute left-0 top-0 right-0 bottom-0 bg-background-dark web:cursor-default web:pointer-events-auto',
|
|
});
|
|
|
|
const actionsheetScrollViewStyle = tva({
|
|
base: 'w-full h-auto',
|
|
});
|
|
|
|
const actionsheetVirtualizedListStyle = tva({
|
|
base: 'w-full h-auto',
|
|
});
|
|
|
|
const actionsheetFlatListStyle = tva({
|
|
base: 'w-full h-auto',
|
|
});
|
|
|
|
const actionsheetSectionListStyle = tva({
|
|
base: 'w-full h-auto',
|
|
});
|
|
|
|
const actionsheetSectionHeaderTextStyle = tva({
|
|
base: 'leading-5 font-bold font-heading my-0 text-typography-500 p-3 uppercase',
|
|
variants: {
|
|
isTruncated: {
|
|
true: '',
|
|
},
|
|
bold: {
|
|
true: 'font-bold',
|
|
},
|
|
underline: {
|
|
true: 'underline',
|
|
},
|
|
strikeThrough: {
|
|
true: 'line-through',
|
|
},
|
|
size: {
|
|
'5xl': 'text-5xl',
|
|
'4xl': 'text-4xl',
|
|
'3xl': 'text-3xl',
|
|
'2xl': 'text-2xl',
|
|
'xl': 'text-xl',
|
|
'lg': 'text-lg',
|
|
'md': 'text-base',
|
|
'sm': 'text-sm',
|
|
'xs': 'text-xs',
|
|
},
|
|
|
|
sub: {
|
|
true: 'text-xs',
|
|
},
|
|
italic: {
|
|
true: 'italic',
|
|
},
|
|
highlight: {
|
|
true: 'bg-yellow500',
|
|
},
|
|
},
|
|
defaultVariants: {
|
|
size: 'xs',
|
|
},
|
|
});
|
|
|
|
const actionsheetIconStyle = tva({
|
|
base: 'text-typography-900',
|
|
variants: {
|
|
size: {
|
|
'2xs': 'h-3 w-3',
|
|
'xs': 'h-3.5 w-3.5',
|
|
'sm': 'h-4 w-4',
|
|
'md': 'w-4 h-4',
|
|
'lg': 'h-5 w-5',
|
|
'xl': 'h-6 w-6',
|
|
},
|
|
},
|
|
});
|
|
|
|
type IActionsheetProps = VariantProps<typeof actionsheetStyle> &
|
|
React.ComponentProps<typeof UIActionsheet> & { className?: string };
|
|
|
|
type IActionsheetContentProps = VariantProps<typeof actionsheetContentStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.Content> & { className?: string };
|
|
|
|
type IActionsheetItemProps = VariantProps<typeof actionsheetItemStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.Item> & { className?: string };
|
|
|
|
type IActionsheetItemTextProps = VariantProps<typeof actionsheetItemTextStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.ItemText> & { className?: string };
|
|
|
|
type IActionsheetDragIndicatorProps = VariantProps<
|
|
typeof actionsheetDragIndicatorStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.DragIndicator> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetDragIndicatorWrapperProps = VariantProps<
|
|
typeof actionsheetDragIndicatorWrapperStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.DragIndicatorWrapper> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetBackdropProps = VariantProps<typeof actionsheetBackdropStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.Backdrop> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetScrollViewProps = VariantProps<
|
|
typeof actionsheetScrollViewStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.ScrollView> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetVirtualizedListProps = VariantProps<
|
|
typeof actionsheetVirtualizedListStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.VirtualizedList> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetFlatListProps = VariantProps<typeof actionsheetFlatListStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.FlatList> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetSectionListProps = VariantProps<
|
|
typeof actionsheetSectionListStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.SectionList> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetSectionHeaderTextProps = VariantProps<
|
|
typeof actionsheetSectionHeaderTextStyle
|
|
> &
|
|
React.ComponentProps<typeof UIActionsheet.SectionHeaderText> & {
|
|
className?: string;
|
|
};
|
|
|
|
type IActionsheetIconProps = VariantProps<typeof actionsheetIconStyle> &
|
|
React.ComponentProps<typeof UIActionsheet.Icon> & {
|
|
className?: string;
|
|
as?: React.ElementType;
|
|
};
|
|
|
|
const Actionsheet = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet>,
|
|
IActionsheetProps
|
|
>(function Actionsheet({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet
|
|
className={actionsheetStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetContent = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.Content>,
|
|
IActionsheetContentProps & { className?: string }
|
|
>(function ActionsheetContent({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.Content
|
|
className={actionsheetContentStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetItem = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.Item>,
|
|
IActionsheetItemProps
|
|
>(function ActionsheetItem({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.Item
|
|
className={actionsheetItemStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetItemText = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.ItemText>,
|
|
IActionsheetItemTextProps
|
|
>(function ActionsheetItemText(
|
|
{ className, isTruncated, bold, underline, strikeThrough, size, ...props },
|
|
ref
|
|
) {
|
|
return (
|
|
<UIActionsheet.ItemText
|
|
className={actionsheetItemTextStyle({
|
|
class: className,
|
|
isTruncated,
|
|
bold,
|
|
underline,
|
|
strikeThrough,
|
|
size,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetDragIndicator = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.DragIndicator>,
|
|
IActionsheetDragIndicatorProps
|
|
>(function ActionsheetDragIndicator({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.DragIndicator
|
|
className={actionsheetDragIndicatorStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetDragIndicatorWrapper = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.DragIndicatorWrapper>,
|
|
IActionsheetDragIndicatorWrapperProps
|
|
>(function ActionsheetDragIndicatorWrapper({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.DragIndicatorWrapper
|
|
className={actionsheetDragIndicatorWrapperStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetBackdrop = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.Backdrop>,
|
|
IActionsheetBackdropProps
|
|
>(function ActionsheetBackdrop({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.Backdrop
|
|
initial={{
|
|
opacity: 0,
|
|
}}
|
|
animate={{
|
|
opacity: 0.5,
|
|
}}
|
|
exit={{
|
|
opacity: 0,
|
|
}}
|
|
{...props}
|
|
className={actionsheetBackdropStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetScrollView = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.ScrollView>,
|
|
IActionsheetScrollViewProps
|
|
>(function ActionsheetScrollView({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.ScrollView
|
|
className={actionsheetScrollViewStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetVirtualizedList = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.VirtualizedList>,
|
|
IActionsheetVirtualizedListProps
|
|
>(function ActionsheetVirtualizedList({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.VirtualizedList
|
|
className={actionsheetVirtualizedListStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetFlatList = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.FlatList>,
|
|
IActionsheetFlatListProps
|
|
>(function ActionsheetFlatList({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.FlatList
|
|
className={actionsheetFlatListStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetSectionList = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.SectionList>,
|
|
IActionsheetSectionListProps
|
|
>(function ActionsheetSectionList({ className, ...props }, ref) {
|
|
return (
|
|
<UIActionsheet.SectionList
|
|
className={actionsheetSectionListStyle({
|
|
class: className,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetSectionHeaderText = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.SectionHeaderText>,
|
|
IActionsheetSectionHeaderTextProps
|
|
>(function ActionsheetSectionHeaderText(
|
|
{
|
|
className,
|
|
isTruncated,
|
|
bold,
|
|
underline,
|
|
strikeThrough,
|
|
size,
|
|
sub,
|
|
italic,
|
|
highlight,
|
|
...props
|
|
},
|
|
ref
|
|
) {
|
|
return (
|
|
<UIActionsheet.SectionHeaderText
|
|
className={actionsheetSectionHeaderTextStyle({
|
|
class: className,
|
|
isTruncated,
|
|
bold,
|
|
underline,
|
|
strikeThrough,
|
|
size,
|
|
sub,
|
|
italic,
|
|
highlight,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
const ActionsheetIcon = React.forwardRef<
|
|
React.ComponentRef<typeof UIActionsheet.Icon>,
|
|
IActionsheetIconProps
|
|
>(function ActionsheetIcon(
|
|
{ className, as: AsComp, size = 'sm', ...props },
|
|
ref
|
|
) {
|
|
if (AsComp) {
|
|
return (
|
|
<AsComp
|
|
className={actionsheetIconStyle({
|
|
class: className,
|
|
size,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
}
|
|
return (
|
|
<UIActionsheet.Icon
|
|
className={actionsheetIconStyle({
|
|
class: className,
|
|
size,
|
|
})}
|
|
ref={ref}
|
|
{...props}
|
|
/>
|
|
);
|
|
});
|
|
|
|
export {
|
|
Actionsheet,
|
|
ActionsheetContent,
|
|
ActionsheetItem,
|
|
ActionsheetItemText,
|
|
ActionsheetDragIndicator,
|
|
ActionsheetDragIndicatorWrapper,
|
|
ActionsheetBackdrop,
|
|
ActionsheetScrollView,
|
|
ActionsheetVirtualizedList,
|
|
ActionsheetFlatList,
|
|
ActionsheetSectionList,
|
|
ActionsheetSectionHeaderText,
|
|
ActionsheetIcon,
|
|
};
|