class TweetViewer {
constructor(user, tweetData) {
let previousLocation = location.pathname + location.search;
this.container = createModal(/*html*/`
${escapeHTML(t.user.name)}
@${t.user.screen_name}
${options.mainTweet && t.user.id_str !== user.id_str ? `` : ''}
${vars.useOldStyleReply ? /*html*/mentionedUserText: ''}${full_text ? await renderTweetBodyHTML(full_text, t.entities, t.display_text_range) : ''}
${!isEnglish ? /*html*/`
` : ``}
${t.extended_entities && t.extended_entities.media ? /*html*/`
${t.extended_entities && t.extended_entities.media && t.extended_entities.media.some(m => m.type === 'animated_gif') ? `` : ''}
${videos ? /*html*/`
` : ``}
` : ``}
${t.card ? `` : ''}
${t.quoted_status ? /*html*/`
${quoteMentionedUserText !== `` && !vars.useOldStyleReply ? /*html*/`
` : ''}
${vars.useOldStyleReply? quoteMentionedUserText : ''}${t.quoted_status.full_text ? await renderTweetBodyHTML(t.quoted_status.full_text, t.quoted_status.entities, t.quoted_status.display_text_range, true) : ''}
${t.quoted_status.extended_entities && t.quoted_status.extended_entities.media ? /*html*/`
` : ''}
` : ``}
${t.limited_actions === 'limit_trusted_friends_tweet' && options.mainTweet ? `
`.replace('$SCREEN_NAME$', tweetStorage[t.conversation_id_str] ? tweetStorage[t.conversation_id_str].user.screen_name : t.in_reply_to_screen_name ? t.in_reply_to_screen_name : t.user.screen_name) : ''}
${t.tombstone ? `` : ''}
${((t.withheld_in_countries && (t.withheld_in_countries.includes("XX") || t.withheld_in_countries.includes("XY"))) || t.withheld_scope) ? `` : ''}
${t.conversation_control ? `` : ''}
${options.mainTweet ? /*html*/`
` : ''}
`;
// video
let vidOverlay = tweet.getElementsByClassName('tweet-media-video-overlay')[0];
if(vidOverlay) {
vidOverlay.addEventListener('click', () => {
let vid = Array.from(tweet.getElementsByClassName('tweet-media')[0].children).filter(e => e.tagName === 'VIDEO')[0];
vid.play();
vid.controls = true;
vid.classList.remove('tweet-media-element-censor');
vidOverlay.style.display = 'none';
});
}
if(videos) {
let vids = Array.from(tweet.getElementsByClassName('tweet-media')[0].children).filter(e => e.tagName === 'VIDEO');
vids[0].onloadstart = () => {
let src = vids[0].currentSrc;
Array.from(tweet.getElementsByClassName('tweet-video-quality')).forEach(el => {
if(el.dataset.url === src) el.classList.add('tweet-video-quality-current');
});
tweet.getElementsByClassName('tweet-video-reload')[0].addEventListener('click', () => {
let vid = Array.from(tweet.getElementsByClassName('tweet-media')[0].children).filter(e => e.tagName === 'VIDEO')[0];
let time = vid.currentTime;
let paused = vid.paused;
vid.load();
vid.onloadstart = () => {
let src = vid.currentSrc;
vid.currentTime = time;
if(!paused) vid.play();
Array.from(tweet.getElementsByClassName('tweet-video-quality')).forEach(el => {
if(el.dataset.url === src.split('&ttd=')[0]) el.classList.add('tweet-video-quality-current');
else el.classList.remove('tweet-video-quality-current');
});
}
});
Array.from(tweet.getElementsByClassName('tweet-video-quality')).forEach(el => el.addEventListener('click', () => {
if(el.className.includes('tweet-video-quality-current')) return;
localStorage.preferredQuality = parseInt(el.innerText);
let vid = Array.from(tweet.getElementsByClassName('tweet-media')[0].children).filter(e => e.tagName === 'VIDEO')[0];
let time = vid.currentTime;
let paused = vid.paused;
for(let v of videos) {
let closestQuality = v.video_info.variants.filter(v => v.bitrate).reduce((prev, curr) => {
return (Math.abs(parseInt(curr.url.match(/\/(\d+)x/)[1]) - parseInt(localStorage.preferredQuality)) < Math.abs(parseInt(prev.url.match(/\/(\d+)x/)[1]) - parseInt(localStorage.preferredQuality)) ? curr : prev);
});
let preferredQualityVariantIndex = v.video_info.variants.findIndex(v => v.url === closestQuality.url);
if(preferredQualityVariantIndex !== -1) {
let preferredQualityVariant = v.video_info.variants[preferredQualityVariantIndex];
v.video_info.variants.splice(preferredQualityVariantIndex, 1);
v.video_info.variants.unshift(preferredQualityVariant);
}
}
tweet.getElementsByClassName('tweet-media')[0].innerHTML = /*html*/`
${t.extended_entities.media.map(m => `<${m.type === 'photo' ? 'img' : 'video'} ${m.ext_alt_text ? `alt="${escapeHTML(m.ext_alt_text)}" title="${escapeHTML(m.ext_alt_text)}"` : ''} crossorigin="anonymous" width="${sizeFunctions[t.extended_entities.media.length](m.original_info.width, m.original_info.height)[0]}" height="${sizeFunctions[t.extended_entities.media.length](m.original_info.width, m.original_info.height)[1]}" loading="lazy" ${m.type === 'video' ? 'controls' : ''} ${m.type === 'animated_gif' ? 'loop muted onclick="if(this.paused) this.play(); else this.pause()"' : ''}${m.type === 'animated_gif' && !vars.disableGifAutoplay ? ' autoplay' : ''} ${m.type === 'photo' ? `src="${m.media_url_https}"` : ''} class="tweet-media-element ${mediaClasses[t.extended_entities.media.length]} ${!vars.displaySensitiveContent && t.possibly_sensitive ? 'tweet-media-element-censor' : ''}">${m.type === 'video' || m.type === 'animated_gif' ? `
${m.video_info.variants.map(v => `