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();
|
ctx.closePath();
|
||||||
if (fill) ctx.fill();
|
if (fill) ctx.fill();
|
||||||
if (stroke) ctx.stroke();
|
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>
|
||||||
</div>
|
</div>
|
||||||
<script defer src="/static/script/share.js"></script>
|
<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>
|
<script>
|
||||||
let deferredPrompt = null;
|
let deferredPrompt = null;
|
||||||
let hasUserInteracted = false;
|
let hasUserInteracted = false;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user