Boka en städare

1
Dina uppgifter
2
Tid & adress
3
Bekräfta
Boka din städning
Fyll i dina uppgifter – bekräftelse via mail inom 2 timmar
💚
Använd RUT-avdrag
Betala bara 50% – vi fixar resten med Skatteverket
🔒 Krypteras och hanteras säkert · Används bara för RUT-ansökan hos Skatteverket
🛡️ 100% nöjdhetsgaranti – inte nöjd? Vi städar om gratis →
✓ Gratis avbokning upp till 24h
✓ Betalning via Swish efter städning
✓ Nöjdhetsgaranti
Hem Hitta städare Boka städning Hur det funkar Priser Tjänster Bli städare Boka nu →
{ try { const res = await fetch( `https://nominatim.openstreetmap.org/search?q=${encodeURIComponent(q+', Sverige')}&format=json&addressdetails=1&limit=5&countrycodes=se`, { headers: { 'Accept-Language': 'sv', 'User-Agent': 'Spick/1.0 hello@spick.se' } } ); const data = await res.json(); if (!data.length) { box.style.display='none'; return; } box.innerHTML = data.map(r => { const addr = r.display_name.split(', Sweden')[0]; const road = r.address?.road || ''; const num = r.address?.house_number || ''; const city = r.address?.city || r.address?.town || r.address?.municipality || ''; const post = r.address?.postcode || ''; const label = [road+' '+num, post+' '+city].filter(Boolean).join(', ').trim(); return `
📍 ${label || addr}
`; }).join(''); box.style.display = 'block'; } catch(e) { box.style.display='none'; } }, 350); } function selectAddr(label, lat, lng) { document.getElementById('address').value = label; document.getElementById('addr-suggestions').style.display = 'none'; // Spara koordinater för geo-matchning window._bookingLat = parseFloat(lat); window._bookingLng = parseFloat(lng); // Extrahera stad const parts = label.split(','); if (parts.length > 1) window._bookingCity = parts[parts.length-1].trim().replace(/^\d+ /, ''); } // Stäng dropdown vid klick utanför document.addEventListener('click', e => { if (!e.target.closest('.f')) { const box = document.getElementById('addr-suggestions'); if (box) box.style.display = 'none'; } }); // ── BANKID AUTOFYLL ─────────────────────────────────────── async function autofillViaBankID() { const pnr = document.getElementById('pnr')?.value?.replace(/[^0-9]/g,''); if (!pnr || pnr.length < 10) { alert('Fyll i personnumret först (YYYYMMDD-XXXX)'); return; } const btn = document.getElementById('bankid-fill-btn'); const status = document.getElementById('bankid-status'); btn.disabled = true; btn.textContent = '⏳ Verifierar...'; status.style.display = 'block'; status.style.background = '#EFF6FF'; status.style.color = '#1E40AF'; status.textContent = '🔵 BankID-verifiering startas – öppna din BankID-app...'; try { // Anropa BankID edge function const res = await fetch('https://urjeijcncsyuletprydy.supabase.co/functions/v1/bankid', { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVyamVpamNuY3N5dWxldHByeWR5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQyNzIyNDQsImV4cCI6MjA4OTg0ODI0NH0.CH5MSMaWTBfkuzZQOBKgxu-B6Vfy8w9DLh49WPU1Vd0' }, body: JSON.stringify({ action: 'start', personalNumber: pnr }) }); const data = await res.json(); if (data.demo) { // Demo-läge: simulera ett lyckat svar status.style.background = '#DCFCE7'; status.style.color = '#166534'; status.textContent = '✅ BankID verifierad! (Demo-läge – namn hämtat)'; // Fyll i demo-uppgifter (namn + adress via SPAR i produktion) const demoName = 'Anna Andersson'; const [first, ...rest] = demoName.split(' '); if (document.getElementById('fname') && !document.getElementById('fname').value) { document.getElementById('fname').value = first; document.getElementById('fname').dispatchEvent(new Event('input')); } if (document.getElementById('lname') && !document.getElementById('lname').value) { document.getElementById('lname').value = rest.join(' '); document.getElementById('lname').dispatchEvent(new Event('input')); } // I produktion: data.address fylls i automatiskt via SPAR // if (data.address?.full && document.getElementById('address')) { // document.getElementById('address').value = data.address.full; // } } else if (data.sessionId) { // Poll för svar let attempts = 0; const poll = setInterval(async () => { attempts++; if (attempts > 20) { clearInterval(poll); status.style.background = '#FEE2E2'; status.style.color = '#991B1B'; status.textContent = '❌ Tidsgräns – försök igen'; btn.disabled = false; btn.textContent = 'Autofyll'; return; } const pollRes = await fetch('https://urjeijcncsyuletprydy.supabase.co/functions/v1/bankid', { method: 'POST', headers: { 'Content-Type': 'application/json', 'apikey': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InVyamVpamNuY3N5dWxldHByeWR5Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzQyNzIyNDQsImV4cCI6MjA4OTg0ODI0NH0.CH5MSMaWTBfkuzZQOBKgxu-B6Vfy8w9DLh49WPU1Vd0' }, body: JSON.stringify({ action: 'poll', sessionId: data.sessionId }) }).then(r => r.json()); if (pollRes.status === 'complete') { clearInterval(poll); status.style.background = '#DCFCE7'; status.style.color = '#166534'; status.textContent = `✅ BankID verifierad! Välkommen, ${pollRes.givenName}!`; // Autofyll formuläret if (pollRes.givenName && document.getElementById('fname')) { document.getElementById('fname').value = pollRes.givenName; } if (pollRes.surname && document.getElementById('lname')) { document.getElementById('lname').value = pollRes.surname; } btn.textContent = '✅ Verifierad'; } }, 2000); } } catch(e) { status.style.background = '#FEE2E2'; status.style.color = '#991B1B'; status.textContent = '❌ Fel vid BankID-verifiering'; btn.disabled = false; btn.textContent = 'Autofyll'; } } >