Skip to content

Commit 2f4598c

Browse files
committed
feat: add support for empty state in suggestions and handle last token change
1 parent 6595f5b commit 2f4598c

File tree

1 file changed

+39
-24
lines changed

1 file changed

+39
-24
lines changed

src/components/form/Input.tsx

Lines changed: 39 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ export interface InputProps<T> extends Code0Input, ValidationProps<T> {
4545
validationUsesSuggestions?: boolean
4646
disableOnValue?: (value: T) => boolean
4747
filterSuggestionsByLastToken?: boolean
48+
onLastTokenChange?: (token: string | null) => void
4849
enforceUniqueSuggestions?: boolean
50+
suggestionsEmptyState?: React.ReactNode
4951

5052
wrapperComponent?: Code0Component<HTMLDivElement>
5153
right?: React.ReactNode
@@ -86,6 +88,8 @@ const InputComponent = React.forwardRef<HTMLInputElement, InputProps<any>>(
8688
validationUsesSuggestions = false,
8789
filterSuggestionsByLastToken = false,
8890
enforceUniqueSuggestions = false,
91+
onLastTokenChange,
92+
suggestionsEmptyState,
8993
...rest
9094
} = props
9195

@@ -333,6 +337,14 @@ const InputComponent = React.forwardRef<HTMLInputElement, InputProps<any>>(
333337
}
334338
}, [filterSuggestionsByLastToken, inputRef, normalizeTextValue, syntaxSegments, value])
335339

340+
useEffect(() => {
341+
setOpen(true)
342+
if (!filterSuggestionsByLastToken) return
343+
if (!onLastTokenChange) return
344+
345+
onLastTokenChange(trailingTextTokenData?.token ?? null)
346+
}, [filterSuggestionsByLastToken, onLastTokenChange, trailingTextTokenData?.token])
347+
336348
const filteredSuggestions = React.useMemo(() => {
337349
if (!filterSuggestionsByLastToken) return suggestions
338350
if (!suggestions) return suggestions
@@ -883,30 +895,33 @@ const InputComponent = React.forwardRef<HTMLInputElement, InputProps<any>>(
883895
/>
884896
</MenuTrigger>
885897
<MenuPortal>
886-
<InputSuggestionMenuContent inputRef={inputRef}>
887-
{suggestionsHeader}
888-
<InputSuggestionMenuContentItems
889-
/* @ts-ignore */
890-
ref={menuRef}
891-
inputRef={inputRef}
892-
suggestions={availableSuggestions}
893-
onSuggestionSelect={(suggestion) => {
894-
if (!onSuggestionSelect) {
895-
applySuggestionValue(suggestion)
896-
} else {
897-
onSuggestionSelect?.(suggestion)
898-
}
899-
setOpen(false)
900-
if (onSuggestionSelect) {
901-
focusInputCaretAtEnd()
902-
}
903-
}}
904-
/>
905-
{suggestionsFooter}
906-
</InputSuggestionMenuContent>
907-
</MenuPortal>
908-
</Menu>
909-
), [applySuggestionValue, availableSuggestions, disabledOnValue, focusInputCaretAtEnd, handleBlur, handleFocus, handleKeyDown, handleKeyDownCapture, inputRef, onSuggestionSelect, open, rest, suggestionsFooter, suggestionsHeader, transformSyntaxWithAppliedParts])
898+
<InputSuggestionMenuContent inputRef={inputRef}>
899+
{suggestionsHeader}
900+
{availableSuggestions?.length === 0 && suggestionsEmptyState}
901+
{!!availableSuggestions?.length && (
902+
<InputSuggestionMenuContentItems
903+
/* @ts-ignore */
904+
ref={menuRef}
905+
inputRef={inputRef}
906+
suggestions={availableSuggestions}
907+
onSuggestionSelect={(suggestion) => {
908+
if (!onSuggestionSelect) {
909+
applySuggestionValue(suggestion)
910+
} else {
911+
onSuggestionSelect?.(suggestion)
912+
}
913+
setOpen(false)
914+
if (onSuggestionSelect) {
915+
focusInputCaretAtEnd()
916+
}
917+
}}
918+
/>
919+
)}
920+
{suggestionsFooter}
921+
</InputSuggestionMenuContent>
922+
</MenuPortal>
923+
</Menu>
924+
), [applySuggestionValue, availableSuggestions, disabledOnValue, focusInputCaretAtEnd, handleBlur, handleFocus, handleKeyDown, handleKeyDownCapture, inputRef, onSuggestionSelect, open, rest, suggestionsEmptyState, suggestionsFooter, suggestionsHeader, transformSyntaxWithAppliedParts])
910925

911926
return (
912927
<>

0 commit comments

Comments
 (0)