You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
3.1 KiB
132 lines
3.1 KiB
import api from '../api'; |
|
import { fetchRelationships } from './accounts'; |
|
import { importFetchedAccounts, importFetchedStatuses } from './importer'; |
|
|
|
export const SEARCH_CHANGE = 'SEARCH_CHANGE'; |
|
export const SEARCH_CLEAR = 'SEARCH_CLEAR'; |
|
export const SEARCH_SHOW = 'SEARCH_SHOW'; |
|
|
|
export const SEARCH_FETCH_REQUEST = 'SEARCH_FETCH_REQUEST'; |
|
export const SEARCH_FETCH_SUCCESS = 'SEARCH_FETCH_SUCCESS'; |
|
export const SEARCH_FETCH_FAIL = 'SEARCH_FETCH_FAIL'; |
|
|
|
export const SEARCH_EXPAND_REQUEST = 'SEARCH_EXPAND_REQUEST'; |
|
export const SEARCH_EXPAND_SUCCESS = 'SEARCH_EXPAND_SUCCESS'; |
|
export const SEARCH_EXPAND_FAIL = 'SEARCH_EXPAND_FAIL'; |
|
|
|
export function changeSearch(value) { |
|
return { |
|
type: SEARCH_CHANGE, |
|
value, |
|
}; |
|
} |
|
|
|
export function clearSearch() { |
|
return { |
|
type: SEARCH_CLEAR, |
|
}; |
|
} |
|
|
|
export function submitSearch() { |
|
return (dispatch, getState) => { |
|
const value = getState().getIn(['search', 'value']); |
|
const signedIn = !!getState().getIn(['meta', 'me']); |
|
|
|
if (value.length === 0) { |
|
dispatch(fetchSearchSuccess({ accounts: [], statuses: [], hashtags: [] }, '')); |
|
return; |
|
} |
|
|
|
dispatch(fetchSearchRequest()); |
|
|
|
api(getState).get('/api/v2/search', { |
|
params: { |
|
q: value, |
|
resolve: signedIn, |
|
limit: 5, |
|
}, |
|
}).then(response => { |
|
if (response.data.accounts) { |
|
dispatch(importFetchedAccounts(response.data.accounts)); |
|
} |
|
|
|
if (response.data.statuses) { |
|
dispatch(importFetchedStatuses(response.data.statuses)); |
|
} |
|
|
|
dispatch(fetchSearchSuccess(response.data, value)); |
|
dispatch(fetchRelationships(response.data.accounts.map(item => item.id))); |
|
}).catch(error => { |
|
dispatch(fetchSearchFail(error)); |
|
}); |
|
}; |
|
} |
|
|
|
export function fetchSearchRequest() { |
|
return { |
|
type: SEARCH_FETCH_REQUEST, |
|
}; |
|
} |
|
|
|
export function fetchSearchSuccess(results, searchTerm) { |
|
return { |
|
type: SEARCH_FETCH_SUCCESS, |
|
results, |
|
searchTerm, |
|
}; |
|
} |
|
|
|
export function fetchSearchFail(error) { |
|
return { |
|
type: SEARCH_FETCH_FAIL, |
|
error, |
|
}; |
|
} |
|
|
|
export const expandSearch = type => (dispatch, getState) => { |
|
const value = getState().getIn(['search', 'value']); |
|
const offset = getState().getIn(['search', 'results', type]).size; |
|
|
|
dispatch(expandSearchRequest()); |
|
|
|
api(getState).get('/api/v2/search', { |
|
params: { |
|
q: value, |
|
type, |
|
offset, |
|
}, |
|
}).then(({ data }) => { |
|
if (data.accounts) { |
|
dispatch(importFetchedAccounts(data.accounts)); |
|
} |
|
|
|
if (data.statuses) { |
|
dispatch(importFetchedStatuses(data.statuses)); |
|
} |
|
|
|
dispatch(expandSearchSuccess(data, value, type)); |
|
dispatch(fetchRelationships(data.accounts.map(item => item.id))); |
|
}).catch(error => { |
|
dispatch(expandSearchFail(error)); |
|
}); |
|
}; |
|
|
|
export const expandSearchRequest = () => ({ |
|
type: SEARCH_EXPAND_REQUEST, |
|
}); |
|
|
|
export const expandSearchSuccess = (results, searchTerm, searchType) => ({ |
|
type: SEARCH_EXPAND_SUCCESS, |
|
results, |
|
searchTerm, |
|
searchType, |
|
}); |
|
|
|
export const expandSearchFail = error => ({ |
|
type: SEARCH_EXPAND_FAIL, |
|
error, |
|
}); |
|
|
|
export const showSearch = () => ({ |
|
type: SEARCH_SHOW, |
|
});
|
|
|