1const SESSION_KEY = 'planeta_last_order'; 2export const TRACK_STORAGE_PREFIX = 'planeta_track_'; 3/** Po tym czasie wpis Åledzenia znika z przeglÄ darki (ms). */ 4const TRACK_MAX_AGE_MS = 24 * 60 * 60 * 1000; 5 6export function generateOrderId(now = new Date()) { 7 const date = [ 8 now.getFullYear(), 9 String(now.getMonth() + 1).padStart(2, '0'), 10 String(now.getDate()).padStart(2, '0') 11 ].join(''); 12 const rand = Math.random().toString(36).slice(2, 6).toUpperCase(); 13 return `PL-${date}-${rand}`; 14} 15 16export function generateTrackingToken() { 17 try { 18 const bytes = new Uint8Array(16); 19 crypto.getRandomValues(bytes); 20 return Array.from(bytes, b => b.toString(16).padStart(2, '0')).join(''); 21 } catch { 22 return `${Date.now().toString(16)}${Math.random().toString(16).slice(2, 10)}`; 23 } 24} 25 26/** Absolutny URL strony Åledzenia zamówienia. */ 27export function buildOrderTrackingUrl(orderId, trackingToken, { lang = '' } = {}) { 28 if (!orderId || !trackingToken) return ''; 29 const path = window.location.pathname.replace(/\\/g, '/'); 30 let basePath = path.replace(/\/[^/]*$/, '/'); 31 if (/\/en\//.test(path)) { 32 basePath = path.replace(/\/en\/.*$/, '/'); 33 } 34 const url = new URL(`${window.location.origin}${basePath}sledz.html`); 35 url.searchParams.set('id', orderId); 36 url.searchParams.set('t', trackingToken); 37 if (lang === 'en') url.searchParams.set('lang', 'en'); 38 return url.toString(); 39} 40 41export function isOrderTrackingEnabled(config = {}) { 42 return config?.orderTracking?.kitchenStatuses === true; 43} 44 45export function trackStorageKey(orderId) { 46 return `${TRACK_STORAGE_PREFIX}${String(orderId || '').trim()}`; 47} 48 49/** Zapisuje id+token Åledzenia w localStorage (FAB na stronie + powrót do sledz). */ 50export function saveActiveOrderTracking(orderId, { 51 token = '', 52 url = '', 53 deliveryLocation = null 54} = {}) { 55 const id = String(orderId || '').trim(); 56 const trackingToken = String(token || '').trim(); 57 if (!id || !trackingToken) return false; 58 try { 59 localStorage.setItem(trackStorageKey(id), JSON.stringify({ 60 token: trackingToken, 61 url: String(url || '').trim(), 62 deliveryLocation: deliveryLocation || null, 63 savedAt: Date.now() 64 })); 65 return true; 66 } catch { 67 return false; 68 } 69} 70 71export function clearActiveOrderTracking(orderId) { 72 const id = String(orderId || '').trim(); 73 if (!id) return; 74 try { 75 localStorage.removeItem(trackStorageKey(id)); 76 } catch { 77 // ignore 78 } 79} 80 81/** Lista aktywnych ÅledzeÅ z localStorage (najnowsze pierwsze). */ 82export function listActiveOrderTrackings({ maxAgeMs = TRACK_MAX_AGE_MS } = {}) { 83 const now = Date.now(); 84 const items = []; 85 try { 86 for (let i = 0; i < localStorage.length; i += 1) { 87 const key = localStorage.key(i); 88 if (!key || !key.startsWith(TRACK_STORAGE_PREFIX)) continue; 89 const orderId = key.slice(TRACK_STORAGE_PREFIX.length); 90 if (!orderId) continue; 91 let raw; 92 try { 93 raw = JSON.parse(localStorage.getItem(key) || ''); 94 } catch { 95 localStorage.removeItem(key); 96 continue; 97 } 98 const token = String(raw?.token || '').trim(); 99 if (!token) { 100 localStorage.removeItem(key); 101 continue; 102 } 103 const savedAt = Number(raw?.savedAt) || 0; 104 if (maxAgeMs > 0 && savedAt > 0 && now - savedAt > maxAgeMs) { 105 localStorage.removeItem(key); 106 continue; 107 } 108 items.push({ 109 orderId, 110 token, 111 url: String(raw?.url || '').trim(), 112 deliveryLocation: raw?.deliveryLocation || null, 113 savedAt: savedAt || 0 114 }); 115 } 116 } catch { 117 return []; 118 } 119 items.sort((a, b) => (b.savedAt || 0) - (a.savedAt || 0)); 120 return items; 121} 122 123export function saveOrderConfirmation(orderId, orderData, config = {}, extra = {}) { 124 const restaurant = config.restaurant || {}; 125 const trackingToken = extra.trackingToken || ''; 126 const trackingUrl = extra.trackingUrl || ''; 127 const payload = { 128 orderId, 129 trackingToken, 130 trackingUrl, 131 orderData: { 132 name: orderData.name, 133 phone: orderData.phone, 134 email: orderData.email, 135 type: orderData.type, 136 address: orderData.address, 137 paymentMethod: orderData.paymentMethod, 138 orderTime: orderData.orderTime, 139 notes: orderData.notes, 140 promoCode: orderData.promoCode, 141 promoLabel: orderData.promoLabel, 142 freeDrink: orderData.freeDrink, 143 items: orderData.items, 144 totals: orderData.totals 145 }, 146 restaurant: { 147 name: restaurant.name, 148 phone: restaurant.phone, 149 address: restaurant.address, 150 city: restaurant.city, 151 orderRules: restaurant.orderRules || null 152 }, 153 createdAt: Date.now() 154 }; 155 156 sessionStorage.setItem(SESSION_KEY, JSON.stringify(payload)); 157 158 if (trackingToken) { 159 saveActiveOrderTracking(orderId, { 160 token: trackingToken, 161 url: trackingUrl, 162 deliveryLocation: extra.deliveryLocation || null 163 });
164 } 165 166 try { 167 localStorage.setItem('planeta_repeat_order', JSON.stringify({ 168 savedAt: Date.now(), 169 items: (orderData.items || []).map(item => ({ 170 id: item.id, 171 name: item.name, 172 size: item.size || null, 173 price: item.price, 174 image: item.image || '', 175 extras: Array.isArray(item.extras) ? item.extras : [], 176 quantity: Math.max(1, Number(item.quantity) || 1) 177 })) 178 })); 179 } catch {} 180} 181 182export function loadOrderConfirmation() { 183 try { 184 const raw = sessionStorage.getItem(SESSION_KEY); 185 return raw ? JSON.parse(raw) : null; 186 } catch { 187 return null; 188 } 189} 190 191export function clearOrderConfirmation() { 192 sessionStorage.removeItem(SESSION_KEY); 193}
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.