class f0ck {
constructor(hash = "") {
this.debug();
this.tpl = {
row: ({ items }) => `
`,
item: ({ id, title, stamp }) => `
`,
};
this.numitems = this.sumItems();
this.items = {
items: [],
last: null,
first: null
};
this.tmphash = null;
this.hash = hash;
}
loadItems(init=false) {
this.getItems().then(
resolve => {
console.log("resolved", this.items);
//if(init) this.render(init);
},
reject => {
console.error("REJECTED!");
}
);
}
getItems() {
return new Promise((resolve, reject) => {
$.getJSON(`${this.tmphash.link},${(this.numitems.ipp*2)}`, data => {
console.log("received data", data);
this.items.last = data.meta.last;
this.items.first = data.meta.first;
for(let item in data.items) {
this.items.items[data.items[item].stamp] = data.items[item];
}
return resolve();
}).fail(err => {
return reject();
});
});
}
sumItems() {
let h = $(window).innerHeight();
let w = $(window).innerWidth();
let itemsize = 128;
let spacing = 10;
let header = 90;
let ipr = Math.floor( w / ( itemsize + spacing ) );
let rpp = Math.floor( ( h - header ) / ( itemsize + spacing ) );
let ipp = Math.floor( ipr * rpp );
return {
ipr: ipr, // items per row
rpp: rpp, // rows per page
ipp: ipp // items per page
};
}
render(init=false) {
let tmpnum = this.sumItems();
let container = $("div#con");
if(this.numitems.ipp !== tmpnum.ipp || init) {
console.log("rendering from", this.current);
if(typeof this.current !== "number")
return;
container.html("");
this.numitems = tmpnum;
let rowtpl = "";
let j, tmplast = 0;
for(var i = this.current+1; j < this.numitems.ipp; i--) {
if(this.items[i]) {
rowtpl += [{ id: this.items[i].id, title: this.items[i].mime, stamp: this.items[i].stamp }].map(this.tpl.item).join``;
j++;
tmplast = this.items[i].stamp;
}
if(this.items.length < i) {
j = this.numitems.ipp;
}
}
this.scope.last = tmplast;
console.log("finished rendering", container.length);
container.append( [{ items: rowtpl }].map(this.tpl.row).join`` );
}
}
set hash(val) {
console.log("hash changed");
let tmp = this.getlink(val);
this.tmphash = tmp;
//if(tmp.last < this.scope.first) {
this.current = tmp.last;
this.loadItems(true);
//}
//else if(tmp.last > this.scope.last || this.scope.last === 0) {
// this.current = tmp.last;
// this.loadItems(true);
//}
}
gethash() {
return this.tmphash;
}
debug() {
$(".navbar a").on("click", event => {
switch(event.target.innerText) {
case "page 1":
this.currentpage = 0;
this.render(true);
break;
case "page 2":
this.currentpage = 1;
this.render(true);
break;
case "page 3":
this.currentpage = 2;
this.render(true);
break;
default:
console.log("nope");
break;
}
$(".navbar span").html(`Page ${this.currentpage}`);
});
}
getlink(tmp) {
const tpl = {
user: ({ user, mime, last, eps }) => `user,${user},${mime},${last}`,
mime: ({ user, mime, last, eps }) => `mime,${mime},${user},${last}`,
new: ({ user, mime, last, eps }) => `items,${last}`,
};
let blah = {
mode: "",
user: "",
mime: "",
last: 0,
post: 0
};
let api = "/api/?";
if(!tmp.match(/\//)) {
tmp = "#new/";
}
tmp = (tmp.match(/,/)?tmp:`${tmp},`).substr(1).split(",");
console.log(tmp);
const args = {
l: tmp[0].split("/"),
r: tmp[1].split("/")
};
blah.mode = ( args.l[0].length === 0 )? "new" : args.l[0];
blah.last = parseInt(args.r[0]) || 0;
blah.post = parseInt(args.r[1]) || 0;
switch(blah.mode) {
case "user":
blah.user = ( args.l[1].length === 0 )? "" : args.l[1];
blah.mime = ( args.l[2].length === 0 )? "" : args.l[2];
break;
case "mime":
blah.user = ( args.l[2].length === 0 )? "" : args.l[2];
blah.mime = ( args.l[1].length === 0 )? "" : args.l[1];
break;
}
return {
link: api + [{ user: blah.user, mime: blah.mime, last: blah.last, eps: this.numitems.ipp }].map(tpl[blah.mode]).join``,
args: blah
};
}
}