-
Notifications
You must be signed in to change notification settings - Fork 4k
/
homePage.jsx
141 lines (117 loc) · 3.98 KB
/
homePage.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import { h, render } from 'preact';
/* global userData */
// This logic is similar to that in initScrolling.js.erb
const frontPageFeedPathNames = new Map([
['/', ''],
['/top/week', 'week'],
['/top/month', 'month'],
['/top/year', 'year'],
['/top/infinity', 'infinity'],
['/latest', 'latest'],
]);
const mainNavMoreTrigger = document.getElementById('main-nav-more-trigger');
function toggleMainNavMore() {
document.getElementById('main-nav-more').classList.remove('hidden');
mainNavMoreTrigger.classList.add('hidden');
}
if (mainNavMoreTrigger) {
mainNavMoreTrigger.addEventListener('click', toggleMainNavMore);
}
function toggleListingsMinimization() {
if (document.body.classList.contains('config_minimize_newest_listings')) {
// Un-minimize
localStorage.setItem('config_minimize_newest_listings', 'no');
document.body.classList.remove('config_minimize_newest_listings');
} else {
// Minimize
localStorage.setItem('config_minimize_newest_listings', 'yes');
document.body.classList.add('config_minimize_newest_listings');
}
}
const sidebarListingsMinimizeButton = document.getElementById(
'sidebar-listings-widget-minimize-button',
);
if (sidebarListingsMinimizeButton) {
sidebarListingsMinimizeButton.addEventListener(
'click',
toggleListingsMinimization,
);
}
/**
* Renders tags followed in the left side bar of the homepage.
*
* @param {HTMLElement} tagsFollowedContainer DOM element to render tags followed.
* @param {object} user The currently logged on user, null if not logged on.
*/
function renderTagsFollowed(tagsFollowedContainer, user = userData()) {
if (user === null || document.getElementById('followed-tags-wrapper')) {
return;
}
// Only render if a user is logged on.
import('../leftSidebar/TagsFollowed').then(({ TagsFollowed }) => {
const { followed_tags } = user; // eslint-disable-line camelcase
const followedTags = JSON.parse(followed_tags);
// This should be done server-side potentially
// sort tags by descending weight, descending popularity and name
followedTags.sort((tagA, tagB) => {
return (
tagB.points - tagA.points ||
tagB.hotness_score - tagA.hotness_score ||
tagA.name.localeCompare(tagB.name)
);
});
render(
<TagsFollowed tags={followedTags} />,
tagsFollowedContainer,
tagsFollowedContainer.firstElementChild,
);
});
}
const feedTimeFrame = frontPageFeedPathNames.get(window.location.pathname);
if (!document.getElementById('featured-story-marker')) {
const waitingForDataLoad = setInterval(function dataLoadedCheck() {
const { user = null, userStatus } = document.body.dataset;
if (userStatus === 'logged-out') {
return;
}
if (userStatus === 'logged-in' && user !== null) {
clearInterval(waitingForDataLoad);
import('./homePageFeed').then(({ renderFeed }) => {
// We have user data, render followed tags.
renderFeed(feedTimeFrame);
InstantClick.on('change', () => {
const { userStatus: currentUserStatus } = document.body.dataset;
if (currentUserStatus === 'logged-out') {
return;
}
const url = new URL(window.location);
const changedFeedTimeFrame = frontPageFeedPathNames.get(url.pathname);
if (!frontPageFeedPathNames.has(url.pathname)) {
return;
}
renderFeed(changedFeedTimeFrame);
});
});
renderTagsFollowed(document.getElementById('sidebar-nav-followed-tags'));
}
}, 2);
}
InstantClick.on('receive', (address, body, title) => {
if (document.body.dataset.userStatus !== 'logged-in') {
// Nothing to do, the user is not logged on.
return false;
}
const tagsFollowedContainer = body.querySelector(
'#sidebar-nav-followed-tags',
);
if (!tagsFollowedContainer) {
// Not on the homepage, so nothing to do.
return false;
}
renderTagsFollowed(tagsFollowedContainer);
return {
body,
title,
};
});
InstantClick.init();