User:Docmoates/Social: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
| Line 139: | Line 139: | ||
<script> | <script> | ||
document.addEventListener('DOMContentLoaded',function(){ | |||
var apiBase='/api.php'; | |||
var user='Guest'; | |||
var csrfToken=''; | |||
try{if(window.mw)user=mw.config.get('wgUserName')||'Guest';}catch(e){} | |||
var photo=localStorage.getItem('sf_photo_'+user)||''; | var photo=localStorage.getItem('sf_photo_'+user)||''; | ||
var pendingImg=''; | var pendingImg=''; | ||
var uploadedFile=null; | var uploadedFile=null; | ||
| Line 151: | Line 154: | ||
function ago(d){var s=Math.floor((Date.now()-d)/1000);if(s<60)return'Just now';var m=Math.floor(s/60);if(m<60)return m+'m';var h=Math.floor(m/60);if(h<24)return h+'h';return Math.floor(h/24)+'d';} | function ago(d){var s=Math.floor((Date.now()-d)/1000);if(s<60)return'Just now';var m=Math.floor(s/60);if(m<60)return m+'m';var h=Math.floor(m/60);if(h<24)return h+'h';return Math.floor(h/24)+'d';} | ||
function gel(id){return document.getElementById(id);} | function gel(id){return document.getElementById(id);} | ||
function apiGet(params){ | |||
var url=apiBase+'?format=json'; | |||
for(var k in params)url+='&'+encodeURIComponent(k)+'='+encodeURIComponent(params[k]); | |||
return fetch(url,{credentials:'same-origin'}).then(function(r){return r.json();}); | |||
} | |||
function apiPost(params){ | |||
var form=new FormData(); | |||
form.append('format','json'); | |||
for(var k in params)form.append(k,params[k]); | |||
return fetch(apiBase,{method:'POST',credentials:'same-origin',body:form}).then(function(r){return r.json();}); | |||
} | |||
function getToken(){ | |||
return apiGet({action:'query',meta:'tokens',type:'csrf'}).then(function(d){ | |||
csrfToken=d.query.tokens.csrftoken; | |||
return csrfToken; | |||
}); | |||
} | |||
function setAv(){ | function setAv(){ | ||
| Line 259: | Line 282: | ||
var filename='SocialFeed_'+user+'_'+Date.now()+'.'+file.name.split('.').pop(); | var filename='SocialFeed_'+user+'_'+Date.now()+'.'+file.name.split('.').pop(); | ||
getToken().then(function(token){ | |||
gel('progress-fill').style.width='30%'; | gel('progress-fill').style.width='30%'; | ||
gel('upload-status').textContent='Uploading to wiki...'; | gel('upload-status').textContent='Uploading to wiki...'; | ||
| Line 267: | Line 290: | ||
formData.append('filename',filename); | formData.append('filename',filename); | ||
formData.append('file',file); | formData.append('file',file); | ||
formData.append('token', | formData.append('token',token); | ||
formData.append('format','json'); | formData.append('format','json'); | ||
formData.append('ignorewarnings','1'); | formData.append('ignorewarnings','1'); | ||
var xhr=new XMLHttpRequest(); | var xhr=new XMLHttpRequest(); | ||
xhr.open('POST', | xhr.open('POST',apiBase,true); | ||
xhr.withCredentials=true; | |||
xhr.upload.onprogress=function(e){ | xhr.upload.onprogress=function(e){ | ||
| Line 313: | Line 337: | ||
if(!(c||pendingImg)){alert('Write something or add image');return;} | if(!(c||pendingImg)){alert('Write something or add image');return;} | ||
var btn=this;btn.disabled=true;btn.textContent='Posting...'; | var btn=this;btn.disabled=true;btn.textContent='Posting...'; | ||
var | |||
if(pendingImg) | getToken().then(function(token){ | ||
var params={action:'socialfeed',sfaction:'createpost',content:c||'(photo)',token:token}; | |||
if(pendingImg)params.image_url=pendingImg; | |||
return apiPost(params); | |||
}).then(function(d){ | |||
if(d.error){alert('Error: '+d.error.info);btn.disabled=false;btn.textContent='Post';return;} | |||
gel('post-content').value=''; | gel('post-content').value=''; | ||
pendingImg='';gel('image-preview').style.display='none'; | pendingImg='';gel('image-preview').style.display='none'; | ||
btn.disabled=false;btn.textContent='Post'; | btn.disabled=false;btn.textContent='Post'; | ||
load(); | load(); | ||
}). | }).catch(function(e){alert('Error: '+e);btn.disabled=false;btn.textContent='Post';}); | ||
}); | }); | ||
function load(){ | function load(){ | ||
apiGet({action:'socialfeed',sfaction:'getposts',limit:20}).then(function(d){ | |||
if(d.socialfeed)render(d.socialfeed.posts||[]); | |||
}).catch(function(){ | |||
gel('timeline-container').innerHTML='<div class="sf-empty"><div class="sf-empty-icon">😕</div><div class="sf-empty-text">Error loading</div></div>'; | gel('timeline-container').innerHTML='<div class="sf-empty"><div class="sf-empty-icon">😕</div><div class="sf-empty-text">Error loading</div></div>'; | ||
}); | }); | ||
| Line 349: | Line 379: | ||
}); | }); | ||
c.innerHTML=h; | c.innerHTML=h; | ||
c.querySelectorAll('[data-del]').forEach(function(b){b.addEventListener('click',function(){if(confirm('Delete?')) | c.querySelectorAll('[data-del]').forEach(function(b){b.addEventListener('click',function(){if(confirm('Delete?')){getToken().then(function(t){return apiPost({action:'socialfeed',sfaction:'deletepost',post_id:b.dataset.del,token:t});}).then(load);}});}); | ||
c.querySelectorAll('[data-like]').forEach(function(b){b.addEventListener('click',function(){ | c.querySelectorAll('[data-like]').forEach(function(b){b.addEventListener('click',function(){getToken().then(function(t){return apiPost({action:'socialfeed',sfaction:'react',post_id:b.dataset.like,reaction_type:'like',token:t});}).then(load);});}); | ||
c.querySelectorAll('[data-cmt]').forEach(function(b){b.addEventListener('click',function(){var box=gel('cmt-'+b.dataset.cmt);if(box.style.display==='none'){box.style.display='block';loadCmt(b.dataset.cmt);}else{box.style.display='none';}});}); | c.querySelectorAll('[data-cmt]').forEach(function(b){b.addEventListener('click',function(){var box=gel('cmt-'+b.dataset.cmt);if(box.style.display==='none'){box.style.display='block';loadCmt(b.dataset.cmt);}else{box.style.display='none';}});}); | ||
} | } | ||
| Line 356: | Line 386: | ||
function loadCmt(id){ | function loadCmt(id){ | ||
var box=gel('cmt-'+id); | var box=gel('cmt-'+id); | ||
apiGet({action:'socialfeed',sfaction:'getcomments',post_id:id}).then(function(d){ | |||
var cmts=d.socialfeed.comments||[]; | var cmts=(d.socialfeed?d.socialfeed.comments:[])||[]; | ||
var h=''; | var h=''; | ||
cmts.forEach(function(cm){var pic=localStorage.getItem('sf_photo_'+cm.username)||'';var av=pic?'<img src="'+pic+'">':init(cm.username);h+='<div class="sf-comment"><div class="sf-avatar sf-avatar-small">'+av+'</div><div class="sf-comment-bubble"><div class="sf-comment-author">'+esc(cm.username)+'</div><div class="sf-comment-text">'+esc(cm.content)+'</div></div></div>';}); | cmts.forEach(function(cm){var pic=localStorage.getItem('sf_photo_'+cm.username)||'';var av=pic?'<img src="'+pic+'">':init(cm.username);h+='<div class="sf-comment"><div class="sf-avatar sf-avatar-small">'+av+'</div><div class="sf-comment-bubble"><div class="sf-comment-author">'+esc(cm.username)+'</div><div class="sf-comment-text">'+esc(cm.content)+'</div></div></div>';}); | ||
| Line 363: | Line 393: | ||
h+='<div class="sf-add-comment"><div class="sf-avatar sf-avatar-small">'+myPic+'</div><input class="sf-comment-input" id="cinput-'+id+'" placeholder="Write a comment..."></div>'; | h+='<div class="sf-add-comment"><div class="sf-avatar sf-avatar-small">'+myPic+'</div><input class="sf-comment-input" id="cinput-'+id+'" placeholder="Write a comment..."></div>'; | ||
box.innerHTML=h; | box.innerHTML=h; | ||
gel('cinput-'+id).addEventListener('keypress',function(e){if(e.key==='Enter'){var v=this.value.trim();if(v){this.value=''; | gel('cinput-'+id).addEventListener('keypress',function(e){if(e.key==='Enter'){var v=this.value.trim();if(v){this.value='';getToken().then(function(t){return apiPost({action:'socialfeed',sfaction:'comment',post_id:id,content:v,token:t});}).then(function(){loadCmt(id);load();});}}}); | ||
}); | }); | ||
} | } | ||
load(); | load(); | ||
}); | }); | ||
</script> | </script> | ||
</div> | </div> | ||
</html> | </html> | ||
Revision as of 02:56, 3 February 2026
Upload to wiki first, then paste URL
Uploading...