@revendo_ch/trade-in-components-angular 0.0.0-stage → 0.1.0-beta.3
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/LICENSE +25 -0
- package/README.md +6 -2
- package/checkout.d.ts +1 -0
- package/esm2022/checkout.mjs +28 -0
- package/esm2022/generated/angular-component-lib/utils.mjs +107 -0
- package/esm2022/generated/proxies.mjs +208 -0
- package/esm2022/public-api.mjs +35 -0
- package/esm2022/revendo_ch-trade-in-components-angular.mjs +5 -0
- package/fesm2022/revendo_ch-trade-in-components-angular.mjs +376 -0
- package/fesm2022/revendo_ch-trade-in-components-angular.mjs.map +1 -0
- package/generated/angular-component-lib/utils.d.ts +26 -0
- package/generated/proxies.d.ts +171 -0
- package/index.d.ts +5 -0
- package/package.json +33 -3
- package/public-api.d.ts +8 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Copyright (c) 2026 Revendo AG. All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software, including its source code, compiled code and documentation (the
|
|
4
|
+
"Software"), is the exclusive property of Revendo AG and is protected by
|
|
5
|
+
copyright law.
|
|
6
|
+
|
|
7
|
+
No right or license to use, copy, modify, merge, publish, distribute,
|
|
8
|
+
sublicense, sell or create derivative works of the Software, in whole or in
|
|
9
|
+
part, is granted to anyone, except to partners of Revendo AG who have a written
|
|
10
|
+
agreement with Revendo AG that expressly permits it, and only to the extent and
|
|
11
|
+
for the purpose set out in that agreement. Any other use is prohibited.
|
|
12
|
+
|
|
13
|
+
The availability of the Software in a public package registry or any other
|
|
14
|
+
public location does not grant any right to use it.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
17
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
18
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. TO THE EXTENT PERMITTED BY
|
|
19
|
+
APPLICABLE LAW, IN NO EVENT SHALL REVENDO AG BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
20
|
+
OTHER LIABILITY ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR ITS
|
|
21
|
+
USE.
|
|
22
|
+
|
|
23
|
+
Third-party open-source components included in the Software, such as the
|
|
24
|
+
Stencil runtime (MIT License, Copyright (c) Ionic Group, Inc.), remain subject
|
|
25
|
+
to their own licenses.
|
package/README.md
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @revendo_ch/trade-in-components-angular
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Proprietary package of Revendo AG, for Revendo's partners only. It is not intended
|
|
4
|
+
for public use, and no use is permitted without a written agreement with Revendo AG
|
|
5
|
+
(see `LICENSE`).
|
|
6
|
+
|
|
7
|
+
Partners receive the integration documentation from Revendo.
|
package/checkout.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function defineCheckoutInBackground(): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `<trade-in-checkout>` is internal to the wizard, which mounts it when a
|
|
3
|
+
* customer reaches checkout. With script tags the wizard fetches it from
|
|
4
|
+
* `checkout-asset-url`; through this package it is defined here instead, from
|
|
5
|
+
* a dynamic import, so the Angular CLI emits it as its own lazy chunk and a
|
|
6
|
+
* visitor who never sells doesn't download it up front. The wizard waits for
|
|
7
|
+
* the definition when it needs it (`loadCheckoutBundle`).
|
|
8
|
+
*
|
|
9
|
+
* Kept in sync with `packages/trade-in-components-react/src/checkout.ts`.
|
|
10
|
+
*/
|
|
11
|
+
const CHECKOUT_TAG = 'trade-in-checkout';
|
|
12
|
+
let pending;
|
|
13
|
+
export function defineCheckoutInBackground() {
|
|
14
|
+
if (typeof window === 'undefined' || !window.customElements)
|
|
15
|
+
return Promise.resolve();
|
|
16
|
+
if (window.customElements.get(CHECKOUT_TAG))
|
|
17
|
+
return Promise.resolve();
|
|
18
|
+
pending ??= import('@revendo_ch/trade-in-components/dist/components/trade-in-checkout.js')
|
|
19
|
+
.then((m) => m.defineCustomElement())
|
|
20
|
+
.catch((error) => {
|
|
21
|
+
// Let the next instance try again; the wizard reports the failure to the
|
|
22
|
+
// customer if checkout is reached without a definition.
|
|
23
|
+
pending = undefined;
|
|
24
|
+
console.error('[trade-in] could not load the checkout component', error);
|
|
25
|
+
});
|
|
26
|
+
return pending;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tvdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2hlY2tvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUM7QUFFekMsSUFBSSxPQUFrQyxDQUFDO0FBRXZDLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYztRQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3RGLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEUsT0FBTyxLQUFLLE1BQU0sQ0FBQyxzRUFBc0UsQ0FBQztTQUN2RixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1NBQ3BDLEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLHlFQUF5RTtRQUN6RSx3REFBd0Q7UUFDeEQsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogYDx0cmFkZS1pbi1jaGVja291dD5gIGlzIGludGVybmFsIHRvIHRoZSB3aXphcmQsIHdoaWNoIG1vdW50cyBpdCB3aGVuIGFcbiAqIGN1c3RvbWVyIHJlYWNoZXMgY2hlY2tvdXQuIFdpdGggc2NyaXB0IHRhZ3MgdGhlIHdpemFyZCBmZXRjaGVzIGl0IGZyb21cbiAqIGBjaGVja291dC1hc3NldC11cmxgOyB0aHJvdWdoIHRoaXMgcGFja2FnZSBpdCBpcyBkZWZpbmVkIGhlcmUgaW5zdGVhZCwgZnJvbVxuICogYSBkeW5hbWljIGltcG9ydCwgc28gdGhlIEFuZ3VsYXIgQ0xJIGVtaXRzIGl0IGFzIGl0cyBvd24gbGF6eSBjaHVuayBhbmQgYVxuICogdmlzaXRvciB3aG8gbmV2ZXIgc2VsbHMgZG9lc24ndCBkb3dubG9hZCBpdCB1cCBmcm9udC4gVGhlIHdpemFyZCB3YWl0cyBmb3JcbiAqIHRoZSBkZWZpbml0aW9uIHdoZW4gaXQgbmVlZHMgaXQgKGBsb2FkQ2hlY2tvdXRCdW5kbGVgKS5cbiAqXG4gKiBLZXB0IGluIHN5bmMgd2l0aCBgcGFja2FnZXMvdHJhZGUtaW4tY29tcG9uZW50cy1yZWFjdC9zcmMvY2hlY2tvdXQudHNgLlxuICovXG5jb25zdCBDSEVDS09VVF9UQUcgPSAndHJhZGUtaW4tY2hlY2tvdXQnO1xuXG5sZXQgcGVuZGluZzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNoZWNrb3V0SW5CYWNrZ3JvdW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHwgIXdpbmRvdy5jdXN0b21FbGVtZW50cykgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICBpZiAod2luZG93LmN1c3RvbUVsZW1lbnRzLmdldChDSEVDS09VVF9UQUcpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHBlbmRpbmcgPz89IGltcG9ydCgnQHJldmVuZG9fY2gvdHJhZGUtaW4tY29tcG9uZW50cy9kaXN0L2NvbXBvbmVudHMvdHJhZGUtaW4tY2hlY2tvdXQuanMnKVxuICAgIC50aGVuKChtKSA9PiBtLmRlZmluZUN1c3RvbUVsZW1lbnQoKSlcbiAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAvLyBMZXQgdGhlIG5leHQgaW5zdGFuY2UgdHJ5IGFnYWluOyB0aGUgd2l6YXJkIHJlcG9ydHMgdGhlIGZhaWx1cmUgdG8gdGhlXG4gICAgICAvLyBjdXN0b21lciBpZiBjaGVja291dCBpcyByZWFjaGVkIHdpdGhvdXQgYSBkZWZpbml0aW9uLlxuICAgICAgcGVuZGluZyA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0cmFkZS1pbl0gY291bGQgbm90IGxvYWQgdGhlIGNoZWNrb3V0IGNvbXBvbmVudCcsIGVycm9yKTtcbiAgICB9KTtcbiAgcmV0dXJuIHBlbmRpbmc7XG59XG4iXX0=
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/* tslint:disable */
|
|
3
|
+
import { inject, PLATFORM_ID } from '@angular/core';
|
|
4
|
+
import { fromEvent } from 'rxjs';
|
|
5
|
+
const serverInstances = new WeakSet();
|
|
6
|
+
/**
|
|
7
|
+
* Records a wrapper created during server rendering. Call from the constructor.
|
|
8
|
+
*/
|
|
9
|
+
export const markServer = (instance) => {
|
|
10
|
+
// what `isPlatformServer()` from `@angular/common` checks
|
|
11
|
+
if (inject(PLATFORM_ID) === 'server') {
|
|
12
|
+
serverInstances.add(instance);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Stencil's own prop name to attribute name conversion (`prop1` -> `prop-1`).
|
|
17
|
+
*/
|
|
18
|
+
const toDashCase = (str) => str
|
|
19
|
+
.replace(/([A-Z0-9])/g, (match) => ` ${match[0]}`)
|
|
20
|
+
.trim()
|
|
21
|
+
.split(' ')
|
|
22
|
+
.join('-')
|
|
23
|
+
.toLowerCase();
|
|
24
|
+
/**
|
|
25
|
+
* Angular's server DOM never writes properties to the HTML, so on the server an input becomes an
|
|
26
|
+
* attribute, which Stencil's `renderToString()` reads:
|
|
27
|
+
* - a string or number as itself, and `true` as an empty attribute, so the component's first
|
|
28
|
+
* render in the browser sees them too;
|
|
29
|
+
* - `false`, anything that isn't a primitive, and any value for a prop with no attribute through
|
|
30
|
+
* `ssrProp()`, which gives the server render the exact value and leaves no attribute behind.
|
|
31
|
+
*/
|
|
32
|
+
const setServerAttribute = (el, item, val, ssr) => {
|
|
33
|
+
const name = ssr.attributes?.[item] ?? toDashCase(item);
|
|
34
|
+
if (val == null) {
|
|
35
|
+
el.removeAttribute(name);
|
|
36
|
+
}
|
|
37
|
+
else if (ssr.refs?.includes(item) ||
|
|
38
|
+
val === false ||
|
|
39
|
+
(typeof val !== 'string' && typeof val !== 'number' && val !== true)) {
|
|
40
|
+
el.setAttribute(name, ssr.ssrProp(val));
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
el.setAttribute(name, val === true ? '' : String(val));
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
export const proxyInputs = (Cmp, inputs, ssr) => {
|
|
47
|
+
const Prototype = Cmp.prototype;
|
|
48
|
+
inputs.forEach((item) => {
|
|
49
|
+
Object.defineProperty(Prototype, item, {
|
|
50
|
+
get() {
|
|
51
|
+
return this.el[item];
|
|
52
|
+
},
|
|
53
|
+
set(val) {
|
|
54
|
+
if (ssr && serverInstances.has(this)) {
|
|
55
|
+
// kept on the element too, so reading the input back on the server works
|
|
56
|
+
this.el[item] = val;
|
|
57
|
+
setServerAttribute(this.el, item, val, ssr);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
this.z.runOutsideAngular(() => (this.el[item] = val));
|
|
61
|
+
},
|
|
62
|
+
/**
|
|
63
|
+
* In the event that proxyInputs is called
|
|
64
|
+
* multiple times re-defining these inputs
|
|
65
|
+
* will cause an error to be thrown. As a result
|
|
66
|
+
* we set configurable: true to indicate these
|
|
67
|
+
* properties can be changed.
|
|
68
|
+
*/
|
|
69
|
+
configurable: true,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
export const proxyMethods = (Cmp, methods) => {
|
|
74
|
+
const Prototype = Cmp.prototype;
|
|
75
|
+
methods.forEach((methodName) => {
|
|
76
|
+
Prototype[methodName] = function () {
|
|
77
|
+
const args = arguments;
|
|
78
|
+
return this.z.runOutsideAngular(() => this.el[methodName].apply(this.el, args));
|
|
79
|
+
};
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
export const proxyOutputs = (instance, el, events) => {
|
|
83
|
+
events.forEach((eventName) => (instance[eventName] = fromEvent(el, eventName)));
|
|
84
|
+
};
|
|
85
|
+
export const defineCustomElement = (tagName, customElement) => {
|
|
86
|
+
if (customElement !== undefined && typeof customElements !== 'undefined' && !customElements.get(tagName)) {
|
|
87
|
+
customElements.define(tagName, customElement);
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
// tslint:disable-next-line: only-arrow-functions
|
|
91
|
+
export function ProxyCmp(opts) {
|
|
92
|
+
const decorator = function (cls) {
|
|
93
|
+
const { defineCustomElementFn, inputs, methods, ssr } = opts;
|
|
94
|
+
if (defineCustomElementFn !== undefined) {
|
|
95
|
+
defineCustomElementFn();
|
|
96
|
+
}
|
|
97
|
+
if (inputs) {
|
|
98
|
+
proxyInputs(cls, inputs, ssr);
|
|
99
|
+
}
|
|
100
|
+
if (methods) {
|
|
101
|
+
proxyMethods(cls, methods);
|
|
102
|
+
}
|
|
103
|
+
return cls;
|
|
104
|
+
};
|
|
105
|
+
return decorator;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZ2VuZXJhdGVkL2FuZ3VsYXItY29tcG9uZW50LWxpYi91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFjakMsTUFBTSxlQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVUsQ0FBQztBQUU5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRTtJQUM3QywwREFBMEQ7SUFDMUQsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQ3BDLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDL0I7QUFDSCxDQUFDLENBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFVLEVBQUUsQ0FDekMsR0FBRztLQUNBLE9BQU8sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDakQsSUFBSSxFQUFFO0tBQ04sS0FBSyxDQUFDLEdBQUcsQ0FBQztLQUNWLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDVCxXQUFXLEVBQUUsQ0FBQztBQUVuQjs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEVBQU8sRUFBRSxJQUFZLEVBQUUsR0FBUSxFQUFFLEdBQWUsRUFBRSxFQUFFO0lBQzlFLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ2YsRUFBRSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMxQjtTQUFNLElBQ0wsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3hCLEdBQUcsS0FBSyxLQUFLO1FBQ2IsQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsS0FBSyxJQUFJLENBQUMsRUFDcEU7UUFDQSxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDekM7U0FBTTtRQUNMLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDeEQ7QUFDSCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFRLEVBQUUsTUFBZ0IsRUFBRSxHQUFnQixFQUFFLEVBQUU7SUFDMUUsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQztJQUNoQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFO1lBQ3JDLEdBQUc7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxHQUFHLENBQUMsR0FBUTtnQkFDVixJQUFJLEdBQUcsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNwQyx5RUFBeUU7b0JBQ3pFLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO29CQUNwQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzVDLE9BQU87aUJBQ1I7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN4RCxDQUFDO1lBQ0Q7Ozs7OztlQU1HO1lBQ0gsWUFBWSxFQUFFLElBQUk7U0FDbkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFRLEVBQUUsT0FBaUIsRUFBRSxFQUFFO0lBQzFELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDaEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFO1FBQzdCLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRztZQUN0QixNQUFNLElBQUksR0FBRyxTQUFTLENBQUM7WUFDdkIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLFFBQWEsRUFBRSxFQUFPLEVBQUUsTUFBZ0IsRUFBRSxFQUFFO0lBQ3ZFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xGLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsT0FBZSxFQUFFLGFBQWtCLEVBQUUsRUFBRTtJQUN6RSxJQUFJLGFBQWEsS0FBSyxTQUFTLElBQUksT0FBTyxjQUFjLEtBQUssV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUN4RyxjQUFjLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUMsQ0FBQztBQUVGLGlEQUFpRDtBQUNqRCxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQTJGO0lBQ2xILE1BQU0sU0FBUyxHQUFHLFVBQVUsR0FBUTtRQUNsQyxNQUFNLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFN0QsSUFBSSxxQkFBcUIsS0FBSyxTQUFTLEVBQUU7WUFDdkMscUJBQXFCLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksTUFBTSxFQUFFO1lBQ1YsV0FBVyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0I7UUFDRCxJQUFJLE9BQU8sRUFBRTtZQUNYLFlBQVksQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDNUI7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUMsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyogdHNsaW50OmRpc2FibGUgKi9cbmltcG9ydCB7IGluamVjdCwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFNlcnZlciByZW5kZXJpbmcgb3B0aW9ucyAodGhlIG91dHB1dCB0YXJnZXQncyBgc3NyUHJvcE1vZHVsZWApLlxuICovXG5pbnRlcmZhY2UgU3NyT3B0aW9ucyB7XG4gIC8qKiBUaGUgY29tcG9uZW50IGxpYnJhcnkncyBgc3NyUHJvcCgpYCwgd2hpY2ggaGFuZHMgYSB2YWx1ZSB0byBTdGVuY2lsJ3Mgc2VydmVyIHJlbmRlci4gKi9cbiAgc3NyUHJvcDogKHZhbHVlOiBhbnkpID0+IGFueTtcbiAgLyoqIElucHV0cyB3aG9zZSBhdHRyaWJ1dGUgaXNuJ3QgU3RlbmNpbCdzIGRhc2gtY2FzZWQgcHJvcCBuYW1lLiAqL1xuICBhdHRyaWJ1dGVzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIElucHV0cyB3aXRoIG5vIGF0dHJpYnV0ZTogZXZlcnkgdmFsdWUgZ29lcyB0aHJvdWdoIGBzc3JQcm9wKClgLiAqL1xuICByZWZzPzogc3RyaW5nW107XG59XG5cbmNvbnN0IHNlcnZlckluc3RhbmNlcyA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcblxuLyoqXG4gKiBSZWNvcmRzIGEgd3JhcHBlciBjcmVhdGVkIGR1cmluZyBzZXJ2ZXIgcmVuZGVyaW5nLiBDYWxsIGZyb20gdGhlIGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgY29uc3QgbWFya1NlcnZlciA9IChpbnN0YW5jZTogb2JqZWN0KSA9PiB7XG4gIC8vIHdoYXQgYGlzUGxhdGZvcm1TZXJ2ZXIoKWAgZnJvbSBgQGFuZ3VsYXIvY29tbW9uYCBjaGVja3NcbiAgaWYgKGluamVjdChQTEFURk9STV9JRCkgPT09ICdzZXJ2ZXInKSB7XG4gICAgc2VydmVySW5zdGFuY2VzLmFkZChpbnN0YW5jZSk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RlbmNpbCdzIG93biBwcm9wIG5hbWUgdG8gYXR0cmlidXRlIG5hbWUgY29udmVyc2lvbiAoYHByb3AxYCAtPiBgcHJvcC0xYCkuXG4gKi9cbmNvbnN0IHRvRGFzaENhc2UgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgc3RyXG4gICAgLnJlcGxhY2UoLyhbQS1aMC05XSkvZywgKG1hdGNoKSA9PiBgICR7bWF0Y2hbMF19YClcbiAgICAudHJpbSgpXG4gICAgLnNwbGl0KCcgJylcbiAgICAuam9pbignLScpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG5cbi8qKlxuICogQW5ndWxhcidzIHNlcnZlciBET00gbmV2ZXIgd3JpdGVzIHByb3BlcnRpZXMgdG8gdGhlIEhUTUwsIHNvIG9uIHRoZSBzZXJ2ZXIgYW4gaW5wdXQgYmVjb21lcyBhblxuICogYXR0cmlidXRlLCB3aGljaCBTdGVuY2lsJ3MgYHJlbmRlclRvU3RyaW5nKClgIHJlYWRzOlxuICogLSBhIHN0cmluZyBvciBudW1iZXIgYXMgaXRzZWxmLCBhbmQgYHRydWVgIGFzIGFuIGVtcHR5IGF0dHJpYnV0ZSwgc28gdGhlIGNvbXBvbmVudCdzIGZpcnN0XG4gKiAgIHJlbmRlciBpbiB0aGUgYnJvd3NlciBzZWVzIHRoZW0gdG9vO1xuICogLSBgZmFsc2VgLCBhbnl0aGluZyB0aGF0IGlzbid0IGEgcHJpbWl0aXZlLCBhbmQgYW55IHZhbHVlIGZvciBhIHByb3Agd2l0aCBubyBhdHRyaWJ1dGUgdGhyb3VnaFxuICogICBgc3NyUHJvcCgpYCwgd2hpY2ggZ2l2ZXMgdGhlIHNlcnZlciByZW5kZXIgdGhlIGV4YWN0IHZhbHVlIGFuZCBsZWF2ZXMgbm8gYXR0cmlidXRlIGJlaGluZC5cbiAqL1xuY29uc3Qgc2V0U2VydmVyQXR0cmlidXRlID0gKGVsOiBhbnksIGl0ZW06IHN0cmluZywgdmFsOiBhbnksIHNzcjogU3NyT3B0aW9ucykgPT4ge1xuICBjb25zdCBuYW1lID0gc3NyLmF0dHJpYnV0ZXM/LltpdGVtXSA/PyB0b0Rhc2hDYXNlKGl0ZW0pO1xuICBpZiAodmFsID09IG51bGwpIHtcbiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7XG4gIH0gZWxzZSBpZiAoXG4gICAgc3NyLnJlZnM/LmluY2x1ZGVzKGl0ZW0pIHx8XG4gICAgdmFsID09PSBmYWxzZSB8fFxuICAgICh0eXBlb2YgdmFsICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgdmFsICE9PSAnbnVtYmVyJyAmJiB2YWwgIT09IHRydWUpXG4gICkge1xuICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCBzc3Iuc3NyUHJvcCh2YWwpKTtcbiAgfSBlbHNlIHtcbiAgICBlbC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsID09PSB0cnVlID8gJycgOiBTdHJpbmcodmFsKSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcm94eUlucHV0cyA9IChDbXA6IGFueSwgaW5wdXRzOiBzdHJpbmdbXSwgc3NyPzogU3NyT3B0aW9ucykgPT4ge1xuICBjb25zdCBQcm90b3R5cGUgPSBDbXAucHJvdG90eXBlO1xuICBpbnB1dHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQcm90b3R5cGUsIGl0ZW0sIHtcbiAgICAgIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxbaXRlbV07XG4gICAgICB9LFxuICAgICAgc2V0KHZhbDogYW55KSB7XG4gICAgICAgIGlmIChzc3IgJiYgc2VydmVySW5zdGFuY2VzLmhhcyh0aGlzKSkge1xuICAgICAgICAgIC8vIGtlcHQgb24gdGhlIGVsZW1lbnQgdG9vLCBzbyByZWFkaW5nIHRoZSBpbnB1dCBiYWNrIG9uIHRoZSBzZXJ2ZXIgd29ya3NcbiAgICAgICAgICB0aGlzLmVsW2l0ZW1dID0gdmFsO1xuICAgICAgICAgIHNldFNlcnZlckF0dHJpYnV0ZSh0aGlzLmVsLCBpdGVtLCB2YWwsIHNzcik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuei5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiAodGhpcy5lbFtpdGVtXSA9IHZhbCkpO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICAgICAgICogSW4gdGhlIGV2ZW50IHRoYXQgcHJveHlJbnB1dHMgaXMgY2FsbGVkXG4gICAgICAgKiBtdWx0aXBsZSB0aW1lcyByZS1kZWZpbmluZyB0aGVzZSBpbnB1dHNcbiAgICAgICAqIHdpbGwgY2F1c2UgYW4gZXJyb3IgdG8gYmUgdGhyb3duLiBBcyBhIHJlc3VsdFxuICAgICAgICogd2Ugc2V0IGNvbmZpZ3VyYWJsZTogdHJ1ZSB0byBpbmRpY2F0ZSB0aGVzZVxuICAgICAgICogcHJvcGVydGllcyBjYW4gYmUgY2hhbmdlZC5cbiAgICAgICAqL1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0pO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm94eU1ldGhvZHMgPSAoQ21wOiBhbnksIG1ldGhvZHM6IHN0cmluZ1tdKSA9PiB7XG4gIGNvbnN0IFByb3RvdHlwZSA9IENtcC5wcm90b3R5cGU7XG4gIG1ldGhvZHMuZm9yRWFjaCgobWV0aG9kTmFtZSkgPT4ge1xuICAgIFByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICByZXR1cm4gdGhpcy56LnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHRoaXMuZWxbbWV0aG9kTmFtZV0uYXBwbHkodGhpcy5lbCwgYXJncykpO1xuICAgIH07XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHByb3h5T3V0cHV0cyA9IChpbnN0YW5jZTogYW55LCBlbDogYW55LCBldmVudHM6IHN0cmluZ1tdKSA9PiB7XG4gIGV2ZW50cy5mb3JFYWNoKChldmVudE5hbWUpID0+IChpbnN0YW5jZVtldmVudE5hbWVdID0gZnJvbUV2ZW50KGVsLCBldmVudE5hbWUpKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVmaW5lQ3VzdG9tRWxlbWVudCA9ICh0YWdOYW1lOiBzdHJpbmcsIGN1c3RvbUVsZW1lbnQ6IGFueSkgPT4ge1xuICBpZiAoY3VzdG9tRWxlbWVudCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBjdXN0b21FbGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcgJiYgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSkge1xuICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSh0YWdOYW1lLCBjdXN0b21FbGVtZW50KTtcbiAgfVxufTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBvbmx5LWFycm93LWZ1bmN0aW9uc1xuZXhwb3J0IGZ1bmN0aW9uIFByb3h5Q21wKG9wdHM6IHsgZGVmaW5lQ3VzdG9tRWxlbWVudEZuPzogKCkgPT4gdm9pZDsgaW5wdXRzPzogYW55OyBtZXRob2RzPzogYW55OyBzc3I/OiBTc3JPcHRpb25zIH0pIHtcbiAgY29uc3QgZGVjb3JhdG9yID0gZnVuY3Rpb24gKGNsczogYW55KSB7XG4gICAgY29uc3QgeyBkZWZpbmVDdXN0b21FbGVtZW50Rm4sIGlucHV0cywgbWV0aG9kcywgc3NyIH0gPSBvcHRzO1xuXG4gICAgaWYgKGRlZmluZUN1c3RvbUVsZW1lbnRGbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWZpbmVDdXN0b21FbGVtZW50Rm4oKTtcbiAgICB9XG5cbiAgICBpZiAoaW5wdXRzKSB7XG4gICAgICBwcm94eUlucHV0cyhjbHMsIGlucHV0cywgc3NyKTtcbiAgICB9XG4gICAgaWYgKG1ldGhvZHMpIHtcbiAgICAgIHByb3h5TWV0aG9kcyhjbHMsIG1ldGhvZHMpO1xuICAgIH1cbiAgICByZXR1cm4gY2xzO1xuICB9O1xuICByZXR1cm4gZGVjb3JhdG9yO1xufVxuIl19
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { __decorate } from "tslib";
|
|
2
|
+
/* tslint:disable */
|
|
3
|
+
/* auto-generated angular directive proxies */
|
|
4
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Output } from '@angular/core';
|
|
5
|
+
import { ProxyCmp } from './angular-component-lib/utils';
|
|
6
|
+
import { defineCustomElement as defineTradeInWizard } from '@revendo_ch/trade-in-components/dist/components/trade-in-wizard.js';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
let TradeInWizard = class TradeInWizard {
|
|
9
|
+
/**
|
|
10
|
+
* Absolute API base for cross-origin partners — Revendo's partner API,
|
|
11
|
+
`https://api.revendo.ch/public/v1` (staging: `https://api-stage.revendo.dev/public/v1`).
|
|
12
|
+
Takes precedence over `proxyBase`. See `EMBEDDING.md`.
|
|
13
|
+
*/
|
|
14
|
+
set apiBase(_) { }
|
|
15
|
+
;
|
|
16
|
+
/**
|
|
17
|
+
* Numeric variant ID of the $0 placeholder product (required for `instant`).
|
|
18
|
+
*/
|
|
19
|
+
set dummyVariantId(_) { }
|
|
20
|
+
;
|
|
21
|
+
/**
|
|
22
|
+
* Fetch the whole picker tree once and walk it locally (no request per pick).
|
|
23
|
+
Set `false` to force the stepwise `/facets` path.
|
|
24
|
+
|
|
25
|
+
Left on by default: a backend without `/facets/tree` (it is not on prod
|
|
26
|
+
yet) makes the first fetch fail, and the wizard falls back to stepwise for
|
|
27
|
+
the rest of the session on its own — so this needs no per-environment flip. @default true
|
|
28
|
+
*/
|
|
29
|
+
set facetTree(_) { }
|
|
30
|
+
;
|
|
31
|
+
/**
|
|
32
|
+
* Checkout flow. `direct` works anywhere; `instant` needs a Shopify host. @default 'direct'
|
|
33
|
+
*/
|
|
34
|
+
set flow(_) { }
|
|
35
|
+
;
|
|
36
|
+
/**
|
|
37
|
+
* Feature flag: show the business "code for business" fields at checkout
|
|
38
|
+
(default off → the published component stays partner-neutral). @default false
|
|
39
|
+
*/
|
|
40
|
+
set businessFields(_) { }
|
|
41
|
+
;
|
|
42
|
+
/**
|
|
43
|
+
* Feature flag: show newsletter/SMS marketing opt-ins at checkout (default off). @default false
|
|
44
|
+
*/
|
|
45
|
+
set marketingOptins(_) { }
|
|
46
|
+
;
|
|
47
|
+
/**
|
|
48
|
+
* Voucher payout bonus in CHF, shown as a badge on the checkout's Gutschein
|
|
49
|
+
option (display only — the payout math happens on the Revendo side).
|
|
50
|
+
*/
|
|
51
|
+
set voucherBonus(_) { }
|
|
52
|
+
;
|
|
53
|
+
/**
|
|
54
|
+
* Explainer line under the checkout's Gutschein option, shown only while
|
|
55
|
+
Gutschein is the selected payment type. Overrides the built-in
|
|
56
|
+
`coVoucherHint` copy.
|
|
57
|
+
*/
|
|
58
|
+
set voucherHint(_) { }
|
|
59
|
+
;
|
|
60
|
+
/**
|
|
61
|
+
* UI language (2-letter). Falls back to `de`. Read from the `lang` attribute. @default 'de'
|
|
62
|
+
*/
|
|
63
|
+
set locale(_) { }
|
|
64
|
+
;
|
|
65
|
+
/**
|
|
66
|
+
* How the wizard mounts. `inline` renders a self-contained card in the page;
|
|
67
|
+
`modal` renders a launcher button that opens a centered modal / mobile
|
|
68
|
+
bottom-sheet with a backdrop. @default 'inline'
|
|
69
|
+
*/
|
|
70
|
+
set presentation(_) { }
|
|
71
|
+
;
|
|
72
|
+
/**
|
|
73
|
+
* Same-origin app-proxy base (Shopify hosts). Used when `apiBase` is unset. @default '/apps/trade-in'
|
|
74
|
+
*/
|
|
75
|
+
set proxyBase(_) { }
|
|
76
|
+
;
|
|
77
|
+
/**
|
|
78
|
+
* Publishable, origin-locked API key issued by Revendo for `apiBase` (sent as
|
|
79
|
+
`X-Publishable-Key`). NOT a secret: it only works from the partner's registered origins.
|
|
80
|
+
*/
|
|
81
|
+
set publishableKey(_) { }
|
|
82
|
+
;
|
|
83
|
+
/**
|
|
84
|
+
* Customer-rating USP row: average score and number of reviews. Both come
|
|
85
|
+
from the host, because the review platform is the host's, not ours — on
|
|
86
|
+
revendo.ch the theme block reads Judge.me's `judgeme.shop_reviews_rating`
|
|
87
|
+
/ `judgeme.shop_reviews_count` shop metafields and passes them down.
|
|
88
|
+
|
|
89
|
+
The row is omitted entirely when `reviewCount` is missing or not a number.
|
|
90
|
+
It used to render a hardcoded "4.8 / 11'000", which was both stale and
|
|
91
|
+
above the real figure — and a published component must not advertise
|
|
92
|
+
Revendo's reviews on a partner's page. No numbers, no claim.
|
|
93
|
+
*/
|
|
94
|
+
set reviewRating(_) { }
|
|
95
|
+
;
|
|
96
|
+
set reviewCount(_) { }
|
|
97
|
+
;
|
|
98
|
+
/**
|
|
99
|
+
* Deal-breaker answers: comma-separated `question:answer` pairs that end the
|
|
100
|
+
appraisal on the spot and jump straight to the quote, skipping every
|
|
101
|
+
question still ahead — e.g. `is_functional:no` ("Does the device work
|
|
102
|
+
properly?" → "No"; the backend already prices that as a manual appraisal,
|
|
103
|
+
so the optical grade and battery answers behind it change nothing).
|
|
104
|
+
|
|
105
|
+
Each side matches the stable `content_type` first and the raw id/value
|
|
106
|
+
second, so `is_functional:no` keeps working when the backend re-authors the
|
|
107
|
+
question under a new id — which it does (see `core/skip-rules.ts`). Left
|
|
108
|
+
empty the wizard asks every question, as before.
|
|
109
|
+
*/
|
|
110
|
+
set skipToQuoteOn(_) { }
|
|
111
|
+
;
|
|
112
|
+
/**
|
|
113
|
+
* Show the intro screen (eyebrow + headline + USP list, "find price" CTA)
|
|
114
|
+
as the first thing a fresh session sees. Set `false` to open straight on
|
|
115
|
+
the picker — for hosts whose own page already carries that pitch, where
|
|
116
|
+
the intro is a second sales screen the customer has to click past.
|
|
117
|
+
|
|
118
|
+
Purely a starting point, not a mode: everything that returns to the start
|
|
119
|
+
("sell another device", closing and reopening the modal) lands on
|
|
120
|
+
whichever screen this selects. @default true
|
|
121
|
+
*/
|
|
122
|
+
set showIntro(_) { }
|
|
123
|
+
;
|
|
124
|
+
/**
|
|
125
|
+
* Optionally open the picker inside one device family (e.g. "iPhone").
|
|
126
|
+
|
|
127
|
+
A shortcut, not a filter: it only seeds the category the picker starts on
|
|
128
|
+
(and the one a fresh pick returns to), so Back and the category chip still
|
|
129
|
+
clear it and show the full family tiles. A deep link's `ti_cat` wins over
|
|
130
|
+
it.
|
|
131
|
+
*/
|
|
132
|
+
set startCategory(_) { }
|
|
133
|
+
;
|
|
134
|
+
/**
|
|
135
|
+
* Where this widget sits, as a label for the quote's attribution — e.g.
|
|
136
|
+
`landing-page`, `pdp-iphone`, `blog-sell-your-mac`. Travels with every
|
|
137
|
+
price call and is persisted by Revendo on the offer and the order behind
|
|
138
|
+
it, so a placement can be measured against the orders it produced.
|
|
139
|
+
|
|
140
|
+
Free-form and set by the host page (the theme block exposes it as a
|
|
141
|
+
setting); nothing in the flow keys off it. Left empty the field is simply
|
|
142
|
+
omitted, as before. Ignored by the partner API, which attributes every
|
|
143
|
+
quote to the partner server-side.
|
|
144
|
+
*/
|
|
145
|
+
set embedSource(_) { }
|
|
146
|
+
;
|
|
147
|
+
set custFirstName(_) { }
|
|
148
|
+
;
|
|
149
|
+
set custLastName(_) { }
|
|
150
|
+
;
|
|
151
|
+
set custEmail(_) { }
|
|
152
|
+
;
|
|
153
|
+
set custPhone(_) { }
|
|
154
|
+
;
|
|
155
|
+
set custStreet(_) { }
|
|
156
|
+
;
|
|
157
|
+
set custZip(_) { }
|
|
158
|
+
;
|
|
159
|
+
set custCity(_) { }
|
|
160
|
+
;
|
|
161
|
+
set custCountry(_) { }
|
|
162
|
+
;
|
|
163
|
+
/**
|
|
164
|
+
* URL of the separately-built checkout bundle — needed with script tags
|
|
165
|
+
(Shopify theme asset, partner page). Not with the npm `loader` or the
|
|
166
|
+
React/Angular packages, which define the checkout themselves.
|
|
167
|
+
*/
|
|
168
|
+
set checkoutAssetUrl(_) { }
|
|
169
|
+
;
|
|
170
|
+
constructor(c, r, z) {
|
|
171
|
+
this.z = z;
|
|
172
|
+
this.tradeInDeviceSelected = new EventEmitter();
|
|
173
|
+
this.tradeInAnalytics = new EventEmitter();
|
|
174
|
+
this.tradeInError = new EventEmitter();
|
|
175
|
+
this.tradeInOrderComplete = new EventEmitter();
|
|
176
|
+
c.detach();
|
|
177
|
+
this.el = r.nativeElement;
|
|
178
|
+
}
|
|
179
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
180
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TradeInWizard, selector: "trade-in-wizard", inputs: { apiBase: "apiBase", businessFields: "businessFields", checkoutAssetUrl: "checkoutAssetUrl", custCity: "custCity", custCountry: "custCountry", custEmail: "custEmail", custFirstName: "custFirstName", custLastName: "custLastName", custPhone: "custPhone", custStreet: "custStreet", custZip: "custZip", dummyVariantId: "dummyVariantId", embedSource: "embedSource", facetTree: "facetTree", flow: "flow", locale: "locale", marketingOptins: "marketingOptins", presentation: "presentation", proxyBase: "proxyBase", publishableKey: "publishableKey", reviewCount: "reviewCount", reviewRating: "reviewRating", showIntro: "showIntro", skipToQuoteOn: "skipToQuoteOn", startCategory: "startCategory", voucherBonus: "voucherBonus", voucherHint: "voucherHint" }, outputs: { tradeInDeviceSelected: "tradeInDeviceSelected", tradeInAnalytics: "tradeInAnalytics", tradeInError: "tradeInError", tradeInOrderComplete: "tradeInOrderComplete" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
181
|
+
};
|
|
182
|
+
TradeInWizard = __decorate([
|
|
183
|
+
ProxyCmp({
|
|
184
|
+
defineCustomElementFn: defineTradeInWizard,
|
|
185
|
+
inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint']
|
|
186
|
+
})
|
|
187
|
+
], TradeInWizard);
|
|
188
|
+
export { TradeInWizard };
|
|
189
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, decorators: [{
|
|
190
|
+
type: Component,
|
|
191
|
+
args: [{
|
|
192
|
+
selector: 'trade-in-wizard',
|
|
193
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
194
|
+
template: '<ng-content></ng-content>',
|
|
195
|
+
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
|
|
196
|
+
inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint'],
|
|
197
|
+
outputs: ['tradeInDeviceSelected', 'tradeInAnalytics', 'tradeInError', 'tradeInOrderComplete'],
|
|
198
|
+
}]
|
|
199
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { tradeInDeviceSelected: [{
|
|
200
|
+
type: Output
|
|
201
|
+
}], tradeInAnalytics: [{
|
|
202
|
+
type: Output
|
|
203
|
+
}], tradeInError: [{
|
|
204
|
+
type: Output
|
|
205
|
+
}], tradeInOrderComplete: [{
|
|
206
|
+
type: Output
|
|
207
|
+
}] } });
|
|
208
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9nZW5lcmF0ZWQvcHJveGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsb0JBQW9CO0FBQ3BCLDhDQUE4QztBQUM5QyxPQUFPLEVBQUUsdUJBQXVCLEVBQXFCLFNBQVMsRUFBYyxZQUFZLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBRWhJLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUl6RCxPQUFPLEVBQUUsbUJBQW1CLElBQUksbUJBQW1CLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQzs7QUFhekgsSUFBTSxhQUFhLEdBQW5CLE1BQU0sYUFBYTtJQUV0Qjs7OztLQUlDO0lBQ0gsSUFBSSxPQUFPLENBQUMsQ0FBc0MsSUFBRyxDQUFDO0lBQUEsQ0FBQztJQUNyRDs7S0FFQztJQUNILElBQUksY0FBYyxDQUFDLENBQTZDLElBQUcsQ0FBQztJQUFBLENBQUM7SUFDbkU7Ozs7Ozs7S0FPQztJQUNILElBQUksU0FBUyxDQUFDLENBQXdDLElBQUcsQ0FBQztJQUFBLENBQUM7SUFDekQ7O0tBRUM7SUFDSCxJQUFJLElBQUksQ0FBQyxDQUFtQyxJQUFHLENBQUM7SUFBQSxDQUFDO0lBQy9DOzs7S0FHQztJQUNILElBQUksY0FBYyxDQUFDLENBQTZDLElBQUcsQ0FBQztJQUFBLENBQUM7SUFDbkU7O0tBRUM7SUFDSCxJQUFJLGVBQWUsQ0FBQyxDQUE4QyxJQUFHLENBQUM7SUFBQSxDQUFDO0lBQ3JFOzs7S0FHQztJQUNILElBQUksWUFBWSxDQUFDLENBQTJDLElBQUcsQ0FBQztJQUFBLENBQUM7SUFDL0Q7Ozs7S0FJQztJQUNILElBQUksV0FBVyxDQUFDLENBQTBDLElBQUcsQ0FBQztJQUFBLENBQUM7SUFDN0Q7O0tBRUM7SUFDSCxJQUFJLE1BQU0sQ0FBQyxDQUFxQyxJQUFHLENBQUM7SUFBQSxDQUFDO0lBQ25EOzs7O0tBSUM7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RSwyQkFBMkI7b0JBQ3JDLHVFQUF1RTtvQkFDdkUsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxDQUFDO29CQUN2WixPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsc0JBQXNCLENBQUM7aUJBQy9GO29JQWtKVyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogdHNsaW50OmRpc2FibGUgKi9cbi8qIGF1dG8tZ2VuZXJhdGVkIGFuZ3VsYXIgZGlyZWN0aXZlIHByb3hpZXMgKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFByb3h5Q21wIH0gZnJvbSAnLi9hbmd1bGFyLWNvbXBvbmVudC1saWIvdXRpbHMnO1xuXG5pbXBvcnQgdHlwZSB7IENvbXBvbmVudHMgfSBmcm9tICdAcmV2ZW5kb19jaC90cmFkZS1pbi1jb21wb25lbnRzL2Rpc3QvY29tcG9uZW50cyc7XG5cbmltcG9ydCB7IGRlZmluZUN1c3RvbUVsZW1lbnQgYXMgZGVmaW5lVHJhZGVJbldpemFyZCB9IGZyb20gJ0ByZXZlbmRvX2NoL3RyYWRlLWluLWNvbXBvbmVudHMvZGlzdC9jb21wb25lbnRzL3RyYWRlLWluLXdpemFyZC5qcyc7XG5AUHJveHlDbXAoe1xuICBkZWZpbmVDdXN0b21FbGVtZW50Rm46IGRlZmluZVRyYWRlSW5XaXphcmQsXG4gIGlucHV0czogWydhcGlCYXNlJywgJ2J1c2luZXNzRmllbGRzJywgJ2NoZWNrb3V0QXNzZXRVcmwnLCAnY3VzdENpdHknLCAnY3VzdENvdW50cnknLCAnY3VzdEVtYWlsJywgJ2N1c3RGaXJzdE5hbWUnLCAnY3VzdExhc3ROYW1lJywgJ2N1c3RQaG9uZScsICdjdXN0U3RyZWV0JywgJ2N1c3RaaXAnLCAnZHVtbXlWYXJpYW50SWQnLCAnZW1iZWRTb3VyY2UnLCAnZmFjZXRUcmVlJywgJ2Zsb3cnLCAnbG9jYWxlJywgJ21hcmtldGluZ09wdGlucycsICdwcmVzZW50YXRpb24nLCAncHJveHlCYXNlJywgJ3B1Ymxpc2hhYmxlS2V5JywgJ3Jldmlld0NvdW50JywgJ3Jldmlld1JhdGluZycsICdzaG93SW50cm8nLCAnc2tpcFRvUXVvdGVPbicsICdzdGFydENhdGVnb3J5JywgJ3ZvdWNoZXJCb251cycsICd2b3VjaGVySGludCddXG59KVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndHJhZGUtaW4td2l6YXJkJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvbm8taW5wdXRzLW1ldGFkYXRhLXByb3BlcnR5XG4gIGlucHV0czogWydhcGlCYXNlJywgJ2J1c2luZXNzRmllbGRzJywgJ2NoZWNrb3V0QXNzZXRVcmwnLCAnY3VzdENpdHknLCAnY3VzdENvdW50cnknLCAnY3VzdEVtYWlsJywgJ2N1c3RGaXJzdE5hbWUnLCAnY3VzdExhc3ROYW1lJywgJ2N1c3RQaG9uZScsICdjdXN0U3RyZWV0JywgJ2N1c3RaaXAnLCAnZHVtbXlWYXJpYW50SWQnLCAnZW1iZWRTb3VyY2UnLCAnZmFjZXRUcmVlJywgJ2Zsb3cnLCAnbG9jYWxlJywgJ21hcmtldGluZ09wdGlucycsICdwcmVzZW50YXRpb24nLCAncHJveHlCYXNlJywgJ3B1Ymxpc2hhYmxlS2V5JywgJ3Jldmlld0NvdW50JywgJ3Jldmlld1JhdGluZycsICdzaG93SW50cm8nLCAnc2tpcFRvUXVvdGVPbicsICdzdGFydENhdGVnb3J5JywgJ3ZvdWNoZXJCb251cycsICd2b3VjaGVySGludCddLFxuICBvdXRwdXRzOiBbJ3RyYWRlSW5EZXZpY2VTZWxlY3RlZCcsICd0cmFkZUluQW5hbHl0aWNzJywgJ3RyYWRlSW5FcnJvcicsICd0cmFkZUluT3JkZXJDb21wbGV0ZSddLFxufSlcbmV4cG9ydCBjbGFzcyBUcmFkZUluV2l6YXJkIHtcbiAgcHJvdGVjdGVkIGVsOiBIVE1MVHJhZGVJbldpemFyZEVsZW1lbnQ7XG4gICAgLyoqXG4gICAqIEFic29sdXRlIEFQSSBiYXNlIGZvciBjcm9zcy1vcmlnaW4gcGFydG5lcnMg4oCUIFJldmVuZG8ncyBwYXJ0bmVyIEFQSSxcbmBodHRwczovL2FwaS5yZXZlbmRvLmNoL3B1YmxpYy92MWAgKHN0YWdpbmc6IGBodHRwczovL2FwaS1zdGFnZS5yZXZlbmRvLmRldi9wdWJsaWMvdjFgKS5cblRha2VzIHByZWNlZGVuY2Ugb3ZlciBgcHJveHlCYXNlYC4gU2VlIGBFTUJFRERJTkcubWRgLlxuICAgKi9cbiAgc2V0IGFwaUJhc2UoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydhcGlCYXNlJ10pIHt9O1xuICAgIC8qKlxuICAgKiBOdW1lcmljIHZhcmlhbnQgSUQgb2YgdGhlICQwIHBsYWNlaG9sZGVyIHByb2R1Y3QgKHJlcXVpcmVkIGZvciBgaW5zdGFudGApLlxuICAgKi9cbiAgc2V0IGR1bW15VmFyaWFudElkKF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsnZHVtbXlWYXJpYW50SWQnXSkge307XG4gICAgLyoqXG4gICAqIEZldGNoIHRoZSB3aG9sZSBwaWNrZXIgdHJlZSBvbmNlIGFuZCB3YWxrIGl0IGxvY2FsbHkgKG5vIHJlcXVlc3QgcGVyIHBpY2spLlxuU2V0IGBmYWxzZWAgdG8gZm9yY2UgdGhlIHN0ZXB3aXNlIGAvZmFjZXRzYCBwYXRoLlxuXG5MZWZ0IG9uIGJ5IGRlZmF1bHQ6IGEgYmFja2VuZCB3aXRob3V0IGAvZmFjZXRzL3RyZWVgIChpdCBpcyBub3Qgb24gcHJvZFxueWV0KSBtYWtlcyB0aGUgZmlyc3QgZmV0Y2ggZmFpbCwgYW5kIHRoZSB3aXphcmQgZmFsbHMgYmFjayB0byBzdGVwd2lzZSBmb3JcbnRoZSByZXN0IG9mIHRoZSBzZXNzaW9uIG9uIGl0cyBvd24g4oCUIHNvIHRoaXMgbmVlZHMgbm8gcGVyLWVudmlyb25tZW50IGZsaXAuIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHNldCBmYWNldFRyZWUoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydmYWNldFRyZWUnXSkge307XG4gICAgLyoqXG4gICAqIENoZWNrb3V0IGZsb3cuIGBkaXJlY3RgIHdvcmtzIGFueXdoZXJlOyBgaW5zdGFudGAgbmVlZHMgYSBTaG9waWZ5IGhvc3QuIEBkZWZhdWx0ICdkaXJlY3QnXG4gICAqL1xuICBzZXQgZmxvdyhfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ2Zsb3cnXSkge307XG4gICAgLyoqXG4gICAqIEZlYXR1cmUgZmxhZzogc2hvdyB0aGUgYnVzaW5lc3MgXCJjb2RlIGZvciBidXNpbmVzc1wiIGZpZWxkcyBhdCBjaGVja291dFxuKGRlZmF1bHQgb2ZmIOKGkiB0aGUgcHVibGlzaGVkIGNvbXBvbmVudCBzdGF5cyBwYXJ0bmVyLW5ldXRyYWwpLiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2V0IGJ1c2luZXNzRmllbGRzKF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsnYnVzaW5lc3NGaWVsZHMnXSkge307XG4gICAgLyoqXG4gICAqIEZlYXR1cmUgZmxhZzogc2hvdyBuZXdzbGV0dGVyL1NNUyBtYXJrZXRpbmcgb3B0LWlucyBhdCBjaGVja291dCAoZGVmYXVsdCBvZmYpLiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgc2V0IG1hcmtldGluZ09wdGlucyhfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ21hcmtldGluZ09wdGlucyddKSB7fTtcbiAgICAvKipcbiAgICogVm91Y2hlciBwYXlvdXQgYm9udXMgaW4gQ0hGLCBzaG93biBhcyBhIGJhZGdlIG9uIHRoZSBjaGVja291dCdzIEd1dHNjaGVpblxub3B0aW9uIChkaXNwbGF5IG9ubHkg4oCUIHRoZSBwYXlvdXQgbWF0aCBoYXBwZW5zIG9uIHRoZSBSZXZlbmRvIHNpZGUpLlxuICAgKi9cbiAgc2V0IHZvdWNoZXJCb251cyhfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3ZvdWNoZXJCb251cyddKSB7fTtcbiAgICAvKipcbiAgICogRXhwbGFpbmVyIGxpbmUgdW5kZXIgdGhlIGNoZWNrb3V0J3MgR3V0c2NoZWluIG9wdGlvbiwgc2hvd24gb25seSB3aGlsZVxuR3V0c2NoZWluIGlzIHRoZSBzZWxlY3RlZCBwYXltZW50IHR5cGUuIE92ZXJyaWRlcyB0aGUgYnVpbHQtaW5cbmBjb1ZvdWNoZXJIaW50YCBjb3B5LlxuICAgKi9cbiAgc2V0IHZvdWNoZXJIaW50KF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsndm91Y2hlckhpbnQnXSkge307XG4gICAgLyoqXG4gICAqIFVJIGxhbmd1YWdlICgyLWxldHRlcikuIEZhbGxzIGJhY2sgdG8gYGRlYC4gUmVhZCBmcm9tIHRoZSBgbGFuZ2AgYXR0cmlidXRlLiBAZGVmYXVsdCAnZGUnXG4gICAqL1xuICBzZXQgbG9jYWxlKF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsnbG9jYWxlJ10pIHt9O1xuICAgIC8qKlxuICAgKiBIb3cgdGhlIHdpemFyZCBtb3VudHMuIGBpbmxpbmVgIHJlbmRlcnMgYSBzZWxmLWNvbnRhaW5lZCBjYXJkIGluIHRoZSBwYWdlO1xuYG1vZGFsYCByZW5kZXJzIGEgbGF1bmNoZXIgYnV0dG9uIHRoYXQgb3BlbnMgYSBjZW50ZXJlZCBtb2RhbCAvIG1vYmlsZVxuYm90dG9tLXNoZWV0IHdpdGggYSBiYWNrZHJvcC4gQGRlZmF1bHQgJ2lubGluZSdcbiAgICovXG4gIHNldCBwcmVzZW50YXRpb24oXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydwcmVzZW50YXRpb24nXSkge307XG4gICAgLyoqXG4gICAqIFNhbWUtb3JpZ2luIGFwcC1wcm94eSBiYXNlIChTaG9waWZ5IGhvc3RzKS4gVXNlZCB3aGVuIGBhcGlCYXNlYCBpcyB1bnNldC4gQGRlZmF1bHQgJy9hcHBzL3RyYWRlLWluJ1xuICAgKi9cbiAgc2V0IHByb3h5QmFzZShfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3Byb3h5QmFzZSddKSB7fTtcbiAgICAvKipcbiAgICogUHVibGlzaGFibGUsIG9yaWdpbi1sb2NrZWQgQVBJIGtleSBpc3N1ZWQgYnkgUmV2ZW5kbyBmb3IgYGFwaUJhc2VgIChzZW50IGFzXG5gWC1QdWJsaXNoYWJsZS1LZXlgKS4gTk9UIGEgc2VjcmV0OiBpdCBvbmx5IHdvcmtzIGZyb20gdGhlIHBhcnRuZXIncyByZWdpc3RlcmVkIG9yaWdpbnMuXG4gICAqL1xuICBzZXQgcHVibGlzaGFibGVLZXkoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydwdWJsaXNoYWJsZUtleSddKSB7fTtcbiAgICAvKipcbiAgICogQ3VzdG9tZXItcmF0aW5nIFVTUCByb3c6IGF2ZXJhZ2Ugc2NvcmUgYW5kIG51bWJlciBvZiByZXZpZXdzLiBCb3RoIGNvbWVcbmZyb20gdGhlIGhvc3QsIGJlY2F1c2UgdGhlIHJldmlldyBwbGF0Zm9ybSBpcyB0aGUgaG9zdCdzLCBub3Qgb3VycyDigJQgb25cbnJldmVuZG8uY2ggdGhlIHRoZW1lIGJsb2NrIHJlYWRzIEp1ZGdlLm1lJ3MgYGp1ZGdlbWUuc2hvcF9yZXZpZXdzX3JhdGluZ2Bcbi8gYGp1ZGdlbWUuc2hvcF9yZXZpZXdzX2NvdW50YCBzaG9wIG1ldGFmaWVsZHMgYW5kIHBhc3NlcyB0aGVtIGRvd24uXG5cblRoZSByb3cgaXMgb21pdHRlZCBlbnRpcmVseSB3aGVuIGByZXZpZXdDb3VudGAgaXMgbWlzc2luZyBvciBub3QgYSBudW1iZXIuXG5JdCB1c2VkIHRvIHJlbmRlciBhIGhhcmRjb2RlZCBcIjQuOCAvIDExJzAwMFwiLCB3aGljaCB3YXMgYm90aCBzdGFsZSBhbmRcbmFib3ZlIHRoZSByZWFsIGZpZ3VyZSDigJQgYW5kIGEgcHVibGlzaGVkIGNvbXBvbmVudCBtdXN0IG5vdCBhZHZlcnRpc2VcblJldmVuZG8ncyByZXZpZXdzIG9uIGEgcGFydG5lcidzIHBhZ2UuIE5vIG51bWJlcnMsIG5vIGNsYWltLlxuICAgKi9cbiAgc2V0IHJldmlld1JhdGluZyhfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3Jldmlld1JhdGluZyddKSB7fTtcbiAgXG4gIHNldCByZXZpZXdDb3VudChfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3Jldmlld0NvdW50J10pIHt9O1xuICAgIC8qKlxuICAgKiBEZWFsLWJyZWFrZXIgYW5zd2VyczogY29tbWEtc2VwYXJhdGVkIGBxdWVzdGlvbjphbnN3ZXJgIHBhaXJzIHRoYXQgZW5kIHRoZVxuYXBwcmFpc2FsIG9uIHRoZSBzcG90IGFuZCBqdW1wIHN0cmFpZ2h0IHRvIHRoZSBxdW90ZSwgc2tpcHBpbmcgZXZlcnlcbnF1ZXN0aW9uIHN0aWxsIGFoZWFkIOKAlCBlLmcuIGBpc19mdW5jdGlvbmFsOm5vYCAoXCJEb2VzIHRoZSBkZXZpY2Ugd29ya1xucHJvcGVybHk/XCIg4oaSIFwiTm9cIjsgdGhlIGJhY2tlbmQgYWxyZWFkeSBwcmljZXMgdGhhdCBhcyBhIG1hbnVhbCBhcHByYWlzYWwsXG5zbyB0aGUgb3B0aWNhbCBncmFkZSBhbmQgYmF0dGVyeSBhbnN3ZXJzIGJlaGluZCBpdCBjaGFuZ2Ugbm90aGluZykuXG5cbkVhY2ggc2lkZSBtYXRjaGVzIHRoZSBzdGFibGUgYGNvbnRlbnRfdHlwZWAgZmlyc3QgYW5kIHRoZSByYXcgaWQvdmFsdWVcbnNlY29uZCwgc28gYGlzX2Z1bmN0aW9uYWw6bm9gIGtlZXBzIHdvcmtpbmcgd2hlbiB0aGUgYmFja2VuZCByZS1hdXRob3JzIHRoZVxucXVlc3Rpb24gdW5kZXIgYSBuZXcgaWQg4oCUIHdoaWNoIGl0IGRvZXMgKHNlZSBgY29yZS9za2lwLXJ1bGVzLnRzYCkuIExlZnRcbmVtcHR5IHRoZSB3aXphcmQgYXNrcyBldmVyeSBxdWVzdGlvbiwgYXMgYmVmb3JlLlxuICAgKi9cbiAgc2V0IHNraXBUb1F1b3RlT24oXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydza2lwVG9RdW90ZU9uJ10pIHt9O1xuICAgIC8qKlxuICAgKiBTaG93IHRoZSBpbnRybyBzY3JlZW4gKGV5ZWJyb3cgKyBoZWFkbGluZSArIFVTUCBsaXN0LCBcImZpbmQgcHJpY2VcIiBDVEEpXG5hcyB0aGUgZmlyc3QgdGhpbmcgYSBmcmVzaCBzZXNzaW9uIHNlZXMuIFNldCBgZmFsc2VgIHRvIG9wZW4gc3RyYWlnaHQgb25cbnRoZSBwaWNrZXIg4oCUIGZvciBob3N0cyB3aG9zZSBvd24gcGFnZSBhbHJlYWR5IGNhcnJpZXMgdGhhdCBwaXRjaCwgd2hlcmVcbnRoZSBpbnRybyBpcyBhIHNlY29uZCBzYWxlcyBzY3JlZW4gdGhlIGN1c3RvbWVyIGhhcyB0byBjbGljayBwYXN0LlxuXG5QdXJlbHkgYSBzdGFydGluZyBwb2ludCwgbm90IGEgbW9kZTogZXZlcnl0aGluZyB0aGF0IHJldHVybnMgdG8gdGhlIHN0YXJ0XG4oXCJzZWxsIGFub3RoZXIgZGV2aWNlXCIsIGNsb3NpbmcgYW5kIHJlb3BlbmluZyB0aGUgbW9kYWwpIGxhbmRzIG9uXG53aGljaGV2ZXIgc2NyZWVuIHRoaXMgc2VsZWN0cy4gQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgc2V0IHNob3dJbnRybyhfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3Nob3dJbnRybyddKSB7fTtcbiAgICAvKipcbiAgICogT3B0aW9uYWxseSBvcGVuIHRoZSBwaWNrZXIgaW5zaWRlIG9uZSBkZXZpY2UgZmFtaWx5IChlLmcuIFwiaVBob25lXCIpLlxuXG5BIHNob3J0Y3V0LCBub3QgYSBmaWx0ZXI6IGl0IG9ubHkgc2VlZHMgdGhlIGNhdGVnb3J5IHRoZSBwaWNrZXIgc3RhcnRzIG9uXG4oYW5kIHRoZSBvbmUgYSBmcmVzaCBwaWNrIHJldHVybnMgdG8pLCBzbyBCYWNrIGFuZCB0aGUgY2F0ZWdvcnkgY2hpcCBzdGlsbFxuY2xlYXIgaXQgYW5kIHNob3cgdGhlIGZ1bGwgZmFtaWx5IHRpbGVzLiBBIGRlZXAgbGluaydzIGB0aV9jYXRgIHdpbnMgb3ZlclxuaXQuXG4gICAqL1xuICBzZXQgc3RhcnRDYXRlZ29yeShfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ3N0YXJ0Q2F0ZWdvcnknXSkge307XG4gICAgLyoqXG4gICAqIFdoZXJlIHRoaXMgd2lkZ2V0IHNpdHMsIGFzIGEgbGFiZWwgZm9yIHRoZSBxdW90ZSdzIGF0dHJpYnV0aW9uIOKAlCBlLmcuXG5gbGFuZGluZy1wYWdlYCwgYHBkcC1pcGhvbmVgLCBgYmxvZy1zZWxsLXlvdXItbWFjYC4gVHJhdmVscyB3aXRoIGV2ZXJ5XG5wcmljZSBjYWxsIGFuZCBpcyBwZXJzaXN0ZWQgYnkgUmV2ZW5kbyBvbiB0aGUgb2ZmZXIgYW5kIHRoZSBvcmRlciBiZWhpbmRcbml0LCBzbyBhIHBsYWNlbWVudCBjYW4gYmUgbWVhc3VyZWQgYWdhaW5zdCB0aGUgb3JkZXJzIGl0IHByb2R1Y2VkLlxuXG5GcmVlLWZvcm0gYW5kIHNldCBieSB0aGUgaG9zdCBwYWdlICh0aGUgdGhlbWUgYmxvY2sgZXhwb3NlcyBpdCBhcyBhXG5zZXR0aW5nKTsgbm90aGluZyBpbiB0aGUgZmxvdyBrZXlzIG9mZiBpdC4gTGVmdCBlbXB0eSB0aGUgZmllbGQgaXMgc2ltcGx5XG5vbWl0dGVkLCBhcyBiZWZvcmUuIElnbm9yZWQgYnkgdGhlIHBhcnRuZXIgQVBJLCB3aGljaCBhdHRyaWJ1dGVzIGV2ZXJ5XG5xdW90ZSB0byB0aGUgcGFydG5lciBzZXJ2ZXItc2lkZS5cbiAgICovXG4gIHNldCBlbWJlZFNvdXJjZShfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ2VtYmVkU291cmNlJ10pIHt9O1xuICBcbiAgc2V0IGN1c3RGaXJzdE5hbWUoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjdXN0Rmlyc3ROYW1lJ10pIHt9O1xuICBcbiAgc2V0IGN1c3RMYXN0TmFtZShfOiBDb21wb25lbnRzLlRyYWRlSW5XaXphcmRbJ2N1c3RMYXN0TmFtZSddKSB7fTtcbiAgXG4gIHNldCBjdXN0RW1haWwoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjdXN0RW1haWwnXSkge307XG4gIFxuICBzZXQgY3VzdFBob25lKF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsnY3VzdFBob25lJ10pIHt9O1xuICBcbiAgc2V0IGN1c3RTdHJlZXQoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjdXN0U3RyZWV0J10pIHt9O1xuICBcbiAgc2V0IGN1c3RaaXAoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjdXN0WmlwJ10pIHt9O1xuICBcbiAgc2V0IGN1c3RDaXR5KF86IENvbXBvbmVudHMuVHJhZGVJbldpemFyZFsnY3VzdENpdHknXSkge307XG4gIFxuICBzZXQgY3VzdENvdW50cnkoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjdXN0Q291bnRyeSddKSB7fTtcbiAgICAvKipcbiAgICogVVJMIG9mIHRoZSBzZXBhcmF0ZWx5LWJ1aWx0IGNoZWNrb3V0IGJ1bmRsZSDigJQgbmVlZGVkIHdpdGggc2NyaXB0IHRhZ3NcbihTaG9waWZ5IHRoZW1lIGFzc2V0LCBwYXJ0bmVyIHBhZ2UpLiBOb3Qgd2l0aCB0aGUgbnBtIGBsb2FkZXJgIG9yIHRoZVxuUmVhY3QvQW5ndWxhciBwYWNrYWdlcywgd2hpY2ggZGVmaW5lIHRoZSBjaGVja291dCB0aGVtc2VsdmVzLlxuICAgKi9cbiAgc2V0IGNoZWNrb3V0QXNzZXRVcmwoXzogQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkWydjaGVja291dEFzc2V0VXJsJ10pIHt9O1xuICBAT3V0cHV0KCkgdHJhZGVJbkRldmljZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcjxUcmFkZUluV2l6YXJkQ3VzdG9tRXZlbnQ8SVRyYWRlSW5XaXphcmRUcmFkZUluRGV2aWNlU2VsZWN0ZWREZXRhaWw+PigpO1xuICBAT3V0cHV0KCkgdHJhZGVJbkFuYWx5dGljcyA9IG5ldyBFdmVudEVtaXR0ZXI8VHJhZGVJbldpemFyZEN1c3RvbUV2ZW50PElUcmFkZUluV2l6YXJkVHJhZGVJbkFuYWx5dGljc0RldGFpbD4+KCk7XG4gIEBPdXRwdXQoKSB0cmFkZUluRXJyb3IgPSBuZXcgRXZlbnRFbWl0dGVyPFRyYWRlSW5XaXphcmRDdXN0b21FdmVudDxJVHJhZGVJbldpemFyZFRyYWRlSW5FcnJvckRldGFpbD4+KCk7XG4gIEBPdXRwdXQoKSB0cmFkZUluT3JkZXJDb21wbGV0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VHJhZGVJbldpemFyZEN1c3RvbUV2ZW50PElUcmFkZUluV2l6YXJkVHJhZGVJbk9yZGVyQ29tcGxldGVEZXRhaWw+PigpO1xuICBjb25zdHJ1Y3RvcihjOiBDaGFuZ2VEZXRlY3RvclJlZiwgcjogRWxlbWVudFJlZiwgcHJvdGVjdGVkIHo6IE5nWm9uZSkge1xuICAgIGMuZGV0YWNoKCk7XG4gICAgdGhpcy5lbCA9IHIubmF0aXZlRWxlbWVudDtcbiAgfVxufVxuXG5cbmltcG9ydCB0eXBlIHsgVHJhZGVJbldpemFyZEN1c3RvbUV2ZW50IH0gZnJvbSAnQHJldmVuZG9fY2gvdHJhZGUtaW4tY29tcG9uZW50cy9kaXN0L2NvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFkZUluRGV2aWNlU2VsZWN0ZWREZXRhaWwgYXMgSVRyYWRlSW5XaXphcmRUcmFkZUluRGV2aWNlU2VsZWN0ZWREZXRhaWwgfSBmcm9tICdAcmV2ZW5kb19jaC90cmFkZS1pbi1jb21wb25lbnRzL2Rpc3QvY29tcG9uZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRyYWRlSW5BbmFseXRpY3NEZXRhaWwgYXMgSVRyYWRlSW5XaXphcmRUcmFkZUluQW5hbHl0aWNzRGV0YWlsIH0gZnJvbSAnQHJldmVuZG9fY2gvdHJhZGUtaW4tY29tcG9uZW50cy9kaXN0L2NvbXBvbmVudHMnO1xuaW1wb3J0IHR5cGUgeyBUcmFkZUluRXJyb3JEZXRhaWwgYXMgSVRyYWRlSW5XaXphcmRUcmFkZUluRXJyb3JEZXRhaWwgfSBmcm9tICdAcmV2ZW5kb19jaC90cmFkZS1pbi1jb21wb25lbnRzL2Rpc3QvY29tcG9uZW50cyc7XG5pbXBvcnQgdHlwZSB7IFRyYWRlSW5PcmRlckNvbXBsZXRlRGV0YWlsIGFzIElUcmFkZUluV2l6YXJkVHJhZGVJbk9yZGVyQ29tcGxldGVEZXRhaWwgfSBmcm9tICdAcmV2ZW5kb19jaC90cmFkZS1pbi1jb21wb25lbnRzL2Rpc3QvY29tcG9uZW50cyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBUcmFkZUluV2l6YXJkIGV4dGVuZHMgQ29tcG9uZW50cy5UcmFkZUluV2l6YXJkIHtcbiAgLyoqXG4gICAqIEN1c3RvbWVyIGFjY2VwdGVkIGEgcXVvdGUuXG4gICAqL1xuICB0cmFkZUluRGV2aWNlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxUcmFkZUluV2l6YXJkQ3VzdG9tRXZlbnQ8SVRyYWRlSW5XaXphcmRUcmFkZUluRGV2aWNlU2VsZWN0ZWREZXRhaWw+PjtcbiAgLyoqXG4gICAqIFByaXZhY3ktc2FmZSBmdW5uZWwgZXZlbnQgZm9yIGhvc3QgYW5hbHl0aWNzIGludGVncmF0aW9ucy5cbiAgICovXG4gIHRyYWRlSW5BbmFseXRpY3M6IEV2ZW50RW1pdHRlcjxUcmFkZUluV2l6YXJkQ3VzdG9tRXZlbnQ8SVRyYWRlSW5XaXphcmRUcmFkZUluQW5hbHl0aWNzRGV0YWlsPj47XG4gIC8qKlxuICAgKiBBIHJlY292ZXJhYmxlIGVycm9yIHN1cmZhY2VkIHRvIHRoZSBob3N0LlxuICAgKi9cbiAgdHJhZGVJbkVycm9yOiBFdmVudEVtaXR0ZXI8VHJhZGVJbldpemFyZEN1c3RvbUV2ZW50PElUcmFkZUluV2l6YXJkVHJhZGVJbkVycm9yRGV0YWlsPj47XG4gIC8qKlxuICAgKiBPcmRlciBmaW5hbGl6ZWQgKGhvc3QgYmFja2VuZCBtdXN0IHN0aWxsIHZlcmlmeSBzZXJ2ZXItdG8tc2VydmVyKS5cbiAgICovXG4gIHRyYWRlSW5PcmRlckNvbXBsZXRlOiBFdmVudEVtaXR0ZXI8VHJhZGVJbldpemFyZEN1c3RvbUV2ZW50PElUcmFkZUluV2l6YXJkVHJhZGVJbk9yZGVyQ29tcGxldGVEZXRhaWw+Pjtcbn1cblxuXG4iXX0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Angular bindings for `<trade-in-wizard>` (standalone component).
|
|
3
|
+
*
|
|
4
|
+
* import { TradeInWizard } from '@revendo_ch/trade-in-components-angular';
|
|
5
|
+
* @Component({ imports: [TradeInWizard], template: `
|
|
6
|
+
* <trade-in-wizard apiBase="…" publishableKey="pk_…" flow="direct"
|
|
7
|
+
* (tradeInOrderComplete)="done($event)"></trade-in-wizard>` })
|
|
8
|
+
*
|
|
9
|
+
* `./generated/` is written by the Stencil Angular output target on every
|
|
10
|
+
* build of `@revendo_ch/trade-in-components` — do not edit it. This file only adds
|
|
11
|
+
* what the generator can't: defining the internal checkout element. Inputs,
|
|
12
|
+
* outputs and the element proxying are inherited from the generated class.
|
|
13
|
+
*/
|
|
14
|
+
import { ChangeDetectionStrategy, Component } from '@angular/core';
|
|
15
|
+
import { TradeInWizard as GeneratedTradeInWizard } from './generated/proxies';
|
|
16
|
+
import { defineCheckoutInBackground } from './checkout';
|
|
17
|
+
import * as i0 from "@angular/core";
|
|
18
|
+
export class TradeInWizard extends GeneratedTradeInWizard {
|
|
19
|
+
constructor() {
|
|
20
|
+
super(...arguments);
|
|
21
|
+
this.checkoutDefined = defineCheckoutInBackground();
|
|
22
|
+
}
|
|
23
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
24
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TradeInWizard, isStandalone: true, selector: "trade-in-wizard", usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
25
|
+
}
|
|
26
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, decorators: [{
|
|
27
|
+
type: Component,
|
|
28
|
+
args: [{
|
|
29
|
+
selector: 'trade-in-wizard',
|
|
30
|
+
standalone: true,
|
|
31
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
32
|
+
template: '<ng-content></ng-content>',
|
|
33
|
+
}]
|
|
34
|
+
}] });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkUsT0FBTyxFQUFFLGFBQWEsSUFBSSxzQkFBc0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7QUFReEQsTUFBTSxPQUFPLGFBQWMsU0FBUSxzQkFBc0I7SUFOekQ7O1FBT21CLG9CQUFlLEdBQUcsMEJBQTBCLEVBQUUsQ0FBQztLQUNqRTsrR0FGWSxhQUFhO21HQUFiLGFBQWEsa0dBRmQsMkJBQTJCOzs0RkFFMUIsYUFBYTtrQkFOekIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFFBQVEsRUFBRSwyQkFBMkI7aUJBQ3RDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBbmd1bGFyIGJpbmRpbmdzIGZvciBgPHRyYWRlLWluLXdpemFyZD5gIChzdGFuZGFsb25lIGNvbXBvbmVudCkuXG4gKlxuICogICBpbXBvcnQgeyBUcmFkZUluV2l6YXJkIH0gZnJvbSAnQHJldmVuZG9fY2gvdHJhZGUtaW4tY29tcG9uZW50cy1hbmd1bGFyJztcbiAqICAgQENvbXBvbmVudCh7IGltcG9ydHM6IFtUcmFkZUluV2l6YXJkXSwgdGVtcGxhdGU6IGBcbiAqICAgICA8dHJhZGUtaW4td2l6YXJkIGFwaUJhc2U9XCLigKZcIiBwdWJsaXNoYWJsZUtleT1cInBrX+KAplwiIGZsb3c9XCJkaXJlY3RcIlxuICogICAgICAgKHRyYWRlSW5PcmRlckNvbXBsZXRlKT1cImRvbmUoJGV2ZW50KVwiPjwvdHJhZGUtaW4td2l6YXJkPmAgfSlcbiAqXG4gKiBgLi9nZW5lcmF0ZWQvYCBpcyB3cml0dGVuIGJ5IHRoZSBTdGVuY2lsIEFuZ3VsYXIgb3V0cHV0IHRhcmdldCBvbiBldmVyeVxuICogYnVpbGQgb2YgYEByZXZlbmRvX2NoL3RyYWRlLWluLWNvbXBvbmVudHNgIOKAlCBkbyBub3QgZWRpdCBpdC4gVGhpcyBmaWxlIG9ubHkgYWRkc1xuICogd2hhdCB0aGUgZ2VuZXJhdG9yIGNhbid0OiBkZWZpbmluZyB0aGUgaW50ZXJuYWwgY2hlY2tvdXQgZWxlbWVudC4gSW5wdXRzLFxuICogb3V0cHV0cyBhbmQgdGhlIGVsZW1lbnQgcHJveHlpbmcgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBnZW5lcmF0ZWQgY2xhc3MuXG4gKi9cbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRyYWRlSW5XaXphcmQgYXMgR2VuZXJhdGVkVHJhZGVJbldpemFyZCB9IGZyb20gJy4vZ2VuZXJhdGVkL3Byb3hpZXMnO1xuaW1wb3J0IHsgZGVmaW5lQ2hlY2tvdXRJbkJhY2tncm91bmQgfSBmcm9tICcuL2NoZWNrb3V0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndHJhZGUtaW4td2l6YXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PicsXG59KVxuZXhwb3J0IGNsYXNzIFRyYWRlSW5XaXphcmQgZXh0ZW5kcyBHZW5lcmF0ZWRUcmFkZUluV2l6YXJkIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGVja291dERlZmluZWQgPSBkZWZpbmVDaGVja291dEluQmFja2dyb3VuZCgpO1xufVxuXG5leHBvcnQgdHlwZSB7XG4gIFRyYWRlSW5BbmFseXRpY3NEZXRhaWwsXG4gIFRyYWRlSW5EZXZpY2VTZWxlY3RlZERldGFpbCxcbiAgVHJhZGVJbkVycm9yRGV0YWlsLFxuICBUcmFkZUluT3JkZXJDb21wbGV0ZURldGFpbCxcbiAgVHJhZGVJbldpemFyZEN1c3RvbUV2ZW50LFxufSBmcm9tICdAcmV2ZW5kb19jaC90cmFkZS1pbi1jb21wb25lbnRzJztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './public-api';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZW5kb19jaC10cmFkZS1pbi1jb21wb25lbnRzLWFuZ3VsYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmV2ZW5kb19jaC10cmFkZS1pbi1jb21wb25lbnRzLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
|
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { inject, PLATFORM_ID, EventEmitter, Output, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
3
|
+
import { __decorate } from 'tslib';
|
|
4
|
+
import { fromEvent } from 'rxjs';
|
|
5
|
+
import { defineCustomElement as defineCustomElement$1 } from '@revendo_ch/trade-in-components/dist/components/trade-in-wizard.js';
|
|
6
|
+
|
|
7
|
+
/* eslint-disable */
|
|
8
|
+
/* tslint:disable */
|
|
9
|
+
const serverInstances = new WeakSet();
|
|
10
|
+
/**
|
|
11
|
+
* Records a wrapper created during server rendering. Call from the constructor.
|
|
12
|
+
*/
|
|
13
|
+
const markServer = (instance) => {
|
|
14
|
+
// what `isPlatformServer()` from `@angular/common` checks
|
|
15
|
+
if (inject(PLATFORM_ID) === 'server') {
|
|
16
|
+
serverInstances.add(instance);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Stencil's own prop name to attribute name conversion (`prop1` -> `prop-1`).
|
|
21
|
+
*/
|
|
22
|
+
const toDashCase = (str) => str
|
|
23
|
+
.replace(/([A-Z0-9])/g, (match) => ` ${match[0]}`)
|
|
24
|
+
.trim()
|
|
25
|
+
.split(' ')
|
|
26
|
+
.join('-')
|
|
27
|
+
.toLowerCase();
|
|
28
|
+
/**
|
|
29
|
+
* Angular's server DOM never writes properties to the HTML, so on the server an input becomes an
|
|
30
|
+
* attribute, which Stencil's `renderToString()` reads:
|
|
31
|
+
* - a string or number as itself, and `true` as an empty attribute, so the component's first
|
|
32
|
+
* render in the browser sees them too;
|
|
33
|
+
* - `false`, anything that isn't a primitive, and any value for a prop with no attribute through
|
|
34
|
+
* `ssrProp()`, which gives the server render the exact value and leaves no attribute behind.
|
|
35
|
+
*/
|
|
36
|
+
const setServerAttribute = (el, item, val, ssr) => {
|
|
37
|
+
const name = ssr.attributes?.[item] ?? toDashCase(item);
|
|
38
|
+
if (val == null) {
|
|
39
|
+
el.removeAttribute(name);
|
|
40
|
+
}
|
|
41
|
+
else if (ssr.refs?.includes(item) ||
|
|
42
|
+
val === false ||
|
|
43
|
+
(typeof val !== 'string' && typeof val !== 'number' && val !== true)) {
|
|
44
|
+
el.setAttribute(name, ssr.ssrProp(val));
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
el.setAttribute(name, val === true ? '' : String(val));
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const proxyInputs = (Cmp, inputs, ssr) => {
|
|
51
|
+
const Prototype = Cmp.prototype;
|
|
52
|
+
inputs.forEach((item) => {
|
|
53
|
+
Object.defineProperty(Prototype, item, {
|
|
54
|
+
get() {
|
|
55
|
+
return this.el[item];
|
|
56
|
+
},
|
|
57
|
+
set(val) {
|
|
58
|
+
if (ssr && serverInstances.has(this)) {
|
|
59
|
+
// kept on the element too, so reading the input back on the server works
|
|
60
|
+
this.el[item] = val;
|
|
61
|
+
setServerAttribute(this.el, item, val, ssr);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
this.z.runOutsideAngular(() => (this.el[item] = val));
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* In the event that proxyInputs is called
|
|
68
|
+
* multiple times re-defining these inputs
|
|
69
|
+
* will cause an error to be thrown. As a result
|
|
70
|
+
* we set configurable: true to indicate these
|
|
71
|
+
* properties can be changed.
|
|
72
|
+
*/
|
|
73
|
+
configurable: true,
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
};
|
|
77
|
+
const proxyMethods = (Cmp, methods) => {
|
|
78
|
+
const Prototype = Cmp.prototype;
|
|
79
|
+
methods.forEach((methodName) => {
|
|
80
|
+
Prototype[methodName] = function () {
|
|
81
|
+
const args = arguments;
|
|
82
|
+
return this.z.runOutsideAngular(() => this.el[methodName].apply(this.el, args));
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
const proxyOutputs = (instance, el, events) => {
|
|
87
|
+
events.forEach((eventName) => (instance[eventName] = fromEvent(el, eventName)));
|
|
88
|
+
};
|
|
89
|
+
const defineCustomElement = (tagName, customElement) => {
|
|
90
|
+
if (customElement !== undefined && typeof customElements !== 'undefined' && !customElements.get(tagName)) {
|
|
91
|
+
customElements.define(tagName, customElement);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
// tslint:disable-next-line: only-arrow-functions
|
|
95
|
+
function ProxyCmp(opts) {
|
|
96
|
+
const decorator = function (cls) {
|
|
97
|
+
const { defineCustomElementFn, inputs, methods, ssr } = opts;
|
|
98
|
+
if (defineCustomElementFn !== undefined) {
|
|
99
|
+
defineCustomElementFn();
|
|
100
|
+
}
|
|
101
|
+
if (inputs) {
|
|
102
|
+
proxyInputs(cls, inputs, ssr);
|
|
103
|
+
}
|
|
104
|
+
if (methods) {
|
|
105
|
+
proxyMethods(cls, methods);
|
|
106
|
+
}
|
|
107
|
+
return cls;
|
|
108
|
+
};
|
|
109
|
+
return decorator;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
let TradeInWizard$1 = class TradeInWizard {
|
|
113
|
+
/**
|
|
114
|
+
* Absolute API base for cross-origin partners — Revendo's partner API,
|
|
115
|
+
`https://api.revendo.ch/public/v1` (staging: `https://api-stage.revendo.dev/public/v1`).
|
|
116
|
+
Takes precedence over `proxyBase`. See `EMBEDDING.md`.
|
|
117
|
+
*/
|
|
118
|
+
set apiBase(_) { }
|
|
119
|
+
;
|
|
120
|
+
/**
|
|
121
|
+
* Numeric variant ID of the $0 placeholder product (required for `instant`).
|
|
122
|
+
*/
|
|
123
|
+
set dummyVariantId(_) { }
|
|
124
|
+
;
|
|
125
|
+
/**
|
|
126
|
+
* Fetch the whole picker tree once and walk it locally (no request per pick).
|
|
127
|
+
Set `false` to force the stepwise `/facets` path.
|
|
128
|
+
|
|
129
|
+
Left on by default: a backend without `/facets/tree` (it is not on prod
|
|
130
|
+
yet) makes the first fetch fail, and the wizard falls back to stepwise for
|
|
131
|
+
the rest of the session on its own — so this needs no per-environment flip. @default true
|
|
132
|
+
*/
|
|
133
|
+
set facetTree(_) { }
|
|
134
|
+
;
|
|
135
|
+
/**
|
|
136
|
+
* Checkout flow. `direct` works anywhere; `instant` needs a Shopify host. @default 'direct'
|
|
137
|
+
*/
|
|
138
|
+
set flow(_) { }
|
|
139
|
+
;
|
|
140
|
+
/**
|
|
141
|
+
* Feature flag: show the business "code for business" fields at checkout
|
|
142
|
+
(default off → the published component stays partner-neutral). @default false
|
|
143
|
+
*/
|
|
144
|
+
set businessFields(_) { }
|
|
145
|
+
;
|
|
146
|
+
/**
|
|
147
|
+
* Feature flag: show newsletter/SMS marketing opt-ins at checkout (default off). @default false
|
|
148
|
+
*/
|
|
149
|
+
set marketingOptins(_) { }
|
|
150
|
+
;
|
|
151
|
+
/**
|
|
152
|
+
* Voucher payout bonus in CHF, shown as a badge on the checkout's Gutschein
|
|
153
|
+
option (display only — the payout math happens on the Revendo side).
|
|
154
|
+
*/
|
|
155
|
+
set voucherBonus(_) { }
|
|
156
|
+
;
|
|
157
|
+
/**
|
|
158
|
+
* Explainer line under the checkout's Gutschein option, shown only while
|
|
159
|
+
Gutschein is the selected payment type. Overrides the built-in
|
|
160
|
+
`coVoucherHint` copy.
|
|
161
|
+
*/
|
|
162
|
+
set voucherHint(_) { }
|
|
163
|
+
;
|
|
164
|
+
/**
|
|
165
|
+
* UI language (2-letter). Falls back to `de`. Read from the `lang` attribute. @default 'de'
|
|
166
|
+
*/
|
|
167
|
+
set locale(_) { }
|
|
168
|
+
;
|
|
169
|
+
/**
|
|
170
|
+
* How the wizard mounts. `inline` renders a self-contained card in the page;
|
|
171
|
+
`modal` renders a launcher button that opens a centered modal / mobile
|
|
172
|
+
bottom-sheet with a backdrop. @default 'inline'
|
|
173
|
+
*/
|
|
174
|
+
set presentation(_) { }
|
|
175
|
+
;
|
|
176
|
+
/**
|
|
177
|
+
* Same-origin app-proxy base (Shopify hosts). Used when `apiBase` is unset. @default '/apps/trade-in'
|
|
178
|
+
*/
|
|
179
|
+
set proxyBase(_) { }
|
|
180
|
+
;
|
|
181
|
+
/**
|
|
182
|
+
* Publishable, origin-locked API key issued by Revendo for `apiBase` (sent as
|
|
183
|
+
`X-Publishable-Key`). NOT a secret: it only works from the partner's registered origins.
|
|
184
|
+
*/
|
|
185
|
+
set publishableKey(_) { }
|
|
186
|
+
;
|
|
187
|
+
/**
|
|
188
|
+
* Customer-rating USP row: average score and number of reviews. Both come
|
|
189
|
+
from the host, because the review platform is the host's, not ours — on
|
|
190
|
+
revendo.ch the theme block reads Judge.me's `judgeme.shop_reviews_rating`
|
|
191
|
+
/ `judgeme.shop_reviews_count` shop metafields and passes them down.
|
|
192
|
+
|
|
193
|
+
The row is omitted entirely when `reviewCount` is missing or not a number.
|
|
194
|
+
It used to render a hardcoded "4.8 / 11'000", which was both stale and
|
|
195
|
+
above the real figure — and a published component must not advertise
|
|
196
|
+
Revendo's reviews on a partner's page. No numbers, no claim.
|
|
197
|
+
*/
|
|
198
|
+
set reviewRating(_) { }
|
|
199
|
+
;
|
|
200
|
+
set reviewCount(_) { }
|
|
201
|
+
;
|
|
202
|
+
/**
|
|
203
|
+
* Deal-breaker answers: comma-separated `question:answer` pairs that end the
|
|
204
|
+
appraisal on the spot and jump straight to the quote, skipping every
|
|
205
|
+
question still ahead — e.g. `is_functional:no` ("Does the device work
|
|
206
|
+
properly?" → "No"; the backend already prices that as a manual appraisal,
|
|
207
|
+
so the optical grade and battery answers behind it change nothing).
|
|
208
|
+
|
|
209
|
+
Each side matches the stable `content_type` first and the raw id/value
|
|
210
|
+
second, so `is_functional:no` keeps working when the backend re-authors the
|
|
211
|
+
question under a new id — which it does (see `core/skip-rules.ts`). Left
|
|
212
|
+
empty the wizard asks every question, as before.
|
|
213
|
+
*/
|
|
214
|
+
set skipToQuoteOn(_) { }
|
|
215
|
+
;
|
|
216
|
+
/**
|
|
217
|
+
* Show the intro screen (eyebrow + headline + USP list, "find price" CTA)
|
|
218
|
+
as the first thing a fresh session sees. Set `false` to open straight on
|
|
219
|
+
the picker — for hosts whose own page already carries that pitch, where
|
|
220
|
+
the intro is a second sales screen the customer has to click past.
|
|
221
|
+
|
|
222
|
+
Purely a starting point, not a mode: everything that returns to the start
|
|
223
|
+
("sell another device", closing and reopening the modal) lands on
|
|
224
|
+
whichever screen this selects. @default true
|
|
225
|
+
*/
|
|
226
|
+
set showIntro(_) { }
|
|
227
|
+
;
|
|
228
|
+
/**
|
|
229
|
+
* Optionally open the picker inside one device family (e.g. "iPhone").
|
|
230
|
+
|
|
231
|
+
A shortcut, not a filter: it only seeds the category the picker starts on
|
|
232
|
+
(and the one a fresh pick returns to), so Back and the category chip still
|
|
233
|
+
clear it and show the full family tiles. A deep link's `ti_cat` wins over
|
|
234
|
+
it.
|
|
235
|
+
*/
|
|
236
|
+
set startCategory(_) { }
|
|
237
|
+
;
|
|
238
|
+
/**
|
|
239
|
+
* Where this widget sits, as a label for the quote's attribution — e.g.
|
|
240
|
+
`landing-page`, `pdp-iphone`, `blog-sell-your-mac`. Travels with every
|
|
241
|
+
price call and is persisted by Revendo on the offer and the order behind
|
|
242
|
+
it, so a placement can be measured against the orders it produced.
|
|
243
|
+
|
|
244
|
+
Free-form and set by the host page (the theme block exposes it as a
|
|
245
|
+
setting); nothing in the flow keys off it. Left empty the field is simply
|
|
246
|
+
omitted, as before. Ignored by the partner API, which attributes every
|
|
247
|
+
quote to the partner server-side.
|
|
248
|
+
*/
|
|
249
|
+
set embedSource(_) { }
|
|
250
|
+
;
|
|
251
|
+
set custFirstName(_) { }
|
|
252
|
+
;
|
|
253
|
+
set custLastName(_) { }
|
|
254
|
+
;
|
|
255
|
+
set custEmail(_) { }
|
|
256
|
+
;
|
|
257
|
+
set custPhone(_) { }
|
|
258
|
+
;
|
|
259
|
+
set custStreet(_) { }
|
|
260
|
+
;
|
|
261
|
+
set custZip(_) { }
|
|
262
|
+
;
|
|
263
|
+
set custCity(_) { }
|
|
264
|
+
;
|
|
265
|
+
set custCountry(_) { }
|
|
266
|
+
;
|
|
267
|
+
/**
|
|
268
|
+
* URL of the separately-built checkout bundle — needed with script tags
|
|
269
|
+
(Shopify theme asset, partner page). Not with the npm `loader` or the
|
|
270
|
+
React/Angular packages, which define the checkout themselves.
|
|
271
|
+
*/
|
|
272
|
+
set checkoutAssetUrl(_) { }
|
|
273
|
+
;
|
|
274
|
+
constructor(c, r, z) {
|
|
275
|
+
this.z = z;
|
|
276
|
+
this.tradeInDeviceSelected = new EventEmitter();
|
|
277
|
+
this.tradeInAnalytics = new EventEmitter();
|
|
278
|
+
this.tradeInError = new EventEmitter();
|
|
279
|
+
this.tradeInOrderComplete = new EventEmitter();
|
|
280
|
+
c.detach();
|
|
281
|
+
this.el = r.nativeElement;
|
|
282
|
+
}
|
|
283
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
284
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TradeInWizard, selector: "trade-in-wizard", inputs: { apiBase: "apiBase", businessFields: "businessFields", checkoutAssetUrl: "checkoutAssetUrl", custCity: "custCity", custCountry: "custCountry", custEmail: "custEmail", custFirstName: "custFirstName", custLastName: "custLastName", custPhone: "custPhone", custStreet: "custStreet", custZip: "custZip", dummyVariantId: "dummyVariantId", embedSource: "embedSource", facetTree: "facetTree", flow: "flow", locale: "locale", marketingOptins: "marketingOptins", presentation: "presentation", proxyBase: "proxyBase", publishableKey: "publishableKey", reviewCount: "reviewCount", reviewRating: "reviewRating", showIntro: "showIntro", skipToQuoteOn: "skipToQuoteOn", startCategory: "startCategory", voucherBonus: "voucherBonus", voucherHint: "voucherHint" }, outputs: { tradeInDeviceSelected: "tradeInDeviceSelected", tradeInAnalytics: "tradeInAnalytics", tradeInError: "tradeInError", tradeInOrderComplete: "tradeInOrderComplete" }, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
285
|
+
};
|
|
286
|
+
TradeInWizard$1 = __decorate([
|
|
287
|
+
ProxyCmp({
|
|
288
|
+
defineCustomElementFn: defineCustomElement$1,
|
|
289
|
+
inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint']
|
|
290
|
+
})
|
|
291
|
+
], TradeInWizard$1);
|
|
292
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard$1, decorators: [{
|
|
293
|
+
type: Component,
|
|
294
|
+
args: [{
|
|
295
|
+
selector: 'trade-in-wizard',
|
|
296
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
297
|
+
template: '<ng-content></ng-content>',
|
|
298
|
+
// eslint-disable-next-line @angular-eslint/no-inputs-metadata-property
|
|
299
|
+
inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint'],
|
|
300
|
+
outputs: ['tradeInDeviceSelected', 'tradeInAnalytics', 'tradeInError', 'tradeInOrderComplete'],
|
|
301
|
+
}]
|
|
302
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }, { type: i0.NgZone }], propDecorators: { tradeInDeviceSelected: [{
|
|
303
|
+
type: Output
|
|
304
|
+
}], tradeInAnalytics: [{
|
|
305
|
+
type: Output
|
|
306
|
+
}], tradeInError: [{
|
|
307
|
+
type: Output
|
|
308
|
+
}], tradeInOrderComplete: [{
|
|
309
|
+
type: Output
|
|
310
|
+
}] } });
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* `<trade-in-checkout>` is internal to the wizard, which mounts it when a
|
|
314
|
+
* customer reaches checkout. With script tags the wizard fetches it from
|
|
315
|
+
* `checkout-asset-url`; through this package it is defined here instead, from
|
|
316
|
+
* a dynamic import, so the Angular CLI emits it as its own lazy chunk and a
|
|
317
|
+
* visitor who never sells doesn't download it up front. The wizard waits for
|
|
318
|
+
* the definition when it needs it (`loadCheckoutBundle`).
|
|
319
|
+
*
|
|
320
|
+
* Kept in sync with `packages/trade-in-components-react/src/checkout.ts`.
|
|
321
|
+
*/
|
|
322
|
+
const CHECKOUT_TAG = 'trade-in-checkout';
|
|
323
|
+
let pending;
|
|
324
|
+
function defineCheckoutInBackground() {
|
|
325
|
+
if (typeof window === 'undefined' || !window.customElements)
|
|
326
|
+
return Promise.resolve();
|
|
327
|
+
if (window.customElements.get(CHECKOUT_TAG))
|
|
328
|
+
return Promise.resolve();
|
|
329
|
+
pending ??= import('@revendo_ch/trade-in-components/dist/components/trade-in-checkout.js')
|
|
330
|
+
.then((m) => m.defineCustomElement())
|
|
331
|
+
.catch((error) => {
|
|
332
|
+
// Let the next instance try again; the wizard reports the failure to the
|
|
333
|
+
// customer if checkout is reached without a definition.
|
|
334
|
+
pending = undefined;
|
|
335
|
+
console.error('[trade-in] could not load the checkout component', error);
|
|
336
|
+
});
|
|
337
|
+
return pending;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Angular bindings for `<trade-in-wizard>` (standalone component).
|
|
342
|
+
*
|
|
343
|
+
* import { TradeInWizard } from '@revendo_ch/trade-in-components-angular';
|
|
344
|
+
* @Component({ imports: [TradeInWizard], template: `
|
|
345
|
+
* <trade-in-wizard apiBase="…" publishableKey="pk_…" flow="direct"
|
|
346
|
+
* (tradeInOrderComplete)="done($event)"></trade-in-wizard>` })
|
|
347
|
+
*
|
|
348
|
+
* `./generated/` is written by the Stencil Angular output target on every
|
|
349
|
+
* build of `@revendo_ch/trade-in-components` — do not edit it. This file only adds
|
|
350
|
+
* what the generator can't: defining the internal checkout element. Inputs,
|
|
351
|
+
* outputs and the element proxying are inherited from the generated class.
|
|
352
|
+
*/
|
|
353
|
+
class TradeInWizard extends TradeInWizard$1 {
|
|
354
|
+
constructor() {
|
|
355
|
+
super(...arguments);
|
|
356
|
+
this.checkoutDefined = defineCheckoutInBackground();
|
|
357
|
+
}
|
|
358
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
359
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TradeInWizard, isStandalone: true, selector: "trade-in-wizard", usesInheritance: true, ngImport: i0, template: '<ng-content></ng-content>', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
360
|
+
}
|
|
361
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TradeInWizard, decorators: [{
|
|
362
|
+
type: Component,
|
|
363
|
+
args: [{
|
|
364
|
+
selector: 'trade-in-wizard',
|
|
365
|
+
standalone: true,
|
|
366
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
367
|
+
template: '<ng-content></ng-content>',
|
|
368
|
+
}]
|
|
369
|
+
}] });
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Generated bundle index. Do not edit.
|
|
373
|
+
*/
|
|
374
|
+
|
|
375
|
+
export { TradeInWizard };
|
|
376
|
+
//# sourceMappingURL=revendo_ch-trade-in-components-angular.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revendo_ch-trade-in-components-angular.mjs","sources":["../../src/generated/angular-component-lib/utils.ts","../../src/generated/proxies.ts","../../src/checkout.ts","../../src/public-api.ts","../../src/revendo_ch-trade-in-components-angular.ts"],"sourcesContent":["/* eslint-disable */\n/* tslint:disable */\nimport { inject, PLATFORM_ID } from '@angular/core';\nimport { fromEvent } from 'rxjs';\n\n/**\n * Server rendering options (the output target's `ssrPropModule`).\n */\ninterface SsrOptions {\n /** The component library's `ssrProp()`, which hands a value to Stencil's server render. */\n ssrProp: (value: any) => any;\n /** Inputs whose attribute isn't Stencil's dash-cased prop name. */\n attributes?: Record<string, string>;\n /** Inputs with no attribute: every value goes through `ssrProp()`. */\n refs?: string[];\n}\n\nconst serverInstances = new WeakSet<object>();\n\n/**\n * Records a wrapper created during server rendering. Call from the constructor.\n */\nexport const markServer = (instance: object) => {\n // what `isPlatformServer()` from `@angular/common` checks\n if (inject(PLATFORM_ID) === 'server') {\n serverInstances.add(instance);\n }\n};\n\n/**\n * Stencil's own prop name to attribute name conversion (`prop1` -> `prop-1`).\n */\nconst toDashCase = (str: string): string =>\n str\n .replace(/([A-Z0-9])/g, (match) => ` ${match[0]}`)\n .trim()\n .split(' ')\n .join('-')\n .toLowerCase();\n\n/**\n * Angular's server DOM never writes properties to the HTML, so on the server an input becomes an\n * attribute, which Stencil's `renderToString()` reads:\n * - a string or number as itself, and `true` as an empty attribute, so the component's first\n * render in the browser sees them too;\n * - `false`, anything that isn't a primitive, and any value for a prop with no attribute through\n * `ssrProp()`, which gives the server render the exact value and leaves no attribute behind.\n */\nconst setServerAttribute = (el: any, item: string, val: any, ssr: SsrOptions) => {\n const name = ssr.attributes?.[item] ?? toDashCase(item);\n if (val == null) {\n el.removeAttribute(name);\n } else if (\n ssr.refs?.includes(item) ||\n val === false ||\n (typeof val !== 'string' && typeof val !== 'number' && val !== true)\n ) {\n el.setAttribute(name, ssr.ssrProp(val));\n } else {\n el.setAttribute(name, val === true ? '' : String(val));\n }\n};\n\nexport const proxyInputs = (Cmp: any, inputs: string[], ssr?: SsrOptions) => {\n const Prototype = Cmp.prototype;\n inputs.forEach((item) => {\n Object.defineProperty(Prototype, item, {\n get() {\n return this.el[item];\n },\n set(val: any) {\n if (ssr && serverInstances.has(this)) {\n // kept on the element too, so reading the input back on the server works\n this.el[item] = val;\n setServerAttribute(this.el, item, val, ssr);\n return;\n }\n this.z.runOutsideAngular(() => (this.el[item] = val));\n },\n /**\n * In the event that proxyInputs is called\n * multiple times re-defining these inputs\n * will cause an error to be thrown. As a result\n * we set configurable: true to indicate these\n * properties can be changed.\n */\n configurable: true,\n });\n });\n};\n\nexport const proxyMethods = (Cmp: any, methods: string[]) => {\n const Prototype = Cmp.prototype;\n methods.forEach((methodName) => {\n Prototype[methodName] = function () {\n const args = arguments;\n return this.z.runOutsideAngular(() => this.el[methodName].apply(this.el, args));\n };\n });\n};\n\nexport const proxyOutputs = (instance: any, el: any, events: string[]) => {\n events.forEach((eventName) => (instance[eventName] = fromEvent(el, eventName)));\n};\n\nexport const defineCustomElement = (tagName: string, customElement: any) => {\n if (customElement !== undefined && typeof customElements !== 'undefined' && !customElements.get(tagName)) {\n customElements.define(tagName, customElement);\n }\n};\n\n// tslint:disable-next-line: only-arrow-functions\nexport function ProxyCmp(opts: { defineCustomElementFn?: () => void; inputs?: any; methods?: any; ssr?: SsrOptions }) {\n const decorator = function (cls: any) {\n const { defineCustomElementFn, inputs, methods, ssr } = opts;\n\n if (defineCustomElementFn !== undefined) {\n defineCustomElementFn();\n }\n\n if (inputs) {\n proxyInputs(cls, inputs, ssr);\n }\n if (methods) {\n proxyMethods(cls, methods);\n }\n return cls;\n };\n return decorator;\n}\n","/* tslint:disable */\n/* auto-generated angular directive proxies */\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Output, NgZone } from '@angular/core';\n\nimport { ProxyCmp } from './angular-component-lib/utils';\n\nimport type { Components } from '@revendo_ch/trade-in-components/dist/components';\n\nimport { defineCustomElement as defineTradeInWizard } from '@revendo_ch/trade-in-components/dist/components/trade-in-wizard.js';\n@ProxyCmp({\n defineCustomElementFn: defineTradeInWizard,\n inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint']\n})\n@Component({\n selector: 'trade-in-wizard',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '<ng-content></ng-content>',\n // eslint-disable-next-line @angular-eslint/no-inputs-metadata-property\n inputs: ['apiBase', 'businessFields', 'checkoutAssetUrl', 'custCity', 'custCountry', 'custEmail', 'custFirstName', 'custLastName', 'custPhone', 'custStreet', 'custZip', 'dummyVariantId', 'embedSource', 'facetTree', 'flow', 'locale', 'marketingOptins', 'presentation', 'proxyBase', 'publishableKey', 'reviewCount', 'reviewRating', 'showIntro', 'skipToQuoteOn', 'startCategory', 'voucherBonus', 'voucherHint'],\n outputs: ['tradeInDeviceSelected', 'tradeInAnalytics', 'tradeInError', 'tradeInOrderComplete'],\n})\nexport class TradeInWizard {\n protected el: HTMLTradeInWizardElement;\n /**\n * Absolute API base for cross-origin partners — Revendo's partner API,\n`https://api.revendo.ch/public/v1` (staging: `https://api-stage.revendo.dev/public/v1`).\nTakes precedence over `proxyBase`. See `EMBEDDING.md`.\n */\n set apiBase(_: Components.TradeInWizard['apiBase']) {};\n /**\n * Numeric variant ID of the $0 placeholder product (required for `instant`).\n */\n set dummyVariantId(_: Components.TradeInWizard['dummyVariantId']) {};\n /**\n * Fetch the whole picker tree once and walk it locally (no request per pick).\nSet `false` to force the stepwise `/facets` path.\n\nLeft on by default: a backend without `/facets/tree` (it is not on prod\nyet) makes the first fetch fail, and the wizard falls back to stepwise for\nthe rest of the session on its own — so this needs no per-environment flip. @default true\n */\n set facetTree(_: Components.TradeInWizard['facetTree']) {};\n /**\n * Checkout flow. `direct` works anywhere; `instant` needs a Shopify host. @default 'direct'\n */\n set flow(_: Components.TradeInWizard['flow']) {};\n /**\n * Feature flag: show the business \"code for business\" fields at checkout\n(default off → the published component stays partner-neutral). @default false\n */\n set businessFields(_: Components.TradeInWizard['businessFields']) {};\n /**\n * Feature flag: show newsletter/SMS marketing opt-ins at checkout (default off). @default false\n */\n set marketingOptins(_: Components.TradeInWizard['marketingOptins']) {};\n /**\n * Voucher payout bonus in CHF, shown as a badge on the checkout's Gutschein\noption (display only — the payout math happens on the Revendo side).\n */\n set voucherBonus(_: Components.TradeInWizard['voucherBonus']) {};\n /**\n * Explainer line under the checkout's Gutschein option, shown only while\nGutschein is the selected payment type. Overrides the built-in\n`coVoucherHint` copy.\n */\n set voucherHint(_: Components.TradeInWizard['voucherHint']) {};\n /**\n * UI language (2-letter). Falls back to `de`. Read from the `lang` attribute. @default 'de'\n */\n set locale(_: Components.TradeInWizard['locale']) {};\n /**\n * How the wizard mounts. `inline` renders a self-contained card in the page;\n`modal` renders a launcher button that opens a centered modal / mobile\nbottom-sheet with a backdrop. @default 'inline'\n */\n set presentation(_: Components.TradeInWizard['presentation']) {};\n /**\n * Same-origin app-proxy base (Shopify hosts). Used when `apiBase` is unset. @default '/apps/trade-in'\n */\n set proxyBase(_: Components.TradeInWizard['proxyBase']) {};\n /**\n * Publishable, origin-locked API key issued by Revendo for `apiBase` (sent as\n`X-Publishable-Key`). NOT a secret: it only works from the partner's registered origins.\n */\n set publishableKey(_: Components.TradeInWizard['publishableKey']) {};\n /**\n * Customer-rating USP row: average score and number of reviews. Both come\nfrom the host, because the review platform is the host's, not ours — on\nrevendo.ch the theme block reads Judge.me's `judgeme.shop_reviews_rating`\n/ `judgeme.shop_reviews_count` shop metafields and passes them down.\n\nThe row is omitted entirely when `reviewCount` is missing or not a number.\nIt used to render a hardcoded \"4.8 / 11'000\", which was both stale and\nabove the real figure — and a published component must not advertise\nRevendo's reviews on a partner's page. No numbers, no claim.\n */\n set reviewRating(_: Components.TradeInWizard['reviewRating']) {};\n \n set reviewCount(_: Components.TradeInWizard['reviewCount']) {};\n /**\n * Deal-breaker answers: comma-separated `question:answer` pairs that end the\nappraisal on the spot and jump straight to the quote, skipping every\nquestion still ahead — e.g. `is_functional:no` (\"Does the device work\nproperly?\" → \"No\"; the backend already prices that as a manual appraisal,\nso the optical grade and battery answers behind it change nothing).\n\nEach side matches the stable `content_type` first and the raw id/value\nsecond, so `is_functional:no` keeps working when the backend re-authors the\nquestion under a new id — which it does (see `core/skip-rules.ts`). Left\nempty the wizard asks every question, as before.\n */\n set skipToQuoteOn(_: Components.TradeInWizard['skipToQuoteOn']) {};\n /**\n * Show the intro screen (eyebrow + headline + USP list, \"find price\" CTA)\nas the first thing a fresh session sees. Set `false` to open straight on\nthe picker — for hosts whose own page already carries that pitch, where\nthe intro is a second sales screen the customer has to click past.\n\nPurely a starting point, not a mode: everything that returns to the start\n(\"sell another device\", closing and reopening the modal) lands on\nwhichever screen this selects. @default true\n */\n set showIntro(_: Components.TradeInWizard['showIntro']) {};\n /**\n * Optionally open the picker inside one device family (e.g. \"iPhone\").\n\nA shortcut, not a filter: it only seeds the category the picker starts on\n(and the one a fresh pick returns to), so Back and the category chip still\nclear it and show the full family tiles. A deep link's `ti_cat` wins over\nit.\n */\n set startCategory(_: Components.TradeInWizard['startCategory']) {};\n /**\n * Where this widget sits, as a label for the quote's attribution — e.g.\n`landing-page`, `pdp-iphone`, `blog-sell-your-mac`. Travels with every\nprice call and is persisted by Revendo on the offer and the order behind\nit, so a placement can be measured against the orders it produced.\n\nFree-form and set by the host page (the theme block exposes it as a\nsetting); nothing in the flow keys off it. Left empty the field is simply\nomitted, as before. Ignored by the partner API, which attributes every\nquote to the partner server-side.\n */\n set embedSource(_: Components.TradeInWizard['embedSource']) {};\n \n set custFirstName(_: Components.TradeInWizard['custFirstName']) {};\n \n set custLastName(_: Components.TradeInWizard['custLastName']) {};\n \n set custEmail(_: Components.TradeInWizard['custEmail']) {};\n \n set custPhone(_: Components.TradeInWizard['custPhone']) {};\n \n set custStreet(_: Components.TradeInWizard['custStreet']) {};\n \n set custZip(_: Components.TradeInWizard['custZip']) {};\n \n set custCity(_: Components.TradeInWizard['custCity']) {};\n \n set custCountry(_: Components.TradeInWizard['custCountry']) {};\n /**\n * URL of the separately-built checkout bundle — needed with script tags\n(Shopify theme asset, partner page). Not with the npm `loader` or the\nReact/Angular packages, which define the checkout themselves.\n */\n set checkoutAssetUrl(_: Components.TradeInWizard['checkoutAssetUrl']) {};\n @Output() tradeInDeviceSelected = new EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInDeviceSelectedDetail>>();\n @Output() tradeInAnalytics = new EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInAnalyticsDetail>>();\n @Output() tradeInError = new EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInErrorDetail>>();\n @Output() tradeInOrderComplete = new EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInOrderCompleteDetail>>();\n constructor(c: ChangeDetectorRef, r: ElementRef, protected z: NgZone) {\n c.detach();\n this.el = r.nativeElement;\n }\n}\n\n\nimport type { TradeInWizardCustomEvent } from '@revendo_ch/trade-in-components/dist/components';\nimport type { TradeInDeviceSelectedDetail as ITradeInWizardTradeInDeviceSelectedDetail } from '@revendo_ch/trade-in-components/dist/components';\nimport type { TradeInAnalyticsDetail as ITradeInWizardTradeInAnalyticsDetail } from '@revendo_ch/trade-in-components/dist/components';\nimport type { TradeInErrorDetail as ITradeInWizardTradeInErrorDetail } from '@revendo_ch/trade-in-components/dist/components';\nimport type { TradeInOrderCompleteDetail as ITradeInWizardTradeInOrderCompleteDetail } from '@revendo_ch/trade-in-components/dist/components';\n\nexport declare interface TradeInWizard extends Components.TradeInWizard {\n /**\n * Customer accepted a quote.\n */\n tradeInDeviceSelected: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInDeviceSelectedDetail>>;\n /**\n * Privacy-safe funnel event for host analytics integrations.\n */\n tradeInAnalytics: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInAnalyticsDetail>>;\n /**\n * A recoverable error surfaced to the host.\n */\n tradeInError: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInErrorDetail>>;\n /**\n * Order finalized (host backend must still verify server-to-server).\n */\n tradeInOrderComplete: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInOrderCompleteDetail>>;\n}\n\n\n","/**\n * `<trade-in-checkout>` is internal to the wizard, which mounts it when a\n * customer reaches checkout. With script tags the wizard fetches it from\n * `checkout-asset-url`; through this package it is defined here instead, from\n * a dynamic import, so the Angular CLI emits it as its own lazy chunk and a\n * visitor who never sells doesn't download it up front. The wizard waits for\n * the definition when it needs it (`loadCheckoutBundle`).\n *\n * Kept in sync with `packages/trade-in-components-react/src/checkout.ts`.\n */\nconst CHECKOUT_TAG = 'trade-in-checkout';\n\nlet pending: Promise<void> | undefined;\n\nexport function defineCheckoutInBackground(): Promise<void> {\n if (typeof window === 'undefined' || !window.customElements) return Promise.resolve();\n if (window.customElements.get(CHECKOUT_TAG)) return Promise.resolve();\n pending ??= import('@revendo_ch/trade-in-components/dist/components/trade-in-checkout.js')\n .then((m) => m.defineCustomElement())\n .catch((error: unknown) => {\n // Let the next instance try again; the wizard reports the failure to the\n // customer if checkout is reached without a definition.\n pending = undefined;\n console.error('[trade-in] could not load the checkout component', error);\n });\n return pending;\n}\n","/**\n * Angular bindings for `<trade-in-wizard>` (standalone component).\n *\n * import { TradeInWizard } from '@revendo_ch/trade-in-components-angular';\n * @Component({ imports: [TradeInWizard], template: `\n * <trade-in-wizard apiBase=\"…\" publishableKey=\"pk_…\" flow=\"direct\"\n * (tradeInOrderComplete)=\"done($event)\"></trade-in-wizard>` })\n *\n * `./generated/` is written by the Stencil Angular output target on every\n * build of `@revendo_ch/trade-in-components` — do not edit it. This file only adds\n * what the generator can't: defining the internal checkout element. Inputs,\n * outputs and the element proxying are inherited from the generated class.\n */\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { TradeInWizard as GeneratedTradeInWizard } from './generated/proxies';\nimport { defineCheckoutInBackground } from './checkout';\n\n@Component({\n selector: 'trade-in-wizard',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: '<ng-content></ng-content>',\n})\nexport class TradeInWizard extends GeneratedTradeInWizard {\n private readonly checkoutDefined = defineCheckoutInBackground();\n}\n\nexport type {\n TradeInAnalyticsDetail,\n TradeInDeviceSelectedDetail,\n TradeInErrorDetail,\n TradeInOrderCompleteDetail,\n TradeInWizardCustomEvent,\n} from '@revendo_ch/trade-in-components';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["TradeInWizard","defineTradeInWizard","GeneratedTradeInWizard"],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server rendering options (the output target's `ssrPropModule`).
|
|
3
|
+
*/
|
|
4
|
+
interface SsrOptions {
|
|
5
|
+
/** The component library's `ssrProp()`, which hands a value to Stencil's server render. */
|
|
6
|
+
ssrProp: (value: any) => any;
|
|
7
|
+
/** Inputs whose attribute isn't Stencil's dash-cased prop name. */
|
|
8
|
+
attributes?: Record<string, string>;
|
|
9
|
+
/** Inputs with no attribute: every value goes through `ssrProp()`. */
|
|
10
|
+
refs?: string[];
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Records a wrapper created during server rendering. Call from the constructor.
|
|
14
|
+
*/
|
|
15
|
+
export declare const markServer: (instance: object) => void;
|
|
16
|
+
export declare const proxyInputs: (Cmp: any, inputs: string[], ssr?: SsrOptions) => void;
|
|
17
|
+
export declare const proxyMethods: (Cmp: any, methods: string[]) => void;
|
|
18
|
+
export declare const proxyOutputs: (instance: any, el: any, events: string[]) => void;
|
|
19
|
+
export declare const defineCustomElement: (tagName: string, customElement: any) => void;
|
|
20
|
+
export declare function ProxyCmp(opts: {
|
|
21
|
+
defineCustomElementFn?: () => void;
|
|
22
|
+
inputs?: any;
|
|
23
|
+
methods?: any;
|
|
24
|
+
ssr?: SsrOptions;
|
|
25
|
+
}): (cls: any) => any;
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { ChangeDetectorRef, ElementRef, EventEmitter, NgZone } from '@angular/core';
|
|
2
|
+
import type { Components } from '@revendo_ch/trade-in-components/dist/components';
|
|
3
|
+
import type { TradeInWizardCustomEvent } from '@revendo_ch/trade-in-components/dist/components';
|
|
4
|
+
import type { TradeInDeviceSelectedDetail as ITradeInWizardTradeInDeviceSelectedDetail } from '@revendo_ch/trade-in-components/dist/components';
|
|
5
|
+
import type { TradeInAnalyticsDetail as ITradeInWizardTradeInAnalyticsDetail } from '@revendo_ch/trade-in-components/dist/components';
|
|
6
|
+
import type { TradeInErrorDetail as ITradeInWizardTradeInErrorDetail } from '@revendo_ch/trade-in-components/dist/components';
|
|
7
|
+
import type { TradeInOrderCompleteDetail as ITradeInWizardTradeInOrderCompleteDetail } from '@revendo_ch/trade-in-components/dist/components';
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
export declare class TradeInWizard {
|
|
10
|
+
protected z: NgZone;
|
|
11
|
+
protected el: HTMLTradeInWizardElement;
|
|
12
|
+
/**
|
|
13
|
+
* Absolute API base for cross-origin partners — Revendo's partner API,
|
|
14
|
+
`https://api.revendo.ch/public/v1` (staging: `https://api-stage.revendo.dev/public/v1`).
|
|
15
|
+
Takes precedence over `proxyBase`. See `EMBEDDING.md`.
|
|
16
|
+
*/
|
|
17
|
+
set apiBase(_: Components.TradeInWizard['apiBase']);
|
|
18
|
+
/**
|
|
19
|
+
* Numeric variant ID of the $0 placeholder product (required for `instant`).
|
|
20
|
+
*/
|
|
21
|
+
set dummyVariantId(_: Components.TradeInWizard['dummyVariantId']);
|
|
22
|
+
/**
|
|
23
|
+
* Fetch the whole picker tree once and walk it locally (no request per pick).
|
|
24
|
+
Set `false` to force the stepwise `/facets` path.
|
|
25
|
+
|
|
26
|
+
Left on by default: a backend without `/facets/tree` (it is not on prod
|
|
27
|
+
yet) makes the first fetch fail, and the wizard falls back to stepwise for
|
|
28
|
+
the rest of the session on its own — so this needs no per-environment flip. @default true
|
|
29
|
+
*/
|
|
30
|
+
set facetTree(_: Components.TradeInWizard['facetTree']);
|
|
31
|
+
/**
|
|
32
|
+
* Checkout flow. `direct` works anywhere; `instant` needs a Shopify host. @default 'direct'
|
|
33
|
+
*/
|
|
34
|
+
set flow(_: Components.TradeInWizard['flow']);
|
|
35
|
+
/**
|
|
36
|
+
* Feature flag: show the business "code for business" fields at checkout
|
|
37
|
+
(default off → the published component stays partner-neutral). @default false
|
|
38
|
+
*/
|
|
39
|
+
set businessFields(_: Components.TradeInWizard['businessFields']);
|
|
40
|
+
/**
|
|
41
|
+
* Feature flag: show newsletter/SMS marketing opt-ins at checkout (default off). @default false
|
|
42
|
+
*/
|
|
43
|
+
set marketingOptins(_: Components.TradeInWizard['marketingOptins']);
|
|
44
|
+
/**
|
|
45
|
+
* Voucher payout bonus in CHF, shown as a badge on the checkout's Gutschein
|
|
46
|
+
option (display only — the payout math happens on the Revendo side).
|
|
47
|
+
*/
|
|
48
|
+
set voucherBonus(_: Components.TradeInWizard['voucherBonus']);
|
|
49
|
+
/**
|
|
50
|
+
* Explainer line under the checkout's Gutschein option, shown only while
|
|
51
|
+
Gutschein is the selected payment type. Overrides the built-in
|
|
52
|
+
`coVoucherHint` copy.
|
|
53
|
+
*/
|
|
54
|
+
set voucherHint(_: Components.TradeInWizard['voucherHint']);
|
|
55
|
+
/**
|
|
56
|
+
* UI language (2-letter). Falls back to `de`. Read from the `lang` attribute. @default 'de'
|
|
57
|
+
*/
|
|
58
|
+
set locale(_: Components.TradeInWizard['locale']);
|
|
59
|
+
/**
|
|
60
|
+
* How the wizard mounts. `inline` renders a self-contained card in the page;
|
|
61
|
+
`modal` renders a launcher button that opens a centered modal / mobile
|
|
62
|
+
bottom-sheet with a backdrop. @default 'inline'
|
|
63
|
+
*/
|
|
64
|
+
set presentation(_: Components.TradeInWizard['presentation']);
|
|
65
|
+
/**
|
|
66
|
+
* Same-origin app-proxy base (Shopify hosts). Used when `apiBase` is unset. @default '/apps/trade-in'
|
|
67
|
+
*/
|
|
68
|
+
set proxyBase(_: Components.TradeInWizard['proxyBase']);
|
|
69
|
+
/**
|
|
70
|
+
* Publishable, origin-locked API key issued by Revendo for `apiBase` (sent as
|
|
71
|
+
`X-Publishable-Key`). NOT a secret: it only works from the partner's registered origins.
|
|
72
|
+
*/
|
|
73
|
+
set publishableKey(_: Components.TradeInWizard['publishableKey']);
|
|
74
|
+
/**
|
|
75
|
+
* Customer-rating USP row: average score and number of reviews. Both come
|
|
76
|
+
from the host, because the review platform is the host's, not ours — on
|
|
77
|
+
revendo.ch the theme block reads Judge.me's `judgeme.shop_reviews_rating`
|
|
78
|
+
/ `judgeme.shop_reviews_count` shop metafields and passes them down.
|
|
79
|
+
|
|
80
|
+
The row is omitted entirely when `reviewCount` is missing or not a number.
|
|
81
|
+
It used to render a hardcoded "4.8 / 11'000", which was both stale and
|
|
82
|
+
above the real figure — and a published component must not advertise
|
|
83
|
+
Revendo's reviews on a partner's page. No numbers, no claim.
|
|
84
|
+
*/
|
|
85
|
+
set reviewRating(_: Components.TradeInWizard['reviewRating']);
|
|
86
|
+
set reviewCount(_: Components.TradeInWizard['reviewCount']);
|
|
87
|
+
/**
|
|
88
|
+
* Deal-breaker answers: comma-separated `question:answer` pairs that end the
|
|
89
|
+
appraisal on the spot and jump straight to the quote, skipping every
|
|
90
|
+
question still ahead — e.g. `is_functional:no` ("Does the device work
|
|
91
|
+
properly?" → "No"; the backend already prices that as a manual appraisal,
|
|
92
|
+
so the optical grade and battery answers behind it change nothing).
|
|
93
|
+
|
|
94
|
+
Each side matches the stable `content_type` first and the raw id/value
|
|
95
|
+
second, so `is_functional:no` keeps working when the backend re-authors the
|
|
96
|
+
question under a new id — which it does (see `core/skip-rules.ts`). Left
|
|
97
|
+
empty the wizard asks every question, as before.
|
|
98
|
+
*/
|
|
99
|
+
set skipToQuoteOn(_: Components.TradeInWizard['skipToQuoteOn']);
|
|
100
|
+
/**
|
|
101
|
+
* Show the intro screen (eyebrow + headline + USP list, "find price" CTA)
|
|
102
|
+
as the first thing a fresh session sees. Set `false` to open straight on
|
|
103
|
+
the picker — for hosts whose own page already carries that pitch, where
|
|
104
|
+
the intro is a second sales screen the customer has to click past.
|
|
105
|
+
|
|
106
|
+
Purely a starting point, not a mode: everything that returns to the start
|
|
107
|
+
("sell another device", closing and reopening the modal) lands on
|
|
108
|
+
whichever screen this selects. @default true
|
|
109
|
+
*/
|
|
110
|
+
set showIntro(_: Components.TradeInWizard['showIntro']);
|
|
111
|
+
/**
|
|
112
|
+
* Optionally open the picker inside one device family (e.g. "iPhone").
|
|
113
|
+
|
|
114
|
+
A shortcut, not a filter: it only seeds the category the picker starts on
|
|
115
|
+
(and the one a fresh pick returns to), so Back and the category chip still
|
|
116
|
+
clear it and show the full family tiles. A deep link's `ti_cat` wins over
|
|
117
|
+
it.
|
|
118
|
+
*/
|
|
119
|
+
set startCategory(_: Components.TradeInWizard['startCategory']);
|
|
120
|
+
/**
|
|
121
|
+
* Where this widget sits, as a label for the quote's attribution — e.g.
|
|
122
|
+
`landing-page`, `pdp-iphone`, `blog-sell-your-mac`. Travels with every
|
|
123
|
+
price call and is persisted by Revendo on the offer and the order behind
|
|
124
|
+
it, so a placement can be measured against the orders it produced.
|
|
125
|
+
|
|
126
|
+
Free-form and set by the host page (the theme block exposes it as a
|
|
127
|
+
setting); nothing in the flow keys off it. Left empty the field is simply
|
|
128
|
+
omitted, as before. Ignored by the partner API, which attributes every
|
|
129
|
+
quote to the partner server-side.
|
|
130
|
+
*/
|
|
131
|
+
set embedSource(_: Components.TradeInWizard['embedSource']);
|
|
132
|
+
set custFirstName(_: Components.TradeInWizard['custFirstName']);
|
|
133
|
+
set custLastName(_: Components.TradeInWizard['custLastName']);
|
|
134
|
+
set custEmail(_: Components.TradeInWizard['custEmail']);
|
|
135
|
+
set custPhone(_: Components.TradeInWizard['custPhone']);
|
|
136
|
+
set custStreet(_: Components.TradeInWizard['custStreet']);
|
|
137
|
+
set custZip(_: Components.TradeInWizard['custZip']);
|
|
138
|
+
set custCity(_: Components.TradeInWizard['custCity']);
|
|
139
|
+
set custCountry(_: Components.TradeInWizard['custCountry']);
|
|
140
|
+
/**
|
|
141
|
+
* URL of the separately-built checkout bundle — needed with script tags
|
|
142
|
+
(Shopify theme asset, partner page). Not with the npm `loader` or the
|
|
143
|
+
React/Angular packages, which define the checkout themselves.
|
|
144
|
+
*/
|
|
145
|
+
set checkoutAssetUrl(_: Components.TradeInWizard['checkoutAssetUrl']);
|
|
146
|
+
tradeInDeviceSelected: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInDeviceSelectedDetail>>;
|
|
147
|
+
tradeInAnalytics: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInAnalyticsDetail>>;
|
|
148
|
+
tradeInError: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInErrorDetail>>;
|
|
149
|
+
tradeInOrderComplete: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInOrderCompleteDetail>>;
|
|
150
|
+
constructor(c: ChangeDetectorRef, r: ElementRef, z: NgZone);
|
|
151
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TradeInWizard, never>;
|
|
152
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TradeInWizard, "trade-in-wizard", never, { "apiBase": { "alias": "apiBase"; "required": false; }; "businessFields": { "alias": "businessFields"; "required": false; }; "checkoutAssetUrl": { "alias": "checkoutAssetUrl"; "required": false; }; "custCity": { "alias": "custCity"; "required": false; }; "custCountry": { "alias": "custCountry"; "required": false; }; "custEmail": { "alias": "custEmail"; "required": false; }; "custFirstName": { "alias": "custFirstName"; "required": false; }; "custLastName": { "alias": "custLastName"; "required": false; }; "custPhone": { "alias": "custPhone"; "required": false; }; "custStreet": { "alias": "custStreet"; "required": false; }; "custZip": { "alias": "custZip"; "required": false; }; "dummyVariantId": { "alias": "dummyVariantId"; "required": false; }; "embedSource": { "alias": "embedSource"; "required": false; }; "facetTree": { "alias": "facetTree"; "required": false; }; "flow": { "alias": "flow"; "required": false; }; "locale": { "alias": "locale"; "required": false; }; "marketingOptins": { "alias": "marketingOptins"; "required": false; }; "presentation": { "alias": "presentation"; "required": false; }; "proxyBase": { "alias": "proxyBase"; "required": false; }; "publishableKey": { "alias": "publishableKey"; "required": false; }; "reviewCount": { "alias": "reviewCount"; "required": false; }; "reviewRating": { "alias": "reviewRating"; "required": false; }; "showIntro": { "alias": "showIntro"; "required": false; }; "skipToQuoteOn": { "alias": "skipToQuoteOn"; "required": false; }; "startCategory": { "alias": "startCategory"; "required": false; }; "voucherBonus": { "alias": "voucherBonus"; "required": false; }; "voucherHint": { "alias": "voucherHint"; "required": false; }; }, { "tradeInDeviceSelected": "tradeInDeviceSelected"; "tradeInAnalytics": "tradeInAnalytics"; "tradeInError": "tradeInError"; "tradeInOrderComplete": "tradeInOrderComplete"; }, never, ["*"], false, never>;
|
|
153
|
+
}
|
|
154
|
+
export declare interface TradeInWizard extends Components.TradeInWizard {
|
|
155
|
+
/**
|
|
156
|
+
* Customer accepted a quote.
|
|
157
|
+
*/
|
|
158
|
+
tradeInDeviceSelected: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInDeviceSelectedDetail>>;
|
|
159
|
+
/**
|
|
160
|
+
* Privacy-safe funnel event for host analytics integrations.
|
|
161
|
+
*/
|
|
162
|
+
tradeInAnalytics: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInAnalyticsDetail>>;
|
|
163
|
+
/**
|
|
164
|
+
* A recoverable error surfaced to the host.
|
|
165
|
+
*/
|
|
166
|
+
tradeInError: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInErrorDetail>>;
|
|
167
|
+
/**
|
|
168
|
+
* Order finalized (host backend must still verify server-to-server).
|
|
169
|
+
*/
|
|
170
|
+
tradeInOrderComplete: EventEmitter<TradeInWizardCustomEvent<ITradeInWizardTradeInOrderCompleteDetail>>;
|
|
171
|
+
}
|
package/index.d.ts
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,36 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@revendo_ch/trade-in-components-angular",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0-beta.3",
|
|
4
|
+
"description": "Angular bindings for the Revendo trade-in wizard (@revendo_ch/trade-in-components).",
|
|
5
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/revendo/instant-direct-trade-in.git",
|
|
9
|
+
"directory": "packages/trade-in-components-angular"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@revendo_ch/trade-in-components": "0.1.0-beta.3",
|
|
13
|
+
"tslib": "^2.3.0"
|
|
14
|
+
},
|
|
15
|
+
"peerDependencies": {
|
|
16
|
+
"@angular/core": ">=17.0.0",
|
|
17
|
+
"rxjs": "^7.4.0"
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"module": "fesm2022/revendo_ch-trade-in-components-angular.mjs",
|
|
23
|
+
"typings": "index.d.ts",
|
|
24
|
+
"exports": {
|
|
25
|
+
"./package.json": {
|
|
26
|
+
"default": "./package.json"
|
|
27
|
+
},
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./index.d.ts",
|
|
30
|
+
"esm2022": "./esm2022/revendo_ch-trade-in-components-angular.mjs",
|
|
31
|
+
"esm": "./esm2022/revendo_ch-trade-in-components-angular.mjs",
|
|
32
|
+
"default": "./fesm2022/revendo_ch-trade-in-components-angular.mjs"
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
"sideEffects": false
|
|
6
36
|
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { TradeInWizard as GeneratedTradeInWizard } from './generated/proxies';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class TradeInWizard extends GeneratedTradeInWizard {
|
|
4
|
+
private readonly checkoutDefined;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TradeInWizard, never>;
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TradeInWizard, "trade-in-wizard", never, {}, {}, never, ["*"], true, never>;
|
|
7
|
+
}
|
|
8
|
+
export type { TradeInAnalyticsDetail, TradeInDeviceSelectedDetail, TradeInErrorDetail, TradeInOrderCompleteDetail, TradeInWizardCustomEvent, } from '@revendo_ch/trade-in-components';
|