UNPKG

4.53 kBTypeScriptView Raw
1import * as React from 'react';
2import { Props as SelectProps } from './Select';
3
4export interface OptionTypeBase {
5 [key: string]: any;
6}
7
8export type OptionsType<OptionType extends OptionTypeBase> = ReadonlyArray<OptionType>;
9
10export interface GroupTypeBase<OptionType extends OptionTypeBase> {
11 options: OptionsType<OptionType>;
12 [key: string]: any;
13}
14
15export type GroupedOptionsType<
16 OptionType extends OptionTypeBase,
17 GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>
18> = ReadonlyArray<GroupType>;
19
20export type ValueType<OptionType extends OptionTypeBase, IsMulti extends boolean> = IsMulti extends true
21 ? OptionsType<OptionType>
22 : OptionType | null;
23
24export type FocusEventHandler = (event: React.FocusEvent<HTMLElement>) => void;
25export type MouseEventHandler = (event: React.MouseEvent<HTMLElement>) => void;
26export type KeyboardEventHandler = (event: React.KeyboardEvent<HTMLElement>) => void;
27
28export type InnerRef = React.Ref<any>;
29export interface PropsWithInnerRef {
30 /** The inner reference. */
31 innerRef: React.Ref<any>;
32}
33
34export type ClassNameList = string[];
35export type ClassNamesState = { [key: string]: boolean } | undefined;
36
37export interface CommonProps<
38 OptionType extends OptionTypeBase,
39 IsMulti extends boolean,
40 GroupType extends GroupTypeBase<OptionType> = GroupTypeBase<OptionType>
41> {
42 clearValue: () => void;
43 className?: string;
44 cx: (state: ClassNamesState | undefined, className: string | undefined) => string;
45 /**
46 * Get the styles of a particular part of the select. Pass in the name of the
47 * property as the first argument, and the current props as the second argument.
48 * See the `styles` object for the properties available.
49 */
50 getStyles: (name: string, props: any) => {};
51 getValue: () => OptionsType<OptionType>;
52 /** Whether the value container currently holds a value. */
53 hasValue: boolean;
54 /** Set when the value container should hold multiple values */
55 isMulti: boolean;
56 /** Whether the text is right to left */
57 isRtl: boolean;
58 options: OptionsType<OptionType>;
59 selectOption: (option: OptionType) => void;
60 selectProps: SelectProps<OptionType, IsMulti, GroupType>;
61 setValue: (newValue: ValueType<OptionType, IsMulti>, action: SetValueAction, option?: OptionType) => void;
62 theme: Theme;
63}
64
65export interface SelectOptionActionMeta<OptionType extends OptionTypeBase> {
66 action: 'select-option';
67 option: OptionType | undefined;
68 name?: string;
69}
70
71export interface DeselectOptionActionMeta<OptionType extends OptionTypeBase> {
72 action: 'deselect-option';
73 option: OptionType | undefined;
74 name?: string;
75}
76
77export interface RemoveValueActionMeta<OptionType extends OptionTypeBase> {
78 action: 'remove-value';
79 removedValue: OptionType;
80 name?: string;
81}
82
83export interface PopValueActionMeta<OptionType extends OptionTypeBase> {
84 action: 'pop-value';
85 removedValue: OptionType;
86 name?: string;
87}
88
89export interface ClearActionMeta<OptionType extends OptionTypeBase> {
90 action: 'clear';
91 removedValues: OptionType[];
92 name?: string;
93}
94
95export interface CreateOptionActionMeta {
96 action: 'create-option';
97 name?: string;
98}
99
100export type ActionMeta<OptionType extends OptionTypeBase> =
101 | SelectOptionActionMeta<OptionType>
102 | DeselectOptionActionMeta<OptionType>
103 | RemoveValueActionMeta<OptionType>
104 | PopValueActionMeta<OptionType>
105 | ClearActionMeta<OptionType>
106 | CreateOptionActionMeta;
107
108export type Action = ActionMeta<OptionTypeBase>['action'];
109export type SetValueAction = 'select-option' | 'deselect-option';
110
111export type InputActionTypes = 'set-value' | 'input-change' | 'input-blur' | 'menu-close';
112
113export interface InputActionMeta {
114 action: InputActionTypes;
115}
116
117export type MenuPlacement = 'auto' | 'bottom' | 'top';
118export type MenuPosition = 'absolute' | 'fixed';
119
120export type FocusDirection = 'up' | 'down' | 'pageup' | 'pagedown' | 'first' | 'last';
121
122export type OptionProps = PropsWithInnerRef & {
123 data: any;
124 id: number;
125 index: number;
126 isDisabled: boolean;
127 isFocused: boolean;
128 isSelected: boolean;
129 label: string;
130 onClick: MouseEventHandler;
131 onMouseOver: MouseEventHandler;
132 value: any;
133};
134
135export interface ThemeSpacing {
136 baseUnit: number;
137 controlHeight: number;
138 menuGutter: number;
139}
140
141export interface Theme {
142 borderRadius: number;
143 colors: { [key: string]: string };
144 spacing: ThemeSpacing;
145}