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