diff --git a/app/components/Fade.tsx b/app/components/Fade.tsx index 7b1e805d6c..a3de3c4eb4 100644 --- a/app/components/Fade.tsx +++ b/app/components/Fade.tsx @@ -18,7 +18,7 @@ type Props = { }; /** - * Wraps children in a if loading is true on mount. + * Wraps children in a if animate is true on mount. */ export const ConditionalFade = ({ animate, children }: Props) => { const [isAnimated] = useState(animate); diff --git a/app/components/InputSelect.tsx b/app/components/InputSelect.tsx index 586bdb7bef..ae27a55431 100644 --- a/app/components/InputSelect.tsx +++ b/app/components/InputSelect.tsx @@ -67,6 +67,8 @@ type Props = Omit, "onChange"> & { short?: boolean; /** Display a tooltip with the descriptive help text about the select menu. */ help?: string; + /** Render function to override the selected value shown in the trigger. Receives the currently selected option, or undefined when none is selected. */ + displayValue?: (selectedOption: Item | undefined) => React.ReactNode; } & TriggerButtonProps; export const InputSelect = React.forwardRef( @@ -79,6 +81,7 @@ export const InputSelect = React.forwardRef( labelHidden, short, help, + displayValue, ...triggerProps } = props; @@ -95,6 +98,20 @@ export const InputSelect = React.forwardRef( (opt) => opt.type === "item" && !!opt.icon ); + const selectedOption = React.useMemo( + () => + localValue + ? (options.find( + (opt) => opt.type === "item" && opt.value === localValue + ) as Item | undefined) + : undefined, + [localValue, options] + ); + + const resolvedDisplayValue = displayValue + ? displayValue(selectedOption) + : undefined; + const renderOption = React.useCallback( (option: Option, idx: number) => { if (option.type === "separator") { @@ -143,6 +160,7 @@ export const InputSelect = React.forwardRef( onChange={onValueChange} placeholder={placeholder} optionsHaveIcon={optionsHaveIcon} + resolvedDisplayValue={resolvedDisplayValue} /> ); } @@ -159,6 +177,7 @@ export const InputSelect = React.forwardRef( ( @@ -193,6 +213,8 @@ const MobileSelect = React.forwardRef( short, placeholder, optionsHaveIcon, + displayValue: _displayValue, + resolvedDisplayValue, ...triggerProps } = props; @@ -262,7 +284,9 @@ const MobileSelect = React.forwardRef( disclosure data-placeholder={selectedOption ? false : ""} > - {selectedOption ? ( + {resolvedDisplayValue !== undefined ? ( + resolvedDisplayValue + ) : selectedOption ? (