mirror of
https://github.com/openvk/openvk
synced 2024-11-15 19:49:14 +03:00
349 lines
10 KiB
JavaScript
349 lines
10 KiB
JavaScript
function humanFileSize(bytes, si) {
|
||
var thresh = si ? 1000 : 1024;
|
||
if(Math.abs(bytes) < thresh) {
|
||
return bytes + ' B';
|
||
}
|
||
var units = si
|
||
? ['kB','MB','GB','TB','PB','EB','ZB','YB']
|
||
: ['KiB','MiB','GiB','TiB','PiB','EiB','ZiB','YiB'];
|
||
var u = -1;
|
||
do {
|
||
bytes /= thresh;
|
||
++u;
|
||
} while(Math.abs(bytes) >= thresh && u < units.length - 1);
|
||
return bytes.toFixed(1)+' '+units[u];
|
||
}
|
||
|
||
function trim(string) {
|
||
var newStr = string.substring(0, 10);
|
||
if(newStr.length !== string.length)
|
||
newStr += "…";
|
||
|
||
return newStr;
|
||
}
|
||
|
||
function handleUpload(id) {
|
||
console.warn("блять...");
|
||
|
||
u("#post-buttons" + id + " .postFileSel").not("#" + this.id).each(input => input.value = null);
|
||
|
||
var indicator = u("#post-buttons" + id + " .post-upload");
|
||
var file = this.files[0];
|
||
if(typeof file === "undefined") {
|
||
indicator.attr("style", "display: none;");
|
||
} else {
|
||
u("span", indicator.nodes[0]).text(trim(file.name) + " (" + humanFileSize(file.size, false) + ")");
|
||
indicator.attr("style", "display: block;");
|
||
}
|
||
|
||
document.querySelector("#post-buttons" + id + " #wallAttachmentMenu").classList.add("hidden");
|
||
}
|
||
|
||
function initGraffiti(id) {
|
||
let canvas = null;
|
||
let msgbox = MessageBox(tr("draw_graffiti"), "<div id='ovkDraw'></div>", [tr("save"), tr("cancel")], [function() {
|
||
canvas.getImage({includeWatermark: false}).toBlob(blob => {
|
||
let fName = "Graffiti-" + Math.ceil(performance.now()).toString() + ".jpeg";
|
||
let image = new File([blob], fName, {type: "image/jpeg", lastModified: new Date().getTime()});
|
||
let trans = new DataTransfer();
|
||
trans.items.add(image);
|
||
|
||
let fileSelect = document.querySelector("#post-buttons" + id + " input[name='_pic_attachment']");
|
||
fileSelect.files = trans.files;
|
||
|
||
u(fileSelect).trigger("change");
|
||
u("#post-buttons" + id + " #write textarea").trigger("focusin");
|
||
}, "image/jpeg", 0.92);
|
||
|
||
canvas.teardown();
|
||
}, function() {
|
||
canvas.teardown();
|
||
}]);
|
||
|
||
let watermarkImage = new Image();
|
||
watermarkImage.src = "/assets/packages/static/openvk/img/logo_watermark.gif";
|
||
|
||
msgbox.attr("style", "width: 750px;");
|
||
canvas = LC.init(document.querySelector("#ovkDraw"), {
|
||
backgroundColor: "#fff",
|
||
imageURLPrefix: "/assets/packages/static/openvk/js/node_modules/literallycanvas/lib/img",
|
||
watermarkImage: watermarkImage,
|
||
imageSize: {
|
||
width: 640,
|
||
height: 480
|
||
}
|
||
});
|
||
}
|
||
|
||
$(document).on("click", ".post-like-button", function(e) {
|
||
e.preventDefault();
|
||
|
||
var thisBtn = u(this).first();
|
||
var link = u(this).attr("href");
|
||
var heart = u(".heart", thisBtn);
|
||
var counter = u(".likeCnt", thisBtn);
|
||
var likes = counter.text() === "" ? 0 : counter.text();
|
||
var isLiked = heart.attr("id") === 'liked';
|
||
|
||
ky(link);
|
||
heart.attr("id", isLiked ? '' : 'liked');
|
||
counter.text(parseInt(likes) + (isLiked ? -1 : 1));
|
||
if (counter.text() === "0") {
|
||
counter.text("");
|
||
}
|
||
|
||
return false;
|
||
});
|
||
|
||
function setupWallPostInputHandlers(id) {
|
||
u("#wall-post-input" + id).on("paste", function(e) {
|
||
if(e.clipboardData.files.length === 1) {
|
||
var input = u("#post-buttons" + id + " input[name=_pic_attachment]").nodes[0];
|
||
input.files = e.clipboardData.files;
|
||
|
||
u(input).trigger("change");
|
||
}
|
||
});
|
||
|
||
u("#wall-post-input" + id).on("input", function(e) {
|
||
var boost = 5;
|
||
var textArea = e.target;
|
||
textArea.style.height = "5px";
|
||
var newHeight = textArea.scrollHeight;
|
||
textArea.style.height = newHeight + boost + "px";
|
||
return;
|
||
|
||
// revert to original size if it is larger (possibly changed by user)
|
||
// textArea.style.height = (newHeight > originalHeight ? (newHeight + boost) : originalHeight) + "px";
|
||
});
|
||
}
|
||
|
||
$(document).on("keydown", "#write > form", function(event) {
|
||
if(event.ctrlKey && event.keyCode === 13)
|
||
this.submit();
|
||
});
|
||
|
||
var tooltipClientTemplate = Handlebars.compile(`
|
||
<table>
|
||
<tr>
|
||
<td width="54" valign="top">
|
||
<img src="{{img}}" width="54" />
|
||
</td>
|
||
<td width="1"></td>
|
||
<td width="150" valign="top">
|
||
<text>
|
||
{{app_tr}}: <b>{{name}}</b>
|
||
</text><br/>
|
||
<a href="{{url}}">${tr("learn_more")}</a>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
`);
|
||
|
||
var tooltipClientNoInfoTemplate = Handlebars.compile(`
|
||
<table>
|
||
<tr>
|
||
<td width="150" valign="top">
|
||
<text>
|
||
{{app_tr}}: <b>{{name}}</b>
|
||
</text><br/>
|
||
</td>
|
||
</tr>
|
||
</table>
|
||
`);
|
||
|
||
function initTooltips() {
|
||
|
||
tippy(".client_app", {
|
||
theme: "light vk",
|
||
content: "⌛",
|
||
allowHTML: true,
|
||
interactive: true,
|
||
interactiveDebounce: 500,
|
||
|
||
onCreate: async function(that) {
|
||
that._resolvedClient = null;
|
||
},
|
||
|
||
onShow: async function(that) {
|
||
let client_tag = that.reference.dataset.appTag;
|
||
let client_name = that.reference.dataset.appName;
|
||
let client_url = that.reference.dataset.appUrl;
|
||
let client_img = that.reference.dataset.appImg;
|
||
|
||
if(client_name != "") {
|
||
let res = {
|
||
'name': client_name,
|
||
'url': client_url,
|
||
'img': client_img,
|
||
'app_tr': tr("app")
|
||
};
|
||
|
||
that.setContent(tooltipClientTemplate(res));
|
||
} else {
|
||
let res = {
|
||
'name': client_tag,
|
||
'app_tr': tr("app")
|
||
};
|
||
|
||
that.setContent(tooltipClientNoInfoTemplate(res));
|
||
}
|
||
}
|
||
});
|
||
|
||
}
|
||
|
||
initTooltips()
|
||
|
||
function addNote(textareaId, nid)
|
||
{
|
||
if(nid > 0) {
|
||
note.value = nid
|
||
let noteObj = document.querySelector("#nd"+nid)
|
||
|
||
let nortd = document.querySelector("#post-buttons"+textareaId+" .post-has-note");
|
||
nortd.style.display = "block"
|
||
|
||
nortd.innerHTML = `${tr("note")} ${escapeHtml(noteObj.dataset.name)}`
|
||
} else {
|
||
note.value = "none"
|
||
|
||
let nortd = document.querySelector("#post-buttons"+textareaId+" .post-has-note");
|
||
nortd.style.display = "none"
|
||
|
||
nortd.innerHTML = ""
|
||
}
|
||
|
||
u("body").removeClass("dimmed");
|
||
u(".ovk-diag-cont").remove();
|
||
}
|
||
|
||
async function attachNote(id)
|
||
{
|
||
let notes = await API.Wall.getMyNotes()
|
||
let body = ``
|
||
|
||
if(notes.closed < 1) {
|
||
body = `${tr("notes_closed")}`
|
||
} else {
|
||
if(notes.items.length < 1) {
|
||
body = `${tr("no_notes")}`
|
||
} else {
|
||
body = `
|
||
${tr("select_or_create_new")}
|
||
<div id="notesList">`
|
||
|
||
if(note.value != "none") {
|
||
body += `
|
||
<div class="ntSelect" onclick="addNote(${id}, 0)">
|
||
<span>${tr("do_not_attach_note")}</span>
|
||
</div>`
|
||
}
|
||
|
||
for(const note of notes.items) {
|
||
body += `
|
||
<div data-name="${note.name}" class="ntSelect" id="nd${note.id}" onclick="addNote(${id}, ${note.id})">
|
||
<span>${escapeHtml(note.name)}</span>
|
||
</div>
|
||
`
|
||
}
|
||
|
||
body += `</div>`
|
||
}
|
||
}
|
||
|
||
let frame = MessageBox(tr("select_note"), body, [tr("cancel")], [Function.noop]);
|
||
|
||
document.querySelector(".ovk-diag-body").style.padding = "10px"
|
||
}
|
||
|
||
async function showArticle(note_id) {
|
||
u("body").addClass("dimmed");
|
||
let note = await API.Notes.getNote(note_id);
|
||
u("#articleAuthorAva").attr("src", note.author.ava);
|
||
u("#articleAuthorName").text(note.author.name);
|
||
u("#articleAuthorName").attr("href", note.author.link);
|
||
u("#articleTime").text(note.created);
|
||
u("#articleLink").attr("href", note.link);
|
||
u("#articleText").html(`<h1 class="articleView_nameHeading">${note.title}</h1>` + note.html);
|
||
u("body").removeClass("dimmed");
|
||
u("body").addClass("article");
|
||
}
|
||
|
||
$(document).on("click", ".showMore", async (e) => {
|
||
e.currentTarget.innerHTML = `<img id="loader" src="/assets/packages/static/openvk/img/loading_mini.gif">`
|
||
|
||
let url = new URL(location.href)
|
||
let newPage = Number(e.currentTarget.dataset.page) + 1
|
||
url.searchParams.set("p", newPage)
|
||
url.searchParams.set("posts", 10)
|
||
|
||
let xhr = new XMLHttpRequest
|
||
xhr.open("GET", url)
|
||
|
||
let container = document.querySelector(".infContainer")
|
||
|
||
function _errorWhenLoading() {
|
||
e.currentTarget.innerHTML = tr("error_loading_objects")
|
||
}
|
||
|
||
function _updateButton() {
|
||
e.currentTarget.setAttribute("data-page", newPage)
|
||
e.currentTarget.innerHTML = tr("show_more")
|
||
|
||
container.append(e.currentTarget)
|
||
|
||
console.info("Page " + newPage + " of " + e.currentTarget.dataset.pageсount)
|
||
if(Number(e.currentTarget.dataset.pageсount) == newPage) {
|
||
e.currentTarget.remove()
|
||
}
|
||
}
|
||
|
||
xhr.onload = () => {
|
||
let parser = new DOMParser
|
||
let result = parser.parseFromString(xhr.responseText, "text/html");
|
||
let objects = result.querySelectorAll(".infObj")
|
||
|
||
for(const obj of objects) {
|
||
container.insertAdjacentHTML("beforeend", obj.outerHTML)
|
||
}
|
||
|
||
if(result.querySelectorAll("textarea").length > 0) {
|
||
for(const trea of result.querySelectorAll("textarea")) {
|
||
setupWallPostInputHandlers(trea.dataset.id)
|
||
|
||
u("#post-buttons" + trea.dataset.id + " .postFileSel").on("change", function() {
|
||
handleUpload.bind(this, trea.dataset.id)();
|
||
});
|
||
}
|
||
}
|
||
|
||
bsdnHydrate()
|
||
|
||
initMentions()
|
||
initTooltips()
|
||
_updateButton()
|
||
}
|
||
|
||
xhr.onerror = () => {_errorWhenLoading()}
|
||
xhr.ontimeout = () => {_errorWhenLoading()}
|
||
|
||
xhr.send()
|
||
})
|
||
|
||
let showMoreObserver = new IntersectionObserver(entries => {
|
||
entries.forEach(x => {
|
||
if(x.isIntersecting) {
|
||
$(".showMore").click()
|
||
}
|
||
})
|
||
}, {
|
||
root: null,
|
||
rootMargin: "0px",
|
||
threshold: 0
|
||
})
|
||
|
||
let showMore = document.querySelector('.showMore');
|
||
|
||
if(showMore != null)
|
||
showMoreObserver.observe(showMore);
|