if('serviceWorker' in navigator){ navigator.serviceWorker.register('/sw.js').catch(()=>{}); } function _b64ToUint8(b64){ const pad='='.repeat((4-b64.length%4)%4); const base=(b64+pad).replace(/-/g,'+').replace(/_/g,'/'); const raw=atob(base); const arr=new Uint8Array(raw.length); for(let i=0;i{ if(document.hidden){ stopMojePolling(); } else if(tab==='moje'){ odswiezMojeCicho(); startMojePolling(); } }); if(token)start();else renderLogin(); // ============ USTAWIENIA KONTA KLIENTA ============ function _podswietlMotyw(){ var akt=document.documentElement.getAttribute('data-theme')==='jasny'?'jasny':'ciemny'; var j=document.getElementById('motywJasny'), c=document.getElementById('motywCiemny'); var ON='flex:1;background:var(--akcent);color:#fff;border-color:var(--akcent);font-weight:600;'; var OFF='flex:1;background:var(--karta2);color:var(--tekst2);border:1px solid var(--border);'; if(j) j.style.cssText=(akt==='jasny'?ON:OFF); if(c) c.style.cssText=(akt==='ciemny'?ON:OFF); } function wybierzMotyw(m){ ustawMotyw(m); setTimeout(_podswietlMotyw,30); } // d56-subkonta-ui: zarzadzanie subkontami (tylko konto glowne) async function ladujMojeSubkonta(){ const box = document.getElementById('ustSubkonta'); const sekcja = document.getElementById('ustSubkontaSekcja'); try{ const r = await api('GET','/api/subkonta'); // sukces = jestesmy kontem glownym -> pokaz sekcje if(sekcja) sekcja.style.display=''; const suby = (r&&r.subkonta)||[]; if(!box) return; if(!suby.length){ box.innerHTML='
Brak subkont. Dodaj pierwsze dla podwykonawcy.
'; return; } box.innerHTML = suby.map(s=>`
${esc(s.nazwa_firmy||s.imie||s.email)}
${esc(s.email)} \u00b7 ${s.pokazuj_ceny?'ceny widoczne':'ceny ukryte'}
`).join(''); }catch(e){ // 403 = jestesmy subkontem -> sekcja zostaje ukryta (subkonto nie zarzadza subkontami) if(sekcja) sekcja.style.display='none'; } } function dodajSubkontoModal(){ const tlo = document.getElementById('modalTlo') || document.body; let modal = document.getElementById('subkontoModal'); if(!modal){ modal = document.createElement('div'); modal.id='subkontoModal'; modal.style.cssText='position:fixed;inset:0;background:rgba(0,0,0,.5);display:flex;align-items:center;justify-content:center;z-index:9999;padding:16px;'; document.body.appendChild(modal); } modal.innerHTML = `
\ud83d\udc65 Nowe subkonto
`; } async function zapiszSubkonto(){ const email=(document.getElementById('subEmail')||{}).value||''; const haslo=(document.getElementById('subHaslo')||{}).value||''; const nazwa=(document.getElementById('subNazwa')||{}).value||''; const imie=(document.getElementById('subImie')||{}).value||''; const st=document.getElementById('subStatus'); if(!email.trim()||haslo.length<6){ if(st){st.style.color='#e0241b';st.textContent='Email + haslo min. 6 znakow';} return; } try{ await api('POST','/api/subkonta',{email:email.trim(),haslo,nazwa_firmy:nazwa.trim()||null,imie:imie.trim()||null}); const m=document.getElementById('subkontoModal'); if(m) m.remove(); toast('Subkonto utworzone \u2713'); ladujMojeSubkonta(); }catch(e){ if(st){st.style.color='#e0241b';st.textContent='Blad: '+(e.message||'');} } } async function renderUstawienia(){ const w=document.getElementById('widok'); if(!w) return; w.innerHTML='

Ustawienia

Ładowanie...
'; try{ const p=await api('GET','/api/konto/profil'); setTimeout(_podswietlMotyw, 50); document.getElementById('ustTresc').innerHTML=`
Motyw aplikacji
Konto
E-mail${esc(p.email||'')}
${p.nazwa_firmy?`
Firma${esc(p.nazwa_firmy)}
`:''}
Telefon kontaktowy
Zmiana hasła
Powiadomienia
\ud83d\udccd Moje adresy
Bezpieczeństwo
Wylogowuje Cię też z tego urządzenia — trzeba będzie zalogować się ponownie.
`; odswiezUstPush(p.push_wlaczony); ladujMojeAdresy(); /* d47-adresy */ ladujMojeSubkonta(); /* d56-subkonta-ui */ }catch(e){ document.getElementById('ustTresc').innerHTML='
Błąd: '+esc(e.message)+'
'; } } function odswiezUstPush(wlaczony){ const box=document.getElementById('ustPushStan'); if(!box) return; if(!('Notification' in window)||!('serviceWorker' in navigator)||!('PushManager' in window)){ box.innerHTML='
Powiadomienia niedostępne na tym urządzeniu.
'; return; } if(Notification.permission==='denied'){ box.innerHTML='
Powiadomienia zablokowane w ustawieniach przeglądarki. Odblokuj je tam, aby włączyć.
'; return; } if(wlaczony && Notification.permission==='granted'){ box.innerHTML='
\u{1F514} Powiadomienia włączone
'+ ''; }else{ box.innerHTML=''; } } async function zapiszTelefon(){ const tel=document.getElementById('ustTelefon').value.trim(); try{ await api('POST','/api/konto/telefon',{telefon:tel}); toast('Telefon zapisany \u2713'); } catch(e){ toast('Błąd: '+e.message); } } async function zmienHaslo(){ const stare=document.getElementById('ustStare').value; const nowe=document.getElementById('ustNowe').value; const nowe2=document.getElementById('ustNowe2').value; if(!stare||!nowe){ toast('Wypełnij wszystkie pola'); return; } if(nowe.length<6){ toast('Nowe hasło min. 6 znaków'); return; } if(nowe!==nowe2){ toast('Hasła nie są takie same'); return; } try{ await api('POST','/api/konto/haslo',{stare_haslo:stare,nowe_haslo:nowe}); toast('Hasło zmienione \u2713'); document.getElementById('ustStare').value=''; document.getElementById('ustNowe').value=''; document.getElementById('ustNowe2').value=''; }catch(e){ toast(e.message||'Błąd zmiany hasła'); } } async function wlaczPushUst(){ await wlaczPowiadomienia(); try{ const p=await api('GET','/api/konto/profil'); odswiezUstPush(p.push_wlaczony); }catch(e){} } async function wylaczPush(){ if(!confirm('Wyłączyć powiadomienia o statusie zamówień?')) return; try{ await api('POST','/api/konto/push-wylacz',{}); try{ const reg=await navigator.serviceWorker.ready; const sub=await reg.pushManager.getSubscription(); if(sub) await sub.unsubscribe(); }catch(e){} toast('Powiadomienia wyłączone'); odswiezUstPush(false); }catch(e){ toast('Błąd: '+e.message); } } async function wylogujWszedzie(){ if(!confirm('Wylogować ze wszystkich urządzeń? Trzeba będzie zalogować się ponownie.')) return; try{ await api('POST','/api/konto/wyloguj-wszedzie',{}); toast('Wylogowano ze wszystkich urządzeń'); setTimeout(wyloguj, 800); }catch(e){ toast('Błąd: '+e.message); } }