let user = {}; let tlCursor = null; let end = false; let linkColors = {}; let activeTweet; let subpage = new URLSearchParams(location.search).get('page'); let nid = new URLSearchParams(location.search).get('nid'); function updateUserData() { API.account.verifyCredentials().then(async u => { user = u; userDataFunction(u); renderUserData(); }).catch(e => { if (e === "Not logged in") { window.location.href = "https://twitter.com/i/flow/login?newtwitter=true"; } console.error(e); }); } // Render function renderUserData() { document.getElementById('user-name').innerText = user.name; document.getElementById('user-name').classList.toggle('user-verified', user.verified); document.getElementById('user-name').classList.toggle('user-protected', user.protected); document.getElementById('user-handle').innerText = `@${user.screen_name}`; document.getElementById('user-tweets').innerText = Number(user.statuses_count).toLocaleString().replace(/\s/g, ','); if(user.statuses_count >= 100000) { let style = document.createElement('style'); style.innerText = ` .user-stat-div > h1 { font-size: 18px !important } .user-stat-div > h2 { font-size: 13px !important } `; document.head.appendChild(style); } document.getElementById('user-following').innerText = Number(user.friends_count).toLocaleString().replace(/\s/g, ','); document.getElementById('user-followers').innerText = Number(user.followers_count).toLocaleString().replace(/\s/g, ','); document.getElementById('user-banner').src = user.profile_banner_url; document.getElementById('user-avatar').src = `${(user.default_profile_image && vars.useOldDefaultProfileImage) ? chrome.runtime.getURL(`images/default_profile_images/default_profile_${Number(user.id_str) % 7}_normal.png`): user.profile_image_url_https}`.replace("_normal", "_400x400"); document.getElementById('wtf-viewall').href = `https://twitter.com/i/connect_people?newtwitter=true&user_id=${user.id_str}`; document.getElementById('user-avatar-link').href = `https://twitter.com/${user.screen_name}`; document.getElementById('user-info').href = `https://twitter.com/${user.screen_name}`; document.getElementById('loading-box').hidden = true; if(vars.enableTwemoji) twemoji.parse(document.getElementById('user-name')); if(document.getElementById('user-stats').clientWidth > 300) { let style = document.createElement('style'); style.innerHTML = `.user-stat-div > h2 { font-size: 10px !important }`; document.head.appendChild(style); } } async function renderDeviceNotificationTimeline(cursor) { let tl = await API.notifications.getDeviceFollowTweets(cursor); let container = document.getElementById('timeline'); if (tl.cursor) { tlCursor = tl.cursor; } else { end = true; } tl = tl.list; if(tl.length === 0 && cursor) { end = true; return; } for (let i = 0; i < tl.length; i++) { let t = tl[i]; if (t.retweeted_status) { await appendTweet(t.retweeted_status, container, { bigFont: false, top: { text: `${escapeHTML(t.user.name)} ${LOC.retweeted.message}`, icon: "\uf006", color: "#77b255", class: 'retweet-label' } }); } else { await appendTweet(t, container, { bigFont: t.full_text.length < 75 }); } } } async function renderLikesTimeline() { document.getElementById("itl-header").innerText = LOC.likes.message; document.getElementsByTagName('title')[0].innerText = `${LOC.likes.message} - OldTwitter`; let tl = await API.notifications.view(nid); let tweetContainer = document.getElementById('timeline'); let userContainer = document.getElementById('user-list'); for(let i in tl) { let d = tl[i]; if(d.type === 'tweet') { if (d.data.retweeted_status) { await appendTweet(d.data.retweeted_status, tweetContainer, { bigFont: false, top: { text: `${escapeHTML(d.data.user.name)} ${LOC.retweeted.message}`, icon: "\uf006", color: "#77b255", class: 'retweet-label' } }); } else { await appendTweet(d.data, tweetContainer, { bigFont: d.data.full_text.length < 75 }); } } else if(d.type === 'user') { await appendUser(d.data, userContainer); } } } let lastScroll = Date.now(); let loadingNewTweets = false; let lastTweetDate = 0; setTimeout(async () => { if(!vars) { await loadVars(); } if(!subpage || !['likes', 'device_follow'].includes(subpage) || (subpage === 'likes' && !nid)) { location.href = 'https://twitter.com/home'; } // weird bug try { document.getElementById('wtf-refresh').addEventListener('click', async () => { renderDiscovery(false); }); } catch(e) { setTimeout(() => location.reload(), 500); console.error(e); return; } document.addEventListener('scroll', async () => { lastScroll = Date.now(); // find active tweet by scroll amount if(Date.now() - lastTweetDate > 50) { lastTweetDate = Date.now(); let tweets = Array.from(document.getElementsByClassName('tweet')); let scrollPoint = scrollY + innerHeight/2; let newActiveTweet = tweets.find(t => scrollPoint > t.offsetTop && scrollPoint < t.offsetTop + t.offsetHeight); if(!activeTweet || (newActiveTweet && !activeTweet.className.startsWith(newActiveTweet.className))) { if(activeTweet) { activeTweet.classList.remove('tweet-active'); } if(newActiveTweet) newActiveTweet.classList.add('tweet-active'); if(vars.autoplayVideos && !document.getElementsByClassName('modal')[0]) { if(activeTweet) { let video = activeTweet.querySelector('.tweet-media > video[controls]'); if(video) { video.pause(); } } if(newActiveTweet) { let newVideo = newActiveTweet.querySelector('.tweet-media > video[controls]'); let newVideoOverlay = newActiveTweet.querySelector('.tweet-media > .tweet-media-video-overlay'); if(newVideo && !newVideo.ended) { newVideo.play(); } else if(newVideoOverlay && !newVideoOverlay.style.display) { newVideoOverlay.click(); } } } activeTweet = newActiveTweet; } } // loading new tweets if (subpage === 'device_follow' && (window.innerHeight + window.scrollY) >= document.body.offsetHeight - 500 && !end) { if (loadingNewTweets) return; loadingNewTweets = true; await renderDeviceNotificationTimeline(tlCursor); setTimeout(() => { loadingNewTweets = false; }, 250); } }, { passive: true }); // Run updateUserData(); renderDiscovery(); renderTrends(); if(subpage === 'device_follow') renderDeviceNotificationTimeline(); else if(subpage === 'likes') renderLikesTimeline(); setInterval(updateUserData, 60000 * 3); setInterval(() => renderDiscovery(false), 60000 * 15); setInterval(renderTrends, 60000 * 5); }, 50);