Browse Source

Auto-update reaction avatars (#634)

master
Federico Brigante 7 years ago
committed by Sindre Sorhus
parent
commit
08d6ade60b
  1. 17
      extension/content.css
  2. 3
      src/content.js
  3. 96
      src/libs/reactions-avatars.js

17
extension/content.css

@ -411,7 +411,7 @@ we will add it back on for the simple news alerts we decide to show
} }
/* Styles for avatars Refined GitHub adds to Reactions */ /* Styles for avatars Refined GitHub adds to Reactions */
.participants-container { .rgh-reactions a:first-of-type {
margin-left: 4px; margin-left: 4px;
} }
@ -424,31 +424,30 @@ we will add it back on for the simple news alerts we decide to show
padding-right: 0 !important; padding-right: 0 !important;
} }
.reaction-summary-item div, .reaction-summary-item a,
.reaction-summary-item div a, .reaction-summary-item img {
.reaction-summary-item div img {
display: inline-block; display: inline-block;
} }
.reaction-summary-item div a { .reaction-summary-item a {
margin-left: -2px; margin-left: -2px;
transition: margin-left 0.2s; transition: margin-left 0.2s;
} }
.reaction-summary-item div img, .reaction-summary-item img,
.reaction-summary-item div span { .reaction-summary-item span {
width: 20px; width: 20px;
height: 20px; height: 20px;
vertical-align: middle; vertical-align: middle;
} }
.reaction-summary-item div img { .reaction-summary-item img {
color: #FFF; /* affects box-shadow */ color: #FFF; /* affects box-shadow */
box-shadow: 0 0 0 2px; box-shadow: 0 0 0 2px;
border-radius: 3px; border-radius: 3px;
} }
.reaction-summary-item.user-has-reacted div img { .reaction-summary-item.user-has-reacted img {
color: #f2f8fa; color: #f2f8fa;
} }

3
src/content.js

@ -640,8 +640,7 @@ async function onDomReady() {
} }
if (pageDetect.isPR() || pageDetect.isIssue() || pageDetect.isCommit()) { if (pageDetect.isPR() || pageDetect.isIssue() || pageDetect.isCommit()) {
addReactionParticipants.add(username); addReactionParticipants();
addReactionParticipants.addListener(username);
showRealNames(); showRealNames();
} }

96
src/libs/reactions-avatars.js

@ -1,72 +1,34 @@
import debounce from 'debounce-fn';
import select from 'select-dom';
import {h} from 'dom-chef'; import {h} from 'dom-chef';
import {emptyElement} from './utils'; import {getUsername} from './utils';
function add(currentUser) { function add() {
$('.comment-reactions.has-reactions').each((index, reactionsContainer) => { const currentUser = getUsername();
const $reactionsContainer = $(reactionsContainer); for (const element of select.all(`
const $reactionButtons = $reactionsContainer.find('.comment-reactions-options .reaction-summary-item[aria-label]'); .comment-reactions.has-reactions
.comment-reactions-options
$reactionButtons.each((index, element) => { .reaction-summary-item[aria-label]:not(.rgh-reactions)
const $element = $(element); `)) {
const participantCount = Number($element.html().split('/g-emoji>')[1]); element.classList.add('rgh-reactions');
const participants = $element.attr('aria-label') const participants = element.getAttribute('aria-label')
.replace(/ reacted with.*/, '') .replace(/ reacted with.*/, '')
.replace(/,? and /, ', ') .replace(/,? and /, ', ')
.replace(/, \d+ more/, '') .replace(/, \d+ more/, '')
.split(', '); .split(', ')
const userPosition = participants.indexOf(currentUser); .filter(username => username !== currentUser)
.filter((u, i) => i < 3) // Limit to 3 avatars
// If the user is the only participant, leave as is .map(user => (
if (participantCount === 1 && userPosition > -1) { <a href={`/${user}`}>
return; <img src={`/${user}.png`}/>
} </a>
));
// Add participant container
if (!element.querySelector('div.participants-container')) { element.append(...participants);
element.append(<div class="participants-container"></div>);
}
// Remove self from participant list so you don't see your own avatar
if (userPosition > -1) {
participants.splice(userPosition, 1);
}
const firstThreeParticipants = participants.slice(0, 3);
const participantsContainer = element.querySelector('.participants-container');
// Clear any existing avatars and remainder count
emptyElement(participantsContainer);
for (const participant of firstThreeParticipants) {
participantsContainer.append(
<a href={`/${participant}`}>
<img src={`/${participant}.png`}/>
</a>
);
}
});
});
}
function reapply(event, currentUser) {
if ($(event.target).closest('.add-reactions-options-item, .reaction-summary-item').not('.add-reaction-btn').length === 0) {
return;
} }
const applyReactions = setInterval(() => {
add(currentUser);
clearInterval(applyReactions);
}, 500);
}
function addListener(currentUser) {
$(document).on('click', event => {
reapply(event, currentUser);
});
} }
export default { export default () => {
add, add();
reapply, document.addEventListener('socket:message', debounce(add, {wait: 100}));
addListener
}; };

Loading…
Cancel
Save