import React, { Component } from "react"; import { Select } from "antd"; export type OptionsCallbackFunc = (o: {label: string, value: string}[]) => void; export type OptionCallbackFunc = (o: {label: string, value: string}) => void; interface IProps { placeholder: string; className: string; value?: string, getOption: (s: string, fn: OptionCallbackFunc) => void, getOptions: (s: string, fn: OptionsCallbackFunc) => void, onSelect?: (s: string) => void, } interface IState { option?: {label: string, value: string}; options: {label: string, value: string}[]; } class Autocomplete extends Component { constructor(props: IProps) { super(props); this.state = { options: [], }; } componentDidMount() { if (this.props.value && this.props.value !== "") { this.props.getOption(this.props.value, (o: {label: string, value: string}) => { this.setState({ options: [o], }); }); } } componentDidUpdate(prevProps: IProps) { if (this.props.value === prevProps.value) { return; } if (this.props.value && this.props.value !== "") { this.props.getOption(this.props.value, (o: {label: string, value: string}) => { this.setState({ options: [o], }); }); } } onFocus = () => { this.props.getOptions("", (options) => { if (this.state.option !== undefined) { const selected = this.state.option.value; if (options.find(e => e.value === selected) === undefined) { options.unshift(this.state.option); } } this.setState({ options: options, }); }); } onSearch = (value: string) => { this.props.getOptions(value, (options) => { this.setState({ options: options, }); }); } onSelect = (value: string, option: any) => { this.setState({ option: {label: option.label, value: option.value}, }); if (this.props.onSelect !== undefined) { this.props.onSelect(value); } } render() { const { getOption, getOptions, ...otherProps } = this.props; return(