UNPKG

2.56 kBTypeScriptView Raw
1import { Component, ComponentType, Ref as ElementRef } from 'react';
2
3import SelectBase, { Props as SelectProps } from './Select';
4import { ActionMeta, GroupTypeBase, InputActionMeta, OptionTypeBase, ValueType } from './types';
5
6export interface DefaultProps {
7 defaultInputValue: string;
8 defaultMenuIsOpen: boolean;
9 defaultValue: readonly OptionTypeBase[] | OptionTypeBase | null;
10}
11
12export const defaultProps: DefaultProps;
13
14export 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
28type 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
36interface State<OptionType extends OptionTypeBase, IsMulti extends boolean> {
37 inputValue: string;
38 menuIsOpen: boolean;
39 value: readonly OptionType[] | OptionType | null;
40}
41
42type GetOptionType<T> = T extends SelectBase<infer OT> ? OT : never;
43
44export 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
69export function manageState<T extends SelectBase<any, boolean>>(
70 SelectComponent: T,
71): StateManager<GetOptionType<T>, boolean, GroupTypeBase<GetOptionType<T>>, T>;
72
73export default manageState;