100 lines
3 KiB
JavaScript
100 lines
3 KiB
JavaScript
import { getUserCounts } from '~/rest_api';
|
|
|
|
let channel;
|
|
|
|
function broadcastCount(newCount) {
|
|
if (!channel) {
|
|
return;
|
|
}
|
|
|
|
channel.postMessage(newCount);
|
|
}
|
|
|
|
function updateUserMergeRequestCounts(newCount) {
|
|
const mergeRequestsCountEl = document.querySelector('.js-assigned-mr-count');
|
|
mergeRequestsCountEl.textContent = newCount.toLocaleString();
|
|
}
|
|
|
|
function updateReviewerMergeRequestCounts(newCount) {
|
|
const mergeRequestsCountEl = document.querySelector('.js-reviewer-mr-count');
|
|
mergeRequestsCountEl.textContent = newCount.toLocaleString();
|
|
}
|
|
|
|
function updateMergeRequestCounts(newCount) {
|
|
const mergeRequestsCountEl = document.querySelector('.js-merge-requests-count');
|
|
mergeRequestsCountEl.textContent = newCount.toLocaleString();
|
|
mergeRequestsCountEl.classList.toggle('gl-display-none', Number(newCount) === 0);
|
|
}
|
|
|
|
function updateAttentionRequestsCount(count) {
|
|
const attentionCountEl = document.querySelector('.js-attention-count');
|
|
attentionCountEl.textContent = count.toLocaleString();
|
|
|
|
if (Number(count) === 0) {
|
|
attentionCountEl.classList.replace('badge-warning', 'badge-neutral');
|
|
} else {
|
|
attentionCountEl.classList.replace('badge-neutral', 'badge-warning');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Refresh user counts (and broadcast if open)
|
|
*/
|
|
export function refreshUserMergeRequestCounts() {
|
|
return getUserCounts()
|
|
.then(({ data }) => {
|
|
const attentionRequestsEnabled = window.gon?.features?.mrAttentionRequests;
|
|
const assignedMergeRequests = data.assigned_merge_requests;
|
|
const reviewerMergeRequests = data.review_requested_merge_requests;
|
|
const attentionRequests = data.attention_requests;
|
|
const fullCount = attentionRequestsEnabled
|
|
? attentionRequests
|
|
: assignedMergeRequests + reviewerMergeRequests;
|
|
|
|
updateUserMergeRequestCounts(assignedMergeRequests);
|
|
updateReviewerMergeRequestCounts(reviewerMergeRequests);
|
|
updateMergeRequestCounts(fullCount);
|
|
broadcastCount(fullCount);
|
|
|
|
if (attentionRequestsEnabled) {
|
|
updateAttentionRequestsCount(attentionRequests);
|
|
}
|
|
})
|
|
.catch((ex) => {
|
|
console.error(ex); // eslint-disable-line no-console
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Close the broadcast channel for user counts
|
|
*/
|
|
export function closeUserCountsBroadcast() {
|
|
if (!channel) {
|
|
return;
|
|
}
|
|
|
|
channel.close();
|
|
channel = null;
|
|
}
|
|
|
|
/**
|
|
* Open the broadcast channel for user counts, adds user id so we only update
|
|
*
|
|
* **Please note:**
|
|
* Not supported in all browsers, but not polyfilling for now
|
|
* to keep bundle size small and
|
|
* no special functionality lost except cross tab notifications
|
|
*/
|
|
export function openUserCountsBroadcast() {
|
|
closeUserCountsBroadcast();
|
|
|
|
if (window.BroadcastChannel) {
|
|
const currentUserId = typeof gon !== 'undefined' && gon && gon.current_user_id;
|
|
if (currentUserId) {
|
|
channel = new BroadcastChannel(`mr_count_channel_${currentUserId}`);
|
|
channel.onmessage = (ev) => {
|
|
updateMergeRequestCounts(ev.data);
|
|
};
|
|
}
|
|
}
|
|
}
|