Skip to content

Commit a20887d

Browse files
refactor(core): extract state enhancers from store (#338)
1 parent f62c084 commit a20887d

File tree

4 files changed

+33
-18
lines changed

4 files changed

+33
-18
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { getCompletion } from './getCompletion';
2+
import { AutocompleteState, InternalAutocompleteOptions } from './types';
3+
4+
export function completionStateEnhancer<TItem>(
5+
state: AutocompleteState<TItem>,
6+
props: InternalAutocompleteOptions<TItem>
7+
) {
8+
return {
9+
...state,
10+
completion: getCompletion({ state, props }),
11+
};
12+
}

packages/autocomplete-core/src/createAutocomplete.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { completionStateEnhancer } from './completionStateEnhancer';
12
import { createStore } from './createStore';
23
import { getAutocompleteSetters } from './getAutocompleteSetters';
34
import { getDefaultProps } from './getDefaultProps';
@@ -15,7 +16,7 @@ export function createAutocomplete<
1516
options: AutocompleteOptions<TItem>
1617
): AutocompleteApi<TItem, TEvent, TMouseEvent, TKeyboardEvent> {
1718
const props = getDefaultProps(options);
18-
const store = createStore(stateReducer, props);
19+
const store = createStore(stateReducer, props, [completionStateEnhancer]);
1920

2021
const {
2122
setHighlightedIndex,
Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,39 @@
1-
import { getCompletion } from './getCompletion';
21
import {
3-
InternalAutocompleteOptions,
42
AutocompleteState,
53
AutocompleteStore,
4+
InternalAutocompleteOptions,
65
Reducer,
6+
StateEnhancer,
77
} from './types';
88

99
export function createStore<TItem>(
1010
reducer: Reducer,
11-
props: InternalAutocompleteOptions<TItem>
11+
props: InternalAutocompleteOptions<TItem>,
12+
stateEnhancers: Array<StateEnhancer<TItem>>
1213
): AutocompleteStore<TItem> {
13-
let state = props.initialState;
14+
function enhanceState(state: AutocompleteState<TItem>) {
15+
return stateEnhancers.reduce(
16+
(nextState, stateEnhancer) => stateEnhancer(nextState, props),
17+
state
18+
);
19+
}
20+
21+
let state = enhanceState(props.initialState);
1422

1523
return {
1624
getState() {
1725
return state;
1826
},
1927
send(action, payload) {
20-
state = withCompletion(
28+
state = enhanceState(
2129
reducer(state, {
2230
type: action,
2331
props,
2432
payload,
25-
}),
26-
props
33+
})
2734
);
2835

2936
props.onStateChange({ state });
3037
},
3138
};
3239
}
33-
34-
function withCompletion<TItem>(
35-
state: AutocompleteState<TItem>,
36-
props: InternalAutocompleteOptions<TItem>
37-
) {
38-
return {
39-
...state,
40-
completion: getCompletion({ state, props }),
41-
};
42-
}

packages/autocomplete-core/src/types/store.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,8 @@ type ActionType =
3535
| 'mousemove'
3636
| 'mouseleave'
3737
| 'click';
38+
39+
export type StateEnhancer<TItem> = (
40+
state: AutocompleteState<TItem>,
41+
props: InternalAutocompleteOptions<TItem>
42+
) => AutocompleteState<TItem>;

0 commit comments

Comments
 (0)