const PUBLIC_KEY = "BNCIOf5rbVCc0URYWtIBliVskE-E3uL2QdKAtjqaGBfsqH5cRCl9BQZQvZRmYL-kHQl9K5mrtXtoBWJhJXzTNj0";
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding).replace(/\-/g, '+').replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) { outputArray[i] = rawData.charCodeAt(i); }
return outputArray;
}
document.getElementById('subscribe-btn').addEventListener('click', async () => {
const reg = await navigator.serviceWorker.register('./sw.js');
await navigator.serviceWorker.ready;
let subscription = await reg.pushManager.getSubscription();
if (!subscription) {
subscription = await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(PUBLIC_KEY)
});
}
document.getElementById('sub-info').value = JSON.stringify(subscription);
});
// --- コピー機能 ---
document.getElementById('copy-btn').addEventListener('click', () => {
const text = document.getElementById('sub-info').value;
if (!text) return alert("先にコードを取得してください");
navigator.clipboard.writeText(text).then(() => {
alert("クリップボードにコピーしました");
});
});
// --- メール送信機能 ---
document.getElementById('email-btn').addEventListener('click', () => {
const text = document.getElementById('sub-info').value;
if (!text) return alert("先にコードを取得してください");
const subject = encodeURIComponent("Web Push 連携コード");
const body = encodeURIComponent(text);
window.location.href = `mailto:?subject=${subject}&body=${body}`;
});
// --- 通知から遷移してきた時のデータ取得処理(強化版) ---
async function checkNotificationData() {
// SWとの通信が途切れないよう、確実にコントローラーを指定する
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage({ type: 'REQUEST_PAYLOAD' });
} else {
const reg = await navigator.serviceWorker.ready;
if (reg && reg.active) {
reg.active.postMessage({ type: 'REQUEST_PAYLOAD' });
}
}
}
navigator.serviceWorker.addEventListener('message', (event) => {
if (event.data && event.data.type === 'NOTIFICATION_CLICKED') {
const payload = event.data.payload;
document.getElementById('trend-word').innerText = payload.trend_word;
document.getElementById('message-text').innerText = payload.message;
document.getElementById('time-text').innerText = payload.time;
document.querySelector('.config-area').style.display = 'none';
document.getElementById('content-area').style.display = 'block';
}
});
window.addEventListener('load', checkNotificationData);
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') {
checkNotificationData();
}
});