From 5446ee64227043b1d3cb288077dbda7377b63c02 Mon Sep 17 00:00:00 2001 From: gbutler Date: Fri, 19 Jun 2026 11:47:56 -0500 Subject: [PATCH] fix(speakers): avoid refetching activities count on page, sort, and search changes Activities count only depends on filters, not on pagination, sort order, or search term. Extracted getSpeakersActivitiesCount and getSubmittersActivitiesCount as standalone exported actions and moved the dispatch to getBySummit in the page, skipping it for handlePageChange, handleSort, and handleSearch. --- src/actions/speaker-actions.js | 13 ++- src/actions/submitter-actions.js | 15 +-- .../summit-speakers-list-page.js | 99 +++++++++++++------ 3 files changed, 87 insertions(+), 40 deletions(-) diff --git a/src/actions/speaker-actions.js b/src/actions/speaker-actions.js index 1b25d275c..85f6c6c73 100644 --- a/src/actions/speaker-actions.js +++ b/src/actions/speaker-actions.js @@ -887,14 +887,19 @@ const parseFilters = (filters) => { return filter; }; -const getSpeakersActivitiesCount = - (summitId, filter, accessToken) => (dispatch) => { +export const getSpeakersActivitiesCount = + (filters = {}) => + async (dispatch, getState) => { + const { currentSummitState } = getState(); + const accessToken = await getAccessTokenSafely(); + const { currentSummit } = currentSummitState; + const filter = parseFilters(filters); const params = { access_token: accessToken }; if (filter.length > 0) params["filter[]"] = filter; return getRequest( createAction(REQUEST_SPEAKERS_ACTIVITIES_COUNT), createAction(RECEIVE_SPEAKERS_ACTIVITIES_COUNT), - `${window.API_BASE_URL}/api/v1/summits/${summitId}/speakers/all/events/count`, + `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/speakers/all/events/count`, authErrorHandler )(params)(dispatch); }; @@ -945,8 +950,6 @@ export const getSpeakersBySummit = params.order = `${orderDirSign}${order}`; } - dispatch(getSpeakersActivitiesCount(currentSummit.id, filter, accessToken)); - return getRequest( createAction(REQUEST_SPEAKERS_BY_SUMMIT), createAction(RECEIVE_SPEAKERS_BY_SUMMIT), diff --git a/src/actions/submitter-actions.js b/src/actions/submitter-actions.js index 906be372d..7fd80f462 100644 --- a/src/actions/submitter-actions.js +++ b/src/actions/submitter-actions.js @@ -51,14 +51,19 @@ export const initSubmittersList = () => async (dispatch) => { dispatch(createAction(INIT_SUBMITTERS_LIST_PARAMS)()); }; -const getSubmittersActivitiesCount = - (summitId, filter, accessToken) => (dispatch) => { +export const getSubmittersActivitiesCount = + (filters = {}) => + async (dispatch, getState) => { + const { currentSummitState } = getState(); + const accessToken = await getAccessTokenSafely(); + const { currentSummit } = currentSummitState; + const filter = parseFilters(filters); const params = { access_token: accessToken }; if (filter.length > 0) params["filter[]"] = filter; return getRequest( createAction(REQUEST_SUBMITTERS_ACTIVITIES_COUNT), createAction(RECEIVE_SUBMITTERS_ACTIVITIES_COUNT), - `${window.API_BASE_URL}/api/v1/summits/${summitId}/submitters/all/events/count`, + `${window.API_BASE_URL}/api/v1/summits/${currentSummit.id}/submitters/all/events/count`, authErrorHandler )(params)(dispatch); }; @@ -113,10 +118,6 @@ export const getSubmittersBySummit = params.order = `${orderDirSign}${order}`; } - dispatch( - getSubmittersActivitiesCount(currentSummit.id, filter, accessToken) - ); - return getRequest( createAction(REQUEST_SUBMITTERS_BY_SUMMIT), createAction(RECEIVE_SUBMITTERS_BY_SUMMIT), diff --git a/src/pages/summit_speakers/summit-speakers-list-page.js b/src/pages/summit_speakers/summit-speakers-list-page.js index c21f1cd52..e64a9409b 100644 --- a/src/pages/summit_speakers/summit-speakers-list-page.js +++ b/src/pages/summit_speakers/summit-speakers-list-page.js @@ -24,6 +24,7 @@ import SpeakerPromoCodeSpecForm from "../../components/forms/speakers-promo-code import { initSpeakersList, getSpeakersBySummit, + getSpeakersActivitiesCount, exportSummitSpeakers, selectSummitSpeaker, unselectSummitSpeaker, @@ -35,6 +36,7 @@ import { import { initSubmittersList, getSubmittersBySummit, + getSubmittersActivitiesCount, exportSummitSubmitters, selectSummitSubmitter, unselectSummitSubmitter, @@ -146,13 +148,28 @@ class SummitSpeakersListPage extends React.Component { : this.props.submittersProps; } - getBySummit(term, page, perPage, order, orderDir, filters) { + getBySummit( + term, + page, + perPage, + order, + orderDir, + filters, + refreshCount = true + ) { const { source } = this.state; const callable = source === sources.speakers ? this.props.getSpeakersBySummit : this.props.getSubmittersBySummit; callable(term, page, perPage, order, orderDir, filters, source); + if (refreshCount) { + const countCallable = + source === sources.speakers + ? this.props.getSpeakersActivitiesCount + : this.props.getSubmittersActivitiesCount; + countCallable(filters); + } } export(term, order, orderDir, filters) { @@ -220,15 +237,23 @@ class SummitSpeakersListPage extends React.Component { const { speakerFilters: { orAndFilter } } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.getBySummit( + term, + page, + perPage, + order, + orderDir, + { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + orAndFilter, + mediaUploadTypeFilter + }, + false + ); } handleSort(index, key, dir) { @@ -246,15 +271,23 @@ class SummitSpeakersListPage extends React.Component { const { speakerFilters: { orAndFilter } } = this.state; - this.getBySummit(term, page, perPage, key, dir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.getBySummit( + term, + page, + perPage, + key, + dir, + { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + orAndFilter, + mediaUploadTypeFilter + }, + false + ); } handleSearch(term) { @@ -273,15 +306,23 @@ class SummitSpeakersListPage extends React.Component { const { speakerFilters: { orAndFilter } } = this.state; - this.getBySummit(term, page, perPage, order, orderDir, { - selectionPlanFilter, - trackFilter, - trackGroupFilter, - activityTypeFilter, - selectionStatusFilter, - orAndFilter, - mediaUploadTypeFilter - }); + this.getBySummit( + term, + page, + perPage, + order, + orderDir, + { + selectionPlanFilter, + trackFilter, + trackGroupFilter, + activityTypeFilter, + selectionStatusFilter, + orAndFilter, + mediaUploadTypeFilter + }, + false + ); } handleChangeSelectionPlanFilter(ev) { @@ -1222,6 +1263,7 @@ const mapStateToProps = ({ export default connect(mapStateToProps, { initSpeakersList, getSpeakersBySummit, + getSpeakersActivitiesCount, exportSummitSpeakers, selectSummitSpeaker, unselectSummitSpeaker, @@ -1231,6 +1273,7 @@ export default connect(mapStateToProps, { sendSpeakerEmails, initSubmittersList, getSubmittersBySummit, + getSubmittersActivitiesCount, exportSummitSubmitters, selectSummitSubmitter, unselectSummitSubmitter,