ublo-lib 1.50.0 → 1.50.2
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/es/future/components/msem-package/components/global-settings.d.ts.map +1 -1
- package/es/future/components/msem-package/components/global-settings.js +1 -1
- package/es/future/components/msem-package/components/pax-settings.d.ts.map +1 -1
- package/es/future/components/msem-package/components/pax-settings.js +7 -5
- package/es/future/components/msem-package/components/pax-settings.module.css +0 -21
- package/es/future/components/msem-package/components/settings-ui.d.ts +3 -0
- package/es/future/components/msem-package/components/settings-ui.d.ts.map +1 -1
- package/es/future/components/msem-package/components/settings-ui.js +3 -0
- package/es/future/components/msem-package/components/settings-ui.module.css +21 -0
- package/es/future/components/msem-package/components/stay-settings.d.ts.map +1 -1
- package/es/future/components/msem-package/components/stay-settings.js +19 -3
- package/es/future/components/msem-preset-editor/services/offers.js +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/global-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"global-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/global-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,2CA8BlE"}
|
|
@@ -16,5 +16,5 @@ export default function GlobalSettings({ config, setConfig }) {
|
|
|
16
16
|
const facet = Number(value);
|
|
17
17
|
setConfig((prev) => ({ ...prev, facet }));
|
|
18
18
|
};
|
|
19
|
-
return (_jsx(Card, { icon: _jsx(Icons.Settings, {}), title: "G\u00E9n\u00E9ral", children: _jsxs("div", { className: styles.settings, children: [_jsx(Input, { label: "Nom du package", value: config.name, onValueChange: updateName, className: styles.field }), _jsx(
|
|
19
|
+
return (_jsx(Card, { icon: _jsx(Icons.Settings, {}), title: "G\u00E9n\u00E9ral", children: _jsxs("div", { className: styles.settings, children: [_jsx(Input, { label: "Nom du package", value: config.name, onValueChange: updateName, className: styles.field }), _jsx(Select, { label: "Facette", placeholder: "Choisissez une facette", options: FACET_OPTIONS, value: config.facet, onValueChange: updateFacet, className: styles.field })] }) }));
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pax-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/pax-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"pax-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/pax-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAOF,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,2CAmG/D"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import Input from "dt-design-system/es/input";
|
|
3
3
|
import Checkbox from "dt-design-system/es/checkbox";
|
|
4
4
|
import * as Icons from "dt-design-system/es/icons";
|
|
5
|
-
import { Card, Radio } from "./settings-ui";
|
|
5
|
+
import { Card, Radio, Note } from "./settings-ui";
|
|
6
6
|
import styles from "./pax-settings.module.css";
|
|
7
7
|
const toNum = (value) => {
|
|
8
8
|
const n = parseInt(value, 10);
|
|
@@ -39,12 +39,14 @@ export default function PaxSettings({ config, setConfig }) {
|
|
|
39
39
|
const updateMax = (value) => patchPax({ max: toNum(value) });
|
|
40
40
|
const updateValue = (value) => patchPax({ value: toNum(value) });
|
|
41
41
|
const updateHidden = (hidden) => patchPax({ hidden });
|
|
42
|
-
|
|
42
|
+
const explanation = getExplanation(pax);
|
|
43
|
+
return (_jsxs(Card, { icon: _jsx(Icons.Users, {}), title: "Nombre de personnes", badge: getBadge(pax), children: [_jsxs("div", { className: styles.modes, children: [_jsx(Radio, { checked: mode === "range", onClick: toggleMode("range"), children: "D\u00E9finir un nombre de personnes" }), _jsx(Radio, { checked: mode === "fixed", onClick: toggleMode("fixed"), children: "Fixer nombre personnes" })] }), mode === "range" && (_jsxs("div", { className: styles.fields, children: [_jsx(Input, { type: "number", label: "Minimum de personnes", value: pax?.min ?? "", onValueChange: updateMin, className: styles.field, min: 1 }), _jsx(Input, { type: "number", label: "Maximum de personnes", value: pax?.max ?? "", onValueChange: updateMax, className: styles.field, min: 1 })] })), mode === "fixed" && (_jsx("div", { className: styles.fields, children: _jsx(Input, { type: "number", label: "Nombre fixe de personnes", value: pax?.value ?? "", onValueChange: updateValue, className: styles.field, min: 1 }) })), mode !== "unlimited" && (_jsx("div", { className: styles.masquer, children: _jsx(Checkbox, { label: "Masquer le nombre de personnes", checked: pax?.hidden || false, onCheckedChange: updateHidden }) })), _jsx(Note, { children: explanation })] }));
|
|
43
44
|
}
|
|
44
45
|
function getExplanation(pax) {
|
|
45
46
|
const mode = pax?.mode ?? "unlimited";
|
|
46
|
-
if (mode === "unlimited")
|
|
47
|
-
return
|
|
47
|
+
if (mode === "unlimited") {
|
|
48
|
+
return "Aucune contrainte : le nombre de personnes est déterminé indépendamment par chaque offre.";
|
|
49
|
+
}
|
|
48
50
|
if (mode === "fixed") {
|
|
49
51
|
return "Le nombre de personnes est fixe : il sera appliqué à chaque offre.";
|
|
50
52
|
}
|
|
@@ -60,7 +62,7 @@ function getBadge(pax) {
|
|
|
60
62
|
if (pax.mode === "fixed") {
|
|
61
63
|
if (pax.value == null)
|
|
62
64
|
return "Nombre de personnes";
|
|
63
|
-
return `
|
|
65
|
+
return `Pour ${pax.value} personne${pax.value > 1 ? "s" : ""}`;
|
|
64
66
|
}
|
|
65
67
|
const { min, max } = pax;
|
|
66
68
|
if (min != null && max != null)
|
|
@@ -19,27 +19,6 @@
|
|
|
19
19
|
justify-content: flex-end;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
/* Note explicative (comportement côté client) */
|
|
23
|
-
.note {
|
|
24
|
-
display: flex;
|
|
25
|
-
align-items: flex-start;
|
|
26
|
-
gap: 8px;
|
|
27
|
-
margin: 0;
|
|
28
|
-
padding: 10px 12px;
|
|
29
|
-
font-size: 13px;
|
|
30
|
-
line-height: 1.4;
|
|
31
|
-
color: var(--ds-grey-700, #262626);
|
|
32
|
-
background-color: var(--ds-grey-100, #f8f8f8);
|
|
33
|
-
border-radius: var(--ds-radius-200, 8px);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.noteIcon {
|
|
37
|
-
flex: 0 0 16px;
|
|
38
|
-
width: 16px;
|
|
39
|
-
height: 16px;
|
|
40
|
-
margin-top: 1px;
|
|
41
|
-
fill: var(--ds-grey-500, #7c7b7b);
|
|
42
|
-
}
|
|
43
22
|
|
|
44
23
|
@media (max-width: 600px) {
|
|
45
24
|
.masquer {
|
|
@@ -19,5 +19,8 @@ export declare function Radio({ checked, onClick, disabled, children, className,
|
|
|
19
19
|
export declare function Badge({ children }: {
|
|
20
20
|
children: React.ReactNode;
|
|
21
21
|
}): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function Note({ children }: {
|
|
23
|
+
children: React.ReactNode;
|
|
24
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
22
25
|
export {};
|
|
23
26
|
//# sourceMappingURL=settings-ui.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-ui.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/settings-ui.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,KAAK,SAAS,GAAG;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAGF,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE,SAAS,2CA2BX;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,UAAU,2CAcZ;AAGD,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAEhE"}
|
|
1
|
+
{"version":3,"file":"settings-ui.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/settings-ui.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAQ/B,KAAK,SAAS,GAAG;IACf,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IAEvB,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;IACnC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAGF,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,GACT,EAAE,SAAS,2CA2BX;AAED,KAAK,UAAU,GAAG;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAMF,wBAAgB,KAAK,CAAC,EACpB,OAAO,EACP,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,GACV,EAAE,UAAU,2CAcZ;AAGD,wBAAgB,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAEhE;AAGD,wBAAgB,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAO/D"}
|
|
@@ -12,3 +12,6 @@ export function Radio({ checked, onClick, disabled, children, className, }) {
|
|
|
12
12
|
export function Badge({ children }) {
|
|
13
13
|
return _jsx("span", { className: styles.badgeInline, children: children });
|
|
14
14
|
}
|
|
15
|
+
export function Note({ children }) {
|
|
16
|
+
return (_jsxs("p", { className: styles.note, children: [_jsx(Icons.Info, { className: styles.noteIcon }), children] }));
|
|
17
|
+
}
|
|
@@ -140,6 +140,27 @@
|
|
|
140
140
|
line-height: 1.2;
|
|
141
141
|
}
|
|
142
142
|
|
|
143
|
+
/* Note d'aide (comportement côté client) : discrète, distincte du contenu */
|
|
144
|
+
.note {
|
|
145
|
+
display: flex;
|
|
146
|
+
align-items: flex-start;
|
|
147
|
+
gap: 6px;
|
|
148
|
+
margin: 2px 0 0;
|
|
149
|
+
padding-top: 12px;
|
|
150
|
+
border-top: 1px solid var(--ds-grey-200, #ededed);
|
|
151
|
+
font-size: 12.5px;
|
|
152
|
+
line-height: 1.45;
|
|
153
|
+
color: var(--ds-grey-500, #7c7b7b);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.noteIcon {
|
|
157
|
+
flex: 0 0 15px;
|
|
158
|
+
width: 15px;
|
|
159
|
+
height: 15px;
|
|
160
|
+
margin-top: 1px;
|
|
161
|
+
fill: var(--ds-grey-400, #949494);
|
|
162
|
+
}
|
|
163
|
+
|
|
143
164
|
/* Badge inline (utilisable dans le corps si besoin) */
|
|
144
165
|
.badgeInline {
|
|
145
166
|
padding: 4px 10px;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stay-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/stay-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"stay-settings.d.ts","sourceRoot":"","sources":["../../../../../src/future/components/msem-package/components/stay-settings.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,KAAK,KAAK,MAAM,UAAU,CAAC;AAIvC,KAAK,KAAK,GAAG;IACX,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,2CAqHhE"}
|
|
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
2
2
|
import Input from "dt-design-system/es/input";
|
|
3
3
|
import Checkbox from "dt-design-system/es/checkbox";
|
|
4
4
|
import * as Icons from "dt-design-system/es/icons";
|
|
5
|
-
import { Card, Radio } from "./settings-ui";
|
|
5
|
+
import { Card, Radio, Note } from "./settings-ui";
|
|
6
6
|
import styles from "./stay-settings.module.css";
|
|
7
7
|
export default function StaySettings({ config, setConfig }) {
|
|
8
8
|
const stay = config.stay;
|
|
@@ -18,6 +18,7 @@ export default function StaySettings({ config, setConfig }) {
|
|
|
18
18
|
forced: undefined,
|
|
19
19
|
fixed: undefined,
|
|
20
20
|
nbDays: undefined,
|
|
21
|
+
hidden: undefined,
|
|
21
22
|
}
|
|
22
23
|
: { dated: true, hidden: undefined });
|
|
23
24
|
const updateStay = (key) => (value) => patchStay({ [key]: value });
|
|
@@ -29,8 +30,23 @@ export default function StaySettings({ config, setConfig }) {
|
|
|
29
30
|
? { fixed: false, hidden: undefined, nbDays: undefined }
|
|
30
31
|
: { fixed: true, forced: false, hidden: undefined });
|
|
31
32
|
const updateHidden = (hidden) => patchStay({ hidden });
|
|
32
|
-
const canHide =
|
|
33
|
-
return (_jsxs(Card, { icon: _jsx(Icons.Calendar, {}), title: "Validit\u00E9 de l'offre",
|
|
33
|
+
const canHide = dated && Boolean(stay?.forced);
|
|
34
|
+
return (_jsxs(Card, { icon: _jsx(Icons.Calendar, {}), title: "Validit\u00E9 de l'offre", badge: getBadge(dated, stay), children: [_jsx(Radio, { checked: dated, onClick: toggleDated, children: "D\u00E9finir des dates de validit\u00E9s" }), dated && (_jsxs(_Fragment, { children: [_jsxs("div", { className: styles.fields, children: [_jsx(Input, { label: "D\u00E9but de validit\u00E9", type: "date", value: stay?.from || "", onValueChange: updateStay("from"), className: styles.field }), _jsx(Input, { label: "Fin de validit\u00E9", type: "date", value: stay?.to || "", onValueChange: updateStay("to"), className: styles.field })] }), _jsxs("div", { className: styles.modes, children: [_jsx(Radio, { checked: Boolean(stay?.forced), onClick: toggleForced, children: "Verrouiller ces dates" }), _jsxs("div", { className: styles.fixedRow, children: [_jsx(Radio, { checked: Boolean(stay?.fixed), onClick: toggleFixed, children: "Fixer l'offre \u00E0" }), _jsx(Input, { value: stay?.nbDays || "", onValueChange: updateNbDays, className: styles.nbDaysInput, disabled: !stay?.fixed, compact: true, type: "number", min: 1 }), _jsx("span", { children: "jours" })] })] })] })), canHide && (_jsx("div", { className: styles.masquer, children: _jsx(Checkbox, { label: "Masquer la validit\u00E9 de l'offre", checked: stay?.hidden || false, onCheckedChange: updateHidden }) })), _jsx(Note, { children: getStayExplanation(dated, stay) })] }));
|
|
35
|
+
}
|
|
36
|
+
function getStayExplanation(dated, stay) {
|
|
37
|
+
if (!dated) {
|
|
38
|
+
return "Le pack est non daté : aucune date n'est demandée au client.";
|
|
39
|
+
}
|
|
40
|
+
if (stay?.forced) {
|
|
41
|
+
return stay?.hidden
|
|
42
|
+
? "Les dates de séjour sont verrouillées et ne sont pas affichées au client."
|
|
43
|
+
: "Les dates de séjour sont verrouillées : le client ne les choisit pas.";
|
|
44
|
+
}
|
|
45
|
+
if (stay?.fixed) {
|
|
46
|
+
const n = stay?.nbDays;
|
|
47
|
+
return `Le client choisit uniquement sa date de début ; le séjour dure ${n ?? "…"} jour${(n ?? 0) > 1 ? "s" : ""} et doit tenir dans la période de validité.`;
|
|
48
|
+
}
|
|
49
|
+
return "Le client choisira ses dates de séjour dans la période de validité.";
|
|
34
50
|
}
|
|
35
51
|
const formatDate = (iso) => {
|
|
36
52
|
if (!iso)
|
|
@@ -31,7 +31,7 @@ export async function get(msemServicesUrl, lang, channel, resort, facet) {
|
|
|
31
31
|
}
|
|
32
32
|
return offer;
|
|
33
33
|
}));
|
|
34
|
-
if (channel === "LBM") {
|
|
34
|
+
if (channel === "LBM" && resort === 209) {
|
|
35
35
|
const easyrentOffers = await API.getEasyRentRenters(msemServicesUrl, channel, resort);
|
|
36
36
|
formattedOffers.push({
|
|
37
37
|
image: "https://widget.msem.tech/images/tunnel/offers/offer_skirental.jpg",
|