User:Docmoates/Social: Difference between revisions

From XMethod Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 139: Line 139:


<script>
<script>
(window.RLQ=window.RLQ||[]).push(function(){
document.addEventListener('DOMContentLoaded',function(){
mw.loader.using(['mediawiki.api','mediawiki.util']).then(function(){
var apiBase='/api.php';
var user=mw.config.get('wgUserName')||'Guest';
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 api=new mw.Api();
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();


api.get({action:'query',meta:'tokens',type:'csrf'}).then(function(data){
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',data.query.tokens.csrftoken);
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',mw.util.wikiScript('api'),true);
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 p={action:'socialfeed',sfaction:'createpost',content:c||'(photo)'};
 
if(pendingImg)p.image_url=pendingImg;
getToken().then(function(token){
api.postWithToken('csrf',p).done(function(){
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();
}).fail(function(code,data){var msg=code;if(data){if(data.error){msg=data.error.info;}}alert('Error: '+msg);btn.disabled=false;btn.textContent='Post';});
}).catch(function(e){alert('Error: '+e);btn.disabled=false;btn.textContent='Post';});
});
});


function load(){
function load(){
api.get({action:'socialfeed',sfaction:'getposts',limit:20}).done(function(d){render(d.socialfeed.posts||[]);}).fail(function(){
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?'))api.postWithToken('csrf',{action:'socialfeed',sfaction:'deletepost',post_id:b.dataset.del}).done(load);});});
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(){api.postWithToken('csrf',{action:'socialfeed',sfaction:'react',post_id:b.dataset.like,reaction_type:'like'}).done(load);});});
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);
api.get({action:'socialfeed',sfaction:'getcomments',post_id:id}).done(function(d){
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='';api.postWithToken('csrf',{action:'socialfeed',sfaction:'comment',post_id:id,content:v}).done(function(){loadCmt(id);load();});}}});
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

Add Story
?
Edit
📝
No posts yet
Be the first to share something!
Set Profile Photo

Upload to wiki first, then paste URL

Add Photo
Upload
From URL
📤
Click to select or drag image here

Uploading...