This commit is contained in:
vladislav 2026-09-03 23:11:28 -04:00
parent afe64b1ad9
commit a751c9d705
Signed by: Vladislav
GPG Key ID: D97C9E5E4860EE45
2 changed files with 126 additions and 126 deletions

View File

@ -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}&quote=${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);
});
});

View File

@ -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}&quote=${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;