import { SearchBarAdvanceFormData } from '~/models/search-bar';
export class SearchService {
- private recentQueries: string[] = this.getRecentQueries();
+ private recentQueries = this.getRecentQueries();
private savedQueries: SearchBarAdvanceFormData[] = this.getSavedQueries();
saveRecentQuery(query: string) {
localStorage.setItem('recentQueries', JSON.stringify(this.recentQueries));
}
- getRecentQueries() {
- return JSON.parse(localStorage.getItem('recentQueries') || '[]') as string[];
+ getRecentQueries(): string[] {
+ return JSON.parse(localStorage.getItem('recentQueries') || '[]');
}
saveQuery(data: SearchBarAdvanceFormData) {
UPDATE_SAVED_QUERY: ofType<SearchBarAdvanceFormData[]>(),
SET_SELECTED_ITEM: ofType<string>(),
MOVE_UP: ofType<{}>(),
- MOVE_DOWN: ofType<{}>()
+ MOVE_DOWN: ofType<{}>(),
+ SELECT_FIRST_ITEM: ofType<{}>()
});
export type SearchBarActions = UnionOf<typeof searchBarActions>;
export const loadRecentQueries = () =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
- const recentQueries = services.searchService.getRecentQueries() || [];
+ const recentQueries = services.searchService.getRecentQueries();
dispatch(searchBarActions.SET_RECENT_QUERIES(recentQueries));
return recentQueries;
};
async (dispatch: Dispatch, getState: () => RootState) => {
const currentView = getState().searchBar.currentView;
dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
- // dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
if (searchValue.length > 0) {
dispatch<any>(searchGroups(searchValue));
if (currentView === SearchView.BASIC) {
export const openSearchView = () =>
(dispatch: Dispatch<any>, getState: () => RootState, services: ServiceRepository) => {
- dispatch(searchBarActions.OPEN_SEARCH_VIEW());
const savedSearchQueries = services.searchService.getSavedQueries();
dispatch(searchBarActions.SET_SAVED_QUERIES(savedSearchQueries));
+ dispatch(loadRecentQueries());
+ dispatch(searchBarActions.OPEN_SEARCH_VIEW());
+ dispatch(searchBarActions.SELECT_FIRST_ITEM());
};
export const closeSearchView = () =>
- (dispatch: Dispatch<any>, getState: () => RootState) => {
- const isOpen = getState().searchBar.open;
- if (isOpen) {
- dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
- dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
- }
+ (dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_SELECTED_ITEM(''));
+ dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
};
export const closeAdvanceView = () =>
export const navigateToItem = (uuid: string) =>
(dispatch: Dispatch<any>) => {
+ dispatch(searchBarActions.SET_SELECTED_ITEM(''));
dispatch(searchBarActions.CLOSE_SEARCH_VIEW());
dispatch(navigateTo(uuid));
};
if (currentView === SearchView.ADVANCED) {
} else if (searchValuePresent) {
- dispatch<any>(goToView(SearchView.AUTOCOMPLETE));
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.AUTOCOMPLETE));
+ dispatch(searchBarActions.SET_SELECTED_ITEM(searchValue));
debounceStartSearch(dispatch);
} else {
- dispatch<any>(goToView(SearchView.BASIC));
- dispatch(searchBarActions.SET_SEARCH_VALUE(searchValue));
+ dispatch(searchBarActions.SET_CURRENT_VIEW(SearchView.BASIC));
dispatch(searchBarActions.SET_SEARCH_RESULTS([]));
+ dispatch(searchBarActions.SELECT_FIRST_ITEM());
}
};
}),
SET_SEARCH_VALUE: searchValue => ({
...state,
- searchValue,
- selectedItem: makeSelectedItem(state.searchValue === state.selectedItem.id
- ? searchValue
- : state.selectedItem.id)
+ searchValue
}),
SET_SAVED_QUERIES: savedQueries => ({ ...state, savedQueries }),
SET_RECENT_QUERIES: recentQueries => ({ ...state, recentQueries }),
selectedItem
};
},
+ SELECT_FIRST_ITEM: () => {
+ let selectedItem = state.selectedItem;
+ if (state.currentView === SearchView.AUTOCOMPLETE) {
+ if (state.searchResults.length > 0) {
+ selectedItem = makeSelectedItem(state.searchResults[0].uuid);
+ }
+ } else if (state.currentView === SearchView.BASIC) {
+ const items = makeQueryList(state.recentQueries, state.savedQueries);
+ if (items.length > 0) {
+ selectedItem = items[0];
+ }
+ }
+ return {
+ ...state,
+ selectedItem
+ };
+ },
default: () => state
});