diff --git a/app/assets/javascripts/actions/uploads_actions.js b/app/assets/javascripts/actions/uploads_actions.js index a15da975c5..c0cf2c306a 100644 --- a/app/assets/javascripts/actions/uploads_actions.js +++ b/app/assets/javascripts/actions/uploads_actions.js @@ -10,25 +10,34 @@ const fetchUploads = (courseId) => { if (res.ok && res.status === 200) { return res.json(); } - return Promise.reject(res); + return Promise.reject(new Error(`Failed to fetch uploads. Status: ${res.status}`)); }) .catch((error) => { logErrorMessage(error); + return { error: 'Failed to fetch uploads', status: error.status || 500 }; }); }; export const receiveUploads = courseId => (dispatch) => { - return ( - fetchUploads(courseId) - .then(resp => dispatch({ + return fetchUploads(courseId) + .then((resp) => { + if (!resp) { + return dispatch({ + type: API_FAIL, + data: { error: 'No response received' }, + }); + } + return dispatch({ type: RECEIVE_UPLOADS, data: resp, - })) - .catch(resp => dispatch({ + }); + }) + .catch((resp) => { + dispatch({ type: API_FAIL, - data: resp - })) - ); + data: resp, + }); + }); }; const fetchUploadMetadata = (uploads) => { diff --git a/app/assets/javascripts/reducers/uploads.js b/app/assets/javascripts/reducers/uploads.js index 69e90ed293..f5c256969e 100644 --- a/app/assets/javascripts/reducers/uploads.js +++ b/app/assets/javascripts/reducers/uploads.js @@ -30,7 +30,7 @@ const SORT_DESCENDING = { export default function uploads(state = initialState, action) { switch (action.type) { case RECEIVE_UPLOADS: { - const dataUploads = action.data.course.uploads; + const dataUploads = action.data?.course?.uploads || []; // Intial sorting by upload date const sortedModel = sortByKey(dataUploads, 'uploaded_at', state.sortKey, SORT_DESCENDING.uploaded_at); diff --git a/app/helpers/uploads_helper.rb b/app/helpers/uploads_helper.rb index 281081c876..9e4fc8c8e4 100644 --- a/app/helpers/uploads_helper.rb +++ b/app/helpers/uploads_helper.rb @@ -3,7 +3,7 @@ #= Helpers for course views module UploadsHelper def pretty_filename(upload) - pretty = upload.file_name + pretty = CGI.unescape(upload.file_name) pretty['File:'] = '' pretty end diff --git a/spec/helpers/uploads_helper_spec.rb b/spec/helpers/uploads_helper_spec.rb index 91ae000087..d03f4c2c99 100644 --- a/spec/helpers/uploads_helper_spec.rb +++ b/spec/helpers/uploads_helper_spec.rb @@ -10,5 +10,14 @@ result = pretty_filename(upload) expect(result).to eq('My file.jpg') end + + it 'formats a complex filename with encoded characters nicely for display' do + upload = build(:commons_upload, + # rubocop:disable Layout/LineLength + file_name: 'File%3AA+sunflower+%F0%9F%8C%BB%F0%9F%8C%BB+in+Kaduna+Polytechnic%2CSabo+Campus.jpg') + # rubocop:enable Layout/LineLength + result = pretty_filename(upload) + expect(result).to eq('A sunflower 🌻🌻 in Kaduna Polytechnic,Sabo Campus.jpg') + end end end