diff --git a/src/components/experimental/Select/Select.tsx b/src/components/experimental/Select/Select.tsx index 88592fd5..ba965d5d 100644 --- a/src/components/experimental/Select/Select.tsx +++ b/src/components/experimental/Select/Select.tsx @@ -1,10 +1,11 @@ -import React, { ReactElement, useState } from 'react'; +import React from 'react'; import { Select as BaseSelect, SelectProps as BaseSelectProps, SelectValue, SelectStateContext, - FieldError + FieldError, + SelectValueRenderProps } from 'react-aria-components'; import { useIsSSR } from 'react-aria'; import { useResizeObserver } from '@react-aria/utils'; @@ -41,42 +42,47 @@ const FakeButton = styled(FakeInput)` } `; -interface SelectFieldProps extends Pick { +interface SelectFieldProps extends Pick { placeholder?: string; + renderValue?: (props: SelectValueRenderProps & { defaultChildren: React.ReactNode }) => React.ReactNode; } -const SelectTrigger = React.forwardRef( - ({ label, leadingIcon, placeholder }, forwardedRef) => { - const state = React.useContext(SelectStateContext); - const buttonRef = React.useRef(null); +// eslint-disable-next-line @typescript-eslint/ban-types +function SelectTriggerWithRef( + { label, leadingIcon, placeholder, renderValue }: SelectFieldProps, + forwardedRef: React.ForwardedRef +) { + const state = React.useContext(SelectStateContext); + const buttonRef = React.useRef(null); - return ( - buttonRef.current?.click()} - > - {leadingIcon} - - - - - {state?.isOpen ? : } - - ); - } -); + return ( + buttonRef.current?.click()}> + {leadingIcon} + + + + + {state?.isOpen ? : } + + ); +} + +const SelectTrigger = React.forwardRef(SelectTriggerWithRef); interface SelectProps> - extends SelectFieldProps, + extends SelectFieldProps, Omit, 'children'> { items?: Iterable; children: React.ReactNode | ((item: T) => React.ReactNode); @@ -89,9 +95,10 @@ function Select>({ errorMessage, description, placeholder, + renderValue, ...props -}: SelectProps): ReactElement { - const [menuWidth, setMenuWidth] = useState(null); +}: SelectProps): React.ReactElement { + const [menuWidth, setMenuWidth] = React.useState(null); const triggerRef = React.useRef(null); const isSSR = useIsSSR(); @@ -117,6 +124,7 @@ function Select>({ label={label} leadingIcon={leadingIcon} placeholder={placeholder} + renderValue={renderValue} /> diff --git a/src/components/experimental/Select/docs/Select.stories.tsx b/src/components/experimental/Select/docs/Select.stories.tsx index 4b26a3dd..f62ab32f 100644 --- a/src/components/experimental/Select/docs/Select.stories.tsx +++ b/src/components/experimental/Select/docs/Select.stories.tsx @@ -70,3 +70,9 @@ export const Invalid: Story = { errorMessage: 'Error' } }; + +export const WithCustomValueRenderer: Story = { + args: { + renderValue: ({ selectedText, isPlaceholder }) => (isPlaceholder ? '' : `${selectedText} ♥`) + } +};