Changeset View
Changeset View
Standalone View
Standalone View
lib/reducers/report-store-reducer.js
// @flow | // @flow | ||||
import { | import { | ||||
sendReportActionTypes, | sendReportActionTypes, | ||||
sendReportsActionTypes, | sendReportsActionTypes, | ||||
queueReportsActionType, | queueReportsActionType, | ||||
} from '../actions/report-actions.js'; | } from '../actions/report-actions.js'; | ||||
import { siweAuthActionTypes } from '../actions/siwe-actions.js'; | import { siweAuthActionTypes } from '../actions/siwe-actions.js'; | ||||
import { | import { | ||||
logOutActionTypes, | logOutActionTypes, | ||||
deleteAccountActionTypes, | deleteAccountActionTypes, | ||||
logInActionTypes, | logInActionTypes, | ||||
} from '../actions/user-actions.js'; | } from '../actions/user-actions.js'; | ||||
import type { ReportStoreOperation } from '../ops/report-store-ops.js'; | |||||
import { isStaff } from '../shared/staff-utils.js'; | import { isStaff } from '../shared/staff-utils.js'; | ||||
import type { BaseAction } from '../types/redux-types.js'; | import type { BaseAction } from '../types/redux-types.js'; | ||||
import { | import { | ||||
type ReportStore, | type ReportStore, | ||||
defaultEnabledReports, | defaultEnabledReports, | ||||
defaultDevEnabledReports, | defaultDevEnabledReports, | ||||
type ClientReportCreationRequest, | type ClientReportCreationRequest, | ||||
} from '../types/report-types.js'; | } from '../types/report-types.js'; | ||||
import { setNewSessionActionType } from '../utils/action-utils.js'; | import { setNewSessionActionType } from '../utils/action-utils.js'; | ||||
import { isDev } from '../utils/dev-utils.js'; | import { isDev } from '../utils/dev-utils.js'; | ||||
import { isReportEnabled } from '../utils/report-utils.js'; | import { isReportEnabled } from '../utils/report-utils.js'; | ||||
export const updateReportsEnabledActionType = 'UPDATE_REPORTS_ENABLED'; | export const updateReportsEnabledActionType = 'UPDATE_REPORTS_ENABLED'; | ||||
export default function reduceReportStore( | export default function reduceReportStore( | ||||
state: ReportStore, | state: ReportStore, | ||||
action: BaseAction, | action: BaseAction, | ||||
newInconsistencies: $ReadOnlyArray<ClientReportCreationRequest>, | newInconsistencies: $ReadOnlyArray<ClientReportCreationRequest>, | ||||
): ReportStore { | ): { | ||||
reportStore: ReportStore, | |||||
reportStoreOperations: $ReadOnlyArray<ReportStoreOperation>, | |||||
} { | |||||
const updatedReports = | const updatedReports = | ||||
newInconsistencies.length > 0 | newInconsistencies.length > 0 | ||||
? [...state.queuedReports, ...newInconsistencies].filter(report => | ? [...state.queuedReports, ...newInconsistencies].filter(report => | ||||
isReportEnabled(report, state.enabledReports), | isReportEnabled(report, state.enabledReports), | ||||
) | ) | ||||
: state.queuedReports; | : state.queuedReports; | ||||
if (action.type === updateReportsEnabledActionType) { | if (action.type === updateReportsEnabledActionType) { | ||||
const newEnabledReports = { ...state.enabledReports, ...action.payload }; | const newEnabledReports = { ...state.enabledReports, ...action.payload }; | ||||
const filteredReports = updatedReports.filter(report => | const filteredReports = updatedReports.filter(report => | ||||
isReportEnabled(report, newEnabledReports), | isReportEnabled(report, newEnabledReports), | ||||
); | ); | ||||
return { | return { | ||||
reportStore: { | |||||
queuedReports: filteredReports, | queuedReports: filteredReports, | ||||
enabledReports: newEnabledReports, | enabledReports: newEnabledReports, | ||||
}, | |||||
reportStoreOperations: [], | |||||
}; | }; | ||||
} else if ( | } else if ( | ||||
action.type === logOutActionTypes.success || | action.type === logOutActionTypes.success || | ||||
action.type === deleteAccountActionTypes.success || | action.type === deleteAccountActionTypes.success || | ||||
(action.type === setNewSessionActionType && | (action.type === setNewSessionActionType && | ||||
action.payload.sessionChange.cookieInvalidated) | action.payload.sessionChange.cookieInvalidated) | ||||
) { | ) { | ||||
return { | return { | ||||
reportStore: { | |||||
queuedReports: [], | queuedReports: [], | ||||
enabledReports: isDev ? defaultDevEnabledReports : defaultEnabledReports, | enabledReports: isDev | ||||
? defaultDevEnabledReports | |||||
: defaultEnabledReports, | |||||
}, | |||||
reportStoreOperations: [], | |||||
}; | }; | ||||
} else if ( | } else if ( | ||||
action.type === logInActionTypes.success || | action.type === logInActionTypes.success || | ||||
action.type === siweAuthActionTypes.success | action.type === siweAuthActionTypes.success | ||||
) { | ) { | ||||
return { | return { | ||||
reportStore: { | |||||
queuedReports: [], | queuedReports: [], | ||||
enabledReports: | enabledReports: | ||||
isStaff(action.payload.currentUserInfo.id) || isDev | isStaff(action.payload.currentUserInfo.id) || isDev | ||||
? defaultDevEnabledReports | ? defaultDevEnabledReports | ||||
: defaultEnabledReports, | : defaultEnabledReports, | ||||
}, | |||||
reportStoreOperations: [], | |||||
}; | }; | ||||
} else if ( | } else if ( | ||||
(action.type === sendReportActionTypes.success || | (action.type === sendReportActionTypes.success || | ||||
action.type === sendReportsActionTypes.success) && | action.type === sendReportsActionTypes.success) && | ||||
action.payload | action.payload | ||||
) { | ) { | ||||
const { payload } = action; | const { payload } = action; | ||||
const unsentReports = updatedReports.filter( | const unsentReports = updatedReports.filter( | ||||
response => !payload.reports.includes(response), | response => !payload.reports.includes(response), | ||||
); | ); | ||||
if (unsentReports.length === updatedReports.length) { | if (unsentReports.length === updatedReports.length) { | ||||
return state; | return { reportStore: state, reportStoreOperations: [] }; | ||||
} | } | ||||
return { ...state, queuedReports: unsentReports }; | return { | ||||
reportStore: { ...state, queuedReports: unsentReports }, | |||||
reportStoreOperations: [], | |||||
}; | |||||
} else if (action.type === queueReportsActionType) { | } else if (action.type === queueReportsActionType) { | ||||
const { reports } = action.payload; | const { reports } = action.payload; | ||||
const filteredReports = [...updatedReports, ...reports].filter(report => | const filteredReports = [...updatedReports, ...reports].filter(report => | ||||
isReportEnabled(report, state.enabledReports), | isReportEnabled(report, state.enabledReports), | ||||
); | ); | ||||
return { | return { | ||||
reportStore: { | |||||
...state, | ...state, | ||||
queuedReports: filteredReports, | queuedReports: filteredReports, | ||||
}, | |||||
reportStoreOperations: [], | |||||
}; | }; | ||||
} | } | ||||
return updatedReports !== state.queuedReports | const reportStore = | ||||
updatedReports !== state.queuedReports | |||||
? { ...state, queuedReports: updatedReports } | ? { ...state, queuedReports: updatedReports } | ||||
: state; | : state; | ||||
return { reportStore, reportStoreOperations: [] }; | |||||
} | } |