@zonetrix/viewer 2.10.2 → 2.10.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,95 +1,95 @@
1
- import { jsx as y, jsxs as D } from "react/jsx-runtime";
2
- import { useState as R, useEffect as Y, useRef as T, useCallback as N, useMemo as _, memo as ce } from "react";
3
- import { Stage as dt, Layer as Fe, Group as ut, Rect as Te, Text as Ie, Circle as ht } from "react-konva";
4
- import { ref as we, onValue as ze, off as Ae, get as ft } from "firebase/database";
1
+ import { jsx as y, jsxs as L } from "react/jsx-runtime";
2
+ import { useState as N, useEffect as W, useRef as A, useCallback as I, useMemo as U, memo as ne, useSyncExternalStore as lt } from "react";
3
+ import { Stage as dt, Layer as Me, Group as ut, Rect as ke, Text as Ee, Circle as ht } from "react-konva";
4
+ import { ref as ve, onValue as Le, off as De, get as ft } from "firebase/database";
5
5
  import { fromFirebaseSeatMap as gt } from "@zonetrix/shared";
6
6
  function pt(t) {
7
- const [n, o] = R(null), [r, u] = R(!1), [l, s] = R(null), x = async () => {
7
+ const [n, i] = N(null), [r, d] = N(!1), [c, o] = N(null), S = async () => {
8
8
  if (t) {
9
- u(!0), s(null);
9
+ d(!0), o(null);
10
10
  try {
11
- const f = await fetch(t);
12
- if (!f.ok)
13
- throw new Error(`Failed to fetch config: ${f.statusText}`);
14
- const i = await f.json();
15
- o(i);
16
- } catch (f) {
17
- const i = f instanceof Error ? f : new Error("Unknown error occurred");
18
- s(i), console.error("Failed to fetch seat map config:", i);
11
+ const h = await fetch(t);
12
+ if (!h.ok)
13
+ throw new Error(`Failed to fetch config: ${h.statusText}`);
14
+ const a = await h.json();
15
+ i(a);
16
+ } catch (h) {
17
+ const a = h instanceof Error ? h : new Error("Unknown error occurred");
18
+ o(a), console.error("Failed to fetch seat map config:", a);
19
19
  } finally {
20
- u(!1);
20
+ d(!1);
21
21
  }
22
22
  }
23
23
  };
24
- return Y(() => {
25
- x();
24
+ return W(() => {
25
+ S();
26
26
  }, [t]), {
27
27
  config: n,
28
28
  loading: r,
29
- error: l,
30
- refetch: x
29
+ error: c,
30
+ refetch: S
31
31
  };
32
32
  }
33
- function yt(t) {
34
- const [n, o] = R({ width: 0, height: 0 });
35
- return Y(() => {
33
+ function bt(t) {
34
+ const [n, i] = N({ width: 0, height: 0 });
35
+ return W(() => {
36
36
  const r = t.current;
37
37
  if (!r) return;
38
- const { width: u, height: l } = r.getBoundingClientRect();
39
- u > 0 && l > 0 && o({ width: u, height: l });
40
- const s = new ResizeObserver((x) => {
41
- const f = x[0];
42
- if (!f) return;
43
- const { width: i, height: a } = f.contentRect;
44
- i > 0 && a > 0 && o((d) => d.width === i && d.height === a ? d : { width: i, height: a });
38
+ const { width: d, height: c } = r.getBoundingClientRect();
39
+ d > 0 && c > 0 && i({ width: d, height: c });
40
+ const o = new ResizeObserver((S) => {
41
+ const h = S[0];
42
+ if (!h) return;
43
+ const { width: a, height: s } = h.contentRect;
44
+ a > 0 && s > 0 && i((u) => u.width === a && u.height === s ? u : { width: a, height: s });
45
45
  });
46
- return s.observe(r), () => {
47
- s.disconnect();
46
+ return o.observe(r), () => {
47
+ o.disconnect();
48
48
  };
49
49
  }, [t]), n;
50
50
  }
51
- function De(t, n) {
51
+ function Ie(t, n) {
52
52
  return Math.sqrt(Math.pow(n.x - t.x, 2) + Math.pow(n.y - t.y, 2));
53
53
  }
54
- function ke(t, n) {
54
+ function Fe(t, n) {
55
55
  return {
56
56
  x: (t.x + n.x) / 2,
57
57
  y: (t.y + n.y) / 2
58
58
  };
59
59
  }
60
- function bt(t, n) {
61
- const o = T(null), r = T(null), u = T(1);
62
- Y(() => {
63
- const l = t.current;
64
- if (!l || !n.enabled) return;
65
- const s = l.container(), x = (a) => {
66
- if (a.touches.length === 2) {
67
- a.preventDefault();
68
- const d = { x: a.touches[0].clientX, y: a.touches[0].clientY }, h = { x: a.touches[1].clientX, y: a.touches[1].clientY };
69
- o.current = De(d, h), r.current = ke(d, h), u.current = n.currentScale;
60
+ function yt(t, n) {
61
+ const i = A(null), r = A(null), d = A(1);
62
+ W(() => {
63
+ const c = t.current;
64
+ if (!c || !n.enabled) return;
65
+ const o = c.container(), S = (s) => {
66
+ if (s.touches.length === 2) {
67
+ s.preventDefault();
68
+ const u = { x: s.touches[0].clientX, y: s.touches[0].clientY }, f = { x: s.touches[1].clientX, y: s.touches[1].clientY };
69
+ i.current = Ie(u, f), r.current = Fe(u, f), d.current = n.currentScale;
70
70
  }
71
- }, f = (a) => {
72
- if (a.touches.length !== 2) return;
73
- a.preventDefault();
74
- const d = { x: a.touches[0].clientX, y: a.touches[0].clientY }, h = { x: a.touches[1].clientX, y: a.touches[1].clientY }, m = De(d, h), S = ke(d, h);
75
- if (o.current !== null && r.current !== null) {
76
- const C = m / o.current, F = Math.min(
71
+ }, h = (s) => {
72
+ if (s.touches.length !== 2) return;
73
+ s.preventDefault();
74
+ const u = { x: s.touches[0].clientX, y: s.touches[0].clientY }, f = { x: s.touches[1].clientX, y: s.touches[1].clientY }, g = Ie(u, f), x = Fe(u, f);
75
+ if (i.current !== null && r.current !== null) {
76
+ const C = g / i.current, R = Math.min(
77
77
  Math.max(n.currentScale * C, n.minScale),
78
78
  n.maxScale
79
- ), I = s.getBoundingClientRect(), M = S.x - I.left, L = S.y - I.top, z = n.currentScale, X = {
80
- x: (M - n.currentPosition.x) / z,
81
- y: (L - n.currentPosition.y) / z
82
- }, q = S.x - r.current.x, j = S.y - r.current.y, Z = {
83
- x: M - X.x * F + q,
84
- y: L - X.y * F + j
79
+ ), F = o.getBoundingClientRect(), M = x.x - F.left, k = x.y - F.top, Y = n.currentScale, T = {
80
+ x: (M - n.currentPosition.x) / Y,
81
+ y: (k - n.currentPosition.y) / Y
82
+ }, X = x.x - r.current.x, j = x.y - r.current.y, re = {
83
+ x: M - T.x * R + X,
84
+ y: k - T.y * R + j
85
85
  };
86
- n.onScaleChange(F, Z), o.current = m, r.current = S;
86
+ n.onScaleChange(R, re), i.current = g, r.current = x;
87
87
  }
88
- }, i = (a) => {
89
- a.touches.length < 2 && (o.current = null, r.current = null);
88
+ }, a = (s) => {
89
+ s.touches.length < 2 && (i.current = null, r.current = null);
90
90
  };
91
- return s.addEventListener("touchstart", x, { passive: !1 }), s.addEventListener("touchmove", f, { passive: !1 }), s.addEventListener("touchend", i), () => {
92
- s.removeEventListener("touchstart", x), s.removeEventListener("touchmove", f), s.removeEventListener("touchend", i);
91
+ return o.addEventListener("touchstart", S, { passive: !1 }), o.addEventListener("touchmove", h, { passive: !1 }), o.addEventListener("touchend", a), () => {
92
+ o.removeEventListener("touchstart", S), o.removeEventListener("touchmove", h), o.removeEventListener("touchend", a);
93
93
  };
94
94
  }, [t, n]);
95
95
  }
@@ -103,45 +103,45 @@ const vt = {
103
103
  seatHidden: "#4a4a4a",
104
104
  gridLines: "#404040",
105
105
  currency: "KD"
106
- }, Xe = ce(({ seat: t, state: n, colors: o, onClick: r, onMouseEnter: u, onMouseLeave: l }) => {
107
- const f = {
108
- available: o.seatAvailable,
109
- reserved: o.seatReserved,
110
- selected: o.seatSelected,
111
- unavailable: o.seatUnavailable,
112
- hidden: o.seatHidden
106
+ }, Ne = ne(({ seat: t, state: n, colors: i, onClick: r, onMouseEnter: d, onMouseLeave: c }) => {
107
+ const h = {
108
+ available: i.seatAvailable,
109
+ reserved: i.seatReserved,
110
+ selected: i.seatSelected,
111
+ unavailable: i.seatUnavailable,
112
+ hidden: i.seatHidden
113
113
  // Hidden seats are filtered out, but included for type safety
114
- }[n], i = n === "available" || n === "selected", a = N(() => {
115
- i && r(t);
116
- }, [t, r, i]), d = N((S) => {
117
- u(t, S);
118
- const C = S.target.getStage();
119
- C && i && (C.container().style.cursor = "pointer");
120
- }, [t, u, i]), h = N((S) => {
121
- l();
122
- const C = S.target.getStage();
114
+ }[n], a = n === "available" || n === "selected", s = I(() => {
115
+ a && r(t);
116
+ }, [t, r, a]), u = I((x) => {
117
+ d(t, x);
118
+ const C = x.target.getStage();
119
+ C && a && (C.container().style.cursor = "pointer");
120
+ }, [t, d, a]), f = I((x) => {
121
+ c();
122
+ const C = x.target.getStage();
123
123
  C && (C.container().style.cursor = "grab");
124
- }, [l]), m = {
124
+ }, [c]), g = {
125
125
  x: t.position.x,
126
126
  y: t.position.y,
127
- fill: f,
127
+ fill: h,
128
128
  stroke: "#ffffff",
129
129
  strokeWidth: 1,
130
- onClick: a,
131
- onTap: a,
132
- onMouseEnter: d,
133
- onMouseLeave: h
130
+ onClick: s,
131
+ onTap: s,
132
+ onMouseEnter: u,
133
+ onMouseLeave: f
134
134
  };
135
135
  return t.shape === "circle" ? /* @__PURE__ */ y(
136
136
  ht,
137
137
  {
138
- ...m,
138
+ ...g,
139
139
  radius: 12
140
140
  }
141
141
  ) : /* @__PURE__ */ y(
142
- Te,
142
+ ke,
143
143
  {
144
- ...m,
144
+ ...g,
145
145
  width: 24,
146
146
  height: 24,
147
147
  offsetX: 12,
@@ -150,9 +150,9 @@ const vt = {
150
150
  }
151
151
  );
152
152
  });
153
- Xe.displayName = "ViewerSeat";
154
- const Ye = ce(({ stage: t, stageColor: n }) => {
155
- const o = (l) => ({
153
+ Ne.displayName = "ViewerSeat";
154
+ const Te = ne(({ stage: t, stageColor: n }) => {
155
+ const i = (c) => ({
156
156
  stage: "🎭",
157
157
  table: "⬜",
158
158
  wall: "▬",
@@ -161,10 +161,10 @@ const Ye = ce(({ stage: t, stageColor: n }) => {
161
161
  bar: "🍷",
162
162
  "entry-exit": "🚪",
163
163
  custom: "➕"
164
- })[l || "stage"] || "🎭", r = t.config.color || n, u = o(t.config.objectType);
165
- return /* @__PURE__ */ D(ut, { x: t.position.x, y: t.position.y, rotation: t.config.rotation || 0, children: [
164
+ })[c || "stage"] || "🎭", r = t.config.color || n, d = i(t.config.objectType);
165
+ return /* @__PURE__ */ L(ut, { x: t.position.x, y: t.position.y, rotation: t.config.rotation || 0, children: [
166
166
  /* @__PURE__ */ y(
167
- Te,
167
+ ke,
168
168
  {
169
169
  width: t.config.width,
170
170
  height: t.config.height,
@@ -175,9 +175,9 @@ const Ye = ce(({ stage: t, stageColor: n }) => {
175
175
  }
176
176
  ),
177
177
  /* @__PURE__ */ y(
178
- Ie,
178
+ Ee,
179
179
  {
180
- text: u,
180
+ text: d,
181
181
  x: 0,
182
182
  y: 0,
183
183
  width: t.config.width,
@@ -189,7 +189,7 @@ const Ye = ce(({ stage: t, stageColor: n }) => {
189
189
  }
190
190
  ),
191
191
  /* @__PURE__ */ y(
192
- Ie,
192
+ Ee,
193
193
  {
194
194
  text: t.config.label,
195
195
  x: 0,
@@ -205,20 +205,20 @@ const Ye = ce(({ stage: t, stageColor: n }) => {
205
205
  )
206
206
  ] });
207
207
  });
208
- Ye.displayName = "ViewerStage";
209
- const je = ce(({
208
+ Te.displayName = "ViewerStage";
209
+ const ze = ne(({
210
210
  floors: t,
211
211
  currentFloorId: n,
212
- onFloorChange: o,
212
+ onFloorChange: i,
213
213
  showAllOption: r,
214
- allLabel: u,
215
- position: l,
216
- className: s
214
+ allLabel: d,
215
+ position: c,
216
+ className: o
217
217
  }) => {
218
- const x = _(
219
- () => [...t].sort((h, m) => h.order - m.order),
218
+ const S = U(
219
+ () => [...t].sort((f, g) => f.order - g.order),
220
220
  [t]
221
- ), i = {
221
+ ), a = {
222
222
  position: "absolute",
223
223
  display: "flex",
224
224
  alignItems: "center",
@@ -233,8 +233,8 @@ const je = ce(({
233
233
  "top-right": { top: 0, right: 0 },
234
234
  "bottom-left": { bottom: 0, left: 0 },
235
235
  "bottom-right": { bottom: 0, right: 0 }
236
- }[l]
237
- }, a = {
236
+ }[c]
237
+ }, s = {
238
238
  padding: "10px 16px",
239
239
  fontSize: "14px",
240
240
  fontWeight: 500,
@@ -246,44 +246,44 @@ const je = ce(({
246
246
  transition: "all 0.2s ease",
247
247
  minHeight: "44px",
248
248
  touchAction: "manipulation"
249
- }, d = {
250
- ...a,
249
+ }, u = {
250
+ ...s,
251
251
  backgroundColor: "#3A7DE5",
252
252
  borderColor: "#3A7DE5"
253
253
  };
254
- return /* @__PURE__ */ D("div", { className: s, style: i, children: [
254
+ return /* @__PURE__ */ L("div", { className: o, style: a, children: [
255
255
  r && /* @__PURE__ */ y(
256
256
  "button",
257
257
  {
258
258
  type: "button",
259
- onClick: () => o(null),
260
- style: n === null ? d : a,
261
- children: u
259
+ onClick: () => i(null),
260
+ style: n === null ? u : s,
261
+ children: d
262
262
  }
263
263
  ),
264
- x.map((h) => /* @__PURE__ */ y(
264
+ S.map((f) => /* @__PURE__ */ y(
265
265
  "button",
266
266
  {
267
267
  type: "button",
268
- onClick: () => o(h.id),
269
- style: n === h.id ? d : a,
270
- children: h.name
268
+ onClick: () => i(f.id),
269
+ style: n === f.id ? u : s,
270
+ children: f.name
271
271
  },
272
- h.id
272
+ f.id
273
273
  ))
274
274
  ] });
275
275
  });
276
- je.displayName = "FloorSelectorBar";
277
- const We = ce(({
276
+ ze.displayName = "FloorSelectorBar";
277
+ const Ae = ne(({
278
278
  scale: t,
279
279
  minScale: n,
280
- maxScale: o,
280
+ maxScale: i,
281
281
  onZoomIn: r,
282
- onZoomOut: u,
283
- position: l,
284
- className: s
282
+ onZoomOut: d,
283
+ position: c,
284
+ className: o
285
285
  }) => {
286
- const f = {
286
+ const h = {
287
287
  position: "absolute",
288
288
  display: "flex",
289
289
  flexDirection: "column",
@@ -298,8 +298,8 @@ const We = ce(({
298
298
  "top-right": { top: 0, right: 0 },
299
299
  "bottom-left": { bottom: 0, left: 0 },
300
300
  "bottom-right": { bottom: 0, right: 0 }
301
- }[l]
302
- }, i = {
301
+ }[c]
302
+ }, a = {
303
303
  width: "44px",
304
304
  height: "44px",
305
305
  minWidth: "44px",
@@ -316,19 +316,19 @@ const We = ce(({
316
316
  justifyContent: "center",
317
317
  transition: "all 0.2s ease",
318
318
  touchAction: "manipulation"
319
- }, a = {
320
- ...i,
319
+ }, s = {
320
+ ...a,
321
321
  opacity: 0.4,
322
322
  cursor: "not-allowed"
323
- }, d = t < o, h = t > n;
324
- return /* @__PURE__ */ D("div", { className: s, style: f, children: [
323
+ }, u = t < i, f = t > n;
324
+ return /* @__PURE__ */ L("div", { className: o, style: h, children: [
325
325
  /* @__PURE__ */ y(
326
326
  "button",
327
327
  {
328
328
  type: "button",
329
329
  onClick: r,
330
- disabled: !d,
331
- style: d ? i : a,
330
+ disabled: !u,
331
+ style: u ? a : s,
332
332
  title: "Zoom In",
333
333
  children: "+"
334
334
  }
@@ -337,32 +337,32 @@ const We = ce(({
337
337
  "button",
338
338
  {
339
339
  type: "button",
340
- onClick: u,
341
- disabled: !h,
342
- style: h ? i : a,
340
+ onClick: d,
341
+ disabled: !f,
342
+ style: f ? a : s,
343
343
  title: "Zoom Out",
344
344
  children: "−"
345
345
  }
346
346
  )
347
347
  ] });
348
348
  });
349
- We.displayName = "ZoomControls";
350
- const Pe = ce(({
349
+ Ae.displayName = "ZoomControls";
350
+ const Xe = ne(({
351
351
  visible: t,
352
352
  x: n,
353
- y: o,
353
+ y: i,
354
354
  seat: r,
355
- currency: u,
356
- state: l
355
+ currency: d,
356
+ state: c
357
357
  }) => {
358
358
  if (!t || !r) return null;
359
- const s = r.seatNumber || (r.rowLabel && r.columnLabel ? `${r.rowLabel}-${r.columnLabel}` : "N/A"), x = {
359
+ const o = r.seatNumber || (r.rowLabel && r.columnLabel ? `${r.rowLabel}-${r.columnLabel}` : "N/A"), S = {
360
360
  position: "fixed",
361
361
  left: `${n + 15}px`,
362
- top: `${o + 15}px`,
362
+ top: `${i + 15}px`,
363
363
  zIndex: 1e3,
364
364
  pointerEvents: "none"
365
- }, f = {
365
+ }, h = {
366
366
  backgroundColor: "rgba(26, 26, 26, 0.95)",
367
367
  color: "#fff",
368
368
  border: "1px solid #444",
@@ -371,512 +371,530 @@ const Pe = ce(({
371
371
  fontSize: "13px",
372
372
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.3)",
373
373
  minWidth: "140px"
374
- }, i = {
374
+ }, a = {
375
375
  color: "#9ca3af",
376
376
  marginRight: "4px"
377
- }, a = {
377
+ }, s = {
378
378
  fontWeight: 600
379
- }, d = {
379
+ }, u = {
380
380
  color: "#4ade80",
381
381
  fontWeight: 600
382
- }, h = {
382
+ }, f = {
383
383
  fontSize: "11px",
384
384
  color: "#6b7280",
385
385
  textTransform: "capitalize",
386
386
  marginTop: "4px"
387
387
  };
388
- return /* @__PURE__ */ y("div", { style: x, children: /* @__PURE__ */ D("div", { style: f, children: [
389
- r.sectionName && /* @__PURE__ */ D("div", { style: { marginBottom: "4px" }, children: [
390
- /* @__PURE__ */ y("span", { style: i, children: "Section:" }),
391
- /* @__PURE__ */ y("span", { style: { ...a, color: "#3b82f6" }, children: r.sectionName })
388
+ return /* @__PURE__ */ y("div", { style: S, children: /* @__PURE__ */ L("div", { style: h, children: [
389
+ r.sectionName && /* @__PURE__ */ L("div", { style: { marginBottom: "4px" }, children: [
390
+ /* @__PURE__ */ y("span", { style: a, children: "Section:" }),
391
+ /* @__PURE__ */ y("span", { style: { ...s, color: "#3b82f6" }, children: r.sectionName })
392
392
  ] }),
393
- /* @__PURE__ */ D("div", { style: { marginBottom: "4px" }, children: [
394
- /* @__PURE__ */ y("span", { style: i, children: "Seat:" }),
395
- /* @__PURE__ */ y("span", { style: a, children: s })
393
+ /* @__PURE__ */ L("div", { style: { marginBottom: "4px" }, children: [
394
+ /* @__PURE__ */ y("span", { style: a, children: "Seat:" }),
395
+ /* @__PURE__ */ y("span", { style: s, children: o })
396
396
  ] }),
397
- r.price !== void 0 && r.price > 0 && l === "available" && /* @__PURE__ */ D("div", { style: { marginBottom: "4px" }, children: [
398
- /* @__PURE__ */ y("span", { style: i, children: "Price:" }),
399
- /* @__PURE__ */ D("span", { style: d, children: [
400
- u,
397
+ r.price !== void 0 && r.price > 0 && c === "available" && /* @__PURE__ */ L("div", { style: { marginBottom: "4px" }, children: [
398
+ /* @__PURE__ */ y("span", { style: a, children: "Price:" }),
399
+ /* @__PURE__ */ L("span", { style: u, children: [
400
+ d,
401
401
  " ",
402
402
  r.price.toFixed(2)
403
403
  ] })
404
404
  ] }),
405
- /* @__PURE__ */ D("div", { style: h, children: [
405
+ /* @__PURE__ */ L("div", { style: f, children: [
406
406
  "Status: ",
407
- l
407
+ c
408
408
  ] })
409
409
  ] }) });
410
410
  });
411
- Pe.displayName = "SeatTooltip";
412
- const Et = ({
411
+ Xe.displayName = "SeatTooltip";
412
+ const It = ({
413
413
  config: t,
414
414
  configUrl: n,
415
- floorId: o,
415
+ floorId: i,
416
416
  onFloorChange: r,
417
- reservedSeats: u = [],
418
- unavailableSeats: l = [],
419
- selectedSeats: s,
420
- myReservedSeats: x = [],
421
- onSeatSelect: f,
422
- onSeatDeselect: i,
423
- onSelectionChange: a,
424
- colorOverrides: d,
425
- showTooltip: h = !0,
426
- zoomEnabled: m = !0,
427
- className: S = "",
417
+ reservedSeats: d = [],
418
+ unavailableSeats: c = [],
419
+ selectedSeats: o,
420
+ myReservedSeats: S = [],
421
+ onSeatSelect: h,
422
+ onSeatDeselect: a,
423
+ onSelectionChange: s,
424
+ colorOverrides: u,
425
+ showTooltip: f = !0,
426
+ zoomEnabled: g = !0,
427
+ className: x = "",
428
428
  onConfigLoad: C,
429
- onError: F,
429
+ onError: R,
430
430
  // Floor selector props
431
- showFloorSelector: I,
431
+ showFloorSelector: F,
432
432
  floorSelectorPosition: M = "top-left",
433
- floorSelectorClassName: L,
434
- showAllFloorsOption: z = !0,
435
- allFloorsLabel: X = "All",
436
- fitToView: q = !0,
433
+ floorSelectorClassName: k,
434
+ showAllFloorsOption: Y = !0,
435
+ allFloorsLabel: T = "All",
436
+ fitToView: X = !0,
437
437
  fitPadding: j = 40,
438
438
  // Zoom controls
439
- showZoomControls: Z = !0,
440
- zoomControlsPosition: P = "bottom-right",
441
- zoomControlsClassName: K,
442
- minZoom: le,
443
- maxZoom: $ = 3,
444
- zoomStep: B = 0.25,
439
+ showZoomControls: re = !0,
440
+ zoomControlsPosition: Ye = "bottom-right",
441
+ zoomControlsClassName: je,
442
+ minZoom: xe,
443
+ maxZoom: B = 3,
444
+ zoomStep: oe = 0.25,
445
445
  // Touch gestures
446
- touchEnabled: Me = !0
446
+ touchEnabled: Pe = !0
447
447
  }) => {
448
- const O = T(null), V = T(null), E = yt(V), [U, ye] = R(/* @__PURE__ */ new Set()), [k, te] = R(1), [A, G] = R({ x: 0, y: 0 }), [$e, Be] = R(null), [Oe, Ue] = R(1), de = T({ width: 0, height: 0 }), [ne, Ee] = R({ visible: !1, x: 0, y: 0, seat: null, state: "available" }), { config: Ve, loading: He, error: re } = pt(n), g = t || Ve, be = o !== void 0, W = be ? o || null : $e, ue = s !== void 0, _e = N((e) => {
449
- be || Be(e), r?.(e);
450
- }, [be, r]), ve = g?.floors || [], qe = I !== void 0 ? I : ve.length > 1, he = _(
451
- () => g ? { ...g.colors, ...d } : { ...vt, ...d },
452
- [g, d]
453
- ), Q = _(() => {
454
- if (!g) return [];
455
- let e = g.seats.filter((c) => c.state !== "hidden");
456
- return W && (e = e.filter(
457
- (c) => c.floorId === W || !c.floorId && W === "floor_default"
448
+ const he = A(null), we = A(null), E = bt(we), [O, Ce] = N(/* @__PURE__ */ new Set()), [D, G] = N(1), [z, H] = N({ x: 0, y: 0 }), [We, Be] = N(null), [$e, Ue] = N(1), ie = A({ width: 0, height: 0 }), [Z, Re] = N({ visible: !1, x: 0, y: 0, seat: null, state: "available" }), { config: He, loading: Ve, error: K } = pt(n), p = t || He, fe = i !== void 0, P = fe ? i || null : We, se = o !== void 0, Oe = I((e) => {
449
+ fe || Be(e), r?.(e);
450
+ }, [fe, r]), ge = p?.floors || [], _e = F !== void 0 ? F : ge.length > 1, ae = U(
451
+ () => p ? { ...p.colors, ...u } : { ...vt, ...u },
452
+ [p, u]
453
+ ), _ = U(() => {
454
+ if (!p) return [];
455
+ let e = p.seats.filter((l) => l.state !== "hidden");
456
+ return P && (e = e.filter(
457
+ (l) => l.floorId === P || !l.floorId && P === "floor_default"
458
458
  )), e;
459
- }, [g, W]), fe = _(() => g?.stages ? W ? g.stages.filter(
460
- (e) => e.floorId === W || !e.floorId && W === "floor_default"
461
- ) : g.stages : [], [g, W]), H = _(() => {
462
- if (!g || Q.length === 0 && fe.length === 0)
459
+ }, [p, P]), ce = U(() => p?.stages ? P ? p.stages.filter(
460
+ (e) => e.floorId === P || !e.floorId && P === "floor_default"
461
+ ) : p.stages : [], [p, P]), $ = U(() => {
462
+ if (!p || _.length === 0 && ce.length === 0)
463
463
  return null;
464
464
  const e = 12;
465
- let c = 1 / 0, p = 1 / 0, b = -1 / 0, v = -1 / 0;
466
- return Q.forEach((w) => {
467
- c = Math.min(c, w.position.x - e), p = Math.min(p, w.position.y - e), b = Math.max(b, w.position.x + e), v = Math.max(v, w.position.y + e);
468
- }), fe.forEach((w) => {
469
- c = Math.min(c, w.position.x), p = Math.min(p, w.position.y), b = Math.max(b, w.position.x + (w.config?.width || 200)), v = Math.max(v, w.position.y + (w.config?.height || 100));
470
- }), { minX: c, minY: p, maxX: b, maxY: v, width: b - c, height: v - p };
471
- }, [g, Q, fe]);
472
- Y(() => {
473
- if (!q || !g || !H || E.width === 0 || E.height === 0) return;
474
- const e = Math.abs(E.width - de.current.width), c = Math.abs(E.height - de.current.height);
475
- if (!(de.current.width === 0) && e < 10 && c < 10) return;
476
- de.current = E;
477
- const b = E.width, v = E.height, w = b - j * 2, se = v - j * 2, ge = w / H.width, xe = se / H.height, pe = Math.min(ge, xe, $), ot = H.minX + H.width / 2, it = H.minY + H.height / 2, st = b / 2, at = v / 2, ct = st - ot * pe, lt = at - it * pe;
478
- te(pe), G({ x: ct, y: lt }), Ue(pe);
479
- }, [q, g, H, j, $, E, W]);
480
- const J = _(() => {
481
- const e = new Set(u), c = new Set(l), p = new Set(x);
482
- return { reserved: e, unavailable: c, myReserved: p };
483
- }, [u, l, x]), me = _(() => s ? new Set(s) : null, [s]), oe = N((e) => {
484
- const c = e.id, p = e.seatNumber || "";
485
- return J.unavailable.has(c) || J.unavailable.has(p) ? "unavailable" : J.reserved.has(c) || J.reserved.has(p) ? "reserved" : J.myReserved.has(c) || J.myReserved.has(p) || U.has(c) ? "selected" : e.state;
486
- }, [J, U]);
487
- Y(() => {
488
- g && C && C(g);
489
- }, [g, C]), Y(() => {
490
- re && F && F(re);
491
- }, [re, F]), Y(() => {
492
- ue && me && ye(me);
493
- }, [ue, me]);
494
- const Ge = N((e) => {
495
- const c = oe(e);
496
- if (c !== "available" && c !== "selected")
465
+ let l = 1 / 0, b = 1 / 0, v = -1 / 0, m = -1 / 0;
466
+ return _.forEach((w) => {
467
+ l = Math.min(l, w.position.x - e), b = Math.min(b, w.position.y - e), v = Math.max(v, w.position.x + e), m = Math.max(m, w.position.y + e);
468
+ }), ce.forEach((w) => {
469
+ l = Math.min(l, w.position.x), b = Math.min(b, w.position.y), v = Math.max(v, w.position.x + (w.config?.width || 200)), m = Math.max(m, w.position.y + (w.config?.height || 100));
470
+ }), { minX: l, minY: b, maxX: v, maxY: m, width: v - l, height: m - b };
471
+ }, [p, _, ce]);
472
+ W(() => {
473
+ if (!X || !p || !$ || E.width === 0 || E.height === 0) return;
474
+ const e = Math.abs(E.width - ie.current.width), l = Math.abs(E.height - ie.current.height);
475
+ if (!(ie.current.width === 0) && e < 10 && l < 10) return;
476
+ ie.current = E;
477
+ const v = E.width, m = E.height, w = v - j * 2, ee = m - j * 2, le = w / $.width, be = ee / $.height, de = Math.min(le, be, B), rt = $.minX + $.width / 2, ot = $.minY + $.height / 2, it = v / 2, st = m / 2, at = it - rt * de, ct = st - ot * de;
478
+ G(de), H({ x: at, y: ct }), Ue(de);
479
+ }, [X, p, $, j, B, E, P]);
480
+ const V = U(() => {
481
+ const e = new Set(d), l = new Set(c), b = new Set(S);
482
+ return { reserved: e, unavailable: l, myReserved: b };
483
+ }, [d, c, S]), pe = U(() => o ? new Set(o) : null, [o]), J = I((e) => {
484
+ const l = e.id, b = e.seatNumber || "";
485
+ return V.unavailable.has(l) || V.unavailable.has(b) ? "unavailable" : V.reserved.has(l) || V.reserved.has(b) ? "reserved" : V.myReserved.has(l) || V.myReserved.has(b) || O.has(l) ? "selected" : e.state;
486
+ }, [V, O]);
487
+ W(() => {
488
+ p && C && C(p);
489
+ }, [p, C]), W(() => {
490
+ K && R && R(K);
491
+ }, [K, R]), W(() => {
492
+ se && pe && Ce(pe);
493
+ }, [se, pe]);
494
+ const qe = I((e) => {
495
+ const l = J(e);
496
+ if (l !== "available" && l !== "selected")
497
497
  return;
498
- const p = U.has(e.id);
499
- ue || ye((b) => {
500
- const v = new Set(b);
501
- return p ? v.delete(e.id) : v.add(e.id), v;
502
- }), p ? i?.(e) : (f?.(e), f || console.log("Seat selected:", e));
503
- }, [oe, U, ue, f, i]), ie = _(() => g ? Q.filter((e) => U.has(e.id)) : [], [Q, U]);
504
- Y(() => {
505
- a?.(ie);
506
- }, [ie, a]);
507
- const ee = le !== void 0 ? le : Oe, Je = N(() => {
508
- if (!m) return;
509
- const e = Math.min(k + B, $);
510
- if (e !== k) {
511
- const c = E.width || g?.canvas.width || 800, p = E.height || g?.canvas.height || 600, b = c / 2, v = p / 2, w = {
512
- x: (b - A.x) / k,
513
- y: (v - A.y) / k
498
+ const b = O.has(e.id);
499
+ se || Ce((v) => {
500
+ const m = new Set(v);
501
+ return b ? m.delete(e.id) : m.add(e.id), m;
502
+ }), b ? a?.(e) : (h?.(e), h || console.log("Seat selected:", e));
503
+ }, [J, O, se, h, a]), Q = U(() => p ? _.filter((e) => O.has(e.id)) : [], [_, O]);
504
+ W(() => {
505
+ s?.(Q);
506
+ }, [Q, s]);
507
+ const q = xe !== void 0 ? xe : $e, Ge = I(() => {
508
+ if (!g) return;
509
+ const e = Math.min(D + oe, B);
510
+ if (e !== D) {
511
+ const l = E.width || p?.canvas.width || 800, b = E.height || p?.canvas.height || 600, v = l / 2, m = b / 2, w = {
512
+ x: (v - z.x) / D,
513
+ y: (m - z.y) / D
514
514
  };
515
- te(e), G({
516
- x: b - w.x * e,
517
- y: v - w.y * e
515
+ G(e), H({
516
+ x: v - w.x * e,
517
+ y: m - w.y * e
518
518
  });
519
519
  }
520
- }, [m, k, B, $, E, g, A]), Ze = N(() => {
521
- if (!m) return;
522
- const e = Math.max(k - B, ee);
523
- if (e !== k) {
524
- const c = E.width || g?.canvas.width || 800, p = E.height || g?.canvas.height || 600, b = c / 2, v = p / 2, w = {
525
- x: (b - A.x) / k,
526
- y: (v - A.y) / k
520
+ }, [g, D, oe, B, E, p, z]), Ze = I(() => {
521
+ if (!g) return;
522
+ const e = Math.max(D - oe, q);
523
+ if (e !== D) {
524
+ const l = E.width || p?.canvas.width || 800, b = E.height || p?.canvas.height || 600, v = l / 2, m = b / 2, w = {
525
+ x: (v - z.x) / D,
526
+ y: (m - z.y) / D
527
527
  };
528
- te(e), G({
529
- x: b - w.x * e,
530
- y: v - w.y * e
528
+ G(e), H({
529
+ x: v - w.x * e,
530
+ y: m - w.y * e
531
531
  });
532
532
  }
533
- }, [m, k, B, ee, E, g, A]), Ke = N((e) => {
534
- G({
533
+ }, [g, D, oe, q, E, p, z]), Ke = I((e) => {
534
+ H({
535
535
  x: e.target.x(),
536
536
  y: e.target.y()
537
537
  });
538
- }, []), Qe = N((e) => {
539
- if (!m) return;
538
+ }, []), Je = I((e) => {
539
+ if (!g) return;
540
540
  e.evt.preventDefault();
541
- const c = O.current;
542
- if (!c) return;
543
- const p = c.scaleX(), b = c.getPointerPosition();
544
- if (!b) return;
545
- const v = 1.1, w = e.evt.deltaY > 0 ? p / v : p * v, se = Math.min(Math.max(w, ee), $), ge = {
546
- x: (b.x - A.x) / p,
547
- y: (b.y - A.y) / p
548
- }, xe = {
549
- x: b.x - ge.x * se,
550
- y: b.y - ge.y * se
541
+ const l = he.current;
542
+ if (!l) return;
543
+ const b = l.scaleX(), v = l.getPointerPosition();
544
+ if (!v) return;
545
+ const m = 1.1, w = e.evt.deltaY > 0 ? b / m : b * m, ee = Math.min(Math.max(w, q), B), le = {
546
+ x: (v.x - z.x) / b,
547
+ y: (v.y - z.y) / b
548
+ }, be = {
549
+ x: v.x - le.x * ee,
550
+ y: v.y - le.y * ee
551
551
  };
552
- te(se), G(xe);
553
- }, [m, A, ee, $]);
554
- bt(O, {
555
- enabled: Me && m,
556
- minScale: ee,
557
- maxScale: $,
558
- currentScale: k,
559
- currentPosition: A,
560
- onScaleChange: (e, c) => {
561
- te(e), G(c);
552
+ G(ee), H(be);
553
+ }, [g, z, q, B]);
554
+ yt(he, {
555
+ enabled: Pe && g,
556
+ minScale: q,
557
+ maxScale: B,
558
+ currentScale: D,
559
+ currentPosition: z,
560
+ onScaleChange: (e, l) => {
561
+ G(e), H(l);
562
562
  },
563
563
  onPositionChange: (e) => {
564
- G(e);
564
+ H(e);
565
565
  }
566
566
  });
567
- const et = N((e, c) => {
568
- if (!h) return;
569
- const p = c.target.getStage();
570
- if (!p) return;
571
- const b = p.getPointerPosition();
567
+ const Qe = I((e, l) => {
568
+ if (!f) return;
569
+ const b = l.target.getStage();
572
570
  if (!b) return;
573
- const v = p.container().getBoundingClientRect();
574
- Ee({
571
+ const v = b.getPointerPosition();
572
+ if (!v) return;
573
+ const m = b.container().getBoundingClientRect();
574
+ Re({
575
575
  visible: !0,
576
- x: v.left + b.x,
577
- y: v.top + b.y,
576
+ x: m.left + v.x,
577
+ y: m.top + v.y,
578
578
  seat: e,
579
- state: oe(e)
579
+ state: J(e)
580
580
  });
581
- }, [h, oe]), tt = N(() => {
582
- Ee((e) => ({ ...e, visible: !1 }));
581
+ }, [f, J]), et = I(() => {
582
+ Re((e) => ({ ...e, visible: !1 }));
583
583
  }, []);
584
- if (He)
585
- return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${S}`, children: /* @__PURE__ */ y("p", { children: "Loading seat map..." }) });
586
- if (re)
587
- return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${S}`, children: /* @__PURE__ */ D("p", { className: "text-red-500", children: [
584
+ if (Ve)
585
+ return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${x}`, children: /* @__PURE__ */ y("p", { children: "Loading seat map..." }) });
586
+ if (K)
587
+ return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${x}`, children: /* @__PURE__ */ L("p", { className: "text-red-500", children: [
588
588
  "Error loading seat map: ",
589
- re.message
589
+ K.message
590
590
  ] }) });
591
- if (!g)
592
- return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${S}`, children: /* @__PURE__ */ y("p", { children: "No configuration provided" }) });
593
- const nt = E.width || g.canvas.width, rt = E.height || g.canvas.height;
594
- return /* @__PURE__ */ D(
591
+ if (!p)
592
+ return /* @__PURE__ */ y("div", { className: `flex items-center justify-center h-full ${x}`, children: /* @__PURE__ */ y("p", { children: "No configuration provided" }) });
593
+ const tt = E.width || p.canvas.width, nt = E.height || p.canvas.height;
594
+ return /* @__PURE__ */ L(
595
595
  "div",
596
596
  {
597
- ref: V,
598
- className: `relative ${S}`,
597
+ ref: we,
598
+ className: `relative ${x}`,
599
599
  style: { width: "100%", height: "100%" },
600
600
  children: [
601
- qe && ve.length > 0 && /* @__PURE__ */ y(
602
- je,
601
+ _e && ge.length > 0 && /* @__PURE__ */ y(
602
+ ze,
603
603
  {
604
- floors: ve,
605
- currentFloorId: W,
606
- onFloorChange: _e,
607
- showAllOption: z,
608
- allLabel: X,
604
+ floors: ge,
605
+ currentFloorId: P,
606
+ onFloorChange: Oe,
607
+ showAllOption: Y,
608
+ allLabel: T,
609
609
  position: M,
610
- className: L
610
+ className: k
611
611
  }
612
612
  ),
613
- /* @__PURE__ */ D(
613
+ /* @__PURE__ */ L(
614
614
  dt,
615
615
  {
616
- ref: O,
617
- width: nt,
618
- height: rt,
619
- scaleX: k,
620
- scaleY: k,
621
- x: A.x,
622
- y: A.y,
616
+ ref: he,
617
+ width: tt,
618
+ height: nt,
619
+ scaleX: D,
620
+ scaleY: D,
621
+ x: z.x,
622
+ y: z.y,
623
623
  draggable: !0,
624
624
  onDragEnd: Ke,
625
- onWheel: Qe,
626
- style: { backgroundColor: g.canvas.backgroundColor, cursor: "grab" },
625
+ onWheel: Je,
626
+ style: { backgroundColor: p.canvas.backgroundColor, cursor: "grab" },
627
627
  children: [
628
- /* @__PURE__ */ y(Fe, { listening: !1, children: fe.map((e) => /* @__PURE__ */ y(
629
- Ye,
628
+ /* @__PURE__ */ y(Me, { listening: !1, children: ce.map((e) => /* @__PURE__ */ y(
629
+ Te,
630
630
  {
631
631
  stage: e,
632
- stageColor: he.stageColor
632
+ stageColor: ae.stageColor
633
633
  },
634
634
  e.id
635
635
  )) }),
636
- /* @__PURE__ */ y(Fe, { children: Q.map((e) => /* @__PURE__ */ y(
637
- Xe,
636
+ /* @__PURE__ */ y(Me, { children: _.map((e) => /* @__PURE__ */ y(
637
+ Ne,
638
638
  {
639
639
  seat: e,
640
- state: oe(e),
641
- colors: he,
642
- onClick: Ge,
643
- onMouseEnter: et,
644
- onMouseLeave: tt
640
+ state: J(e),
641
+ colors: ae,
642
+ onClick: qe,
643
+ onMouseEnter: Qe,
644
+ onMouseLeave: et
645
645
  },
646
646
  e.id
647
647
  )) })
648
648
  ]
649
649
  }
650
650
  ),
651
- h && /* @__PURE__ */ y(
652
- Pe,
651
+ f && /* @__PURE__ */ y(
652
+ Xe,
653
653
  {
654
- visible: ne.visible,
655
- x: ne.x,
656
- y: ne.y,
657
- seat: ne.seat,
658
- currency: he.currency,
659
- state: ne.state
654
+ visible: Z.visible,
655
+ x: Z.x,
656
+ y: Z.y,
657
+ seat: Z.seat,
658
+ currency: ae.currency,
659
+ state: Z.state
660
660
  }
661
661
  ),
662
- Z && m && /* @__PURE__ */ y(
663
- We,
662
+ re && g && /* @__PURE__ */ y(
663
+ Ae,
664
664
  {
665
- scale: k,
666
- minScale: ee,
667
- maxScale: $,
668
- onZoomIn: Je,
665
+ scale: D,
666
+ minScale: q,
667
+ maxScale: B,
668
+ onZoomIn: Ge,
669
669
  onZoomOut: Ze,
670
- position: P,
671
- className: K
670
+ position: Ye,
671
+ className: je
672
672
  }
673
673
  ),
674
- ie.length > 0 && /* @__PURE__ */ D("div", { className: "absolute top-4 right-4 bg-white dark:bg-gray-800 p-4 rounded shadow-lg", children: [
675
- /* @__PURE__ */ D("h3", { className: "font-semibold mb-2", children: [
674
+ Q.length > 0 && /* @__PURE__ */ L("div", { className: "absolute top-4 right-4 bg-white dark:bg-gray-800 p-4 rounded shadow-lg", children: [
675
+ /* @__PURE__ */ L("h3", { className: "font-semibold mb-2", children: [
676
676
  "Selected Seats (",
677
- ie.length,
677
+ Q.length,
678
678
  ")"
679
679
  ] }),
680
- /* @__PURE__ */ y("div", { className: "max-h-48 overflow-y-auto space-y-1", children: ie.map((e) => /* @__PURE__ */ D("div", { className: "text-sm", children: [
680
+ /* @__PURE__ */ y("div", { className: "max-h-48 overflow-y-auto space-y-1", children: Q.map((e) => /* @__PURE__ */ L("div", { className: "text-sm", children: [
681
681
  e.seatNumber,
682
- e.price && ` - ${he.currency} ${e.price.toFixed(2)}`
682
+ e.price && ` - ${ae.currency} ${e.price.toFixed(2)}`
683
683
  ] }, e.id)) })
684
684
  ] })
685
685
  ]
686
686
  }
687
687
  );
688
688
  };
689
- let ae = null;
689
+ let te = null;
690
690
  function Ft(t) {
691
- ae = t;
691
+ te = t;
692
692
  }
693
- function Ce() {
694
- if (!ae)
693
+ function me() {
694
+ if (!te)
695
695
  throw new Error(
696
696
  "Firebase database not initialized. Call initializeFirebaseForViewer(db) first."
697
697
  );
698
- return ae;
698
+ return te;
699
699
  }
700
- function Re() {
701
- return ae !== null;
700
+ function Se() {
701
+ return te !== null;
702
702
  }
703
- function It() {
704
- ae = null;
703
+ function kt() {
704
+ te = null;
705
705
  }
706
- function Se(t, n) {
706
+ function ye(t, n) {
707
707
  if (t.length !== n.length) return !1;
708
- for (let o = 0; o < t.length; o++)
709
- if (t[o] !== n[o]) return !1;
710
- return !0;
708
+ const i = [...t].sort(), r = [...n].sort();
709
+ return i.every((d, c) => d === r[c]);
711
710
  }
712
- function Le(t, n) {
713
- return Se(t.myReserved, n.myReserved) && Se(t.otherReserved, n.otherReserved) && Se(t.unavailable, n.unavailable);
714
- }
715
- function Ne(t, n) {
716
- const o = [], r = [], u = [];
717
- return Object.entries(t).forEach(([l, s]) => {
718
- s && typeof s == "object" && s.state && (s.state === "unavailable" ? u.push(l) : s.state === "reserved" && (n && s.userId === n ? o.push(l) : r.push(l)));
719
- }), { myReserved: o, otherReserved: r, unavailable: u };
711
+ function mt(t, n) {
712
+ const i = [], r = [], d = [];
713
+ return Object.entries(t).forEach(([c, o]) => {
714
+ o && typeof o == "object" && o.state && (o.state === "unavailable" ? d.push(c) : o.state === "reserved" && (n && o.userId === n ? i.push(c) : r.push(c)));
715
+ }), {
716
+ myReserved: i.sort(),
717
+ otherReserved: r.sort(),
718
+ unavailable: d.sort()
719
+ };
720
720
  }
721
- function mt(t) {
722
- const { seatMapId: n, currentUserId: o, enabled: r = !0, onStateChange: u, onError: l } = t, [s, x] = R(null), [f, i] = R(!0), [a, d] = R(null), [h, m] = R(null), [S, C] = R([]), [F, I] = R([]), [M, L] = R([]), z = T(u), X = T(l), q = T(o);
723
- z.current = u, X.current = l, q.current = o;
724
- const j = T({
725
- myReserved: [],
726
- otherReserved: [],
727
- unavailable: []
728
- }), Z = T(null);
729
- return Y(() => {
730
- if (!r || !n) {
731
- i(!1);
732
- return;
733
- }
734
- if (!Re()) {
735
- i(!1), d(new Error("Firebase not initialized. Call initializeFirebaseForViewer first."));
736
- return;
737
- }
738
- const P = Ce(), K = we(P, `seat_states/${n}`);
739
- return i(!0), d(null), ze(K, (B) => {
740
- const O = B.val() || {}, V = Ne(O, q.current), E = j.current, U = JSON.stringify(Z.current) !== JSON.stringify(O);
741
- U && (x(O), Z.current = O), i(!1), !Le(E, V) && (m(Date.now()), C(V.myReserved), I(V.otherReserved), L(V.unavailable), j.current = V), U && z.current?.(O);
742
- }, (B) => {
743
- d(B), i(!1), X.current?.(B);
744
- }), () => {
745
- Ae(K);
746
- };
747
- }, [n, r]), Y(() => {
748
- if (s) {
749
- const P = Ne(s, o), K = j.current;
750
- !Le(K, P) && (C(P.myReserved), I(P.otherReserved), L(P.unavailable), j.current = P, m(Date.now()));
751
- }
752
- }, [o]), {
753
- states: s,
754
- loading: f,
755
- error: a,
756
- lastUpdated: h,
757
- myReservedSeats: S,
758
- otherReservedSeats: F,
759
- unavailableSeats: M,
721
+ const ue = {
722
+ states: null,
723
+ loading: !0,
724
+ error: null,
725
+ lastUpdated: null,
726
+ myReservedSeats: [],
727
+ otherReservedSeats: [],
728
+ unavailableSeats: []
729
+ };
730
+ function St(t) {
731
+ const { seatMapId: n, currentUserId: i, enabled: r = !0, onStateChange: d, onError: c } = t, o = A({ ...ue }), S = A(d), h = A(c), a = A(i);
732
+ S.current = d, h.current = c, a.current = i;
733
+ const s = I(
734
+ (x) => {
735
+ if (!r || !n)
736
+ return o.current = { ...ue, loading: !1 }, () => {
737
+ };
738
+ if (!Se())
739
+ return o.current = {
740
+ ...ue,
741
+ loading: !1,
742
+ error: new Error("Firebase not initialized. Call initializeFirebaseForViewer first.")
743
+ }, () => {
744
+ };
745
+ const C = me(), R = ve(C, `seatmaps/${n}/seat_states`);
746
+ return Le(R, (k) => {
747
+ const T = k.val() || {}, X = mt(T, a.current), j = o.current;
748
+ (j.loading || !ye(j.myReservedSeats, X.myReserved) || !ye(j.otherReservedSeats, X.otherReserved) || !ye(j.unavailableSeats, X.unavailable)) && (o.current = {
749
+ states: T,
750
+ loading: !1,
751
+ error: null,
752
+ lastUpdated: Date.now(),
753
+ myReservedSeats: X.myReserved,
754
+ otherReservedSeats: X.otherReserved,
755
+ unavailableSeats: X.unavailable
756
+ }, S.current?.(T), x());
757
+ }, (k) => {
758
+ o.current = {
759
+ ...o.current,
760
+ loading: !1,
761
+ error: k
762
+ }, h.current?.(k), x();
763
+ }), () => {
764
+ De(R);
765
+ };
766
+ },
767
+ [n, r, i]
768
+ // Include currentUserId to re-derive on user change
769
+ ), u = I(() => o.current, []), f = I(() => ue, []), g = lt(s, u, f);
770
+ return {
771
+ states: g.states,
772
+ loading: g.loading,
773
+ error: g.error,
774
+ lastUpdated: g.lastUpdated,
775
+ myReservedSeats: g.myReservedSeats,
776
+ otherReservedSeats: g.otherReservedSeats,
777
+ unavailableSeats: g.unavailableSeats,
760
778
  // Legacy alias
761
- reservedSeats: F
779
+ reservedSeats: g.otherReservedSeats
762
780
  };
763
781
  }
764
782
  function xt(t) {
765
783
  const {
766
784
  seatMapId: n,
767
- enabled: o = !0,
785
+ enabled: i = !0,
768
786
  subscribeToChanges: r = !1,
769
- onConfigLoad: u,
770
- onError: l
771
- } = t, [s, x] = R(null), [f, i] = R(!0), [a, d] = R(null), h = T(u), m = T(l);
772
- h.current = u, m.current = l;
773
- const S = N(async () => {
787
+ onConfigLoad: d,
788
+ onError: c
789
+ } = t, [o, S] = N(null), [h, a] = N(!0), [s, u] = N(null), f = A(d), g = A(c);
790
+ f.current = d, g.current = c;
791
+ const x = I(async () => {
774
792
  if (!n) return;
775
- if (!Re()) {
776
- d(new Error("Firebase not initialized. Call initializeFirebaseForViewer first.")), i(!1);
793
+ if (!Se()) {
794
+ u(new Error("Firebase not initialized. Call initializeFirebaseForViewer first.")), a(!1);
777
795
  return;
778
796
  }
779
- const C = Ce(), F = we(C, `seatmaps/${n}`);
797
+ const C = me(), R = ve(C, `seatmaps/${n}`);
780
798
  try {
781
- i(!0), d(null);
782
- const M = (await ft(F)).val();
799
+ a(!0), u(null);
800
+ const M = (await ft(R)).val();
783
801
  if (M) {
784
- const L = gt(M);
785
- x(L), h.current?.(L);
802
+ const k = gt(M);
803
+ S(k), f.current?.(k);
786
804
  } else
787
- d(new Error(`Seat map ${n} not found in Firebase`));
788
- } catch (I) {
789
- const M = I instanceof Error ? I : new Error("Unknown error");
790
- d(M), m.current?.(M);
805
+ u(new Error(`Seat map ${n} not found in Firebase`));
806
+ } catch (F) {
807
+ const M = F instanceof Error ? F : new Error("Unknown error");
808
+ u(M), g.current?.(M);
791
809
  } finally {
792
- i(!1);
810
+ a(!1);
793
811
  }
794
812
  }, [n]);
795
- return Y(() => {
796
- if (!o || !n) {
797
- i(!1);
813
+ return W(() => {
814
+ if (!i || !n) {
815
+ a(!1);
798
816
  return;
799
817
  }
800
- if (S(), r && Re()) {
801
- const C = Ce(), F = we(C, `seatmaps/${n}/meta/updated_at`);
802
- let I = !0, M = null;
803
- return ze(F, (z) => {
804
- if (I) {
805
- I = !1, M = z.val();
818
+ if (x(), r && Se()) {
819
+ const C = me(), R = ve(C, `seatmaps/${n}/meta/updated_at`);
820
+ let F = !0, M = null;
821
+ return Le(R, (Y) => {
822
+ if (F) {
823
+ F = !1, M = Y.val();
806
824
  return;
807
825
  }
808
- const X = z.val();
809
- z.exists() && X !== M && (M = X, S());
826
+ const T = Y.val();
827
+ Y.exists() && T !== M && (M = T, x());
810
828
  }), () => {
811
- Ae(F);
829
+ De(R);
812
830
  };
813
831
  }
814
- }, [n, o, r]), {
815
- config: s,
816
- loading: f,
817
- error: a,
818
- refetch: S
832
+ }, [n, i, r]), {
833
+ config: o,
834
+ loading: h,
835
+ error: s,
836
+ refetch: x
819
837
  };
820
838
  }
821
- function Dt(t) {
839
+ function Lt(t) {
822
840
  const {
823
841
  seatMapId: n,
824
- userId: o,
842
+ userId: i,
825
843
  enabled: r = !0,
826
- subscribeToDesignChanges: u = !1,
827
- onConfigLoad: l,
828
- onStateChange: s,
829
- onError: x
844
+ subscribeToDesignChanges: d = !1,
845
+ onConfigLoad: c,
846
+ onStateChange: o,
847
+ onError: S
830
848
  } = t, {
831
- config: f,
832
- loading: i,
833
- error: a,
834
- refetch: d
849
+ config: h,
850
+ loading: a,
851
+ error: s,
852
+ refetch: u
835
853
  } = xt({
836
854
  seatMapId: n,
837
855
  enabled: r,
838
- subscribeToChanges: u,
839
- onConfigLoad: l,
840
- onError: x
856
+ subscribeToChanges: d,
857
+ onConfigLoad: c,
858
+ onError: S
841
859
  }), {
842
- states: h,
843
- loading: m,
844
- error: S,
860
+ states: f,
861
+ loading: g,
862
+ error: x,
845
863
  lastUpdated: C,
846
- myReservedSeats: F,
847
- otherReservedSeats: I,
864
+ myReservedSeats: R,
865
+ otherReservedSeats: F,
848
866
  unavailableSeats: M,
849
- reservedSeats: L
850
- } = mt({
867
+ reservedSeats: k
868
+ } = St({
851
869
  seatMapId: n,
852
- currentUserId: o,
870
+ currentUserId: i,
853
871
  enabled: r,
854
- onStateChange: s,
855
- onError: x
872
+ onStateChange: o,
873
+ onError: S
856
874
  });
857
875
  return {
858
- config: f,
859
- loading: i || m,
860
- error: a || S,
861
- myReservedSeats: F,
862
- otherReservedSeats: I,
876
+ config: h,
877
+ loading: a || g,
878
+ error: s || x,
879
+ myReservedSeats: R,
880
+ otherReservedSeats: F,
863
881
  unavailableSeats: M,
864
- reservedSeats: L,
865
- seatStates: h,
882
+ reservedSeats: k,
883
+ seatStates: f,
866
884
  lastUpdated: C,
867
- refetch: d
885
+ refetch: u
868
886
  };
869
887
  }
870
888
  export {
871
889
  vt as DEFAULT_COLORS,
872
- Et as SeatMapViewer,
873
- It as clearFirebaseInstance,
890
+ It as SeatMapViewer,
891
+ kt as clearFirebaseInstance,
874
892
  Ft as initializeFirebaseForViewer,
875
- Re as isFirebaseInitialized,
893
+ Se as isFirebaseInitialized,
876
894
  pt as useConfigFetcher,
877
- yt as useContainerSize,
895
+ bt as useContainerSize,
878
896
  xt as useFirebaseConfig,
879
- mt as useFirebaseSeatStates,
880
- Dt as useRealtimeSeatMap,
881
- bt as useTouchGestures
897
+ St as useFirebaseSeatStates,
898
+ Lt as useRealtimeSeatMap,
899
+ yt as useTouchGestures
882
900
  };