1 | import { Component, ComponentType, Ref as ElementRef } from 'react';
|
2 |
|
3 | import SelectBase, { Props as SelectProps } from './Select';
|
4 | import { ActionMeta, GroupTypeBase, InputActionMeta, OptionTypeBase, ValueType } from './types';
|
5 |
|
6 | export interface DefaultProps {
|
7 | defaultInputValue: string;
|
8 | defaultMenuIsOpen: boolean;
|
9 | defaultValue: readonly OptionTypeBase[] | OptionTypeBase | null;
|
10 | }
|
11 |
|
12 | export const defaultProps: DefaultProps;
|
13 |
|
14 | export interface Props<
|
15 | OptionType extends OptionTypeBase,
|
16 | IsMulti extends boolean,
|
17 | GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>
|
18 | > {
|
19 | defaultInputValue?: string;
|
20 | defaultMenuIsOpen?: boolean;
|
21 | defaultValue?: readonly OptionType[] | OptionType | null;
|
22 | inputValue?: string;
|
23 | menuIsOpen?: boolean;
|
24 | value?: readonly OptionType[] | OptionType | null;
|
25 | onChange?: (value: ValueType<OptionType, IsMulti>, actionMeta: ActionMeta<OptionType>) => void;
|
26 | }
|
27 |
|
28 | type StateProps<T extends SelectProps<any, boolean, any>> = Pick<
|
29 | T,
|
30 | Exclude<
|
31 | keyof T,
|
32 | 'inputValue' | 'value' | 'menuIsOpen' | 'onChange' | 'onInputChange' | 'onMenuClose' | 'onMenuOpen'
|
33 | >
|
34 | >;
|
35 |
|
36 | interface State<OptionType extends OptionTypeBase, IsMulti extends boolean> {
|
37 | inputValue: string;
|
38 | menuIsOpen: boolean;
|
39 | value: readonly OptionType[] | OptionType | null;
|
40 | }
|
41 |
|
42 | type GetOptionType<T> = T extends SelectBase<infer OT> ? OT : never;
|
43 |
|
44 | export class StateManager<
|
45 | OptionType extends OptionTypeBase = { label: string; value: string },
|
46 | IsMulti extends boolean = false,
|
47 | GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>,
|
48 | T extends SelectBase<OptionType, IsMulti> = SelectBase<OptionType, IsMulti>
|
49 | > extends Component<
|
50 | StateProps<SelectProps<OptionType, IsMulti, GroupType>> &
|
51 | Props<OptionType, IsMulti, GroupType> &
|
52 | SelectProps<OptionType, IsMulti, GroupType>,
|
53 | State<OptionType, IsMulti>
|
54 | > {
|
55 | static defaultProps: DefaultProps;
|
56 |
|
57 | select: T;
|
58 |
|
59 | focus(): void;
|
60 | blur(): void;
|
61 | getProp(key: string): any;
|
62 | callProp(name: string, ...args: any[]): any;
|
63 | onChange: (value: ValueType<OptionType, IsMulti>, actionMeta: ActionMeta<OptionType>) => void;
|
64 | onInputChange: (value: ValueType<OptionType, IsMulti>, actionMeta: InputActionMeta) => void;
|
65 | onMenuOpen: () => void;
|
66 | onMenuClose: () => void;
|
67 | }
|
68 |
|
69 | export function manageState<T extends SelectBase<any, boolean>>(
|
70 | SelectComponent: T,
|
71 | ): StateManager<GetOptionType<T>, boolean, GroupTypeBase<GetOptionType<T>>, T>;
|
72 |
|
73 | export default manageState;
|