diff --git a/app/javascript/gabsocial/actions/links.js b/app/javascript/gabsocial/actions/links.js index 44ff2135..f6d72447 100644 --- a/app/javascript/gabsocial/actions/links.js +++ b/app/javascript/gabsocial/actions/links.js @@ -4,9 +4,17 @@ export const LINK_FETCH_REQUEST = 'LINK_FETCH_REQUEST' export const LINK_FETCH_SUCCESS = 'LINK_FETCH_SUCCESS' export const LINK_FETCH_FAIL = 'LINK_FETCH_FAIL' +export const POPULAR_LINKS_FETCH_REQUEST = 'POPULAR_LINKS_FETCH_REQUEST' +export const POPULAR_LINKS_FETCH_SUCCESS = 'POPULAR_LINKS_FETCH_SUCCESS' +export const POPULAR_LINKS_FETCH_FAIL = 'POPULAR_LINKS_FETCH_FAIL' + export const IMPORT_LINK_CARDS = 'IMPORT_LINK_CARDS' export const fetchLinkCard = (cardId) => (dispatch, getState) => { + //If card exists, don't refetch + const card = getState().getIn(['links', 'items', `${cardId}`]) + if (!!card) return + dispatch(fetchLinkCardRequest(cardId)) api(getState).get(`/api/v1/links/${cardId}`).then(({ data }) => { @@ -34,4 +42,30 @@ export const fetchLinkCardFail = (error, cardId) => ({ export const importLinkCards = (cards) => ({ type: IMPORT_LINK_CARDS, cards, -}) \ No newline at end of file +}) + +export const fetchPopularLinks = () => (dispatch, getState) => { + const isFetched = getState().getIn(['links', 'popular', 'isFetched'], false) + if (isFetched) return + + dispatch(fetchPopularLinksRequest()) + + api(getState).get(`/api/v1/popular_links?type=links`).then(({ data }) => { + dispatch(fetchPopularLinksSuccess(data)) + }) + .catch((err) => dispatch(fetchPopularLinksFail(err))) +} + +export const fetchPopularLinksRequest = () => ({ + type: POPULAR_LINKS_FETCH_REQUEST, +}) + +export const fetchPopularLinksSuccess = (cards) => ({ + type: POPULAR_LINKS_FETCH_SUCCESS, + cards, +}) + +export const fetchPopularLinksFail = (error) => ({ + type: POPULAR_LINKS_FETCH_FAIL, + error, +}) diff --git a/app/javascript/gabsocial/reducers/links.js b/app/javascript/gabsocial/reducers/links.js index 7b2ec9ff..aff1d92c 100644 --- a/app/javascript/gabsocial/reducers/links.js +++ b/app/javascript/gabsocial/reducers/links.js @@ -8,13 +8,20 @@ import { LINK_FETCH_SUCCESS, LINK_FETCH_FAIL, IMPORT_LINK_CARDS, + POPULAR_LINKS_FETCH_REQUEST, + POPULAR_LINKS_FETCH_SUCCESS, + POPULAR_LINKS_FETCH_FAIL, } from '../actions/links' const initialState = ImmutableMap({ isFetched: false, - isError: false, isLoading: false, items: ImmutableMap(), + popular: ImmutableMap({ + isLoading: false, + isFetched: false, + items: ImmutableList(), + }), }) export default function links(state = initialState, action) { @@ -26,20 +33,35 @@ export default function links(state = initialState, action) { mutable.setIn(['items', `${action.card.id}`], fromJS(action.card)) mutable.set('isLoading', false) mutable.set('isFetched', false) - mutable.set('isError', false) }) case IMPORT_LINK_CARDS: return state.withMutations((mutable) => { action.cards.forEach((card) => mutable.setIn(['items', `${card.id}`], fromJS(card))) mutable.set('isLoading', false) mutable.set('isFetched', false) - mutable.set('isError', false) }) case LINK_FETCH_FAIL: return state.withMutations((mutable) => { mutable.set('isLoading', false) mutable.set('isFetched', false) - mutable.set('isError', true) + }) + case POPULAR_LINKS_FETCH_REQUEST: + return state.setIn(['popular', 'isLoading'], true) + case POPULAR_LINKS_FETCH_SUCCESS: + return state.withMutations((mutable) => { + let popularIds = [] + action.cards.forEach((card) => { + mutable.setIn(['items', `${card.id}`], fromJS(card)) + popularIds.push(`${card.id}`) + }) + mutable.setIn(['popular', 'items'], fromJS(popularIds)) + mutable.setIn(['popular', 'isFetched'], true) + }) + case POPULAR_LINKS_FETCH_FAIL: + return state.withMutations((mutable) => { + mutable.setIn(['popular', 'isLoading'], false) + mutable.setIn(['popular', 'isFetched'], true) + mutable.setIn(['popular', 'items'], ImmutableList()) }) default: return state