Select
The Select
component is a dropdown menu that allows users to choose an option from a list. It supports multiple picker styles, enabling it to adapt to different design and functionality needs.
When the pickerType
prop is set to native
, the Select
component leverages the default select interface of the underlying platform, whether it’s Android or iOS. This ensures a familiar, consistent, and reliable experience that adheres to the native design standards of each operating system.
For more tailored designs, the pickerType
can be set to custom
. In this mode, the component uses a default custom-designed picker interface provided by the Phaselis framework. This custom picker is highly configurable, allowing you to modify its appearance and behavior using a variety of additional props to match your application's unique style and functionality requirements.
Import
import { Select } from "phaselis";
Usage
Native Picker Usage
import { InputGroup, Select, required } from "phaselis";
const Example = () => {
return (
<InputGroup label="Native Select">
<Select
name="nativeSelect"
leftIcon="Globe"
size="md"
validations={[required("This field is required")]}
options={[
{ value: "usa", label: "USA" },
{ value: "canada", label: "Canada" },
{ value: "mexico", label: "Mexico" },
]}
pickerType="native"
placeholder="Select a country"
/>
</InputGroup>
);
};
export default Example;
Custom Picker (Default) Usage
import { InputGroup, Select, required } from "phaselis";
const Example = () => {
return (
<InputGroup label="Custom Select">
<Select
name="customDefault"
leftIcon="ArrowRight"
size="lg"
validations={[required("Selection is required")]}
options={[
{ value: "apple", label: "Apple" },
{ value: "banana", label: "Banana" },
{ value: "cherry", label: "Cherry" },
]}
pickerType="custom"
placeholder="Pick a fruit"
/>
</InputGroup>
);
};
export default Example;
Custom Picker with Customization
import { InputGroup, Select, Slot } from "phaselis";
import { Pressable, Text, TouchableOpacity, View } from "react-native";
const Example = () => {
return (
<InputGroup label="Custom Select with Customization">
<Select
name="customSelectWithSlots"
leftIcon="User"
size="md"
pickerType="custom"
options={[
{ value: "admin", label: "Admin" },
{ value: "editor", label: "Editor" },
{ value: "viewer", label: "Viewer" },
]}
placeholder="Select a role"
OptionSlot={({
item,
selectedItem,
onChange,
setShowPicker,
closeOnSelect,
}) => (
<TouchableOpacity
onPress={() => {
onChange?.(null, item?.value, item);
if (closeOnSelect) setShowPicker?.(false);
}}
style={{
padding: 10,
backgroundColor:
selectedItem?.value === item?.value ? "#e0e0e0" : "transparent",
}}
>
<Text>{item?.label}</Text>
</TouchableOpacity>
)}
HeaderSlot={({ text, setShowPicker, closeIcon, closeIconSize }) => (
<View style={{ padding: 15, backgroundColor: "#f0f0f0" }}>
<Text style={{ fontSize: 18, fontWeight: "bold" }}>{text}</Text>
<Pressable onPress={() => setShowPicker?.(false)}>
<Slot icon={closeIcon} />
</Pressable>
</View>
)}
InputSlot={({
selectedItem,
placeholder,
leftIcon,
rightIcon,
setShowPicker,
}) => (
<Pressable
onPress={() => setShowPicker?.(true)}
style={{
flexDirection: "row",
padding: 10,
borderWidth: 1,
borderColor: "#ccc",
borderRadius: 5,
}}
>
<Slot icon={leftIcon} size="md" />
<Text style={{ flex: 1, paddingHorizontal: 10 }}>
{selectedItem?.label || placeholder}
</Text>
<Slot icon={rightIcon} size="md" />
</Pressable>
)}
/>
</InputGroup>
);
};
export default Example;
Props
Common Props
These are the main props available to both native
and custom
picker types:
options required
Array<{ value: any; label: string; }>[]
An array of options to display in the picker. Each option should contain a value
and label
property.
<Select
pickerType="native"
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
/>
onChange
(e: any, value?: any, data?: any) => any
A callback function triggered when the value changes. It receives the event object, the selected value, and optional data.
<Select
pickerType="custom"
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
onChange={(e, value) => console.log(value)}
/>
pickerType
native | custom
Defines the type of picker to use. native
is for platform-specific pickers, while custom
is for a customizable interface. Default is native
.
<Select
pickerType="native"
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
/>
style
Name | Type | Description |
---|---|---|
container | ViewStyle | Style for the outer container of the picker component. |
element | TextStyle | Style for the text displayed in the input field or picker element. |
leftSlot | ViewStyle | TextStyle |
rightSlot | ViewStyle | TextStyle |
You can style the picker using the style
prop with ViewStyle
and TextStyle
for respective components.
<Select
style={{ container: { padding: 10 }, element: { fontSize: 16 } }}
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
pickerType="custom"
/>
You can style the picker with the style
prop using either an object with named styles or directly provide TextStyle properties that will be applied to the element (text display).
// Object with named styles
<Select
style={{
container: { padding: 10 },
element: { fontSize: 16, color: '#333' },
leftSlot: { marginRight: 8 },
rightSlot: { marginLeft: 8 }
}}
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
pickerType="custom"
/>
// Direct element styling
<Select
style={{ fontSize: 16, fontWeight: 'bold', color: '#0066cc' }}
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
pickerType="custom"
/>
containerStyle
ViewStyle
Additional style applied directly to the container element.
<Select
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
containerStyle={{ borderWidth: 1, borderColor: '#ccc', borderRadius: 8, padding: 8 }}
/>
elementStyle
TextStyle
Additional style applied directly to the text element.
<Select
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
elementStyle={{ fontSize: 16, color: '#444', fontWeight: '500' }}
/>
leftSlotStyle
ViewStyle | TextStyle
Additional style applied directly to the left slot or icon.
<Select
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
leftIcon="List"
leftSlotStyle={{ color: '#0066cc', marginRight: 10 }}
/>
rightSlotStyle
ViewStyle | TextStyle
Additional style applied directly to the right slot or icon.
<Select
options={[
{ value: "1", label: "Option 1" },
{ value: "2", label: "Option 2" },
]}
rightIcon="ChevronDown"
rightSlotStyle={{ color: '#666', marginLeft: 10 }}
/>
size
The size of the picker.
<Select
pickerType="native"
size="lg"
options={[
{ value: "1", label: "1" },
{ value: "2", label: "2" },
{ value: "3", label: "3" },
]}
/>
selectedItem
any | undefined
The currently selected item from the options.
import { Text, TouchableOpacity } from "react-native";
<Select
pickerType="custom"
options={[
{ value: "admin", label: "Admin" },
{ value: "editor", label: "Editor" },
{ value: "viewer", label: "Viewer" },
]}
OptionSlot={({ item, selectedItem, onChange }) => (
<TouchableOpacity
onPress={() => onChange?.(null, item?.value, item)}
style={{
padding: 10,
backgroundColor:
selectedItem?.value === item?.value ? "#e0e0e0" : "transparent",
}}
>
<Text>{item?.label}</Text>
</TouchableOpacity>
)}
/>
disabled
boolean
A flag to disable the picker, preventing user interaction.
<Select
pickerType="native"
options={[
{ value: "admin", label: "Admin" },
{ value: "editor", label: "Editor" },
{ value: "viewer", label: "Viewer" },
]}
disabled
/>
Native Picker Props
These are the additional props specifically available when the pickerType
is set to "native"
:
placeholder
string
The placeholder text displayed when no value is selected in the native picker. This is used to prompt the user to make a selection.
<Select
pickerType="native"
options={[
{ value: "admin", label: "Admin" },
{ value: "editor", label: "Editor" },
{ value: "viewer", label: "Viewer" },
]}
placeholder="Select a role"
/>
Custom Picker Props
These are the additional props specifically available when the pickerType
is set to "custom"
:
setShowPicker
Dispatch<SetStateAction<boolean>>
A setter function to control the visibility of the picker. This function should be used to change the showPicker
state.
import { Slot } from "phaselis";
import { Pressable, Text, View } from "react-native";
<Select
pickerType="custom"
options={[
{ value: "admin", label: "Admin" },
{ value: "editor", label: "Editor" },
{ value: "viewer", label: "Viewer" },
]}
HeaderSlot={({ text, setShowPicker, closeIcon, closeIconSize }) => (
<View style={{ padding: 15, backgroundColor: "#f0f0f0" }}>
<Text style={{ fontSize: 18, fontWeight: "bold" }}>{text}</Text>
<Pressable onPress={() => setShowPicker?.(false)}>
<Slot icon={closeIcon} />
</Pressable>
</View>
)}
/>
maxHeightModal
number | string
The maximum height of the modal where the picker is displayed. It can be a number or a string value (e.g., "50%"
, "400px"
) to control the size of the bottom sheet.
<Select pickerType="custom" options={[]} maxHeightModal={500} />
fullScreenModal
boolean
A flag to determine whether the modal should take up the full screen. If set to true
, the picker will be displayed in full-screen mode.
<Select pickerType="custom" options={[]} fullScreenModal={true} />
HeaderSlot
ComponentType<HeaderSlotProps>
A slot component used to customize the header of the picker.
<Select pickerType="custom" options={[]} HeaderSlot={CustomHeaderSlot} />
closeIcon
The name of the close icon to be displayed in the header of the picker. This is used in conjunction with HeaderSlot
.
<Select pickerType="custom" options={[]} closeIcon="Close" />
closeIconSize
The size of the close icon in the header.
<Select pickerType="custom" options={[]} closeIconSize="md" />
CloseIconSlot
ComponentType
A slot component used to customize the close icon in the header. If provided, this will replace the default close icon.
<Select pickerType="custom" options={[]} CloseIconSlot={CustomCloseIcon} />
OptionSlot
ComponentType<OptionSlotProps>
A slot component used to customize the rendering of each option in the picker.
<Select pickerType="custom" options={[]} OptionSlot={CustomOptionSlot} />
NoOptionSlot
ComponentType
A slot component used when there are no available options to display in the picker. You can customize what appears when there are no options.
<Select pickerType="custom" options={[]} NoOptionSlot={CustomNoOptionSlot} />
closeOnSelect
boolean
A flag that determines whether the picker should close automatically after an option is selected. When set to true
, the picker will be closed immediately after an option is selected.
<Select pickerType="custom" options={[]} closeOnSelect={true} />
style
Name | Type | Description |
---|---|---|
container | ViewStyle | Style for the outer container of the picker component. |
element | TextStyle | Style for the text displayed in the input field or picker element. |
leftSlot | ViewStyle | TextStyle | Style for the component or icon on the left side of the picker. |
rightSlot | ViewStyle | TextStyle | Style for the component or icon on the right side of the picker. |
You can style the picker using the style
prop with ViewStyle
and TextStyle
for respective components.
<Select
pickerType="custom"
options={[]}
style={{ container: { padding: 10 }, element: { fontSize: 16 } }}
/>