hotfix
This commit is contained in:
parent
afe64b1ad9
commit
a751c9d705
@ -135,129 +135,4 @@ function roundRect(ctx, x, y, w, h, r, fill, stroke) {
|
||||
ctx.closePath();
|
||||
if (fill) ctx.fill();
|
||||
if (stroke) ctx.stroke();
|
||||
}
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const shareModal = document.getElementById('shareModal');
|
||||
const closeshareModal = document.getElementById('closeModal');
|
||||
const fb = document.getElementById('fb');
|
||||
const vk = document.getElementById('vk');
|
||||
const tg = document.getElementById('tg');
|
||||
const ok = document.getElementById('ok');
|
||||
const wa = document.getElementById('wa');
|
||||
const inst = document.getElementById('inst');
|
||||
const copyBtn = document.getElementById('copyBtn');
|
||||
const copyMsg = document.getElementById('copyMsg');
|
||||
function buildShareUrl(platform, url, text = '') {
|
||||
const u = encodeURIComponent(url);
|
||||
const t = encodeURIComponent(text);
|
||||
switch (platform) {
|
||||
case 'tw': return `https://twitter.com/intent/tweet?url=${u}&text=${t}`;
|
||||
case 'vk': return `https://vk.com/share.php?url=${u}&title=${t}`;
|
||||
case 'tg': return `https://telegram.me/share/url?url=${u}&text=${t}`;
|
||||
case 'fb': return `https://www.facebook.com/sharer/sharer.php?u=${u}"e=${t}`;
|
||||
case 'ok': return `https://connect.ok.ru/offer?url=${u}&title=${t}`;
|
||||
case 'wa': return `https://api.whatsapp.com/send?text=${t} ${u}`;
|
||||
case 'inst': return `https://www.instagram.com/?url=${u}`;
|
||||
default: return '#';
|
||||
}
|
||||
}
|
||||
const shareBtns = document.querySelectorAll('#shareBtn');
|
||||
shareBtns.forEach(btn => {
|
||||
btn.addEventListener('click', async () => {
|
||||
const link = window.location.origin + btn.dataset.link || window.location.href;
|
||||
const text = btn.dataset.text || document.title;
|
||||
const image = btn.dataset.image;
|
||||
const imagetext = btn.dataset.imagetext || '';
|
||||
let blob = null;
|
||||
let file = null;
|
||||
let objectUrl = null;
|
||||
try {
|
||||
if (image) {
|
||||
const imageUrl = window.location.origin + image;
|
||||
// В обработчике кнопки
|
||||
const blob = await imageWithTextBlob(imageUrl, imagetext, {
|
||||
textColor: '#5F1798',
|
||||
});
|
||||
console.log(`Generated blob for "${imagetext}" | size: ${blob.size} | url: ${imageUrl}`);
|
||||
const filename = `shared-image-${Date.now()}.png`;
|
||||
file = new File([blob], filename, { type: blob.type });
|
||||
// Создаём object URL только если хотим (необязательно для navigator.share)
|
||||
objectUrl = URL.createObjectURL(file);
|
||||
if (navigator.canShare && navigator.canShare({ files: [file] })) {
|
||||
await navigator.share({
|
||||
title: text,
|
||||
text: text,
|
||||
url: link,
|
||||
files: [file],
|
||||
});
|
||||
} else {
|
||||
await navigator.share({
|
||||
title: text,
|
||||
text: '',
|
||||
url: link,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
await navigator.share({ title: text, text: '', url: link });
|
||||
}
|
||||
} catch (err) {
|
||||
openshareModal(link, text);
|
||||
} finally {
|
||||
// Очистка
|
||||
try {
|
||||
if (objectUrl) {
|
||||
URL.revokeObjectURL(objectUrl);
|
||||
objectUrl = null;
|
||||
}
|
||||
} catch (e) { /* ignore */ }
|
||||
// Удаляем ссылки, чтобы GC мог собрать объекты
|
||||
blob = null;
|
||||
file = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
function openshareModal(link, text) {
|
||||
vk.href = buildShareUrl('vk', link, text);
|
||||
tg.href = buildShareUrl('tg', link, text);
|
||||
fb.href = buildShareUrl('fb', link, text);
|
||||
ok.href = buildShareUrl('ok', link, text);
|
||||
wa.href = buildShareUrl('wa', link, text);
|
||||
inst.href = buildShareUrl('inst', link, text);
|
||||
shareModal.style.display = 'flex';
|
||||
copyBtn.dataset.link = link;
|
||||
shareModal.style.display = 'flex'
|
||||
}
|
||||
closeshareModal.addEventListener('click', () => {
|
||||
shareModal.style.display = 'none';
|
||||
});
|
||||
shareModal.addEventListener('click', (e) => {
|
||||
if (e.target === shareModal) shareModal.style.display = 'none';
|
||||
});
|
||||
async function copyToClipboard(text) {
|
||||
try {
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
await navigator.clipboard.writeText(text);
|
||||
} else {
|
||||
const ta = document.createElement('textarea');
|
||||
ta.value = text;
|
||||
ta.style.position = 'fixed';
|
||||
ta.style.left = '-9999px';
|
||||
document.body.appendChild(ta);
|
||||
ta.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(ta);
|
||||
}
|
||||
showCopyMessage();
|
||||
} catch (e) {
|
||||
showToast({message: 'Не удалось скопировать ссылку', status: 'error'});
|
||||
}
|
||||
}
|
||||
function showCopyMessage() {
|
||||
copyMsg.style.display = 'inline';
|
||||
setTimeout(() => copyMsg.style.display = 'none', 2000);
|
||||
}
|
||||
copyBtn.addEventListener('click', () => {
|
||||
const link = copyBtn.dataset.link || window.location.href;
|
||||
copyToClipboard(link);
|
||||
});
|
||||
});
|
||||
}
|
||||
@ -172,6 +172,131 @@ function showToast(e={}){let{message:t="",status:a="info",duration:l=4e3}=e,n=do
|
||||
</div>
|
||||
</div>
|
||||
<script defer src="/static/script/share.js"></script>
|
||||
<script>document.addEventListener('DOMContentLoaded', () => {
|
||||
const shareModal = document.getElementById('shareModal');
|
||||
const closeshareModal = document.getElementById('closeModal');
|
||||
const fb = document.getElementById('fb');
|
||||
const vk = document.getElementById('vk');
|
||||
const tg = document.getElementById('tg');
|
||||
const ok = document.getElementById('ok');
|
||||
const wa = document.getElementById('wa');
|
||||
const inst = document.getElementById('inst');
|
||||
const copyBtn = document.getElementById('copyBtn');
|
||||
const copyMsg = document.getElementById('copyMsg');
|
||||
function buildShareUrl(platform, url, text = '') {
|
||||
const u = encodeURIComponent(url);
|
||||
const t = encodeURIComponent(text);
|
||||
switch (platform) {
|
||||
case 'tw': return `https://twitter.com/intent/tweet?url=${u}&text=${t}`;
|
||||
case 'vk': return `https://vk.com/share.php?url=${u}&title=${t}`;
|
||||
case 'tg': return `https://telegram.me/share/url?url=${u}&text=${t}`;
|
||||
case 'fb': return `https://www.facebook.com/sharer/sharer.php?u=${u}"e=${t}`;
|
||||
case 'ok': return `https://connect.ok.ru/offer?url=${u}&title=${t}`;
|
||||
case 'wa': return `https://api.whatsapp.com/send?text=${t} ${u}`;
|
||||
case 'inst': return `https://www.instagram.com/?url=${u}`;
|
||||
default: return '#';
|
||||
}
|
||||
}
|
||||
const shareBtns = document.querySelectorAll('#shareBtn');
|
||||
shareBtns.forEach(btn => {
|
||||
btn.addEventListener('click', async () => {
|
||||
const link = window.location.origin + btn.dataset.link || window.location.href;
|
||||
const text = btn.dataset.text || document.title;
|
||||
const image = btn.dataset.image;
|
||||
const imagetext = btn.dataset.imagetext || '';
|
||||
let blob = null;
|
||||
let file = null;
|
||||
let objectUrl = null;
|
||||
try {
|
||||
if (image) {
|
||||
const imageUrl = window.location.origin + image;
|
||||
// В обработчике кнопки
|
||||
const blob = await imageWithTextBlob(imageUrl, imagetext, {
|
||||
textColor: '#5F1798',
|
||||
});
|
||||
console.log(`Generated blob for "${imagetext}" | size: ${blob.size} | url: ${imageUrl}`);
|
||||
const filename = `shared-image-${Date.now()}.png`;
|
||||
file = new File([blob], filename, { type: blob.type });
|
||||
// Создаём object URL только если хотим (необязательно для navigator.share)
|
||||
objectUrl = URL.createObjectURL(file);
|
||||
if (navigator.canShare && navigator.canShare({ files: [file] })) {
|
||||
await navigator.share({
|
||||
title: text,
|
||||
text: text,
|
||||
url: link,
|
||||
files: [file],
|
||||
});
|
||||
} else {
|
||||
await navigator.share({
|
||||
title: text,
|
||||
text: '',
|
||||
url: link,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
await navigator.share({ title: text, text: '', url: link });
|
||||
}
|
||||
} catch (err) {
|
||||
openshareModal(link, text);
|
||||
} finally {
|
||||
// Очистка
|
||||
try {
|
||||
if (objectUrl) {
|
||||
URL.revokeObjectURL(objectUrl);
|
||||
objectUrl = null;
|
||||
}
|
||||
} catch (e) { /* ignore */ }
|
||||
// Удаляем ссылки, чтобы GC мог собрать объекты
|
||||
blob = null;
|
||||
file = null;
|
||||
}
|
||||
});
|
||||
});
|
||||
function openshareModal(link, text) {
|
||||
vk.href = buildShareUrl('vk', link, text);
|
||||
tg.href = buildShareUrl('tg', link, text);
|
||||
fb.href = buildShareUrl('fb', link, text);
|
||||
ok.href = buildShareUrl('ok', link, text);
|
||||
wa.href = buildShareUrl('wa', link, text);
|
||||
inst.href = buildShareUrl('inst', link, text);
|
||||
shareModal.style.display = 'flex';
|
||||
copyBtn.dataset.link = link;
|
||||
shareModal.style.display = 'flex'
|
||||
}
|
||||
closeshareModal.addEventListener('click', () => {
|
||||
shareModal.style.display = 'none';
|
||||
});
|
||||
shareModal.addEventListener('click', (e) => {
|
||||
if (e.target === shareModal) shareModal.style.display = 'none';
|
||||
});
|
||||
async function copyToClipboard(text) {
|
||||
try {
|
||||
if (navigator.clipboard && navigator.clipboard.writeText) {
|
||||
await navigator.clipboard.writeText(text);
|
||||
} else {
|
||||
const ta = document.createElement('textarea');
|
||||
ta.value = text;
|
||||
ta.style.position = 'fixed';
|
||||
ta.style.left = '-9999px';
|
||||
document.body.appendChild(ta);
|
||||
ta.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(ta);
|
||||
}
|
||||
showCopyMessage();
|
||||
} catch (e) {
|
||||
showToast({message: 'Не удалось скопировать ссылку', status: 'error'});
|
||||
}
|
||||
}
|
||||
function showCopyMessage() {
|
||||
copyMsg.style.display = 'inline';
|
||||
setTimeout(() => copyMsg.style.display = 'none', 2000);
|
||||
}
|
||||
copyBtn.addEventListener('click', () => {
|
||||
const link = copyBtn.dataset.link || window.location.href;
|
||||
copyToClipboard(link);
|
||||
});
|
||||
});</script>
|
||||
<script>
|
||||
let deferredPrompt = null;
|
||||
let hasUserInteracted = false;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user