iticket-seatingplan-dev 1.5.4 → 1.5.6

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.js CHANGED
@@ -1,5 +1,3 @@
1
- import Badge from './components/Badge'
2
- import Button from './components/Button'
3
- import SeatingPlan from './components/SeatingPlan'
1
+ import SeatingPlan from "./components/SeatingPlan";
4
2
 
5
- export { Badge, Button, SeatingPlan }
3
+ export { SeatingPlan };
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "iticket-seatingplan-dev",
3
3
  "description": "Seating plan with FLEXi pricing",
4
4
  "author": "gedwyne",
5
- "version": "1.5.4",
5
+ "version": "1.5.6",
6
6
  "private": false,
7
7
  "keywords": [
8
8
  "iticket",
@@ -1,9 +0,0 @@
1
- import React from 'react'
2
- const Badge = (props) => {
3
- return (
4
- <div className={`badge ${!props.value ? 'badge--none' : ''} `}>
5
- <h4 className="heavy">{props.value || 0}</h4>
6
- </div>
7
- )
8
- }
9
- export default Badge
@@ -1,17 +0,0 @@
1
- import React from 'react'
2
- const Button = (props) => {
3
- return (
4
- <button
5
- className={`btn btn--${props.kind} CTA`}
6
- data-id={props.id}
7
- type={props.type}
8
- name={props.name}
9
- value={props.value}
10
- disabled={props.disabled}
11
- onClick={props.handleClick}
12
- >
13
- <h4>{props.label}</h4>
14
- </button>
15
- )
16
- }
17
- export default Button
@@ -1,277 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = Map;
7
- require("leaflet-gesture-handling/dist/leaflet-gesture-handling.css");
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _reactLeaflet = require("react-leaflet");
10
- var _leafletGestureHandling2 = require("leaflet-gesture-handling");
11
- var _reactLeafletCustomControl = _interopRequireDefault(require("react-leaflet-custom-control"));
12
- var _encodedSvgs = require("./assets/encodedSvgs");
13
- var _utils = require("../utils");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
16
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
- function Map(_ref) {
18
- let {
19
- seats,
20
- height,
21
- width,
22
- bounds,
23
- handleClickSeat,
24
- ticketPopupOpen,
25
- setTicketPopupOpen,
26
- chosenSeat,
27
- addTicketToCart,
28
- isReloading,
29
- initialFetch,
30
- isFullScreen,
31
- setIsFullScreen,
32
- priceSectionIds,
33
- areaName,
34
- price
35
- } = _ref;
36
- const [isLegendOpen, setIsLegendOpen] = (0, _react.useState)(false);
37
- const map = (0, _reactLeaflet.useMap)();
38
- (0, _react.useEffect)(() => {
39
- const closeOnEscape = e => {
40
- if (e.key === "Escape") {
41
- if (isFullScreen && !ticketPopupOpen) {
42
- setIsFullScreen(false);
43
- } else if (ticketPopupOpen) {
44
- map.closePopup();
45
- }
46
- }
47
- };
48
- if (typeof window !== "undefined") {
49
- window.addEventListener("keydown", closeOnEscape);
50
- }
51
- return () => {
52
- if (typeof window !== "undefined") {
53
- window.removeEventListener("keydown", closeOnEscape);
54
- }
55
- };
56
- }, [isFullScreen, ticketPopupOpen]);
57
-
58
- // gesture-handling plugin disallows scroll zooming and touch panning,
59
- // to allow users to scroll past the map when it's not full screen.
60
- (0, _react.useEffect)(() => {
61
- if (!isFullScreen) {
62
- map.addHandler("gestureHandling", _leafletGestureHandling2.GestureHandling);
63
- map.gestureHandling.enable();
64
- }
65
- }, [map, isFullScreen]);
66
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
67
- position: "bottomright"
68
- }, /*#__PURE__*/_react.default.createElement("div", {
69
- className: "legendBox"
70
- }, /*#__PURE__*/_react.default.createElement("div", {
71
- className: "legend-header"
72
- }, /*#__PURE__*/_react.default.createElement("button", {
73
- className: "legend-button ".concat(isLegendOpen ? "expanded" : ""),
74
- onClick: () => setIsLegendOpen(!isLegendOpen)
75
- }, /*#__PURE__*/_react.default.createElement("p", null, isLegendOpen ? "LEGEND:" : "VIEW LEGEND")), isLegendOpen && /*#__PURE__*/_react.default.createElement("button", {
76
- className: "close-button",
77
- onClick: () => setIsLegendOpen(false)
78
- }, /*#__PURE__*/_react.default.createElement("img", {
79
- src: _encodedSvgs.closeIcon,
80
- alt: "close"
81
- }))), /*#__PURE__*/_react.default.createElement("div", {
82
- className: "legend-contents ".concat(isLegendOpen ? "expanded" : "")
83
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
84
- className: "legend-item"
85
- }, /*#__PURE__*/_react.default.createElement("div", {
86
- className: "legend-symbol legend-available"
87
- }), /*#__PURE__*/_react.default.createElement("p", null, "available"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
88
- className: "legend-item"
89
- }, /*#__PURE__*/_react.default.createElement("div", {
90
- className: "legend-symbol legend-sold"
91
- }), /*#__PURE__*/_react.default.createElement("p", null, "sold"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
92
- className: "legend-item"
93
- }, /*#__PURE__*/_react.default.createElement("div", {
94
- className: "legend-symbol legend-in-cart"
95
- }), /*#__PURE__*/_react.default.createElement("p", null, "in cart"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
96
- className: "legend-item"
97
- }, /*#__PURE__*/_react.default.createElement("img", {
98
- src: _encodedSvgs.wheelchairIcon,
99
- width: 15,
100
- height: 15
101
- }), /*#__PURE__*/_react.default.createElement("p", null, "wheelchair"))), seats.seats.filter(seat => seat.m).length > 0 ? /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
102
- className: "legend-item"
103
- }, /*#__PURE__*/_react.default.createElement("img", {
104
- src: _encodedSvgs.userIcon,
105
- width: 15,
106
- height: 15
107
- }), /*#__PURE__*/_react.default.createElement("p", null, "membership seats"))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null)))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
108
- position: "topleft"
109
- }, /*#__PURE__*/_react.default.createElement("div", {
110
- className: "extra-controls"
111
- }, /*#__PURE__*/_react.default.createElement("button", {
112
- title: "Re-centre Seating Plan",
113
- onClick: () => map.fitBounds(bounds),
114
- className: "leaflet-control-zoom-in"
115
- }, /*#__PURE__*/_react.default.createElement("img", {
116
- src: "https://au-iticket-shop-legacy.azurewebsites.net/assets/images/fit-icon.jpg",
117
- style: {
118
- height: "17px"
119
- }
120
- })), /*#__PURE__*/_react.default.createElement("button", {
121
- title: "Reload Seating Plan",
122
- disabled: isReloading,
123
- onClick: () => {
124
- initialFetch(true);
125
- map.fitBounds(bounds);
126
- },
127
- className: "leaflet-control-zoom-in reload-seating-plan",
128
- style: {
129
- background: isReloading ? "rgb(0, 230, 64)" : "#fff"
130
- }
131
- }, /*#__PURE__*/_react.default.createElement("img", {
132
- className: isReloading ? "rotate" : "",
133
- src: "https://au-iticket-shop-legacy.azurewebsites.net/assets/images/refresh.png",
134
- style: {
135
- height: "17px"
136
- }
137
- })))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
138
- position: "topleft"
139
- }, /*#__PURE__*/_react.default.createElement("div", {
140
- className: "extra-controls full-screen-control"
141
- }, /*#__PURE__*/_react.default.createElement("button", {
142
- title: isFullScreen ? "Collapse Seating Plan" : "Expand Seating Plan",
143
- onClick: () => {
144
- setIsFullScreen(!isFullScreen);
145
- },
146
- className: "leaflet-control-zoom-in"
147
- }, /*#__PURE__*/_react.default.createElement("img", {
148
- src: isFullScreen ? _encodedSvgs.collapseIcon : _encodedSvgs.expandIcon,
149
- style: {
150
- height: "24px"
151
- }
152
- })))), /*#__PURE__*/_react.default.createElement(_reactLeafletCustomControl.default, {
153
- position: "topright"
154
- }, /*#__PURE__*/_react.default.createElement("button", {
155
- title: "Close full screen",
156
- onClick: () => setIsFullScreen(false),
157
- className: "full-screen-close-button ".concat(isFullScreen ? "show" : "")
158
- }, /*#__PURE__*/_react.default.createElement("img", {
159
- src: _encodedSvgs.closeIcon,
160
- style: {
161
- height: "24px"
162
- }
163
- }))), /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
164
- url: seats.background,
165
- bounds: [[0, 0], [height * 0.03, width * 0.03]],
166
- zIndex: 10
167
- }), seats && seats.seats && seats.seats.map((s, i) => {
168
- var _chosenSeat$seat;
169
- return /*#__PURE__*/_react.default.createElement("div", {
170
- key: i
171
- }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
172
- url: "https://iticketseatingplan.blob.core.windows.net/embed/static/media/rippleload.08e6a08dd832819226ef.gif",
173
- bounds: [[(s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.45 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207)) - 0.11, s.x * 0.3 + 0.15 - 0.11], [(s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.45 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207)) + 0.11, s.x * 0.3 + 0.15 + 0.11]
174
- // [height * 0.0302 - s.y * 0.602 - 0.3, s.x * 0.61 - 0.3],
175
- // [height * 0.0302 - s.y * 0.602 + 0.3, s.x * 0.61 + 0.3],
176
- // [height * 0.0302 - s.y * 0.602 - 0.17, s.x * 0.61 - 0.17],
177
- // [height * 0.0302 - s.y * 0.602 + 0.17, s.x * 0.61 + 0.17],
178
- ],
179
- opacity: s.loading || ticketPopupOpen && (chosenSeat === null || chosenSeat === void 0 || (_chosenSeat$seat = chosenSeat.seat) === null || _chosenSeat$seat === void 0 ? void 0 : _chosenSeat$seat.ssId) === s.ssId ? 100 : 0,
180
- zIndex: 10
181
- }), !priceSectionIds || priceSectionIds.includes(s.psId) ? s.s === _utils.statuses.WHEELCHAIR_ACCESS ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
182
- url: _encodedSvgs.wheelchairIcon,
183
- bounds: [
184
- // [
185
- // height * 0.0302 - s.y * 0.602 - 0.17,
186
- // s.x * 0.61 - 0.17,
187
- // ],
188
- // [
189
- // height * 0.0302 - s.y * 0.602 + 0.17,
190
- // s.x * 0.61 + 0.17,
191
- // ],
192
- [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207) - 0.11, s.x * 0.3 + 0.15 - 0.11], [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207) + 0.11, s.x * 0.3 + 0.15 + 0.11]],
193
- zIndex: 10
194
- }) : s.s === _utils.statuses.USER_PENDING && s.m ? /*#__PURE__*/_react.default.createElement(_reactLeaflet.ImageOverlay, {
195
- url: _encodedSvgs.userIcon,
196
- bounds: [
197
- // [
198
- // height * 0.0302 - s.y * 0.602 - 0.17,
199
- // s.x * 0.61 - 0.17,
200
- // ],
201
- // [
202
- // height * 0.0302 - s.y * 0.602 + 0.17,
203
- // s.x * 0.61 + 0.17,
204
- // ],
205
- [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207) - 0.11, s.x * 0.3 + 0.15 - 0.15], [height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.5 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207) + 0.11, s.x * 0.3 + 0.15 + 0.15]],
206
- zIndex: 10
207
- }) : /*#__PURE__*/_react.default.createElement(_reactLeaflet.Circle, {
208
- center: [
209
- // height * 0.0305 -
210
- // s.y * 0.57 -
211
- // height * (height > 700 ? 0.0001 : 0.0006),
212
- // s.x * 0.6 + 0.25,
213
- //experimental
214
- // 14.42,
215
- // (height / 33.33 - 0.3 * s.y).toFixed(1)
216
- // height / 33.33 - (height / 33.33) * s.y * 0.01, //29, //3 27, // height / 33.33 - s.y, // s.y * 0.3, //+ (height / 0.503) * 0.01, //11.66, // 5.2,
217
- //working
218
- s.r.includes("NORTH") ? height / 33.33 - height / 33.33 * s.y * 0.0105 + 1.4 : height * 0.05 - s.y / (height > 800 ? height > 999 ? 3.45 : 3.3 : 3.35) - (height > 800 ? height > 999 ? height * 0.0201 : height * 0.0198 : height > 587 ? height * 0.0201 : height > 399 ? height * 0.02035 : height * 0.0207),
219
- // s.r.includes('NORTH')
220
- // ? 0
221
- // : 0,
222
- s.x * 0.3 + 0.15
223
-
224
- // height * 0.04 -
225
- // s.y / (height > 800 ? 3.5 : 3.35) -
226
- // (height > 800 ? height * 0.0101 : height * 0.0201),
227
- // s.x * 0.3 + 0.15,
228
-
229
- // -s.y * (height * 0.00037) + 24.2,
230
- // s.x * 0.3 + 0.15,
231
- ],
232
- pathOptions: (0, _utils.getInitialColor)(s, price),
233
- radius: 12000,
234
- eventHandlers: {
235
- click: e => handleClickSeat(e, s),
236
- popupopen: () => {
237
- setTicketPopupOpen(true);
238
- },
239
- popupclose: () => {
240
- setTicketPopupOpen(false);
241
- }
242
- }
243
- // value={s}
244
- }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.Tooltip, {
245
- className: "seatname-tooltip",
246
- direction: "top",
247
- offset: [0, height * 0.03 + -30]
248
- }, s.r + "-" + s.c), s.s === _utils.statuses.UNSOLD && /*#__PURE__*/_react.default.createElement(_reactLeaflet.Popup, {
249
- className: "ticket-popup"
250
- }, /*#__PURE__*/_react.default.createElement("div", {
251
- className: "popup-header"
252
- }, /*#__PURE__*/_react.default.createElement("p", {
253
- className: "seatname"
254
- }, "".concat(areaName ? areaName + " | " : "").concat(s.r, "-").concat(s.c)), /*#__PURE__*/_react.default.createElement("button", {
255
- className: "close-button",
256
- "aria-label": "close popup",
257
- onClick: () => map.closePopup()
258
- }, /*#__PURE__*/_react.default.createElement("img", {
259
- src: _encodedSvgs.closeIcon,
260
- alt: "close"
261
- }))), /*#__PURE__*/_react.default.createElement("p", {
262
- className: "heading"
263
- }, "Select option:"), seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && price.psId === s.psId).map(price => /*#__PURE__*/_react.default.createElement("button", {
264
- key: price.paId,
265
- className: "priceage",
266
- onClick: () => {
267
- s.loading = true;
268
- addTicketToCart(s, price);
269
- },
270
- disabled: price.is_available === false
271
- }, /*#__PURE__*/_react.default.createElement("p", {
272
- className: "price"
273
- }, /*#__PURE__*/_react.default.createElement("span", null, price.paName), /*#__PURE__*/_react.default.createElement("span", null, _utils.NZDollar.format(price.p))), price.is_available === false && /*#__PURE__*/_react.default.createElement("span", {
274
- className: "unavailable"
275
- }, "Allocation exhausted"))))) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null));
276
- }));
277
- }
@@ -1,516 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.default = void 0;
7
- require("./styles/index.css");
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _Map = _interopRequireDefault(require("./Map"));
10
- var _reactLeaflet = require("react-leaflet");
11
- var _utils = require("../utils");
12
- var _reactDom = require("react-dom");
13
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
- const SeatingPlan = _ref => {
17
- var _document, _document2, _document3;
18
- let {
19
- eventId,
20
- eventVenueId,
21
- sessionId,
22
- showingId,
23
- areaId,
24
- priceSectionIds,
25
- price,
26
- quantity,
27
- callbackFunction,
28
- apiKey,
29
- baseUrl,
30
- countryCode,
31
- connectedShowings,
32
- areaName,
33
- promoCode
34
- } = _ref;
35
- const [initialiseMessage, setInitialiseMessage] = (0, _react.useState)("Initialising seating plan...");
36
- const [isReloading, setIsReloading] = (0, _react.useState)(false);
37
- const [position, setPosition] = (0, _react.useState)(null);
38
- const [height, setHeight] = (0, _react.useState)(0);
39
- const [width, setWidth] = (0, _react.useState)(0);
40
- const [seats, setSeats] = (0, _react.useState)([]);
41
- const [error, setError] = (0, _react.useState)(null);
42
- const [processing, setProcessing] = (0, _react.useState)(false);
43
- const [bookedSeats, setBookedSeats] = (0, _react.useState)([]);
44
- const [chosenSeat, setChosenSeat] = (0, _react.useState)(null);
45
- const [area, setArea] = (0, _react.useState)(null);
46
- const [ticketPopupOpen, setTicketPopupOpen] = (0, _react.useState)(false);
47
- const [bounds, setBounds] = (0, _react.useState)(null);
48
- const [isFullScreen, setIsFullScreen] = (0, _react.useState)(false);
49
- const [mounted, setMounted] = _react.default.useState(false);
50
- const mapRef = (0, _react.useRef)(null);
51
- const setMap = map => {
52
- mapRef.current = map;
53
- };
54
- (0, _react.useLayoutEffect)(() => setMounted(true), []);
55
- const addTicketToCart = (s, priceage, cs) => {
56
- var _mapRef$current;
57
- if (s.s !== _utils.statuses.UNSOLD && s.s !== _utils.statuses.USER_PENDING || bookedSeats.length >= quantity && s.s === _utils.statuses.UNSOLD) {
58
- if (bookedSeats.length >= quantity) {
59
- const event = {
60
- type: "error",
61
- details: {
62
- message: "Maximum ticket booking quantity specified reached."
63
- }
64
- };
65
- callbackFunction(event);
66
- }
67
- s.loading = false;
68
- return;
69
- }
70
- if (priceage.is_available === false) {
71
- const event = {
72
- type: "error",
73
- details: {
74
- message: "Allocation exhausted, please try another area or price."
75
- }
76
- };
77
- callbackFunction(event);
78
- s.loading = false;
79
- return;
80
- }
81
- (_mapRef$current = mapRef.current) === null || _mapRef$current === void 0 || (_mapRef$current = _mapRef$current.target) === null || _mapRef$current === void 0 || _mapRef$current.closePopup();
82
- setProcessing(true);
83
- fetch("".concat(baseUrl, "/legacy/").concat(countryCode, "/shop/events/").concat(eventId, "/").concat(eventVenueId, "/showings/").concat(showingId, "/tickets/allocated/").concat(areaId), {
84
- method: "POST",
85
- body: JSON.stringify({
86
- priceAgeId: priceage.paId,
87
- seatId: s.ssId,
88
- connectedShowings: connectedShowings
89
- }),
90
- headers: {
91
- "content-type": "application/json",
92
- "basket-key": sessionId
93
- }
94
- }).then(response => {
95
- if ((response === null || response === void 0 ? void 0 : response.status) === 403) {
96
- s.loading = false;
97
- (cs || chosenSeat).circle.target.setStyle({
98
- fillColor: _utils.statusColors.sold
99
- });
100
- cs ? cs.seat.s = _utils.statuses.SOLD : chosenSeat.seat.s = _utils.statuses.SOLD;
101
- const event = {
102
- type: "error",
103
- details: {
104
- error: {
105
- code: 403,
106
- message: "The seat you're trying to book is no longer available."
107
- }
108
- }
109
- };
110
- callbackFunction(event);
111
- } else if ((response === null || response === void 0 ? void 0 : response.status) === 400) {
112
- s.loading = false;
113
- (cs || chosenSeat).circle.target.setStyle({
114
- fillColor: _utils.statusColors.sold
115
- });
116
- cs ? cs.seat.s = _utils.statuses.SOLD : chosenSeat.seat.s = _utils.statuses.SOLD;
117
- const event = {
118
- type: "error",
119
- details: {
120
- error: {
121
- code: 403,
122
- message: "Oops, seems like you're trying to book tickets that are incompatible with other tickets in your cart."
123
- }
124
- }
125
- };
126
- callbackFunction(event);
127
- } else if ((response === null || response === void 0 ? void 0 : response.status) === 429) {
128
- s.loading = false;
129
- (cs || chosenSeat).circle.target.setStyle({
130
- fillColor: _utils.statusColors.available
131
- });
132
- const event = {
133
- type: "error",
134
- details: {
135
- error: {
136
- code: 429,
137
- message: "Someone else selected this first. Please try again"
138
- }
139
- }
140
- };
141
- callbackFunction(event);
142
- } else {
143
- // console.log(chosenSeat.seat.ssId, cs?.seat.ssId)
144
- s.s = _utils.statuses.USER_PENDING;
145
- s.bookedPrice = price;
146
- s.loading = false;
147
- (cs || chosenSeat).circle.target.setStyle({
148
- fillColor: _utils.statusColors.booked
149
- });
150
- setBookedSeats([...bookedSeats, {
151
- ssId: s.ssId,
152
- r: s.r,
153
- c: s.c,
154
- showingId: showingId,
155
- pId: priceage.paId,
156
- p: priceage.p,
157
- paName: priceage.paName
158
- }]);
159
- const event = {
160
- type: "cart-change-add",
161
- details: [...bookedSeats, {
162
- ssId: s.ssId,
163
- r: s.r,
164
- c: s.c,
165
- showingId: showingId,
166
- pId: priceage.paId,
167
- p: priceage.p,
168
- paName: priceage.paName
169
- }]
170
- };
171
- callbackFunction(event);
172
- }
173
- }).catch(error => {
174
- s.loading = false;
175
- (cs || chosenSeat).circle.target.setStyle({
176
- fillColor: _utils.statusColors.available
177
- });
178
- const event = {
179
- type: "error",
180
- details: s.pMin && s.pMax && (price < s.pMin || price > s.pMax) ? {
181
- error: {
182
- code: 403,
183
- message: "Price specified not allowed."
184
- }
185
- } : {
186
- error: {
187
- code: 500,
188
- message: "Oops! Something went wrong. Please try again."
189
- }
190
- }
191
- };
192
- callbackFunction(event);
193
- }).finally(() => {
194
- setProcessing(false);
195
- _initialFetch(true);
196
- });
197
- };
198
- const removeTicketFromCart = (s, e) => {
199
- setProcessing(true);
200
- fetch("".concat(baseUrl, "/legacy/").concat(countryCode, "/shop/events/").concat(eventId, "/").concat(eventVenueId, "/showings/").concat(showingId, "/tickets/allocated/").concat(areaId, "/seat/").concat(s.ssId), {
201
- method: "DELETE",
202
- headers: {
203
- "basket-key": sessionId
204
- }
205
- }).then(response => {
206
- s.loading = false;
207
- s.s = _utils.statuses.UNSOLD;
208
- s.bookedPrice = null;
209
- e.target.setStyle({
210
- fillColor: _utils.statusColors.available
211
- });
212
- setBookedSeats(bookedSeats.filter(bs => bs.ssId !== s.ssId));
213
- const event = {
214
- type: "cart-change-remove",
215
- details: bookedSeats.filter(bs => bs.ssId === s.ssId)
216
- };
217
- callbackFunction(event);
218
- }).catch(error => {
219
- e.target.setStyle({
220
- fillColor: _utils.statusColors.booked
221
- });
222
- const event = {
223
- type: "error",
224
- details: {
225
- error: {
226
- code: 500,
227
- message: "Oops! Something went wrong. Please try again."
228
- }
229
- }
230
- };
231
- callbackFunction(event);
232
- }).finally(() => {
233
- setProcessing(false);
234
- _initialFetch(true);
235
- });
236
- };
237
- const handleClickSeat = (e, s) => {
238
- setChosenSeat({
239
- circle: e,
240
- seat: s
241
- });
242
- if (s.s !== _utils.statuses.UNSOLD && s.s !== _utils.statuses.USER_PENDING || bookedSeats.length >= quantity && s.s === _utils.statuses.UNSOLD) {
243
- if (bookedSeats.length >= quantity) {
244
- const event = {
245
- type: "error",
246
- details: {
247
- message: "Maximum ticket booking quantity specified reached."
248
- }
249
- };
250
- callbackFunction(event);
251
- }
252
- return;
253
- }
254
- if (s.s === _utils.statuses.UNSOLD) {
255
- const availablePrices = seats.pricing.filter(price => (!priceSectionIds || priceSectionIds.includes(price.psId)) && s.psId === price.psId);
256
- if (availablePrices.length === 1) {
257
- s.loading = true;
258
- addTicketToCart(s, availablePrices[0], {
259
- circle: e,
260
- seat: s
261
- });
262
- }
263
- } else {
264
- s.loading = true;
265
- removeTicketFromCart(s, e);
266
- }
267
- };
268
- const _initialFetch = function initialFetch() {
269
- let isReload = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
270
- if (isReload) {
271
- setIsReloading(true);
272
- }
273
- setInitialiseMessage("Initialising seating plan...");
274
- fetch(// `http://localhost:3155/api/legacy/shop/events/${eventId}/${eventVenueId}/showings/${showingId}/tickets/allocated/${areaId}`,
275
- "".concat(baseUrl, "/legacy/").concat(countryCode, "/shop/events/").concat(eventId, "/").concat(eventVenueId, "/showings/").concat(showingId, "/tickets/allocated/").concat(areaId).concat(promoCode ? "?promo=".concat(promoCode) : ""), {
276
- headers: {
277
- "basket-key": sessionId,
278
- Authorization: "Bearer ".concat(apiKey)
279
- }
280
- }).then(async response => {
281
- const data = await response.json();
282
- data.retryAfter = response.headers.get("Retry-After");
283
- return data;
284
- }).then(data => {
285
- if (data.statusCode === 429) {
286
- setInitialiseMessage("Looks like it's busy. Stand by. Trying again in ".concat(data.retryAfter, " second").concat(data.retryAfter > 1 ? "s" : "", "."));
287
- return setTimeout(_initialFetch, data.retryAfter * 1000);
288
- }
289
- if (data.statusCode === 403) {
290
- if (!sessionId || data.message === "Invalid Session id.") {
291
- throw new Error("Looks like your cart has expired. Please refresh the page to try again.");
292
- } else {
293
- throw new Error("Invalid API Key or unauthorized URL");
294
- }
295
- }
296
- const img = new Image();
297
- img.src = data.background;
298
- setBookedSeats(data.seats.filter(s => s.s === _utils.statuses.USER_PENDING && s.bookedPrice === price).map(s => ({
299
- ssId: s.ssId,
300
- r: s.r,
301
- c: s.c,
302
- showingId: showingId,
303
- p: s.p,
304
- //price || s.defaultPrice,
305
- pId: s.pId,
306
- paName: s.paName
307
- })));
308
- img.onload = () => {
309
- const imgSouthwest = [0, 0];
310
- const imgNortheast = [img.height * 0.015, img.width * 0.015];
311
- setBounds([imgSouthwest, imgNortheast]);
312
- setPosition([img.height * 0.005, img.width * 0.005]);
313
- setHeight(img.height * 0.5);
314
- setWidth(img.width * 0.5);
315
- setSeats(data);
316
- };
317
- setIsReloading(false);
318
- }).catch(error => {
319
- var _error$message;
320
- // console.log(error);
321
- setError({
322
- response: {
323
- data: {
324
- message: (_error$message = error === null || error === void 0 ? void 0 : error.message) !== null && _error$message !== void 0 ? _error$message : "Something went wrong. Please try again."
325
- }
326
- }
327
- });
328
- setIsReloading(false);
329
- });
330
- };
331
- (0, _react.useEffect)(() => {
332
- if (!error && areaId !== area) {
333
- setArea(areaId);
334
- _initialFetch();
335
- setPosition(null);
336
- }
337
- }, [areaId]);
338
-
339
- // useEffect(() => {
340
- // if (bookedSeats && position && chosenSeat) {
341
- // const event = { type: 'cart-change', details: bookedSeats }
342
- // callbackFunction(event)
343
- // }
344
- // }, [bookedSeats])
345
-
346
- (0, _react.useEffect)(() => {
347
- if (ticketPopupOpen) {
348
- chosenSeat === null || chosenSeat === void 0 || chosenSeat.circle.target.setStyle({
349
- fillOpacity: 0
350
- });
351
- }
352
- }, [ticketPopupOpen, chosenSeat]);
353
- (0, _react.useEffect)(() => {
354
- if (processing) {
355
- const availablePrices = seats.pricing.filter(price => !priceSectionIds || priceSectionIds.includes(price.psId));
356
- availablePrices.length === 1 && (chosenSeat === null || chosenSeat === void 0 ? void 0 : chosenSeat.circle.target.setStyle({
357
- fillOpacity: 0
358
- }));
359
- }
360
- }, [chosenSeat, processing]);
361
-
362
- // render the map using ReactDOM.createPortal to avoid z-index issues
363
- // in full screen mode, render the map in the body, otherwise render in the seating-plan-root div
364
- const mapContainer = mounted && (isFullScreen ? (_document = document) === null || _document === void 0 ? void 0 : _document.body : (_document2 = document) === null || _document2 === void 0 ? void 0 : _document2.getElementById("seating-plan-root"));
365
- const backdropContainer = mounted && ((_document3 = document) === null || _document3 === void 0 ? void 0 : _document3.body);
366
-
367
- // return seating plan
368
- return /*#__PURE__*/_react.default.createElement("div", {
369
- className: "seating-plan-root",
370
- id: "seating-plan-root"
371
- }, error ? /*#__PURE__*/_react.default.createElement("div", {
372
- className: "loading"
373
- }, /*#__PURE__*/_react.default.createElement("h1", null, "OOPS!"), /*#__PURE__*/_react.default.createElement("div", null, error.response.data.message)) : position && area === areaId ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, backdropContainer && /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement("div", {
374
- className: "seating-plan-backdrop ".concat(isFullScreen ? "full-screen" : ""),
375
- onClick: () => setIsFullScreen(false)
376
- }), backdropContainer), mapContainer && /*#__PURE__*/(0, _reactDom.createPortal)(/*#__PURE__*/_react.default.createElement("div", {
377
- className: "seating-plan-container ".concat(isFullScreen ? "full-screen" : "")
378
- }, /*#__PURE__*/_react.default.createElement(_reactLeaflet.MapContainer, {
379
- zoomSnap: 0,
380
- zoomDelta: 1,
381
- center: (0, _utils.calculateCenterOfMap)(height, seats.seats),
382
- zoom: undefined,
383
- zoomControl: true,
384
- scrollWheelZoom: true,
385
- bounds: bounds,
386
- whenReady: setMap
387
- }, /*#__PURE__*/_react.default.createElement(_Map.default, {
388
- seats: seats,
389
- height: height,
390
- width: width,
391
- bounds: bounds,
392
- handleClickSeat: handleClickSeat,
393
- ticketPopupOpen: ticketPopupOpen,
394
- setTicketPopupOpen: setTicketPopupOpen,
395
- chosenSeat: chosenSeat,
396
- addTicketToCart: addTicketToCart,
397
- isReloading: isReloading,
398
- initialFetch: _initialFetch,
399
- isFullScreen: isFullScreen,
400
- setIsFullScreen: setIsFullScreen,
401
- priceSectionIds: priceSectionIds,
402
- areaName: areaName,
403
- price: price
404
- }))), mapContainer)) : /*#__PURE__*/_react.default.createElement("div", {
405
- className: "loading"
406
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("svg", {
407
- width: "105",
408
- height: "105",
409
- viewBox: "0 0 105 105",
410
- xmlns: "http://www.w3.org/2000/svg",
411
- fill: "#2ecc71"
412
- }, /*#__PURE__*/_react.default.createElement("circle", {
413
- cx: "12.5",
414
- cy: "12.5",
415
- r: "12.5"
416
- }, /*#__PURE__*/_react.default.createElement("animate", {
417
- attributeName: "fill-opacity",
418
- begin: "0s",
419
- dur: "1s",
420
- values: "1;.2;1",
421
- calcMode: "linear",
422
- repeatCount: "indefinite"
423
- })), /*#__PURE__*/_react.default.createElement("circle", {
424
- cx: "12.5",
425
- cy: "52.5",
426
- r: "12.5",
427
- fillOpacity: ".5"
428
- }, /*#__PURE__*/_react.default.createElement("animate", {
429
- attributeName: "fill-opacity",
430
- begin: "100ms",
431
- dur: "1s",
432
- values: "1;.2;1",
433
- calcMode: "linear",
434
- repeatCount: "indefinite"
435
- })), /*#__PURE__*/_react.default.createElement("circle", {
436
- cx: "52.5",
437
- cy: "12.5",
438
- r: "12.5"
439
- }, /*#__PURE__*/_react.default.createElement("animate", {
440
- attributeName: "fill-opacity",
441
- begin: "300ms",
442
- dur: "1s",
443
- values: "1;.2;1",
444
- calcMode: "linear",
445
- repeatCount: "indefinite"
446
- })), /*#__PURE__*/_react.default.createElement("circle", {
447
- cx: "52.5",
448
- cy: "52.5",
449
- r: "12.5"
450
- }, /*#__PURE__*/_react.default.createElement("animate", {
451
- attributeName: "fill-opacity",
452
- begin: "600ms",
453
- dur: "1s",
454
- values: "1;.2;1",
455
- calcMode: "linear",
456
- repeatCount: "indefinite"
457
- })), /*#__PURE__*/_react.default.createElement("circle", {
458
- cx: "92.5",
459
- cy: "12.5",
460
- r: "12.5"
461
- }, /*#__PURE__*/_react.default.createElement("animate", {
462
- attributeName: "fill-opacity",
463
- begin: "800ms",
464
- dur: "1s",
465
- values: "1;.2;1",
466
- calcMode: "linear",
467
- repeatCount: "indefinite"
468
- })), /*#__PURE__*/_react.default.createElement("circle", {
469
- cx: "92.5",
470
- cy: "52.5",
471
- r: "12.5"
472
- }, /*#__PURE__*/_react.default.createElement("animate", {
473
- attributeName: "fill-opacity",
474
- begin: "400ms",
475
- dur: "1s",
476
- values: "1;.2;1",
477
- calcMode: "linear",
478
- repeatCount: "indefinite"
479
- })), /*#__PURE__*/_react.default.createElement("circle", {
480
- cx: "12.5",
481
- cy: "92.5",
482
- r: "12.5"
483
- }, /*#__PURE__*/_react.default.createElement("animate", {
484
- attributeName: "fill-opacity",
485
- begin: "700ms",
486
- dur: "1s",
487
- values: "1;.2;1",
488
- calcMode: "linear",
489
- repeatCount: "indefinite"
490
- })), /*#__PURE__*/_react.default.createElement("circle", {
491
- cx: "52.5",
492
- cy: "92.5",
493
- r: "12.5"
494
- }, /*#__PURE__*/_react.default.createElement("animate", {
495
- attributeName: "fill-opacity",
496
- begin: "500ms",
497
- dur: "1s",
498
- values: "1;.2;1",
499
- calcMode: "linear",
500
- repeatCount: "indefinite"
501
- })), /*#__PURE__*/_react.default.createElement("circle", {
502
- cx: "92.5",
503
- cy: "92.5",
504
- r: "12.5"
505
- }, /*#__PURE__*/_react.default.createElement("animate", {
506
- attributeName: "fill-opacity",
507
- begin: "200ms",
508
- dur: "1s",
509
- values: "1;.2;1",
510
- calcMode: "linear",
511
- repeatCount: "indefinite"
512
- })))), /*#__PURE__*/_react.default.createElement("div", {
513
- className: "initialise-message"
514
- }, initialiseMessage)));
515
- };
516
- var _default = exports.default = SeatingPlan;