1import { DashboardQuery, SearchQueryParams, SearchAction, SearchLayout } from '../types';
2import {
3  ADD_TAG,
4  CLEAR_FILTERS,
5  LAYOUT_CHANGE,
6  QUERY_CHANGE,
7  REMOVE_STARRED,
8  REMOVE_TAG,
9  SET_TAGS,
10  TOGGLE_SORT,
11  TOGGLE_STARRED,
12} from './actionTypes';
13
14export const defaultQuery: DashboardQuery = {
15  query: '',
16  tag: [],
17  starred: false,
18  skipRecent: false,
19  skipStarred: false,
20  folderIds: [],
21  sort: null,
22  layout: SearchLayout.Folders,
23  prevSort: null,
24};
25
26export const defaultQueryParams: SearchQueryParams = {
27  sort: null,
28  starred: null,
29  query: null,
30  tag: null,
31  layout: null,
32};
33
34export const queryReducer = (state: DashboardQuery, action: SearchAction) => {
35  switch (action.type) {
36    case QUERY_CHANGE:
37      return { ...state, query: action.payload };
38    case REMOVE_TAG:
39      return { ...state, tag: state.tag.filter((t) => t !== action.payload) };
40    case SET_TAGS:
41      return { ...state, tag: action.payload };
42    case ADD_TAG: {
43      const tag = action.payload;
44      return tag && !state.tag.includes(tag) ? { ...state, tag: [...state.tag, tag] } : state;
45    }
46    case TOGGLE_STARRED:
47      return { ...state, starred: action.payload };
48    case REMOVE_STARRED:
49      return { ...state, starred: false };
50    case CLEAR_FILTERS:
51      return { ...state, query: '', tag: [], starred: false, sort: null };
52    case TOGGLE_SORT: {
53      const sort = action.payload;
54      if (state.layout === SearchLayout.Folders) {
55        return { ...state, sort, layout: SearchLayout.List };
56      }
57      return { ...state, sort };
58    }
59    case LAYOUT_CHANGE: {
60      const layout = action.payload;
61      if (state.sort && layout === SearchLayout.Folders) {
62        return { ...state, layout, sort: null, prevSort: state.sort };
63      }
64      return { ...state, layout, sort: state.prevSort };
65    }
66    default:
67      return state;
68  }
69};
70