Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove jQuery AJAX from the archive download links #29380

Merged
merged 4 commits into from
Feb 25, 2024
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 23 additions & 31 deletions web_src/js/features/repo-common.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,30 @@
import $ from 'jquery';
import {hideElem, showElem} from '../utils/dom.js';
import {POST} from '../modules/fetch.js';

const {csrfToken} = window.config;
async function getArchive($target, url, first) {
silverwind marked this conversation as resolved.
Show resolved Hide resolved
const response = await POST(url);
if (response.status === 200) {
const data = await response.json();
if (!data) {
// XXX Shouldn't happen?
$target.closest('.dropdown').children('i').removeClass('loading');
Copy link
Member

@silverwind silverwind Feb 24, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

put the loading removal in a finally clause . This is important because fetch will throw on network errors.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It shouldn't happen always so I put it in a catch but anyway these loading indicators are not working

Copy link
Member

@silverwind silverwind Feb 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now you have 3 code branches that remove the indicator, while a single finally would be sufficient as long as you don't return inside the try. Actually I think a finally may even execute when you return.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Now you have 3 code branches that remove the indicator, while a single finally would be sufficient as long as you don't return inside the try. Actually I think a finally may even execute when you return.

Yes, finally executes always, even after return

Copy link
Member

@silverwind silverwind Feb 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In fact it does:

(() => {
  try {
    return console.log('a');
  } finally {
    console.log('b');
  }
})();

Logs both "a" and "b".

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the case complete is false we don't want to remove the loading indicator

Copy link
Member

@silverwind silverwind Feb 25, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about setting a let isComplete = true variable before the fetch, set it to false conditionally and check it during indicator removal and before the recursion?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code as it is right now has the same behavior as before. Logic changes should not go in this PR

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The code reads like ass but previous one did too, so whatever.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed on that front

return;
}

function getArchive($target, url, first) {
$.ajax({
url,
type: 'POST',
data: {
_csrf: csrfToken,
},
complete(xhr) {
if (xhr.status === 200) {
if (!xhr.responseJSON) {
// XXX Shouldn't happen?
$target.closest('.dropdown').children('i').removeClass('loading');
return;
}

if (!xhr.responseJSON.complete) {
$target.closest('.dropdown').children('i').addClass('loading');
// Wait for only three quarters of a second initially, in case it's
// quickly archived.
setTimeout(() => {
getArchive($target, url, false);
}, first ? 750 : 2000);
} else {
// We don't need to continue checking.
$target.closest('.dropdown').children('i').removeClass('loading');
window.location.href = url;
}
}
},
});
if (!data.complete) {
$target.closest('.dropdown').children('i').addClass('loading');
// Wait for only three quarters of a second initially, in case it's
// quickly archived.
setTimeout(() => {
getArchive($target, url, false);
}, first ? 750 : 2000);
} else {
// We don't need to continue checking.
$target.closest('.dropdown').children('i').removeClass('loading');
window.location.href = url;
}
}
}

export function initRepoArchiveLinks() {
Expand Down
Loading