PageSourceSearch

https://pizzeria-planeta.pl/js/order-confirmation.js

js pizzeria-planeta.pl collected 2026-10-08 07:36:05 UTC 5,868 bytes, 193 lines download raw bytes

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.