未分類

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();
            }
        });