(async function (){
if(!('serviceWorker' in navigator)||!('PushManager' in window)){
console.log('Push not supported.');
return;
}
let publicKey='';
try {
const res=await fetch(JobnasNotif.ajax_url + '?action=jobnas_get_vapid');
const json=await res.json();
if(json.success) publicKey=json.data.publicKey;
} catch (e){
console.error('Gagal ambil VAPID', e);
return;
}
if(!publicKey){
console.log('Public key kosong.');
return;
}
const permission=await Notification.requestPermission();
if(permission!=='granted'){
console.log('User tidak memberi izin notif.');
return;
}
const reg=await navigator.serviceWorker.ready;
let sub=await reg.pushManager.getSubscription();
if(!sub){
try {
sub=await reg.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(publicKey)
});
} catch (e){
console.error('Gagal subscribe push', e);
return;
}}
try {
const ua=navigator.userAgent;
const payload={
subscription: sub.toJSON(),
browser: detectBrowser(ua),
platform: detectPlatform(ua)
};
await fetch(JobnasNotif.ajax_url + '?action=jobnas_subscribe', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
} catch (e){
console.error('Gagal kirim subscription', e);
}
function urlBase64ToUint8Array(base64String){
const padding='='.repeat((4 - (base64String.length % 4)) % 4);
const base64=(base64String + padding).replace(/-/g, '+').replace(/_/g, '/');
const rawData=atob(base64);
const outputArray=new Uint8Array(rawData.length);
for (let i=0; i < rawData.length; ++i){
outputArray[i]=rawData.charCodeAt(i);
}
return outputArray;
}
function detectBrowser(ua){
if(ua.includes('Chrome')) return 'Chrome';
if(ua.includes('Firefox')) return 'Firefox';
if(ua.includes('Safari')) return 'Safari';
if(ua.includes('Edge')) return 'Edge';
return 'Unknown';
}
function detectPlatform(ua){
if(ua.includes('Android')) return 'Android';
if(ua.includes('iPhone')||ua.includes('iPad')) return 'iOS';
if(ua.includes('Windows')) return 'Windows';
if(ua.includes('Mac')) return 'Mac';
return 'Unknown';
}})();