fix
This commit is contained in:
277
ArtisanConnect/components/ui/select/index.tsx
Normal file
277
ArtisanConnect/components/ui/select/index.tsx
Normal file
@@ -0,0 +1,277 @@
|
||||
'use client';
|
||||
|
||||
import React from 'react';
|
||||
import { tva } from '@gluestack-ui/nativewind-utils/tva';
|
||||
import { PrimitiveIcon, UIIcon } from '@gluestack-ui/icon';
|
||||
import {
|
||||
withStyleContext,
|
||||
useStyleContext,
|
||||
} from '@gluestack-ui/nativewind-utils/withStyleContext';
|
||||
import type { VariantProps } from '@gluestack-ui/nativewind-utils';
|
||||
import { createSelect } from '@gluestack-ui/select';
|
||||
import { cssInterop } from 'nativewind';
|
||||
import {
|
||||
Actionsheet,
|
||||
ActionsheetContent,
|
||||
ActionsheetItem,
|
||||
ActionsheetItemText,
|
||||
ActionsheetDragIndicator,
|
||||
ActionsheetDragIndicatorWrapper,
|
||||
ActionsheetBackdrop,
|
||||
ActionsheetScrollView,
|
||||
ActionsheetVirtualizedList,
|
||||
ActionsheetFlatList,
|
||||
ActionsheetSectionList,
|
||||
ActionsheetSectionHeaderText,
|
||||
} from './select-actionsheet';
|
||||
import { Pressable, View, TextInput } from 'react-native';
|
||||
|
||||
const SelectTriggerWrapper = React.forwardRef<
|
||||
React.ComponentRef<typeof Pressable>,
|
||||
React.ComponentProps<typeof Pressable>
|
||||
>(function SelectTriggerWrapper({ ...props }, ref) {
|
||||
return <Pressable {...props} ref={ref} />;
|
||||
});
|
||||
|
||||
const selectIconStyle = tva({
|
||||
base: 'text-background-500 fill-none',
|
||||
parentVariants: {
|
||||
size: {
|
||||
'2xs': 'h-3 w-3',
|
||||
'xs': 'h-3.5 w-3.5',
|
||||
'sm': 'h-4 w-4',
|
||||
'md': 'h-[18px] w-[18px]',
|
||||
'lg': 'h-5 w-5',
|
||||
'xl': 'h-6 w-6',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const selectStyle = tva({
|
||||
base: '',
|
||||
});
|
||||
|
||||
const selectTriggerStyle = tva({
|
||||
base: 'border border-background-300 rounded flex-row items-center overflow-hidden data-[hover=true]:border-outline-400 data-[focus=true]:border-primary-700 data-[disabled=true]:opacity-40 data-[disabled=true]:data-[hover=true]:border-background-300',
|
||||
variants: {
|
||||
size: {
|
||||
xl: 'h-12',
|
||||
lg: 'h-11',
|
||||
md: 'h-10',
|
||||
sm: 'h-9',
|
||||
},
|
||||
variant: {
|
||||
underlined:
|
||||
'border-0 border-b rounded-none data-[hover=true]:border-primary-700 data-[focus=true]:border-primary-700 data-[focus=true]:web:shadow-[inset_0_-1px_0_0] data-[focus=true]:web:shadow-primary-700 data-[invalid=true]:border-error-700 data-[invalid=true]:web:shadow-error-700',
|
||||
outline:
|
||||
'data-[focus=true]:border-primary-700 data-[focus=true]:web:shadow-[inset_0_0_0_1px] data-[focus=true]:data-[hover=true]:web:shadow-primary-600 data-[invalid=true]:web:shadow-[inset_0_0_0_1px] data-[invalid=true]:border-error-700 data-[invalid=true]:web:shadow-error-700 data-[invalid=true]:data-[hover=true]:border-error-700',
|
||||
rounded:
|
||||
'rounded-full data-[focus=true]:border-primary-700 data-[focus=true]:web:shadow-[inset_0_0_0_1px] data-[focus=true]:web:shadow-primary-700 data-[invalid=true]:border-error-700 data-[invalid=true]:web:shadow-error-700',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const selectInputStyle = tva({
|
||||
base: 'py-auto px-3 placeholder:text-typography-500 web:w-full h-full text-typography-900 pointer-events-none web:outline-none ios:leading-[0px]',
|
||||
parentVariants: {
|
||||
size: {
|
||||
xl: 'text-xl',
|
||||
lg: 'text-lg',
|
||||
md: 'text-base',
|
||||
sm: 'text-sm',
|
||||
},
|
||||
variant: {
|
||||
underlined: 'px-0',
|
||||
outline: '',
|
||||
rounded: 'px-4',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
const UISelect = createSelect(
|
||||
{
|
||||
Root: View,
|
||||
Trigger: withStyleContext(SelectTriggerWrapper),
|
||||
Input: TextInput,
|
||||
Icon: UIIcon,
|
||||
},
|
||||
{
|
||||
Portal: Actionsheet,
|
||||
Backdrop: ActionsheetBackdrop,
|
||||
Content: ActionsheetContent,
|
||||
DragIndicator: ActionsheetDragIndicator,
|
||||
DragIndicatorWrapper: ActionsheetDragIndicatorWrapper,
|
||||
Item: ActionsheetItem,
|
||||
ItemText: ActionsheetItemText,
|
||||
ScrollView: ActionsheetScrollView,
|
||||
VirtualizedList: ActionsheetVirtualizedList,
|
||||
FlatList: ActionsheetFlatList,
|
||||
SectionList: ActionsheetSectionList,
|
||||
SectionHeaderText: ActionsheetSectionHeaderText,
|
||||
}
|
||||
);
|
||||
|
||||
cssInterop(UISelect, { className: 'style' });
|
||||
cssInterop(UISelect.Input, {
|
||||
className: { target: 'style', nativeStyleToProp: { textAlign: true } },
|
||||
});
|
||||
cssInterop(SelectTriggerWrapper, { className: 'style' });
|
||||
|
||||
cssInterop(PrimitiveIcon, {
|
||||
className: {
|
||||
target: 'style',
|
||||
nativeStyleToProp: {
|
||||
height: true,
|
||||
width: true,
|
||||
fill: true,
|
||||
color: 'classNameColor',
|
||||
stroke: true,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
type ISelectProps = VariantProps<typeof selectStyle> &
|
||||
React.ComponentProps<typeof UISelect> & { className?: string };
|
||||
|
||||
const Select = React.forwardRef<
|
||||
React.ComponentRef<typeof UISelect>,
|
||||
ISelectProps
|
||||
>(function Select({ className, ...props }, ref) {
|
||||
return (
|
||||
<UISelect
|
||||
className={selectStyle({
|
||||
class: className,
|
||||
})}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
type ISelectTriggerProps = VariantProps<typeof selectTriggerStyle> &
|
||||
React.ComponentProps<typeof UISelect.Trigger> & { className?: string };
|
||||
|
||||
const SelectTrigger = React.forwardRef<
|
||||
React.ComponentRef<typeof UISelect.Trigger>,
|
||||
ISelectTriggerProps
|
||||
>(function SelectTrigger(
|
||||
{ className, size = 'md', variant = 'outline', ...props },
|
||||
ref
|
||||
) {
|
||||
return (
|
||||
<UISelect.Trigger
|
||||
className={selectTriggerStyle({
|
||||
class: className,
|
||||
size,
|
||||
variant,
|
||||
})}
|
||||
ref={ref}
|
||||
context={{ size, variant }}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
type ISelectInputProps = VariantProps<typeof selectInputStyle> &
|
||||
React.ComponentProps<typeof UISelect.Input> & { className?: string };
|
||||
|
||||
const SelectInput = React.forwardRef<
|
||||
React.ComponentRef<typeof UISelect.Input>,
|
||||
ISelectInputProps
|
||||
>(function SelectInput({ className, ...props }, ref) {
|
||||
const { size: parentSize, variant: parentVariant } = useStyleContext();
|
||||
return (
|
||||
<UISelect.Input
|
||||
className={selectInputStyle({
|
||||
class: className,
|
||||
parentVariants: {
|
||||
size: parentSize,
|
||||
variant: parentVariant,
|
||||
},
|
||||
})}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
type ISelectIcon = VariantProps<typeof selectIconStyle> &
|
||||
React.ComponentProps<typeof UISelect.Icon> & { className?: string };
|
||||
|
||||
const SelectIcon = React.forwardRef<
|
||||
React.ComponentRef<typeof UISelect.Icon>,
|
||||
ISelectIcon
|
||||
>(function SelectIcon({ className, size, ...props }, ref) {
|
||||
const { size: parentSize } = useStyleContext();
|
||||
if (typeof size === 'number') {
|
||||
return (
|
||||
<UISelect.Icon
|
||||
ref={ref}
|
||||
{...props}
|
||||
className={selectIconStyle({ class: className })}
|
||||
size={size}
|
||||
/>
|
||||
);
|
||||
} else if (
|
||||
//@ts-expect-error : web only
|
||||
(props?.height !== undefined || props?.width !== undefined) &&
|
||||
size === undefined
|
||||
) {
|
||||
return (
|
||||
<UISelect.Icon
|
||||
ref={ref}
|
||||
{...props}
|
||||
className={selectIconStyle({ class: className })}
|
||||
/>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<UISelect.Icon
|
||||
className={selectIconStyle({
|
||||
class: className,
|
||||
size,
|
||||
parentVariants: {
|
||||
size: parentSize,
|
||||
},
|
||||
})}
|
||||
ref={ref}
|
||||
{...props}
|
||||
/>
|
||||
);
|
||||
});
|
||||
|
||||
Select.displayName = 'Select';
|
||||
SelectTrigger.displayName = 'SelectTrigger';
|
||||
SelectInput.displayName = 'SelectInput';
|
||||
SelectIcon.displayName = 'SelectIcon';
|
||||
|
||||
// Actionsheet Components
|
||||
const SelectPortal = UISelect.Portal;
|
||||
const SelectBackdrop = UISelect.Backdrop;
|
||||
const SelectContent = UISelect.Content;
|
||||
const SelectDragIndicator = UISelect.DragIndicator;
|
||||
const SelectDragIndicatorWrapper = UISelect.DragIndicatorWrapper;
|
||||
const SelectItem = UISelect.Item;
|
||||
const SelectScrollView = UISelect.ScrollView;
|
||||
const SelectVirtualizedList = UISelect.VirtualizedList;
|
||||
const SelectFlatList = UISelect.FlatList;
|
||||
const SelectSectionList = UISelect.SectionList;
|
||||
const SelectSectionHeaderText = UISelect.SectionHeaderText;
|
||||
|
||||
export {
|
||||
Select,
|
||||
SelectTrigger,
|
||||
SelectInput,
|
||||
SelectIcon,
|
||||
SelectPortal,
|
||||
SelectBackdrop,
|
||||
SelectContent,
|
||||
SelectDragIndicator,
|
||||
SelectDragIndicatorWrapper,
|
||||
SelectItem,
|
||||
SelectScrollView,
|
||||
SelectVirtualizedList,
|
||||
SelectFlatList,
|
||||
SelectSectionList,
|
||||
SelectSectionHeaderText,
|
||||
};
|
||||
Reference in New Issue
Block a user