import { observable, action, computed } from 'mobx' import { SavedSearchParamsItem, GetSavedSearchParamsResponseData, SavedSearchParamsItemType, SearchFilterItem, } from '../types/searchSelect' import { getSavedSearchParams, delSavedSearchParams, postSaveSearchParams } from '../utils/api' import { getSavedSearchParamsText, transformQToQuery } from '../utils/searchSelect' import main from './main' import searchTypeSelect from './searchTypeSelect' import searchPagination from './searchPagination' const HISTORY_SEARCH_PARAMS_LOCALSTORAGE_KEY = 'historySearchParams' class SavedSearchParams { /** * @description 保存的搜索条件 */ @observable savedSearchParams: SavedSearchParamsItem[] = [] @action.bound setSavedSearchParams(savedSearchParams: SavedSearchParamsItem[]) { Object.assign(this, { savedSearchParams }) } /** * @description 搜索条件历史记录 */ @observable historySearchParams: SavedSearchParamsItem[] = [] @action.bound setHistorySearchParams(historySearchParams: SavedSearchParamsItem[]) { Object.assign(this, { historySearchParams }) } @action.bound setHistorySearchParamsAndUpdateStorage(historySearchParams: SavedSearchParamsItem[]) { const { setHistorySearchParams } = this setHistorySearchParams(historySearchParams) localStorage.setItem( HISTORY_SEARCH_PARAMS_LOCALSTORAGE_KEY, JSON.stringify(historySearchParams) ) } @computed get allSavedSearchParams() { const { savedSearchParams, historySearchParams } = this return [...savedSearchParams, ...historySearchParams] } /** * @description 当前savedSearchParmasBar显示的是保存条件还是历史条件 */ @observable showType: SavedSearchParamsItemType = 'saved' @action.bound setShowType(showType: SavedSearchParamsItemType) { Object.assign(this, { showType }) } @action.bound switchShowType() { const { showType, setShowType } = this setShowType(showType === 'saved' ? 'history' : 'saved') } @computed get currentShowSearchParams() { const { showType, savedSearchParams, historySearchParams } = this return showType === 'saved' ? savedSearchParams : historySearchParams } @action.bound delSearchParams(index: number) { const { currentShowSearchParams, delSearchParamsSaved, delSearchParamsHistory } = this const { id, type } = currentShowSearchParams[index] if (type === 'saved') { delSearchParamsSaved(id) } else { delSearchParamsHistory(index) } } /** * @description 是否正在删除保存的搜索条件 */ @observable delingSearchParamsSaved: boolean = false @action.bound setDelingSearchParamsSaved(delingSearchParamsSaved: boolean) { Object.assign(this, { delingSearchParamsSaved }) } @action.bound async delSearchParamsSaved(id: number) { const { setDelingSearchParamsSaved, pullSavedSearchParams } = this setDelingSearchParamsSaved(true) const res = await delSavedSearchParams(id) setDelingSearchParamsSaved(false) if (!res) return false pullSavedSearchParams() return true } @action.bound delSearchParamsHistory(index: number) { const { historySearchParams, setHistorySearchParamsAndUpdateStorage } = this const willUpdate = [...historySearchParams] willUpdate.splice(index, 1) setHistorySearchParamsAndUpdateStorage(willUpdate) } /** * @description 是否正在拉取保存的搜索条件 */ @observable pullingSavedSearchParams: boolean = false @action.bound setPullingSavedSearchParams(pullingSavedSearchParams: boolean) { Object.assign(this, { pullingSavedSearchParams }) } @action.bound handlePullSavedSearchParamsResponse(res: GetSavedSearchParamsResponseData) { const { setSavedSearchParams } = this const { channelDict } = main const params = res.map(({ q, filters, id }) => ({ q, filter: filters, id, type: 'saved', str: getSavedSearchParamsText(q, filters, channelDict), })) setSavedSearchParams(params.splice(0, 5)) } @action.bound async pullSavedSearchParams() { const { setPullingSavedSearchParams, handlePullSavedSearchParamsResponse } = this setPullingSavedSearchParams(true) const res = await getSavedSearchParams() setPullingSavedSearchParams(false) if (!res) return false handlePullSavedSearchParamsResponse(res.data) } @action.bound getHistorySearchParams() { const { setHistorySearchParams } = this const params = JSON.parse( localStorage.getItem(HISTORY_SEARCH_PARAMS_LOCALSTORAGE_KEY) || '[]' ) as SavedSearchParamsItem[] setHistorySearchParams(params) } @action.bound async init() { const { hideSaveSearchParams } = main.config if (hideSaveSearchParams) return const { pullSavedSearchParams, getHistorySearchParams } = this await pullSavedSearchParams() getHistorySearchParams() const { savedSearchParams, allSavedSearchParams, setShowType } = this if (!allSavedSearchParams.length) return let showType: SavedSearchParamsItemType = 'saved' if (!savedSearchParams.length) showType = 'history' setShowType(showType) } @action.bound addSearchParamsHistory(q: string, filter: SearchFilterItem[]) { const { historySearchParams, setHistorySearchParamsAndUpdateStorage } = this const { channelDict } = main const str = getSavedSearchParamsText(q, filter, channelDict) const hasSameSearchParams = historySearchParams.find(({ str: _ }) => _ === str) if (hasSameSearchParams) return const willUpdate: SavedSearchParamsItem[] = [ { q, filter, type: 'history', id: Date.now(), str }, ...historySearchParams, ] willUpdate.splice(5) setHistorySearchParamsAndUpdateStorage(willUpdate) } /** * @description 是否正在保存搜索条件 */ @observable addingSearchParamsSaved: boolean = false @action.bound setAddingSearchParamsSaved(addingSearchParamsSaved: boolean) { Object.assign(this, { addingSearchParamsSaved }) } @action.bound async addSearchParamsSaved(q: string, filter: SearchFilterItem[]) { const { setAddingSearchParamsSaved, pullSavedSearchParams } = this setAddingSearchParamsSaved(true) const res = await postSaveSearchParams({ q, filter }) setAddingSearchParamsSaved(false) if (!res) return false pullSavedSearchParams() return true } @action.bound chooseSavedSearchParams(index: number) { const { currentShowSearchParams } = this const { setQuery, setFilters, setFoldAbleActiveFilter, searchCandidate } = main const { searchType } = searchTypeSelect const { initTotalAndPage } = searchPagination const { q, filter } = currentShowSearchParams[index] setQuery(transformQToQuery(q, searchType)) setFilters(filter) setFoldAbleActiveFilter(null) initTotalAndPage() searchCandidate() } } export default new SavedSearchParams()