docbrown/app/assets/javascripts/initializers/initializeBaseUserData.js
Nick Taylor 0119918237
Homepage left side bar tags followed (#5918) [deploy]
* SASS formatting in action.

* Unnested .sidebar-nav-element in SASS

* Created the <TagsFollowed /> component.

* Mini refactor.

* Left side bar uses <TagsFollowed /> component now.

* Accomodating InstantClick

* Small refactor and added some comments.

* The homepage webpacker pack only needs to be loaded once.

* Added tests for the <TagsFollowed /> component.

* Modified the receive InstantClick callback as per their docs.

* Reverted the data-no-instant on he homepage bundle. It seems to cause issues in certain scenarios.

* Just some tweaks to <TagsFollowed /> component.

* Removed CSS for general img tag in context of sidebar as it does not appear to be used.

* Fixed copy paste error from JSX to HTML.

* Fixed <img /> styles for arbitrary sponsorship widget.

* Fixed a regression that a Capybara test caught.

* Fixed user followed tags on home page tests.

* Fixed logic for loading user data on homepage.
2020-02-11 12:09:23 -05:00

124 lines
3.7 KiB
JavaScript

'use strict';
/* global userData, filterXSS */
function initializeUserProfileContent(user) {
document.getElementById('sidebar-profile-pic').innerHTML =
'<img alt="' +
user.username +
'" class="sidebar-profile-pic-img" src="' +
user.profile_image_90 +
'" />';
document.getElementById('sidebar-profile-name').innerHTML = filterXSS(
user.name,
);
document.getElementById('sidebar-profile-username').innerHTML =
'@' + user.username;
document.getElementById('sidebar-profile-snapshot-inner').href =
'/' + user.username;
}
function initializeUserSidebar(user) {
if (!document.getElementById('sidebar-nav')) return;
initializeUserProfileContent(user);
let followedTags = JSON.parse(user.followed_tags);
const tagSeparatorLabel =
followedTags.length === 0
? 'Follow tags to improve your feed'
: 'Other Popular Tags';
followedTags.forEach(tag => {
const element = document.getElementById(
'default-sidebar-element-' + tag.name,
);
if (element) {
element.remove();
}
});
document.getElementById('tag-separator').innerHTML = tagSeparatorLabel;
document.getElementById('sidebar-nav-default-tags').classList.add('showing');
}
function addRelevantButtonsToArticle(user) {
var articleContainer = document.getElementById('article-show-container');
if (articleContainer) {
if (parseInt(articleContainer.dataset.authorId, 10) === user.id) {
let actions = [
`<a href="${articleContainer.dataset.path}/edit" rel="nofollow">EDIT</a>`,
];
if (JSON.parse(articleContainer.dataset.published) === true) {
actions.push(
`<a href="${articleContainer.dataset.path}/manage" rel="nofollow">MANAGE</a>`,
);
}
if (user.pro) {
actions.push(
`<a href="${articleContainer.dataset.path}/stats" rel="nofollow">STATS</a>`,
);
}
document.getElementById('action-space').innerHTML = actions.join('');
} else if (user.trusted) {
document.getElementById('action-space').innerHTML =
'<a href="' +
articleContainer.dataset.path +
'/mod" rel="nofollow">MODERATE <span class="post-word">POST</span></a>';
}
}
}
function addRelevantButtonsToComments(user) {
if (document.getElementById('comments-container')) {
// buttons are actually <span>'s
var settingsButts = document.getElementsByClassName('comment-actions');
for (let i = 0; i < settingsButts.length; i += 1) {
let butt = settingsButts[i];
const { action, commentableUserId, userId } = butt.dataset;
if (parseInt(userId, 10) === user.id) {
butt.style.display = 'inline-block';
}
if (
action === 'hide-button' &&
parseInt(commentableUserId, 10) === user.id
) {
butt.style.display = 'inline-block';
} else if (
action === 'hide-button' &&
parseInt(commentableUserId, 10) !== user.id
) {
butt.style.display = 'none';
}
}
if (user.trusted) {
var modButts = document.getElementsByClassName('mod-actions');
for (let i = 0; i < modButts.length; i += 1) {
let butt = modButts[i];
butt.className = 'mod-actions';
butt.style.display = 'inline-block';
}
}
}
}
function initializeBaseUserData() {
const user = userData();
const userProfileLinkHTML =
'<a href="/' +
user.username +
'" id="first-nav-link"><div class="option prime-option">@' +
user.username +
'</div></a>';
document.getElementById(
'user-profile-link-placeholder',
).innerHTML = userProfileLinkHTML;
document.getElementById('nav-profile-image').src = user.profile_image_90;
initializeUserSidebar(user);
addRelevantButtonsToArticle(user);
addRelevantButtonsToComments(user);
}