'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, React.ComponentProps >(function SelectTriggerWrapper({ ...props }, ref) { return ; }); 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 & React.ComponentProps & { className?: string }; const Select = React.forwardRef< React.ComponentRef, ISelectProps >(function Select({ className, ...props }, ref) { return ( ); }); type ISelectTriggerProps = VariantProps & React.ComponentProps & { className?: string }; const SelectTrigger = React.forwardRef< React.ComponentRef, ISelectTriggerProps >(function SelectTrigger( { className, size = 'md', variant = 'outline', ...props }, ref ) { return ( ); }); type ISelectInputProps = VariantProps & React.ComponentProps & { className?: string }; const SelectInput = React.forwardRef< React.ComponentRef, ISelectInputProps >(function SelectInput({ className, ...props }, ref) { const { size: parentSize, variant: parentVariant } = useStyleContext(); return ( ); }); type ISelectIcon = VariantProps & React.ComponentProps & { className?: string }; const SelectIcon = React.forwardRef< React.ComponentRef, ISelectIcon >(function SelectIcon({ className, size, ...props }, ref) { const { size: parentSize } = useStyleContext(); if (typeof size === 'number') { return ( ); } else if ( //@ts-expect-error : web only (props?.height !== undefined || props?.width !== undefined) && size === undefined ) { return ( ); } return ( ); }); 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, };