timezoneChangingOne = (x)=>{var date= new Date(x.innerHTML); var year = date.getFullYear().toString(); var month = (date.getMonth()+1).toString().padStart(2, '0'); var day = date.getDate().toString().padStart(2, '0'); var hour = date.getHours().toString().padStart(2, '0'); var min = date.getMinutes().toString().padStart(2, '0'); var sec = date.getSeconds().toString().padStart(2, '0'); local_date_string = `${year}-${month}-${day} ${hour}:${min}:${sec}`; x.innerHTML=local_date_string;} function timezoneChanging(){ document.querySelectorAll(".post-time").forEach( x => timezoneChangingOne(x) ); } var requestNote = {"type" : "home", "arg" : ""}; var pathName = window.location.pathname; var homePattern = /[/]home[/]/; var userPagePattern = /[/]user[/]([^/]+)/; var userIdName = ""; if (pathName.match(userPagePattern)){ userIdName = pathName.match(userPagePattern)[1]; requestNote = {"type" : "user", "arg" : userIdName}; } $name = (x) => document.getElementsByName(x); $ = (x) => document.getElementById(x); csrf_token = $("_token").content; var httpRequest; async function make_req() { post_text = $('post_text').value; post_privilage = $('privil_choosing').value; if (post_text != ""){ await fetch('/api/post', { method: 'POST', headers: { "X-CSRFToken": csrf_token, 'Content-Type': 'application/json', }, body: JSON.stringify({ "privilage" : post_privilage, "text" : post_text, "request_note" : requestNote, }) }).then(response => {if (response.ok == true) {$('post_text').value = ""; getLatestPosts(); // wait for a moment then get latest posts }} ); } } function auto_expand(element) { element.style.height = 6+"em"; element.style.height = (element.scrollHeight)+"px"; } timezoneChanging(); function adjust_post_text(){ var post_text = $("post_text"); post_text.style.height = 6+"em"; post_text.style.height = (post_text.scrollHeight)+"px"; } async function getRecentPostsCounter(){ latest_time_string = $("latest_time").innerHTML; await fetch('/api/get_recent_posts_counter', { method: 'POST', headers: { "X-CSRFToken": csrf_token, 'Content-Type': 'application/json', }, body: JSON.stringify({ "latest_time" : latest_time_string, "request_note" : requestNote, }) }).then(response => response.json()) .then(the_json => {let newer_posts_num = the_json['newer_posts_num']; if (newer_posts_num == 1) { $("new_post_notifier").style.display = "block"; $("new_post_notifier").innerHTML = `1 new post`} if (newer_posts_num > 1) { $("new_post_notifier").style.display = "block"; $("new_post_notifier").innerHTML = `${newer_posts_num} new posts`} }); } var intervalID = window.setInterval(getRecentPostsCounter, 20000); function appendPostToTheEnd(post){ var public_tl = $("public_timeline"); var new_div = createPostDiv(post); public_tl.insertBefore(new_div, $('previous_post_loader')); } async function getPreviousPosts(){ var new_oldest_time; oldest_time_string = $("oldest_time").innerHTML; await fetch('/api/get_previous_posts', { method: 'POST', headers: { "X-CSRFToken": csrf_token, 'Content-Type': 'application/json', }, body: JSON.stringify({ "oldest_time" : oldest_time_string, "request_note" : requestNote, }) }).then(response => response.json()) .then(item => {new_oldest_time_raw = item['oldest_time']; new_oldest_time = new_oldest_time_raw.substring(0,10) + " " + new_oldest_time_raw.substring(11,26) + "+0000"; return item['older_posts'];}) .then(posts => {if (posts.length == 0) {$('previous_post_loader').style.display = 'none';} else{posts.forEach(post => appendPostToTheEnd(post)); $('oldest_time').innerHTML = new_oldest_time;}}) } async function make_follow_req(){ requestValue = $("follow-user-button").value; await fetch(`/api/follow_request/${requestValue}/${userIdName}`, { method: 'POST', headers: { "X-CSRFToken": csrf_token, 'Content-Type': 'application/json', }, body : "" }).then(response => response.json()) .then( item =>{ returnValue = item["status"]; if (returnValue == "request sent"){ $("follow-user-button").value = "cancel-following-request"; $("follow-user-button").innerHTML = "Cancel Following Request"; } else if(returnValue == "request cancelled" || returnValue == "unfollowed"){ $("follow-user-button").value = "send-following-request"; $("follow-user-button").innerHTML = "Follow"; } } ) } async function getLatestPosts(){ latest_time_string = $("latest_time").innerHTML; await fetch('/api/get_latest_posts', { method: 'POST', headers: { "X-CSRFToken": csrf_token, 'Content-Type': 'application/json', }, body: JSON.stringify({ "latest_time" : latest_time_string, "request_note" : requestNote, }) }) .then(response => response.json()) .then(item => item['newer_posts']) .then(posts => {posts.forEach(post => addPostToTheBeginning(post)); $('new_post_notifier').style.display = "none"; var nowTime = new Date(); var nowTimeString = nowTime.toISOString(); $("latest_time").innerHTML = nowTimeString.substring(0,10) + " " + nowTimeString.substring(11,23) + "000+0000"; }); } function createPostDiv(post){ var new_div = document.createElement("div"); new_div.id = `post-${post.id}`; new_div.className = "post"; post_text_replaced = post.text.replace(/(\r\n|\n\r|\r|\n)/g, "
" ); new_div.innerHTML = `${post.poster_shown_name} at ${post.post_time}
${post_text_replaced}
↩ī¸ - 🔁 - ⭐`; new_div_timestamp = new_div.getElementsByClassName('post-time')[0]; timezoneChangingOne(new_div_timestamp); return new_div; } function addPostToTheBeginning(post){ var public_tl = $("public_timeline"); var new_div = createPostDiv(post); public_tl.insertBefore(new_div, $('latest_time').nextSibling); } $("new_post_notifier").addEventListener('click', getLatestPosts); $("previous_post_loader").addEventListener('click', getPreviousPosts); if (requestNote["type"] == "home"){ $("submit_post").addEventListener('click', make_req); adjust_post_text(); } if (requestNote["type"] == "user"){ $("follow-user-button").addEventListener('click', make_follow_req); }