PageSourceSearch

https://nishi2.jp/wp/wp-content/cache/autoptimize/js/autoptimize_single_5c85b0d82fbe6da33358e682f9af2ac2.js

js nishi2.jp collected 2026-10-02 06:13:39 UTC 8,307 bytes, 26 lines download raw bytes

1(function(){'use strict';if(!document.getElementById('n2pn-settings-form')){return;}
2document.addEventListener('DOMContentLoaded',function(){setTimeout(initFcmCheck,800);});function initFcmCheck(){injectStatusCard();checkFcmSubscriptions();document.querySelectorAll('input[name="topics[]"]').forEach(function(cb){cb.addEventListener('change',function(){var cached=window.__n2pnFcmActual||[];markCheckboxes(cached);});});}
3function injectStatusCard(){var statusDiv=document.querySelector('.n2pn-settings-status');if(!statusDiv)return;var card=document.createElement('div');card.className='n2pn-status-card';card.id='n2pn-fcm-status-card';card.style.cssText='margin-top:16px;border-left-color:#FF9800;';card.innerHTML='<h3>FCM登録状態</h3>'+'<p id="n2pn-fcm-status-text">確認中...</p>'+'<div id="n2pn-fcm-diff" style="display:none;margin-top:8px;font-size:13px;"></div>'+'<div id="n2pn-fcm-actions" style="margin-top:12px;display:none;">'+'  <button type="button" id="n2pn-fcm-repair-btn" class="n2pn-btn n2pn-btn-primary" style="margin-right:8px;">欠けているトピックを再登録</button>'+'  <button type="button" id="n2pn-fcm-recheck-btn" class="n2pn-btn-link">再確認する</button>'+'</div>';statusDiv.appendChild(card);document.getElementById('n2pn-fcm-repair-btn').addEventListener('click',handleRepair);document.getElementById('n2pn-fcm-recheck-btn').addEventListener('click',function(e){e.preventDefault();checkFcmSubscriptions();});}
4async function checkFcmSubscriptions(){var statusEl=document.getElementById('n2pn-fcm-status-text');var diffEl=document.getElementById('n2pn-fcm-diff');var actionsEl=document.getElementById('n2pn-fcm-actions');statusEl.innerHTML='<small>確認中...</small>';diffEl.style.display='none';actionsEl.style.display='none';var fcmToken=localStorage.getItem('n2pn_fcm_token');if(!fcmToken){statusEl.innerHTML='<small style="color:#999;">FCMトークン未取得のため確認できません</small>';return;}
5if(typeof n2pnConfig==='undefined'){statusEl.innerHTML='<small style="color:#999;">設定未読み込み</small>';return;}
6try{var params=new URLSearchParams();params.append('action','n2pn_check_fcm_subscriptions');params.append('token',fcmToken);params.append('nonce',n2pnConfig.nonce);var res=await fetch(n2pnConfig.ajaxUrl,{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:params});var data=await res.json();if(!data.success){var msg=(data.data&&data.data.message)?data.data.message:'不明なエラー';var extra='';if(data.data&&data.data.token_head){extra+='<br><small style="color:#999;">token: '+escapeHtml(data.data.token_head)+' ('+data.data.token_len+'文字)</small>';}
7statusEl.innerHTML='<small style="color:#f44336;">確認エラー: '+escapeHtml(msg)+'</small>'+extra;if(/InvalidToken/i.test(msg)){var actionsEl=document.getElementById('n2pn-fcm-actions');var diffEl=document.getElementById('n2pn-fcm-diff');if(diffEl){diffEl.style.display='block';diffEl.innerHTML='<p style="margin:8px 0;">保存されているFCMトークンが失効しています。<br>新しいトークンを発行して全トピックに再登録します。</p>';}
8if(actionsEl){actionsEl.style.display='block';var btn=document.getElementById('n2pn-fcm-repair-btn');btn.textContent='トークンを再発行して登録し直す';btn.dataset.mode='refresh-token';delete btn.dataset.missing;}}
9return;}
10var actualTopics=data.data.actual_topics||[];window.__n2pnFcmActual=actualTopics;renderStatus(actualTopics);markCheckboxes(actualTopics);}catch(err){console.error('FCM状態確認エラー:',err);statusEl.innerHTML='<small style="color:#f44336;">確認失敗: '+escapeHtml(err.message)+'</small>';}}
11function getSelectedTopics(){return Array.prototype.map.call(document.querySelectorAll('input[name="topics[]"]:checked'),function(cb){return cb.value;});}
12function getLabelMap(){var map={};document.querySelectorAll('input[name="topics[]"]').forEach(function(cb){var span=cb.parentElement.querySelector('span');if(span)map[cb.value]=span.textContent.trim();});return map;}
13function renderStatus(actualTopics){var statusEl=document.getElementById('n2pn-fcm-status-text');var diffEl=document.getElementById('n2pn-fcm-diff');var actionsEl=document.getElementById('n2pn-fcm-actions');var repairBtn=document.getElementById('n2pn-fcm-repair-btn');var card=document.getElementById('n2pn-fcm-status-card');var selected=getSelectedTopics();var missing=selected.filter(function(t){return actualTopics.indexOf(t)===-1;});if(missing.length===0){statusEl.innerHTML='<strong style="color:#4CAF50;">✓ すべてのトピックが正常に登録されています</strong> <small>('+actualTopics.length+'件)</small>';diffEl.style.display='none';actionsEl.style.display='none';if(card)card.style.borderLeftColor='#4CAF50';return;}
14if(card)card.style.borderLeftColor='#FF9800';statusEl.innerHTML='<strong style="color:#FF9800;">⚠ '+missing.length+'件のトピックがFCMに未登録です</strong>';var labelMap=getLabelMap();var missingLabels=missing.map(function(t){return escapeHtml(labelMap[t]||t);});diffEl.style.display='block';diffEl.innerHTML='<strong>未登録のトピック:</strong><br>'+missingLabels.join('、');actionsEl.style.display='block';repairBtn.dataset.missing=JSON.stringify(missing);}
15function markCheckboxes(actualTopics){document.querySelectorAll('input[name="topics[]"]').forEach(function(cb){var label=cb.closest('.n2pn-checkbox-item');
15if(!label)return;var existing=label.querySelector('.n2pn-fcm-mark');if(existing)existing.remove();if(!cb.checked)return;var mark=document.createElement('small');mark.className='n2pn-fcm-mark';mark.style.marginLeft='auto';mark.style.paddingLeft='8px';mark.style.fontSize='14px';mark.style.fontWeight='bold';if(actualTopics.indexOf(cb.value)!==-1){mark.innerHTML='<span style="color:#4CAF50;">✓</span>';mark.title='FCMに登録済み';}else{mark.innerHTML='<span style="color:#f44336;">✗</span>';mark.title='FCMに未登録';}
16label.appendChild(mark);});}
17async function handleRepair(e){var btn=e.currentTarget;var mode=btn.dataset.mode||'missing';if(!window.n2pnPush){alert('通知サービスが初期化されていません。通知を許可してからお試しください。');return;}
18if(mode==='refresh-token'){var originalText=btn.textContent;btn.disabled=true;btn.textContent='トークン再発行中...';try{localStorage.removeItem('n2pn_fcm_token');if(typeof window.n2pnPush.requestPermission==='function'){await window.n2pnPush.requestPermission();}
19var allSelected=getSelectedTopics();if(allSelected.length>0&&typeof window.n2pnPush.subscribe==='function'){btn.textContent='登録中('+allSelected.length+'件)...';await window.n2pnPush.subscribe(allSelected);localStorage.setItem('n2pn_subscribed_topics',JSON.stringify(allSelected));}
20btn.textContent='✓ 再登録完了、確認中...';setTimeout(function(){checkFcmSubscriptions();btn.disabled=false;btn.textContent=originalText;btn.dataset.mode='missing';},1500);}catch(err){console.error('トークン再発行エラー:',err);alert('トークンの再発行に失敗しました: '+err.message);btn.disabled=false;btn.textContent=originalText;}
21return;}
22var missing;try{missing=JSON.parse(btn.dataset.missing||'[]');}catch(_){missing=[];}
23if(missing.length===0)return;if(typeof window.n2pnPush.subscribe!=='function'){alert('通知サービスが初期化されていません。');return;}
24var originalText=btn.textContent;btn.disabled=true;btn.textContent='登録中('+missing.length+'件)...';try{await window.n2pnPush.subscribe(missing);var current=[];try{current=JSON.parse(localStorage.getItem('n2pn_subscribed_topics')||'[]');}catch(_){current=[];}
25var merged=current.slice();missing.forEach(function(t){if(merged.indexOf(t)===-1)merged.push(t);});localStorage.setItem('n2pn_subscribed_topics',JSON.stringify(merged));btn.textContent='✓ 登録完了、再確認中...';setTimeout(function(){checkFcmSubscriptions();btn.disabled=false;btn.textContent=originalText;},1500);}catch(err){console.error('修復エラー:',err);alert('再登録に失敗しました: '+err.message);btn.disabled=false;btn.textContent=originalText;}}
26function escapeHtml(str){return String(str).replace(/[&<>"']/g,function(m){return({'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'})[m];});}})();

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.