@wix/pricing-plans-site-api 1.0.7 → 1.1.1
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/README.md +4 -3
- package/dist/index.d.ts +8 -6
- package/dist/index.js +142 -72
- package/dist/index.js.map +1 -1
- package/package.json +3 -4
package/README.md
CHANGED
|
@@ -27,7 +27,6 @@ resources: {
|
|
|
27
27
|
'@wix/site-service-pages',
|
|
28
28
|
'@wix/site-service-url',
|
|
29
29
|
'@wix/site-service-router',
|
|
30
|
-
'@wix/site-service-public-api-caller',
|
|
31
30
|
],
|
|
32
31
|
},
|
|
33
32
|
},
|
|
@@ -74,11 +73,13 @@ const { price, cycle, duration } = await getTranslatedPricingDetails(plan);
|
|
|
74
73
|
|
|
75
74
|
## Builder app support
|
|
76
75
|
|
|
77
|
-
On the legacy app, every option works as before.
|
|
76
|
+
On the legacy app, every option works as before, except in `navigateToPlanPage`: `widgetType` is left out. Like the legacy app, it generates a `checkoutFlowId` when none is given and passes it to the plan customization page or the eCommerce cart. `navigateToPlanPage` expects the legacy app to use eCommerce checkout, like every legacy installation on Studio 2.
|
|
77
|
+
|
|
78
|
+
The Builder app reads fewer options:
|
|
78
79
|
|
|
79
80
|
- `planIds` and `pricingVariantsByPlanId` choose the plans the Plans page shows.
|
|
80
81
|
- `checkout.minStartDate` and `checkout.maxStartDate` limit the start date on the plan customization page. A plan that goes straight to checkout doesn't get them.
|
|
81
82
|
- `checkout.thankYouPage.navigation` sets where the thank you page's continue button goes, and where the plan customization page goes after adding the plan to the cart. A target that isn't on the site is left out.
|
|
82
83
|
- `title`, `subtitle`, `biOptions`, `checkoutFlowId`, `widgetType` and `checkout.thankYouPage.content` aren't supported, and are left out.
|
|
83
84
|
|
|
84
|
-
`navigateToPlanPage` rejects a plan that isn't public or has no visible pricing variant. On
|
|
85
|
+
`navigateToPlanPage` rejects a plan that isn't public or has no visible pricing variant, and a `pricingVariantId` that isn't one of the plan's visible pricing variants. On both apps it loads the plan and creates the eCommerce cart as the vertical's app, so the app needs permission to read Pricing Plans plans and to manage eCommerce carts.
|
package/dist/index.d.ts
CHANGED
|
@@ -85,15 +85,17 @@ type PricingPlansSiteApi = {
|
|
|
85
85
|
* customization page when the plan has a form or a start date to choose, and to checkout
|
|
86
86
|
* otherwise.
|
|
87
87
|
*
|
|
88
|
-
* Uses the given pricing variant, or the plan's first one when `pricingVariantId` is
|
|
89
|
-
* The Builder app leaves out `biOptions`, `checkoutFlowId`, `widgetType` and
|
|
90
|
-
* `thankYouPage.content`.
|
|
88
|
+
* Uses the given pricing variant, or the plan's first visible one when `pricingVariantId` is
|
|
89
|
+
* omitted. The Builder app leaves out `biOptions`, `checkoutFlowId`, `widgetType` and
|
|
90
|
+
* `thankYouPage.content`. The legacy app leaves out `widgetType`, generates `checkoutFlowId` when
|
|
91
|
+
* it's omitted, and expects the site to use eCommerce checkout.
|
|
91
92
|
*
|
|
92
93
|
* @param options Plan to buy and checkout settings.
|
|
93
94
|
* @returns Resolves once the site visitor is on the plan customization page or checkout.
|
|
94
95
|
* @throws `Pricing Plans is not installed on the site.` when Pricing Plans isn't installed on the
|
|
95
96
|
* site.
|
|
96
|
-
* @throws When the plan can't be bought online,
|
|
97
|
+
* @throws When the plan or the given pricing variant can't be bought online, such as a hidden
|
|
98
|
+
* pricing variant, or when the site has no page to buy it on.
|
|
97
99
|
* @throws When the router doesn't navigate.
|
|
98
100
|
*/
|
|
99
101
|
navigateToPlanPage(options: NavigateToPlanPageOptions): Promise<void>;
|
|
@@ -231,8 +233,8 @@ declare function usePricingPlansPricingDetails({ initI18n, language }: PricingDe
|
|
|
231
233
|
* page.
|
|
232
234
|
*
|
|
233
235
|
* Use it inside a site component or context provider, and list these services in the extension's
|
|
234
|
-
* `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url
|
|
235
|
-
* `@wix/site-service-router
|
|
236
|
+
* `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url` and
|
|
237
|
+
* `@wix/site-service-router`.
|
|
236
238
|
*
|
|
237
239
|
* @example
|
|
238
240
|
* const { navigateToPlanPage } = usePricingPlansSiteApi();
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,6 @@ import { RouterDefinition } from "@wix/site-service-router/definition";
|
|
|
5
5
|
import { UrlDefinition } from "@wix/site-service-url/definition";
|
|
6
6
|
import { cartV2 } from "@wix/ecom";
|
|
7
7
|
import { plansV3 } from "@wix/pricing-plans";
|
|
8
|
-
import { defineService } from "@wix/services-definitions";
|
|
9
8
|
//#region src/pricing-details/format-price.ts
|
|
10
9
|
function formatPrice(amount, currency, locale, trimTrailingZeroes = false) {
|
|
11
10
|
if (!amount || !currency) return amount ?? "";
|
|
@@ -227,48 +226,6 @@ function usePricingPlansPricingDetails({ initI18n, language }) {
|
|
|
227
226
|
//#region src/constants.ts
|
|
228
227
|
const PRICING_PLANS_APP_ID = "1522827f-c56c-a5c9-2ac9-00f9e6ae12d3";
|
|
229
228
|
//#endregion
|
|
230
|
-
//#region src/builder/checkout.ts
|
|
231
|
-
async function loadPublicPlan(planId) {
|
|
232
|
-
const { items } = await plansV3.queryPlans().eq("_id", planId).eq("visibility", "PUBLIC").limit(1).find();
|
|
233
|
-
return items[0];
|
|
234
|
-
}
|
|
235
|
-
async function createCheckoutUrl(planId, pricingVariantId, membersOnly = false) {
|
|
236
|
-
const cart = await cartV2.createCart({
|
|
237
|
-
cart: { source: { channelType: "WEB" } },
|
|
238
|
-
catalogItems: [{
|
|
239
|
-
quantity: 1,
|
|
240
|
-
catalogReference: {
|
|
241
|
-
appId: PRICING_PLANS_APP_ID,
|
|
242
|
-
catalogItemId: planId,
|
|
243
|
-
options: {
|
|
244
|
-
type: "PLAN",
|
|
245
|
-
planOptions: {
|
|
246
|
-
pricingVariantId,
|
|
247
|
-
membersOnly
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}]
|
|
252
|
-
});
|
|
253
|
-
if (!cart?._id) throw new Error("Cart creation did not return an ID");
|
|
254
|
-
const { checkoutUrl } = await cartV2.getCheckoutUrl(cart._id);
|
|
255
|
-
if (!checkoutUrl) throw new Error("Checkout URL was not returned");
|
|
256
|
-
return checkoutUrl;
|
|
257
|
-
}
|
|
258
|
-
//#endregion
|
|
259
|
-
//#region src/builder/plan-purchase.ts
|
|
260
|
-
function planPurchase(plan, pricingVariantId) {
|
|
261
|
-
if (!plan) return;
|
|
262
|
-
const variants = (plan.pricingVariants ?? []).filter((variant) => Boolean(variant._id) && variant.visible !== false);
|
|
263
|
-
const variant = variants.find(({ _id }) => _id === pricingVariantId) ?? variants[0];
|
|
264
|
-
if (!variant) return;
|
|
265
|
-
const requiresStartDate = plan.startDateSettings ? plan.startDateSettings.type === "DATE_RANGE" : variant.billingTerms?.startType === "CUSTOM";
|
|
266
|
-
return {
|
|
267
|
-
pricingVariantId: variant._id,
|
|
268
|
-
requiresCustomization: Boolean(plan.formId) || requiresStartDate
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
//#endregion
|
|
272
229
|
//#region src/url.ts
|
|
273
230
|
function siteHref(siteUrl, path) {
|
|
274
231
|
return `${siteUrl.replace(/\/$/, "")}/${path.replace(/^\//, "")}`;
|
|
@@ -277,6 +234,11 @@ function withQuery(url, query) {
|
|
|
277
234
|
const search = query.toString();
|
|
278
235
|
return search ? `${url}?${search}` : url;
|
|
279
236
|
}
|
|
237
|
+
function withSearchParams(siteUrl, url, entries) {
|
|
238
|
+
const result = new URL(url, siteUrl);
|
|
239
|
+
for (const [name, value] of entries) if (value) result.searchParams.set(name, value);
|
|
240
|
+
return result.href;
|
|
241
|
+
}
|
|
280
242
|
function queryOf(entries) {
|
|
281
243
|
return new URLSearchParams(entries.filter((entry) => Boolean(entry[1])));
|
|
282
244
|
}
|
|
@@ -356,11 +318,7 @@ function withSuccessUrl(context, checkoutUrl, navigation) {
|
|
|
356
318
|
const thankYouPage = appPageUrl(context, BUILDER_THANK_YOU_PAGE_ID);
|
|
357
319
|
const target = returnUrl(context, navigation);
|
|
358
320
|
if (!thankYouPage || !target) return checkoutUrl;
|
|
359
|
-
|
|
360
|
-
const url = new URL(checkoutUrl);
|
|
361
|
-
successUrl.searchParams.set("returnUrl", target);
|
|
362
|
-
url.searchParams.set("successUrl", successUrl.href);
|
|
363
|
-
return url.href;
|
|
321
|
+
return withSearchParams(context.siteUrl, checkoutUrl, [["successUrl", withSearchParams(context.siteUrl, thankYouPage, [["returnUrl", target]])]]);
|
|
364
322
|
}
|
|
365
323
|
//#endregion
|
|
366
324
|
//#region src/adapters/navigate-to-page.ts
|
|
@@ -373,19 +331,79 @@ async function getPageUrl(href, pageName) {
|
|
|
373
331
|
return href;
|
|
374
332
|
}
|
|
375
333
|
//#endregion
|
|
334
|
+
//#region src/builder/checkout.ts
|
|
335
|
+
async function loadPublicPlan(planId) {
|
|
336
|
+
const { items } = await plansV3.queryPlans().eq("_id", planId).eq("visibility", "PUBLIC").limit(1).find();
|
|
337
|
+
return items[0];
|
|
338
|
+
}
|
|
339
|
+
async function createPlanCart(planId, pricingVariantId, { membersOnly, checkoutFlowId }) {
|
|
340
|
+
const cart = await cartV2.createCart({
|
|
341
|
+
cart: { source: {
|
|
342
|
+
channelType: "WEB",
|
|
343
|
+
externalReferences: checkoutFlowId ? [{
|
|
344
|
+
appId: PRICING_PLANS_APP_ID,
|
|
345
|
+
resourceId: checkoutFlowId
|
|
346
|
+
}] : void 0
|
|
347
|
+
} },
|
|
348
|
+
catalogItems: [{
|
|
349
|
+
quantity: 1,
|
|
350
|
+
catalogReference: {
|
|
351
|
+
appId: PRICING_PLANS_APP_ID,
|
|
352
|
+
catalogItemId: planId,
|
|
353
|
+
options: {
|
|
354
|
+
type: "PLAN",
|
|
355
|
+
planOptions: {
|
|
356
|
+
pricingVariantId,
|
|
357
|
+
membersOnly
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}]
|
|
362
|
+
});
|
|
363
|
+
if (!cart?._id) throw new Error("Cart creation did not return an ID");
|
|
364
|
+
return cart._id;
|
|
365
|
+
}
|
|
366
|
+
async function getCheckoutUrl(cartId) {
|
|
367
|
+
const { checkoutUrl } = await cartV2.getCheckoutUrl(cartId);
|
|
368
|
+
if (!checkoutUrl) throw new Error("Checkout URL was not returned");
|
|
369
|
+
return checkoutUrl;
|
|
370
|
+
}
|
|
371
|
+
//#endregion
|
|
372
|
+
//#region src/builder/plan-purchase.ts
|
|
373
|
+
function planPurchase(plan, pricingVariantId) {
|
|
374
|
+
const variants = (plan?.pricingVariants ?? []).filter((variant) => Boolean(variant._id) && variant.visible !== false);
|
|
375
|
+
if (!plan || !variants.length) throw new Error("Plan is not available for online purchase.");
|
|
376
|
+
const variant = pricingVariantId ? variants.find(({ _id }) => _id === pricingVariantId) : variants[0];
|
|
377
|
+
if (!variant) throw new Error("Pricing variant is not available for online purchase.");
|
|
378
|
+
return {
|
|
379
|
+
pricingVariantId: variant._id,
|
|
380
|
+
requiresCustomization: Boolean(plan.formId) || variant.billingTerms?.startType === "CUSTOM"
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
//#endregion
|
|
384
|
+
//#region src/adapters/purchase-plan.ts
|
|
385
|
+
async function purchasePlan(navigateTo, options, flow) {
|
|
386
|
+
const { pricingVariantId, requiresCustomization } = planPurchase(await loadPublicPlan(options.planId), options.pricingVariantId);
|
|
387
|
+
if (requiresCustomization) return navigateToPage(navigateTo, flow.customizationUrl({
|
|
388
|
+
...options,
|
|
389
|
+
pricingVariantId
|
|
390
|
+
}), "plan page");
|
|
391
|
+
const cartId = await createPlanCart(options.planId, pricingVariantId, flow.cart);
|
|
392
|
+
return navigateToPage(navigateTo, flow.checkoutUrl(await getCheckoutUrl(cartId), cartId), "checkout");
|
|
393
|
+
}
|
|
394
|
+
//#endregion
|
|
376
395
|
//#region src/adapters/builder.ts
|
|
377
396
|
function createBuilderSiteApi({ navigateTo, ...context }) {
|
|
378
397
|
return {
|
|
379
398
|
navigateToPricingPage: (options = {}) => navigateToPage(navigateTo, builderPricingPageUrl(context, options), "pricing page"),
|
|
380
399
|
getPricingPageUrl: (options = {}) => getPageUrl(builderPricingPageUrl(context, options), "pricing page"),
|
|
381
|
-
navigateToPlanPage:
|
|
382
|
-
const
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
})
|
|
388
|
-
return navigateToPage(navigateTo, withSuccessUrl(context, await createCheckoutUrl(options.planId, purchase.pricingVariantId, Boolean(returnUrl(context, options.thankYouPage?.navigation))), options.thankYouPage?.navigation), "checkout");
|
|
400
|
+
navigateToPlanPage: (options) => {
|
|
401
|
+
const navigation = options.thankYouPage?.navigation;
|
|
402
|
+
return purchasePlan(navigateTo, options, {
|
|
403
|
+
cart: { membersOnly: Boolean(returnUrl(context, navigation)) },
|
|
404
|
+
customizationUrl: (purchaseOptions) => builderPlanPageUrl(context, purchaseOptions),
|
|
405
|
+
checkoutUrl: (checkoutUrl) => withSuccessUrl(context, checkoutUrl, navigation)
|
|
406
|
+
});
|
|
389
407
|
}
|
|
390
408
|
};
|
|
391
409
|
}
|
|
@@ -402,9 +420,20 @@ function legacyPricingPageUrl(context, options) {
|
|
|
402
420
|
return url && withQuery(url, pricingPageQuery(options));
|
|
403
421
|
}
|
|
404
422
|
function pricingPageQuery({ planIds, pricingVariantsByPlanId, title, subtitle, biOptions, checkout }) {
|
|
405
|
-
const { content, navigation } = checkout?.thankYouPage ?? {};
|
|
406
423
|
const pricingVariants = pricingVariantsByPlanId && encodePricingVariants(pricingVariantsByPlanId);
|
|
407
424
|
return queryOf([
|
|
425
|
+
...integrationQueryEntries({
|
|
426
|
+
biOptions,
|
|
427
|
+
checkout
|
|
428
|
+
}),
|
|
429
|
+
pricingVariants ? ["pricingVariants", pricingVariants] : ["planIds", planIds?.join(",")],
|
|
430
|
+
["title", title],
|
|
431
|
+
["subtitle", subtitle]
|
|
432
|
+
]);
|
|
433
|
+
}
|
|
434
|
+
function integrationQueryEntries({ biOptions, checkout }) {
|
|
435
|
+
const { content, navigation } = checkout?.thankYouPage ?? {};
|
|
436
|
+
return [
|
|
408
437
|
["destination", navigation?.type === "url" ? navigation.url : void 0],
|
|
409
438
|
["page", navigation?.type === "page" ? navigation.pageId : void 0],
|
|
410
439
|
["section", navigation?.type === "section" ? encodeBase64Url(navigation.options) : void 0],
|
|
@@ -414,24 +443,69 @@ function pricingPageQuery({ planIds, pricingVariantsByPlanId, title, subtitle, b
|
|
|
414
443
|
["minStartDate", checkout?.minStartDate],
|
|
415
444
|
["thankYouTitle", content?.title],
|
|
416
445
|
["thankYouMessage", content?.message],
|
|
417
|
-
["thankYouCTA", content?.cta]
|
|
418
|
-
|
|
419
|
-
["title", title],
|
|
420
|
-
["subtitle", subtitle]
|
|
421
|
-
]);
|
|
446
|
+
["thankYouCTA", content?.cta]
|
|
447
|
+
];
|
|
422
448
|
}
|
|
423
449
|
function encodeBase64Url(input) {
|
|
424
450
|
const bytes = encodeURIComponent(JSON.stringify(input)).replace(/%[0-9A-F]{2}/g, (percent) => String.fromCharCode(parseInt(percent.slice(1), 16)));
|
|
425
451
|
return btoa(bytes).replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_");
|
|
426
452
|
}
|
|
427
453
|
//#endregion
|
|
454
|
+
//#region src/legacy/plan-page-url.ts
|
|
455
|
+
const LEGACY_PLAN_CUSTOMIZATION_PAGE_ID = "Plan Customization";
|
|
456
|
+
const LEGACY_THANK_YOU_PAGE_ID = "Thank You";
|
|
457
|
+
function legacyPlanCustomizationUrl(context, { planId, pricingVariantId, checkoutFlowId, biOptions, ...checkout }) {
|
|
458
|
+
const url = appPageUrl(context, LEGACY_PLAN_CUSTOMIZATION_PAGE_ID);
|
|
459
|
+
return url && withQuery(url, queryOf([
|
|
460
|
+
...integrationQueryEntries({
|
|
461
|
+
biOptions,
|
|
462
|
+
checkout
|
|
463
|
+
}),
|
|
464
|
+
["planId", planId],
|
|
465
|
+
["checkoutFlowId", checkoutFlowId],
|
|
466
|
+
["pricingVariantId", pricingVariantId]
|
|
467
|
+
]));
|
|
468
|
+
}
|
|
469
|
+
function isCustomPurchaseFlow({ thankYouPage }) {
|
|
470
|
+
return Boolean(thankYouPage?.content || thankYouPage?.navigation?.type === "section" || thankYouPage?.navigation?.type === "page");
|
|
471
|
+
}
|
|
472
|
+
function legacyCheckoutUrl(context, checkoutUrl, cartId, options) {
|
|
473
|
+
const successUrl = legacySuccessUrl(context, cartId, options);
|
|
474
|
+
return withSearchParams(context.siteUrl, checkoutUrl, [["successUrl", successUrl && encodeURIComponent(successUrl)], ["disableContinueShopping", "true"]]);
|
|
475
|
+
}
|
|
476
|
+
function legacySuccessUrl(context, cartId, { planId, biOptions, ...checkout }) {
|
|
477
|
+
const url = appPageUrl(context, LEGACY_THANK_YOU_PAGE_ID);
|
|
478
|
+
if (!url || !isCustomPurchaseFlow(checkout)) return;
|
|
479
|
+
return withQuery(url, queryOf([
|
|
480
|
+
...integrationQueryEntries({
|
|
481
|
+
biOptions,
|
|
482
|
+
checkout
|
|
483
|
+
}),
|
|
484
|
+
["isEcom", "true"],
|
|
485
|
+
["cartId", cartId],
|
|
486
|
+
["planId", planId]
|
|
487
|
+
]));
|
|
488
|
+
}
|
|
489
|
+
//#endregion
|
|
428
490
|
//#region src/adapters/legacy-ooi.ts
|
|
429
|
-
function createLegacyOoiSiteApi({ navigateTo,
|
|
491
|
+
function createLegacyOoiSiteApi({ navigateTo, ...context }) {
|
|
430
492
|
return {
|
|
431
493
|
navigateToPricingPage: (options = {}) => navigateToPage(navigateTo, legacyPricingPageUrl(context, options), "pricing page"),
|
|
432
494
|
getPricingPageUrl: (options = {}) => getPageUrl(legacyPricingPageUrl(context, options), "pricing page"),
|
|
433
|
-
navigateToPlanPage:
|
|
434
|
-
|
|
495
|
+
navigateToPlanPage: (options) => {
|
|
496
|
+
const checkoutFlowId = options.checkoutFlowId ?? crypto.randomUUID();
|
|
497
|
+
const flowOptions = {
|
|
498
|
+
...options,
|
|
499
|
+
checkoutFlowId
|
|
500
|
+
};
|
|
501
|
+
return purchasePlan(navigateTo, flowOptions, {
|
|
502
|
+
cart: {
|
|
503
|
+
membersOnly: isCustomPurchaseFlow(options),
|
|
504
|
+
checkoutFlowId
|
|
505
|
+
},
|
|
506
|
+
customizationUrl: (purchaseOptions) => legacyPlanCustomizationUrl(context, purchaseOptions),
|
|
507
|
+
checkoutUrl: (checkoutUrl, cartId) => legacyCheckoutUrl(context, checkoutUrl, cartId, flowOptions)
|
|
508
|
+
});
|
|
435
509
|
}
|
|
436
510
|
};
|
|
437
511
|
}
|
|
@@ -458,9 +532,6 @@ function createSiteApi(context) {
|
|
|
458
532
|
return createNotInstalledSiteApi();
|
|
459
533
|
}
|
|
460
534
|
//#endregion
|
|
461
|
-
//#region src/public-api-caller.ts
|
|
462
|
-
const PublicApiCallerDefinition = defineService("@wix/site-service-public-api-caller");
|
|
463
|
-
//#endregion
|
|
464
535
|
//#region src/use-pricing-plans-site-api.ts
|
|
465
536
|
/**
|
|
466
537
|
* Navigation to Pricing Plans pages that works with both versions of the Pricing Plans app: the
|
|
@@ -473,8 +544,8 @@ const PublicApiCallerDefinition = defineService("@wix/site-service-public-api-ca
|
|
|
473
544
|
* page.
|
|
474
545
|
*
|
|
475
546
|
* Use it inside a site component or context provider, and list these services in the extension's
|
|
476
|
-
* `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url
|
|
477
|
-
* `@wix/site-service-router
|
|
547
|
+
* `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url` and
|
|
548
|
+
* `@wix/site-service-router`.
|
|
478
549
|
*
|
|
479
550
|
* @example
|
|
480
551
|
* const { navigateToPlanPage } = usePricingPlansSiteApi();
|
|
@@ -489,8 +560,7 @@ function usePricingPlansSiteApi() {
|
|
|
489
560
|
pages,
|
|
490
561
|
siteUrl: url.siteUrl,
|
|
491
562
|
sectionUrl: (appDefinitionId, sectionId, discardRouterPageSuffix) => url.appSectionRelativeUrl(appDefinitionId, sectionId, discardRouterPageSuffix),
|
|
492
|
-
navigateTo: (href) => getService(RouterDefinition).navigateTo({ href })
|
|
493
|
-
callPublicApi: (methodPath, args) => getService(PublicApiCallerDefinition).callPublicApi(PRICING_PLANS_APP_ID, methodPath, args)
|
|
563
|
+
navigateTo: (href) => getService(RouterDefinition).navigateTo({ href })
|
|
494
564
|
}), [
|
|
495
565
|
pages,
|
|
496
566
|
url,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["englishMessages"],"sources":["../src/pricing-details/format-price.ts","../src/assets/locale/messages_en.dev.json","../src/pricing-details/messages.ts","../src/pricing-details/translate.ts","../src/pricing-details/variant-labels.ts","../src/pricing-details/pricing-details.ts","../src/use-pricing-plans-pricing-details.ts","../src/constants.ts","../src/builder/checkout.ts","../src/builder/plan-purchase.ts","../src/url.ts","../src/app-pages.ts","../src/builder/return-url.ts","../src/builder/checkout-query.ts","../src/builder/plan-page-url.ts","../src/builder/pricing-page-url.ts","../src/builder/success-url.ts","../src/adapters/navigate-to-page.ts","../src/adapters/builder.ts","../src/legacy/pages.ts","../src/legacy/pricing-page-url.ts","../src/adapters/legacy-ooi.ts","../src/adapters/not-installed.ts","../src/create-site-api.ts","../src/public-api-caller.ts","../src/use-pricing-plans-site-api.ts"],"sourcesContent":["export function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string,\n trimTrailingZeroes = false,\n): string {\n if (!amount || !currency) {\n return amount ?? '';\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n trailingZeroDisplay: trimTrailingZeroes ? 'stripIfInteger' : 'auto',\n }).format(Number(amount));\n } catch {\n return amount;\n }\n}\n","","import englishMessages from '../assets/locale/messages_en.dev.json';\n\nexport type Messages = Readonly<Record<string, string>>;\n\ntype MessageFiles = Record<string, () => Promise<{ default: Messages }>>;\n\nexport const ENGLISH_MESSAGES: Messages = englishMessages;\n\nconst MESSAGE_FILES: MessageFiles = import.meta.glob<{ default: Messages }>([\n '../assets/locale/messages_*.json',\n '!../assets/locale/messages_*.dev.json',\n '!../assets/locale/messages_en.json',\n]);\n\n// Behind import.meta.env.DEV, so the production build of the consumer app leaves them out.\nconst DEV_MESSAGE_FILES: MessageFiles = import.meta.env?.DEV\n ? import.meta.glob<{ default: Messages }>([\n '../assets/locale/messages_*.dev.json',\n '!../assets/locale/messages_en.dev.json',\n ])\n : {};\n\nconst loadedMessages = new Map<string, Promise<Messages>>();\n\nconst messagesFile = (language: string) => `../assets/locale/messages_${language}.json`;\n\nconst devMessagesFile = (language: string) => `../assets/locale/messages_${language}.dev.json`;\n\nexport function messageFileLanguages(language: string): string[] {\n const [baseLanguage] = language.split(/[-_]/);\n\n return baseLanguage && baseLanguage !== language ? [language, baseLanguage] : [language];\n}\n\nconst loadFile = async (load: MessageFiles[string] | undefined): Promise<Messages> =>\n load ? (await load()).default : {};\n\nexport function loadMessages(language: string): Promise<Messages> {\n const fileLanguage = messageFileLanguages(language).find(\n (candidate) =>\n MESSAGE_FILES[messagesFile(candidate)] || DEV_MESSAGE_FILES[devMessagesFile(candidate)],\n );\n\n if (!fileLanguage) {\n return Promise.resolve(ENGLISH_MESSAGES);\n }\n\n const loaded = loadedMessages.get(fileLanguage);\n\n if (loaded) {\n return loaded;\n }\n\n const loading = Promise.all([\n loadFile(MESSAGE_FILES[messagesFile(fileLanguage)]),\n loadFile(DEV_MESSAGE_FILES[devMessagesFile(fileLanguage)]),\n ]).then(\n ([messages, devMessages]) => ({ ...messages, ...devMessages }),\n () => {\n loadedMessages.delete(fileLanguage);\n\n return ENGLISH_MESSAGES;\n },\n );\n\n loadedMessages.set(fileLanguage, loading);\n\n return loading;\n}\n","import type { I18n, InitI18n } from '../types';\nimport { ENGLISH_MESSAGES, loadMessages } from './messages';\n\nexport type Translate = (key: string, values?: Record<string, number>) => string;\n\nconst translations = new WeakMap<InitI18n, Map<string, Promise<Translate>>>();\n\nconst initialized = (i18n: I18n) =>\n i18n.isInitialized\n ? Promise.resolve()\n : new Promise<void>((resolve) => {\n i18n.on('initialized', () => resolve());\n });\n\nasync function buildTranslate(initI18n: InitI18n, language: string): Promise<Translate> {\n const messages = await loadMessages(language);\n const i18n = initI18n({ locale: language, messages: { ...ENGLISH_MESSAGES, ...messages } });\n\n await initialized(i18n);\n\n if (!i18n.modules?.i18nFormat) {\n throw new Error(\n 'Pricing texts need an i18next instance with ICU messages, such as initI18n of @wix/fed-cli-i18next.',\n );\n }\n\n // Typed loosely in I18n, so the overloaded t of every i18next version matches it.\n const t = i18n.t.bind(i18n) as unknown as (\n key: string,\n values?: Record<string, number>,\n ) => unknown;\n\n return (key, values) => String(t(key, values));\n}\n\nexport function createTranslate(initI18n: InitI18n, language: string): Promise<Translate> {\n const languages = translations.get(initI18n) ?? new Map<string, Promise<Translate>>();\n\n translations.set(initI18n, languages);\n\n const existing = languages.get(language);\n\n if (existing) {\n return existing;\n }\n\n const building = buildTranslate(initI18n, language);\n\n languages.set(language, building);\n building.catch(() => languages.delete(language));\n\n return building;\n}\n","import type { plansV3 } from '@wix/pricing-plans';\nimport type { FormattedAdditionalFee } from '../types';\nimport { formatPrice } from './format-price';\nimport type { Translate } from './translate';\n\ntype PricingVariant = plansV3.PricingVariant;\n\nconst CYCLE_KEYS: Record<string, string> = {\n DAY: 'pp.period-recurrency.every-day-plural',\n WEEK: 'pp.period-recurrency.every-week-plural',\n MONTH: 'pp.period-recurrency.every-month-plural',\n YEAR: 'pp.period-recurrency.every-year-plural',\n};\n\nconst DURATION_KEYS: Record<string, string> = {\n DAY: 'pp.plan-validity.valid-for-days-v2',\n WEEK: 'pp.plan-validity.valid-for-weeks-v2',\n MONTH: 'pp.plan-validity.valid-for-months-v2',\n YEAR: 'pp.plan-validity.valid-for-years-v2',\n};\n\nconst isUnlimitedVariant = (variant: PricingVariant) =>\n variant.billingTerms?.endType === 'UNTIL_CANCELLED';\n\nconst getCycleDuration = (variant: PricingVariant) =>\n parseInt(variant.billingTerms?.billingCycle?.count ?? '1', 10);\n\nfunction isRecurringVariant(variant: PricingVariant) {\n const terms = variant.billingTerms;\n\n if (!terms?.billingCycle) {\n return false;\n }\n\n if (terms.endType === 'CYCLES_COMPLETED') {\n return terms.cyclesCompletedDetails?.billingCycleCount !== '1';\n }\n\n return true;\n}\n\nexport const hasFreeTrialDays = (variant: PricingVariant) => Boolean(variant.freeTrialDays);\n\nexport function getCycleLabel(variant: PricingVariant, t: Translate): string {\n const key = CYCLE_KEYS[variant.billingTerms?.billingCycle?.period ?? ''];\n\n if (!isRecurringVariant(variant) || !key) {\n return '';\n }\n\n return t(key, { count: getCycleDuration(variant) });\n}\n\nexport function getDurationLabel(variant: PricingVariant, t: Translate): string {\n if (isUnlimitedVariant(variant)) {\n return t('pp.plan-validity.valid-unlimited');\n }\n\n const key = DURATION_KEYS[variant.billingTerms?.billingCycle?.period ?? ''];\n const cycleDuration = getCycleDuration(variant);\n const cycleCount = parseInt(\n variant.billingTerms?.cyclesCompletedDetails?.billingCycleCount ?? '',\n 10,\n );\n\n if (!key || !cycleDuration || !cycleCount) {\n return '';\n }\n\n return t(key, { amount: cycleDuration * cycleCount });\n}\n\nexport function getFreeTrialLabel(variant: PricingVariant, t: Translate): string {\n if (!variant.freeTrialDays) {\n return '';\n }\n\n return t(isUnlimitedVariant(variant) ? 'pp.free-trial-days-unlimited' : 'pp.free-trial-days', {\n count: variant.freeTrialDays,\n });\n}\n\nexport function getAdditionalFees(\n variant: PricingVariant,\n currency: string | undefined,\n locale: string,\n trimTrailingZeroes?: boolean,\n): FormattedAdditionalFee[] {\n return (variant.fees ?? [])\n .filter((fee) => Boolean(fee.fixedAmountOptions?.amount))\n .map((fee) => ({\n name: fee.name ?? '',\n amount: formatPrice(fee.fixedAmountOptions?.amount, currency, locale, trimTrailingZeroes),\n }));\n}\n","import type { plansV3 } from '@wix/pricing-plans';\nimport type {\n GetTranslatedPricingDetailsOptions,\n PricingDetailsApi,\n PricingDetailsOptions,\n TranslatedPricingDetails,\n} from '../types';\nimport { formatPrice } from './format-price';\nimport { createTranslate } from './translate';\nimport type { Translate } from './translate';\nimport {\n getAdditionalFees,\n getCycleLabel,\n getDurationLabel,\n getFreeTrialLabel,\n hasFreeTrialDays,\n} from './variant-labels';\n\nconst EMPTY_PRICING_DETAILS: TranslatedPricingDetails = {\n price: '',\n cycle: '',\n duration: '',\n freeTrial: '',\n additionalFees: [],\n};\n\nfunction getVariantPricingDetails(\n plan: plansV3.Plan,\n variant: plansV3.PricingVariant,\n t: Translate,\n locale: string,\n options?: GetTranslatedPricingDetailsOptions,\n): TranslatedPricingDetails {\n const amount = plan.currency ? variant.pricingStrategies?.[0]?.flatRate?.amount : undefined;\n\n return {\n price: formatPrice(amount, plan.currency, locale, options?.trimTrailingZeroes),\n cycle: getCycleLabel(variant, t),\n duration: getDurationLabel(variant, t),\n freeTrial: getFreeTrialLabel(variant, t),\n additionalFees: getAdditionalFees(variant, plan.currency, locale, options?.trimTrailingZeroes),\n };\n}\n\nfunction getPlanPricingDetails(\n plan: plansV3.Plan,\n t: Translate,\n locale: string,\n options?: GetTranslatedPricingDetailsOptions,\n): TranslatedPricingDetails {\n const variants = plan.pricingVariants ?? [];\n const [firstVariant] = variants;\n\n if (!firstVariant) {\n return EMPTY_PRICING_DETAILS;\n }\n\n const firstVariantDetails = getVariantPricingDetails(plan, firstVariant, t, locale, options);\n\n if (variants.length === 1) {\n return firstVariantDetails;\n }\n\n // A free trial can be set per variant through the API, so the plan shows one when any variant has it.\n const freeTrialVariant = variants.find(hasFreeTrialDays);\n\n return {\n ...firstVariantDetails,\n price: t('pp.pricing-details.multiple-prices'),\n cycle: '',\n freeTrial: freeTrialVariant ? getFreeTrialLabel(freeTrialVariant, t) : '',\n };\n}\n\nexport function createPricingDetailsApi({\n initI18n,\n language,\n}: PricingDetailsOptions): PricingDetailsApi {\n return {\n getTranslatedPricingDetails: async (plan, options) =>\n getPlanPricingDetails(plan, await createTranslate(initI18n, language), language, options),\n getTranslatedPricingDetailsPerVariant: async (plan, options) => {\n const t = await createTranslate(initI18n, language);\n\n return (plan.pricingVariants ?? []).map((variant) => {\n const [categoryId] = variant.categoryIds ?? [];\n\n return {\n ...getVariantPricingDetails(plan, variant, t, language, options),\n pricingVariantId: variant._id ?? '',\n categoryName: categoryId ? options?.variantCategoryNameById?.[categoryId] : undefined,\n };\n });\n },\n };\n}\n","import { useMemo } from 'react';\nimport { createPricingDetailsApi } from './pricing-details/pricing-details';\nimport type { PricingDetailsApi, PricingDetailsOptions } from './types';\n\n/**\n * Pricing texts of Pricing Plans plans, like the legacy `getTranslatedPricingDetails` and\n * `getTranslatedPricingDetailsPerVariant`.\n *\n * The texts are translated with an i18next instance the hook builds with the app's `initI18n`, so\n * the i18next runtime stays with the app and the app's own instance isn't changed. Its instances\n * have to format ICU messages, like the ones `initI18n` of `@wix/fed-cli-i18next` creates.\n *\n * The texts depend only on the plan, so the hook works with both apps and on sites without Pricing\n * Plans, and needs no `serviceDependencies`.\n *\n * @param options The app's i18next factory, and the language of the texts.\n *\n * @example\n * const { getTranslatedPricingDetails } = usePricingPlansPricingDetails({\n * initI18n,\n * language: essentialsI18n.getLanguage(),\n * });\n *\n * const { price, cycle } = await getTranslatedPricingDetails(plan);\n */\nexport function usePricingPlansPricingDetails({\n initI18n,\n language,\n}: PricingDetailsOptions): PricingDetailsApi {\n return useMemo(() => createPricingDetailsApi({ initI18n, language }), [initI18n, language]);\n}\n","export const PRICING_PLANS_APP_ID = '1522827f-c56c-a5c9-2ac9-00f9e6ae12d3';\n","import { cartV2 } from '@wix/ecom';\nimport { plansV3 } from '@wix/pricing-plans';\nimport { PRICING_PLANS_APP_ID } from '../constants';\n\nexport async function loadPublicPlan(planId: string): Promise<plansV3.Plan | undefined> {\n const { items } = await plansV3\n .queryPlans()\n .eq('_id', planId)\n .eq('visibility', 'PUBLIC')\n .limit(1)\n .find();\n\n return items[0];\n}\n\nexport async function createCheckoutUrl(\n planId: string,\n pricingVariantId: string,\n membersOnly = false,\n): Promise<string> {\n const cart = await cartV2.createCart({\n cart: { source: { channelType: 'WEB' } },\n catalogItems: [\n {\n quantity: 1,\n catalogReference: {\n appId: PRICING_PLANS_APP_ID,\n catalogItemId: planId,\n options: { type: 'PLAN', planOptions: { pricingVariantId, membersOnly } },\n },\n },\n ],\n });\n\n if (!cart?._id) {\n throw new Error('Cart creation did not return an ID');\n }\n\n const { checkoutUrl } = await cartV2.getCheckoutUrl(cart._id);\n\n if (!checkoutUrl) {\n throw new Error('Checkout URL was not returned');\n }\n\n return checkoutUrl;\n}\n","import type { plansV3 } from '@wix/pricing-plans';\n\nexport type PlanPurchase = {\n pricingVariantId: string;\n requiresCustomization: boolean;\n};\n\nexport function planPurchase(\n plan: plansV3.Plan | undefined,\n pricingVariantId?: string,\n): PlanPurchase | undefined {\n if (!plan) return;\n\n const variants = (plan.pricingVariants ?? []).filter(\n (variant): variant is plansV3.PricingVariant & { _id: string } =>\n Boolean(variant._id) && variant.visible !== false,\n );\n // Like the legacy app, a hidden or unknown pricingVariantId falls back to the first visible variant.\n const variant = variants.find(({ _id }) => _id === pricingVariantId) ?? variants[0];\n\n if (!variant) return;\n\n const requiresStartDate = plan.startDateSettings\n ? plan.startDateSettings.type === 'DATE_RANGE'\n : variant.billingTerms?.startType === 'CUSTOM';\n\n return {\n pricingVariantId: variant._id,\n requiresCustomization: Boolean(plan.formId) || requiresStartDate,\n };\n}\n","export function siteHref(siteUrl: string, path: string): string {\n return `${siteUrl.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`;\n}\n\nexport function withQuery(url: string, query: URLSearchParams): string {\n const search = query.toString();\n\n return search ? `${url}?${search}` : url;\n}\n\nexport function queryOf(entries: Array<[string, string | undefined]>): URLSearchParams {\n return new URLSearchParams(\n entries.filter((entry): entry is [string, string] => Boolean(entry[1])),\n );\n}\n\nexport function encodePricingVariants(pricingVariantsByPlanId: Record<string, string[]>): string {\n return Object.entries(pricingVariantsByPlanId)\n .filter(([, pricingVariantIds]) => pricingVariantIds.length)\n .map(([planId, pricingVariantIds]) => [planId, ...pricingVariantIds].join(':'))\n .join(',');\n}\n","import { PRICING_PLANS_APP_ID } from './constants';\nimport type { Page, Pages, UrlContext } from './types';\nimport { siteHref } from './url';\n\nexport function findAppPage(pages: Pages, appPageId: string): Page | undefined {\n const candidates = Object.values(pages).filter(\n (page) => !page.popup && page.appPageId === appPageId,\n );\n const unowned = candidates.filter((page) => !page.appDefinitionId);\n\n return (\n candidates.find((page) => page.appDefinitionId === PRICING_PLANS_APP_ID) ??\n (unowned.length === 1 ? unowned[0] : undefined)\n );\n}\n\nexport function appPageUrl(context: UrlContext, appPageId: string): string | undefined {\n const path = findAppPage(context.pages, appPageId)\n ? context.sectionUrl(PRICING_PLANS_APP_ID, appPageId)\n : undefined;\n\n return path ? siteHref(context.siteUrl, path) : undefined;\n}\n","import type { NavigationPolicy, UrlContext } from '../types';\nimport { siteHref, withQuery } from '../url';\n\nexport function returnUrl(\n { pages, siteUrl, sectionUrl }: UrlContext,\n navigation: NavigationPolicy | undefined,\n): string | undefined {\n if (!navigation) return;\n\n switch (navigation.type) {\n case 'url':\n return onSiteUrl(siteUrl, navigation.url);\n case 'page': {\n const page = pages[navigation.pageId];\n\n return page && siteHref(siteUrl, page.path);\n }\n case 'section': {\n const { appDefinitionId, sectionId, state, queryParams, discardRouterPageSuffix } =\n navigation.options;\n const path = sectionUrl(appDefinitionId, sectionId, discardRouterPageSuffix);\n\n if (!path) return;\n\n const url = siteHref(siteUrl, state ? `${path.replace(/\\/$/, '')}/${state}` : path);\n\n return queryParams\n ? withQuery(url, new URLSearchParams({ appSectionParams: JSON.stringify(queryParams) }))\n : url;\n }\n }\n}\n\n// Matches the targets the Thank You page accepts as `returnUrl`; it sends any other to the homepage.\nfunction onSiteUrl(siteUrl: string, url: string): string | undefined {\n try {\n const site = new URL(siteUrl.endsWith('/') ? siteUrl : `${siteUrl}/`);\n const target = new URL(url.startsWith('/') ? siteHref(siteUrl, url) : url, site);\n const basePath = site.pathname.replace(/\\/$/, '');\n\n if (\n target.origin === site.origin &&\n !target.username &&\n !target.password &&\n (target.protocol === 'https:' || target.protocol === 'http:') &&\n (target.pathname === basePath || target.pathname.startsWith(`${basePath}/`))\n ) {\n return target.href;\n }\n } catch {\n return;\n }\n}\n","import type { CheckoutOptions, UrlContext } from '../types';\nimport { returnUrl } from './return-url';\n\nexport function checkoutQueryEntries(\n context: UrlContext,\n checkout: CheckoutOptions = {},\n): Array<[string, string | undefined]> {\n return [\n ['minStartDate', checkout.minStartDate],\n ['maxStartDate', checkout.maxStartDate],\n ['returnUrl', returnUrl(context, checkout.thankYouPage?.navigation)],\n ];\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigateToPlanPageOptions, UrlContext } from '../types';\nimport { queryOf, withQuery } from '../url';\nimport { checkoutQueryEntries } from './checkout-query';\n\nexport const BUILDER_PLAN_PAGE_ID = 'plan-customization-page';\n\nexport function builderPlanPageUrl(\n context: UrlContext,\n { planId, pricingVariantId, ...checkout }: NavigateToPlanPageOptions,\n): string | undefined {\n const url = appPageUrl(context, BUILDER_PLAN_PAGE_ID);\n\n if (!url) return;\n\n return withQuery(\n `${url.replace(/\\/+$/, '')}/${encodeURIComponent(planId)}`,\n queryOf([['pricingVariantId', pricingVariantId], ...checkoutQueryEntries(context, checkout)]),\n );\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigateToPricingPageOptions, UrlContext } from '../types';\nimport { encodePricingVariants, queryOf, withQuery } from '../url';\nimport { checkoutQueryEntries } from './checkout-query';\n\nexport const BUILDER_PRICING_PAGE_ID = 'plans-page';\n\nexport function builderPricingPageUrl(\n context: UrlContext,\n { planIds, pricingVariantsByPlanId, checkout }: NavigateToPricingPageOptions,\n): string | undefined {\n const url = appPageUrl(context, BUILDER_PRICING_PAGE_ID);\n\n if (!url) return;\n\n const pricingVariants = pricingVariantsByPlanId && encodePricingVariants(pricingVariantsByPlanId);\n\n return withQuery(\n url,\n queryOf([\n pricingVariants ? ['pricingVariants', pricingVariants] : ['planIds', planIds?.join(',')],\n ...checkoutQueryEntries(context, checkout),\n ]),\n );\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigationPolicy, UrlContext } from '../types';\nimport { returnUrl } from './return-url';\n\nexport const BUILDER_THANK_YOU_PAGE_ID = 'thank-you-page';\n\nexport function withSuccessUrl(\n context: UrlContext,\n checkoutUrl: string,\n navigation: NavigationPolicy | undefined,\n): string {\n const thankYouPage = appPageUrl(context, BUILDER_THANK_YOU_PAGE_ID);\n const target = returnUrl(context, navigation);\n\n if (!thankYouPage || !target) {\n return checkoutUrl;\n }\n\n const successUrl = new URL(thankYouPage);\n const url = new URL(checkoutUrl);\n\n successUrl.searchParams.set('returnUrl', target);\n url.searchParams.set('successUrl', successUrl.href);\n\n return url.href;\n}\n","import type { SiteApiContext } from '../types';\n\nexport async function navigateToPage(\n navigateTo: SiteApiContext['navigateTo'],\n href: string | undefined,\n pageName: string,\n): Promise<void> {\n if (!href) {\n throw new Error(`Cannot navigate to ${pageName}, because it is not available on the site.`);\n }\n\n if (!(await navigateTo(href))) {\n throw new Error(`Navigation to ${pageName} failed.`);\n }\n}\n\nexport async function getPageUrl(href: string | undefined, pageName: string): Promise<string> {\n if (!href) {\n throw new Error(`Cannot get ${pageName} URL, because it is not available on the site.`);\n }\n\n return href;\n}\n","import { createCheckoutUrl, loadPublicPlan } from '../builder/checkout';\nimport { planPurchase } from '../builder/plan-purchase';\nimport { builderPlanPageUrl } from '../builder/plan-page-url';\nimport { builderPricingPageUrl } from '../builder/pricing-page-url';\nimport { returnUrl } from '../builder/return-url';\nimport { withSuccessUrl } from '../builder/success-url';\nimport type { SiteApiContext, PricingPlansSiteApi } from '../types';\nimport { getPageUrl, navigateToPage } from './navigate-to-page';\n\nexport function createBuilderSiteApi({\n navigateTo,\n ...context\n}: SiteApiContext): PricingPlansSiteApi {\n return {\n navigateToPricingPage: (options = {}) =>\n navigateToPage(navigateTo, builderPricingPageUrl(context, options), 'pricing page'),\n getPricingPageUrl: (options = {}) =>\n getPageUrl(builderPricingPageUrl(context, options), 'pricing page'),\n navigateToPlanPage: async (options) => {\n const purchase = planPurchase(await loadPublicPlan(options.planId), options.pricingVariantId);\n\n if (!purchase) {\n throw new Error('Plan is not available for online purchase.');\n }\n\n if (purchase.requiresCustomization) {\n return navigateToPage(\n navigateTo,\n builderPlanPageUrl(context, { ...options, pricingVariantId: purchase.pricingVariantId }),\n 'plan page',\n );\n }\n\n const checkoutUrl = await createCheckoutUrl(\n options.planId,\n purchase.pricingVariantId,\n Boolean(returnUrl(context, options.thankYouPage?.navigation)),\n );\n\n return navigateToPage(\n navigateTo,\n withSuccessUrl(context, checkoutUrl, options.thankYouPage?.navigation),\n 'checkout',\n );\n },\n };\n}\n","import { findAppPage } from '../app-pages';\nimport type { Page, Pages } from '../types';\n\nexport const LEGACY_PRICING_PAGE_ID = 'membership_plan_picker_tpa';\n\nexport function findLegacyPricingPage(pages: Pages): Page | undefined {\n return findAppPage(pages, LEGACY_PRICING_PAGE_ID);\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigateToPricingPageOptions, UrlContext } from '../types';\nimport { encodePricingVariants, queryOf, withQuery } from '../url';\nimport { LEGACY_PRICING_PAGE_ID } from './pages';\n\nexport function legacyPricingPageUrl(\n context: UrlContext,\n options: NavigateToPricingPageOptions,\n): string | undefined {\n const url = appPageUrl(context, LEGACY_PRICING_PAGE_ID);\n\n return url && withQuery(url, pricingPageQuery(options));\n}\n\nfunction pricingPageQuery({\n planIds,\n pricingVariantsByPlanId,\n title,\n subtitle,\n biOptions,\n checkout,\n}: NavigateToPricingPageOptions): URLSearchParams {\n const { content, navigation } = checkout?.thankYouPage ?? {};\n const pricingVariants = pricingVariantsByPlanId && encodePricingVariants(pricingVariantsByPlanId);\n\n return queryOf([\n ['destination', navigation?.type === 'url' ? navigation.url : undefined],\n ['page', navigation?.type === 'page' ? navigation.pageId : undefined],\n ['section', navigation?.type === 'section' ? encodeBase64Url(navigation.options) : undefined],\n ['referral', biOptions?.referralInfo],\n ['referralId', biOptions?.referralId],\n ['maxStartDate', checkout?.maxStartDate],\n ['minStartDate', checkout?.minStartDate],\n ['thankYouTitle', content?.title],\n ['thankYouMessage', content?.message],\n ['thankYouCTA', content?.cta],\n pricingVariants ? ['pricingVariants', pricingVariants] : ['planIds', planIds?.join(',')],\n ['title', title],\n ['subtitle', subtitle],\n ]);\n}\n\nfunction encodeBase64Url(input: unknown): string {\n const bytes = encodeURIComponent(JSON.stringify(input)).replace(/%[0-9A-F]{2}/g, (percent) =>\n String.fromCharCode(parseInt(percent.slice(1), 16)),\n );\n\n return btoa(bytes).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","import { legacyPricingPageUrl } from '../legacy/pricing-page-url';\nimport type { SiteApiContext, PricingPlansSiteApi } from '../types';\nimport { getPageUrl, navigateToPage } from './navigate-to-page';\n\nexport function createLegacyOoiSiteApi({\n navigateTo,\n callPublicApi,\n ...context\n}: SiteApiContext): PricingPlansSiteApi {\n return {\n navigateToPricingPage: (options = {}) =>\n navigateToPage(navigateTo, legacyPricingPageUrl(context, options), 'pricing page'),\n getPricingPageUrl: (options = {}) =>\n getPageUrl(legacyPricingPageUrl(context, options), 'pricing page'),\n navigateToPlanPage: async (options) => {\n await callPublicApi('navigateToPlanPage', [options]);\n },\n };\n}\n","import type { PricingPlansSiteApi } from '../types';\n\nconst notInstalled = () => Promise.reject(new Error('Pricing Plans is not installed on the site.'));\n\nexport function createNotInstalledSiteApi(): PricingPlansSiteApi {\n return {\n navigateToPricingPage: notInstalled,\n getPricingPageUrl: notInstalled,\n navigateToPlanPage: notInstalled,\n };\n}\n","import { createBuilderSiteApi } from './adapters/builder';\nimport { createLegacyOoiSiteApi } from './adapters/legacy-ooi';\nimport { createNotInstalledSiteApi } from './adapters/not-installed';\nimport { findAppPage } from './app-pages';\nimport { BUILDER_PLAN_PAGE_ID } from './builder/plan-page-url';\nimport { BUILDER_PRICING_PAGE_ID } from './builder/pricing-page-url';\nimport { BUILDER_THANK_YOU_PAGE_ID } from './builder/success-url';\nimport { PRICING_PLANS_APP_ID } from './constants';\nimport { findLegacyPricingPage } from './legacy/pages';\nimport type { SiteApiContext, PricingPlansSiteApi } from './types';\n\nconst BUILDER_PAGE_IDS = [BUILDER_PRICING_PAGE_ID, BUILDER_PLAN_PAGE_ID, BUILDER_THANK_YOU_PAGE_ID];\n\nexport function createSiteApi(context: SiteApiContext): PricingPlansSiteApi {\n if (findLegacyPricingPage(context.pages)) {\n return createLegacyOoiSiteApi(context);\n }\n\n if (\n Object.values(context.pages).some((page) => page.appDefinitionId === PRICING_PLANS_APP_ID) ||\n BUILDER_PAGE_IDS.some((appPageId) => findAppPage(context.pages, appPageId))\n ) {\n return createBuilderSiteApi(context);\n }\n\n return createNotInstalledSiteApi();\n}\n","import { defineService } from '@wix/services-definitions';\n\ntype PublicApiCaller = {\n callPublicApi(\n appDefinitionId: string,\n methodPath: string | string[],\n args?: unknown[],\n ): Promise<unknown>;\n};\n\nexport const PublicApiCallerDefinition = defineService<PublicApiCaller>(\n '@wix/site-service-public-api-caller',\n);\n","import { usePages } from '@wix/react-component-utils';\nimport { useGetService, useService } from '@wix/services-manager-react';\nimport { RouterDefinition } from '@wix/site-service-router/definition';\nimport { UrlDefinition } from '@wix/site-service-url/definition';\nimport { useMemo } from 'react';\nimport { PRICING_PLANS_APP_ID } from './constants';\nimport { createSiteApi } from './create-site-api';\nimport { PublicApiCallerDefinition } from './public-api-caller';\nimport type { PricingPlansSiteApi } from './types';\n\n/**\n * Navigation to Pricing Plans pages that works with both versions of the Pricing Plans app: the\n * legacy app (OOI) and the Builder app. The hook detects which one the site runs and uses its\n * pages, so the calls are the same for both.\n *\n * Calling the hook is safe on any site. When Pricing Plans isn't installed on the site, every method\n * it returns rejects with the error `Pricing Plans is not installed on the site.` and doesn't\n * navigate. The hook treats Pricing Plans as installed when the site has at least one Pricing Plans\n * page.\n *\n * Use it inside a site component or context provider, and list these services in the extension's\n * `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url`,\n * `@wix/site-service-router` and `@wix/site-service-public-api-caller`.\n *\n * @example\n * const { navigateToPlanPage } = usePricingPlansSiteApi();\n *\n * <button onClick={() => navigateToPlanPage({ planId })}>Buy plan</button>\n */\nexport function usePricingPlansSiteApi(): PricingPlansSiteApi {\n const pages = usePages();\n const url = useService(UrlDefinition);\n const getService = useGetService();\n\n return useMemo(\n () =>\n createSiteApi({\n pages,\n siteUrl: url.siteUrl,\n sectionUrl: (appDefinitionId, sectionId, discardRouterPageSuffix) =>\n url.appSectionRelativeUrl(appDefinitionId, sectionId, discardRouterPageSuffix),\n navigateTo: (href) => getService(RouterDefinition).navigateTo({ href }),\n callPublicApi: (methodPath, args) =>\n getService(PublicApiCallerDefinition).callPublicApi(\n PRICING_PLANS_APP_ID,\n methodPath,\n args,\n ),\n }),\n [pages, url, getService],\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["englishMessages"],"sources":["../src/pricing-details/format-price.ts","../src/assets/locale/messages_en.dev.json","../src/pricing-details/messages.ts","../src/pricing-details/translate.ts","../src/pricing-details/variant-labels.ts","../src/pricing-details/pricing-details.ts","../src/use-pricing-plans-pricing-details.ts","../src/constants.ts","../src/url.ts","../src/app-pages.ts","../src/builder/return-url.ts","../src/builder/checkout-query.ts","../src/builder/plan-page-url.ts","../src/builder/pricing-page-url.ts","../src/builder/success-url.ts","../src/adapters/navigate-to-page.ts","../src/builder/checkout.ts","../src/builder/plan-purchase.ts","../src/adapters/purchase-plan.ts","../src/adapters/builder.ts","../src/legacy/pages.ts","../src/legacy/pricing-page-url.ts","../src/legacy/plan-page-url.ts","../src/adapters/legacy-ooi.ts","../src/adapters/not-installed.ts","../src/create-site-api.ts","../src/use-pricing-plans-site-api.ts"],"sourcesContent":["export function formatPrice(\n amount: string | undefined,\n currency: string | undefined,\n locale: string,\n trimTrailingZeroes = false,\n): string {\n if (!amount || !currency) {\n return amount ?? '';\n }\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n trailingZeroDisplay: trimTrailingZeroes ? 'stripIfInteger' : 'auto',\n }).format(Number(amount));\n } catch {\n return amount;\n }\n}\n","","import englishMessages from '../assets/locale/messages_en.dev.json';\n\nexport type Messages = Readonly<Record<string, string>>;\n\ntype MessageFiles = Record<string, () => Promise<{ default: Messages }>>;\n\nexport const ENGLISH_MESSAGES: Messages = englishMessages;\n\nconst MESSAGE_FILES: MessageFiles = import.meta.glob<{ default: Messages }>([\n '../assets/locale/messages_*.json',\n '!../assets/locale/messages_*.dev.json',\n '!../assets/locale/messages_en.json',\n]);\n\n// Behind import.meta.env.DEV, so the production build of the consumer app leaves them out.\nconst DEV_MESSAGE_FILES: MessageFiles = import.meta.env?.DEV\n ? import.meta.glob<{ default: Messages }>([\n '../assets/locale/messages_*.dev.json',\n '!../assets/locale/messages_en.dev.json',\n ])\n : {};\n\nconst loadedMessages = new Map<string, Promise<Messages>>();\n\nconst messagesFile = (language: string) => `../assets/locale/messages_${language}.json`;\n\nconst devMessagesFile = (language: string) => `../assets/locale/messages_${language}.dev.json`;\n\nexport function messageFileLanguages(language: string): string[] {\n const [baseLanguage] = language.split(/[-_]/);\n\n return baseLanguage && baseLanguage !== language ? [language, baseLanguage] : [language];\n}\n\nconst loadFile = async (load: MessageFiles[string] | undefined): Promise<Messages> =>\n load ? (await load()).default : {};\n\nexport function loadMessages(language: string): Promise<Messages> {\n const fileLanguage = messageFileLanguages(language).find(\n (candidate) =>\n MESSAGE_FILES[messagesFile(candidate)] || DEV_MESSAGE_FILES[devMessagesFile(candidate)],\n );\n\n if (!fileLanguage) {\n return Promise.resolve(ENGLISH_MESSAGES);\n }\n\n const loaded = loadedMessages.get(fileLanguage);\n\n if (loaded) {\n return loaded;\n }\n\n const loading = Promise.all([\n loadFile(MESSAGE_FILES[messagesFile(fileLanguage)]),\n loadFile(DEV_MESSAGE_FILES[devMessagesFile(fileLanguage)]),\n ]).then(\n ([messages, devMessages]) => ({ ...messages, ...devMessages }),\n () => {\n loadedMessages.delete(fileLanguage);\n\n return ENGLISH_MESSAGES;\n },\n );\n\n loadedMessages.set(fileLanguage, loading);\n\n return loading;\n}\n","import type { I18n, InitI18n } from '../types';\nimport { ENGLISH_MESSAGES, loadMessages } from './messages';\n\nexport type Translate = (key: string, values?: Record<string, number>) => string;\n\nconst translations = new WeakMap<InitI18n, Map<string, Promise<Translate>>>();\n\nconst initialized = (i18n: I18n) =>\n i18n.isInitialized\n ? Promise.resolve()\n : new Promise<void>((resolve) => {\n i18n.on('initialized', () => resolve());\n });\n\nasync function buildTranslate(initI18n: InitI18n, language: string): Promise<Translate> {\n const messages = await loadMessages(language);\n const i18n = initI18n({ locale: language, messages: { ...ENGLISH_MESSAGES, ...messages } });\n\n await initialized(i18n);\n\n if (!i18n.modules?.i18nFormat) {\n throw new Error(\n 'Pricing texts need an i18next instance with ICU messages, such as initI18n of @wix/fed-cli-i18next.',\n );\n }\n\n // Typed loosely in I18n, so the overloaded t of every i18next version matches it.\n const t = i18n.t.bind(i18n) as unknown as (\n key: string,\n values?: Record<string, number>,\n ) => unknown;\n\n return (key, values) => String(t(key, values));\n}\n\nexport function createTranslate(initI18n: InitI18n, language: string): Promise<Translate> {\n const languages = translations.get(initI18n) ?? new Map<string, Promise<Translate>>();\n\n translations.set(initI18n, languages);\n\n const existing = languages.get(language);\n\n if (existing) {\n return existing;\n }\n\n const building = buildTranslate(initI18n, language);\n\n languages.set(language, building);\n building.catch(() => languages.delete(language));\n\n return building;\n}\n","import type { plansV3 } from '@wix/pricing-plans';\nimport type { FormattedAdditionalFee } from '../types';\nimport { formatPrice } from './format-price';\nimport type { Translate } from './translate';\n\ntype PricingVariant = plansV3.PricingVariant;\n\nconst CYCLE_KEYS: Record<string, string> = {\n DAY: 'pp.period-recurrency.every-day-plural',\n WEEK: 'pp.period-recurrency.every-week-plural',\n MONTH: 'pp.period-recurrency.every-month-plural',\n YEAR: 'pp.period-recurrency.every-year-plural',\n};\n\nconst DURATION_KEYS: Record<string, string> = {\n DAY: 'pp.plan-validity.valid-for-days-v2',\n WEEK: 'pp.plan-validity.valid-for-weeks-v2',\n MONTH: 'pp.plan-validity.valid-for-months-v2',\n YEAR: 'pp.plan-validity.valid-for-years-v2',\n};\n\nconst isUnlimitedVariant = (variant: PricingVariant) =>\n variant.billingTerms?.endType === 'UNTIL_CANCELLED';\n\nconst getCycleDuration = (variant: PricingVariant) =>\n parseInt(variant.billingTerms?.billingCycle?.count ?? '1', 10);\n\nfunction isRecurringVariant(variant: PricingVariant) {\n const terms = variant.billingTerms;\n\n if (!terms?.billingCycle) {\n return false;\n }\n\n if (terms.endType === 'CYCLES_COMPLETED') {\n return terms.cyclesCompletedDetails?.billingCycleCount !== '1';\n }\n\n return true;\n}\n\nexport const hasFreeTrialDays = (variant: PricingVariant) => Boolean(variant.freeTrialDays);\n\nexport function getCycleLabel(variant: PricingVariant, t: Translate): string {\n const key = CYCLE_KEYS[variant.billingTerms?.billingCycle?.period ?? ''];\n\n if (!isRecurringVariant(variant) || !key) {\n return '';\n }\n\n return t(key, { count: getCycleDuration(variant) });\n}\n\nexport function getDurationLabel(variant: PricingVariant, t: Translate): string {\n if (isUnlimitedVariant(variant)) {\n return t('pp.plan-validity.valid-unlimited');\n }\n\n const key = DURATION_KEYS[variant.billingTerms?.billingCycle?.period ?? ''];\n const cycleDuration = getCycleDuration(variant);\n const cycleCount = parseInt(\n variant.billingTerms?.cyclesCompletedDetails?.billingCycleCount ?? '',\n 10,\n );\n\n if (!key || !cycleDuration || !cycleCount) {\n return '';\n }\n\n return t(key, { amount: cycleDuration * cycleCount });\n}\n\nexport function getFreeTrialLabel(variant: PricingVariant, t: Translate): string {\n if (!variant.freeTrialDays) {\n return '';\n }\n\n return t(isUnlimitedVariant(variant) ? 'pp.free-trial-days-unlimited' : 'pp.free-trial-days', {\n count: variant.freeTrialDays,\n });\n}\n\nexport function getAdditionalFees(\n variant: PricingVariant,\n currency: string | undefined,\n locale: string,\n trimTrailingZeroes?: boolean,\n): FormattedAdditionalFee[] {\n return (variant.fees ?? [])\n .filter((fee) => Boolean(fee.fixedAmountOptions?.amount))\n .map((fee) => ({\n name: fee.name ?? '',\n amount: formatPrice(fee.fixedAmountOptions?.amount, currency, locale, trimTrailingZeroes),\n }));\n}\n","import type { plansV3 } from '@wix/pricing-plans';\nimport type {\n GetTranslatedPricingDetailsOptions,\n PricingDetailsApi,\n PricingDetailsOptions,\n TranslatedPricingDetails,\n} from '../types';\nimport { formatPrice } from './format-price';\nimport { createTranslate } from './translate';\nimport type { Translate } from './translate';\nimport {\n getAdditionalFees,\n getCycleLabel,\n getDurationLabel,\n getFreeTrialLabel,\n hasFreeTrialDays,\n} from './variant-labels';\n\nconst EMPTY_PRICING_DETAILS: TranslatedPricingDetails = {\n price: '',\n cycle: '',\n duration: '',\n freeTrial: '',\n additionalFees: [],\n};\n\nfunction getVariantPricingDetails(\n plan: plansV3.Plan,\n variant: plansV3.PricingVariant,\n t: Translate,\n locale: string,\n options?: GetTranslatedPricingDetailsOptions,\n): TranslatedPricingDetails {\n const amount = plan.currency ? variant.pricingStrategies?.[0]?.flatRate?.amount : undefined;\n\n return {\n price: formatPrice(amount, plan.currency, locale, options?.trimTrailingZeroes),\n cycle: getCycleLabel(variant, t),\n duration: getDurationLabel(variant, t),\n freeTrial: getFreeTrialLabel(variant, t),\n additionalFees: getAdditionalFees(variant, plan.currency, locale, options?.trimTrailingZeroes),\n };\n}\n\nfunction getPlanPricingDetails(\n plan: plansV3.Plan,\n t: Translate,\n locale: string,\n options?: GetTranslatedPricingDetailsOptions,\n): TranslatedPricingDetails {\n const variants = plan.pricingVariants ?? [];\n const [firstVariant] = variants;\n\n if (!firstVariant) {\n return EMPTY_PRICING_DETAILS;\n }\n\n const firstVariantDetails = getVariantPricingDetails(plan, firstVariant, t, locale, options);\n\n if (variants.length === 1) {\n return firstVariantDetails;\n }\n\n // A free trial can be set per variant through the API, so the plan shows one when any variant has it.\n const freeTrialVariant = variants.find(hasFreeTrialDays);\n\n return {\n ...firstVariantDetails,\n price: t('pp.pricing-details.multiple-prices'),\n cycle: '',\n freeTrial: freeTrialVariant ? getFreeTrialLabel(freeTrialVariant, t) : '',\n };\n}\n\nexport function createPricingDetailsApi({\n initI18n,\n language,\n}: PricingDetailsOptions): PricingDetailsApi {\n return {\n getTranslatedPricingDetails: async (plan, options) =>\n getPlanPricingDetails(plan, await createTranslate(initI18n, language), language, options),\n getTranslatedPricingDetailsPerVariant: async (plan, options) => {\n const t = await createTranslate(initI18n, language);\n\n return (plan.pricingVariants ?? []).map((variant) => {\n const [categoryId] = variant.categoryIds ?? [];\n\n return {\n ...getVariantPricingDetails(plan, variant, t, language, options),\n pricingVariantId: variant._id ?? '',\n categoryName: categoryId ? options?.variantCategoryNameById?.[categoryId] : undefined,\n };\n });\n },\n };\n}\n","import { useMemo } from 'react';\nimport { createPricingDetailsApi } from './pricing-details/pricing-details';\nimport type { PricingDetailsApi, PricingDetailsOptions } from './types';\n\n/**\n * Pricing texts of Pricing Plans plans, like the legacy `getTranslatedPricingDetails` and\n * `getTranslatedPricingDetailsPerVariant`.\n *\n * The texts are translated with an i18next instance the hook builds with the app's `initI18n`, so\n * the i18next runtime stays with the app and the app's own instance isn't changed. Its instances\n * have to format ICU messages, like the ones `initI18n` of `@wix/fed-cli-i18next` creates.\n *\n * The texts depend only on the plan, so the hook works with both apps and on sites without Pricing\n * Plans, and needs no `serviceDependencies`.\n *\n * @param options The app's i18next factory, and the language of the texts.\n *\n * @example\n * const { getTranslatedPricingDetails } = usePricingPlansPricingDetails({\n * initI18n,\n * language: essentialsI18n.getLanguage(),\n * });\n *\n * const { price, cycle } = await getTranslatedPricingDetails(plan);\n */\nexport function usePricingPlansPricingDetails({\n initI18n,\n language,\n}: PricingDetailsOptions): PricingDetailsApi {\n return useMemo(() => createPricingDetailsApi({ initI18n, language }), [initI18n, language]);\n}\n","export const PRICING_PLANS_APP_ID = '1522827f-c56c-a5c9-2ac9-00f9e6ae12d3';\n","export function siteHref(siteUrl: string, path: string): string {\n return `${siteUrl.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`;\n}\n\nexport function withQuery(url: string, query: URLSearchParams): string {\n const search = query.toString();\n\n return search ? `${url}?${search}` : url;\n}\n\n// Resolved against the site, so a site-relative URL, like a checkout URL, doesn't throw.\nexport function withSearchParams(\n siteUrl: string,\n url: string,\n entries: Array<[string, string | undefined]>,\n): string {\n const result = new URL(url, siteUrl);\n\n for (const [name, value] of entries) {\n if (value) result.searchParams.set(name, value);\n }\n\n return result.href;\n}\n\nexport function queryOf(entries: Array<[string, string | undefined]>): URLSearchParams {\n return new URLSearchParams(\n entries.filter((entry): entry is [string, string] => Boolean(entry[1])),\n );\n}\n\nexport function encodePricingVariants(pricingVariantsByPlanId: Record<string, string[]>): string {\n return Object.entries(pricingVariantsByPlanId)\n .filter(([, pricingVariantIds]) => pricingVariantIds.length)\n .map(([planId, pricingVariantIds]) => [planId, ...pricingVariantIds].join(':'))\n .join(',');\n}\n","import { PRICING_PLANS_APP_ID } from './constants';\nimport type { Page, Pages, UrlContext } from './types';\nimport { siteHref } from './url';\n\nexport function findAppPage(pages: Pages, appPageId: string): Page | undefined {\n const candidates = Object.values(pages).filter(\n (page) => !page.popup && page.appPageId === appPageId,\n );\n const unowned = candidates.filter((page) => !page.appDefinitionId);\n\n return (\n candidates.find((page) => page.appDefinitionId === PRICING_PLANS_APP_ID) ??\n (unowned.length === 1 ? unowned[0] : undefined)\n );\n}\n\nexport function appPageUrl(context: UrlContext, appPageId: string): string | undefined {\n const path = findAppPage(context.pages, appPageId)\n ? context.sectionUrl(PRICING_PLANS_APP_ID, appPageId)\n : undefined;\n\n return path ? siteHref(context.siteUrl, path) : undefined;\n}\n","import type { NavigationPolicy, UrlContext } from '../types';\nimport { siteHref, withQuery } from '../url';\n\nexport function returnUrl(\n { pages, siteUrl, sectionUrl }: UrlContext,\n navigation: NavigationPolicy | undefined,\n): string | undefined {\n if (!navigation) return;\n\n switch (navigation.type) {\n case 'url':\n return onSiteUrl(siteUrl, navigation.url);\n case 'page': {\n const page = pages[navigation.pageId];\n\n return page && siteHref(siteUrl, page.path);\n }\n case 'section': {\n const { appDefinitionId, sectionId, state, queryParams, discardRouterPageSuffix } =\n navigation.options;\n const path = sectionUrl(appDefinitionId, sectionId, discardRouterPageSuffix);\n\n if (!path) return;\n\n const url = siteHref(siteUrl, state ? `${path.replace(/\\/$/, '')}/${state}` : path);\n\n return queryParams\n ? withQuery(url, new URLSearchParams({ appSectionParams: JSON.stringify(queryParams) }))\n : url;\n }\n }\n}\n\n// Matches the targets the Thank You page accepts as `returnUrl`; it sends any other to the homepage.\nfunction onSiteUrl(siteUrl: string, url: string): string | undefined {\n try {\n const site = new URL(siteUrl.endsWith('/') ? siteUrl : `${siteUrl}/`);\n const target = new URL(url.startsWith('/') ? siteHref(siteUrl, url) : url, site);\n const basePath = site.pathname.replace(/\\/$/, '');\n\n if (\n target.origin === site.origin &&\n !target.username &&\n !target.password &&\n (target.protocol === 'https:' || target.protocol === 'http:') &&\n (target.pathname === basePath || target.pathname.startsWith(`${basePath}/`))\n ) {\n return target.href;\n }\n } catch {\n return;\n }\n}\n","import type { CheckoutOptions, UrlContext } from '../types';\nimport { returnUrl } from './return-url';\n\nexport function checkoutQueryEntries(\n context: UrlContext,\n checkout: CheckoutOptions = {},\n): Array<[string, string | undefined]> {\n return [\n ['minStartDate', checkout.minStartDate],\n ['maxStartDate', checkout.maxStartDate],\n ['returnUrl', returnUrl(context, checkout.thankYouPage?.navigation)],\n ];\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigateToPlanPageOptions, UrlContext } from '../types';\nimport { queryOf, withQuery } from '../url';\nimport { checkoutQueryEntries } from './checkout-query';\n\nexport const BUILDER_PLAN_PAGE_ID = 'plan-customization-page';\n\nexport function builderPlanPageUrl(\n context: UrlContext,\n { planId, pricingVariantId, ...checkout }: NavigateToPlanPageOptions,\n): string | undefined {\n const url = appPageUrl(context, BUILDER_PLAN_PAGE_ID);\n\n if (!url) return;\n\n return withQuery(\n `${url.replace(/\\/+$/, '')}/${encodeURIComponent(planId)}`,\n queryOf([['pricingVariantId', pricingVariantId], ...checkoutQueryEntries(context, checkout)]),\n );\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigateToPricingPageOptions, UrlContext } from '../types';\nimport { encodePricingVariants, queryOf, withQuery } from '../url';\nimport { checkoutQueryEntries } from './checkout-query';\n\nexport const BUILDER_PRICING_PAGE_ID = 'plans-page';\n\nexport function builderPricingPageUrl(\n context: UrlContext,\n { planIds, pricingVariantsByPlanId, checkout }: NavigateToPricingPageOptions,\n): string | undefined {\n const url = appPageUrl(context, BUILDER_PRICING_PAGE_ID);\n\n if (!url) return;\n\n const pricingVariants = pricingVariantsByPlanId && encodePricingVariants(pricingVariantsByPlanId);\n\n return withQuery(\n url,\n queryOf([\n pricingVariants ? ['pricingVariants', pricingVariants] : ['planIds', planIds?.join(',')],\n ...checkoutQueryEntries(context, checkout),\n ]),\n );\n}\n","import { appPageUrl } from '../app-pages';\nimport type { NavigationPolicy, UrlContext } from '../types';\nimport { withSearchParams } from '../url';\nimport { returnUrl } from './return-url';\n\nexport const BUILDER_THANK_YOU_PAGE_ID = 'thank-you-page';\n\nexport function withSuccessUrl(\n context: UrlContext,\n checkoutUrl: string,\n navigation: NavigationPolicy | undefined,\n): string {\n const thankYouPage = appPageUrl(context, BUILDER_THANK_YOU_PAGE_ID);\n const target = returnUrl(context, navigation);\n\n if (!thankYouPage || !target) {\n return checkoutUrl;\n }\n\n return withSearchParams(context.siteUrl, checkoutUrl, [\n ['successUrl', withSearchParams(context.siteUrl, thankYouPage, [['returnUrl', target]])],\n ]);\n}\n","import type { SiteApiContext } from '../types';\n\nexport async function navigateToPage(\n navigateTo: SiteApiContext['navigateTo'],\n href: string | undefined,\n pageName: string,\n): Promise<void> {\n if (!href) {\n throw new Error(`Cannot navigate to ${pageName}, because it is not available on the site.`);\n }\n\n if (!(await navigateTo(href))) {\n throw new Error(`Navigation to ${pageName} failed.`);\n }\n}\n\nexport async function getPageUrl(href: string | undefined, pageName: string): Promise<string> {\n if (!href) {\n throw new Error(`Cannot get ${pageName} URL, because it is not available on the site.`);\n }\n\n return href;\n}\n","import { cartV2 } from '@wix/ecom';\nimport { plansV3 } from '@wix/pricing-plans';\nimport { PRICING_PLANS_APP_ID } from '../constants';\n\nexport async function loadPublicPlan(planId: string): Promise<plansV3.Plan | undefined> {\n const { items } = await plansV3\n .queryPlans()\n .eq('_id', planId)\n .eq('visibility', 'PUBLIC')\n .limit(1)\n .find();\n\n return items[0];\n}\n\nexport type PlanCartOptions = {\n membersOnly: boolean;\n checkoutFlowId?: string;\n};\n\nexport async function createPlanCart(\n planId: string,\n pricingVariantId: string,\n { membersOnly, checkoutFlowId }: PlanCartOptions,\n): Promise<string> {\n const cart = await cartV2.createCart({\n cart: {\n source: {\n channelType: 'WEB',\n externalReferences: checkoutFlowId\n ? [{ appId: PRICING_PLANS_APP_ID, resourceId: checkoutFlowId }]\n : undefined,\n },\n },\n catalogItems: [\n {\n quantity: 1,\n catalogReference: {\n appId: PRICING_PLANS_APP_ID,\n catalogItemId: planId,\n options: { type: 'PLAN', planOptions: { pricingVariantId, membersOnly } },\n },\n },\n ],\n });\n\n if (!cart?._id) {\n throw new Error('Cart creation did not return an ID');\n }\n\n return cart._id;\n}\n\nexport async function getCheckoutUrl(cartId: string): Promise<string> {\n const { checkoutUrl } = await cartV2.getCheckoutUrl(cartId);\n\n if (!checkoutUrl) {\n throw new Error('Checkout URL was not returned');\n }\n\n return checkoutUrl;\n}\n","import type { plansV3 } from '@wix/pricing-plans';\n\nexport type PlanPurchase = {\n pricingVariantId: string;\n requiresCustomization: boolean;\n};\n\nexport function planPurchase(\n plan: plansV3.Plan | undefined,\n pricingVariantId?: string,\n): PlanPurchase {\n const variants = (plan?.pricingVariants ?? []).filter(\n (variant): variant is plansV3.PricingVariant & { _id: string } =>\n Boolean(variant._id) && variant.visible !== false,\n );\n\n if (!plan || !variants.length) {\n throw new Error('Plan is not available for online purchase.');\n }\n\n const variant = pricingVariantId\n ? variants.find(({ _id }) => _id === pricingVariantId)\n : variants[0];\n\n if (!variant) {\n throw new Error('Pricing variant is not available for online purchase.');\n }\n\n return {\n pricingVariantId: variant._id,\n requiresCustomization: Boolean(plan.formId) || variant.billingTerms?.startType === 'CUSTOM',\n };\n}\n","import { createPlanCart, getCheckoutUrl, loadPublicPlan } from '../builder/checkout';\nimport type { PlanCartOptions } from '../builder/checkout';\nimport { planPurchase } from '../builder/plan-purchase';\nimport type { NavigateToPlanPageOptions, SiteApiContext } from '../types';\nimport { navigateToPage } from './navigate-to-page';\n\nexport type PurchaseFlow = {\n cart: PlanCartOptions;\n customizationUrl(options: NavigateToPlanPageOptions): string | undefined;\n checkoutUrl(checkoutUrl: string, cartId: string): string;\n};\n\nexport async function purchasePlan(\n navigateTo: SiteApiContext['navigateTo'],\n options: NavigateToPlanPageOptions,\n flow: PurchaseFlow,\n): Promise<void> {\n const { pricingVariantId, requiresCustomization } = planPurchase(\n await loadPublicPlan(options.planId),\n options.pricingVariantId,\n );\n\n if (requiresCustomization) {\n return navigateToPage(\n navigateTo,\n flow.customizationUrl({ ...options, pricingVariantId }),\n 'plan page',\n );\n }\n\n const cartId = await createPlanCart(options.planId, pricingVariantId, flow.cart);\n\n return navigateToPage(\n navigateTo,\n flow.checkoutUrl(await getCheckoutUrl(cartId), cartId),\n 'checkout',\n );\n}\n","import { builderPlanPageUrl } from '../builder/plan-page-url';\nimport { builderPricingPageUrl } from '../builder/pricing-page-url';\nimport { returnUrl } from '../builder/return-url';\nimport { withSuccessUrl } from '../builder/success-url';\nimport type { SiteApiContext, PricingPlansSiteApi } from '../types';\nimport { getPageUrl, navigateToPage } from './navigate-to-page';\nimport { purchasePlan } from './purchase-plan';\n\nexport function createBuilderSiteApi({\n navigateTo,\n ...context\n}: SiteApiContext): PricingPlansSiteApi {\n return {\n navigateToPricingPage: (options = {}) =>\n navigateToPage(navigateTo, builderPricingPageUrl(context, options), 'pricing page'),\n getPricingPageUrl: (options = {}) =>\n getPageUrl(builderPricingPageUrl(context, options), 'pricing page'),\n navigateToPlanPage: (options) => {\n const navigation = options.thankYouPage?.navigation;\n\n return purchasePlan(navigateTo, options, {\n cart: { membersOnly: Boolean(returnUrl(context, navigation)) },\n customizationUrl: (purchaseOptions) => builderPlanPageUrl(context, purchaseOptions),\n checkoutUrl: (checkoutUrl) => withSuccessUrl(context, checkoutUrl, navigation),\n });\n },\n };\n}\n","import { findAppPage } from '../app-pages';\nimport type { Page, Pages } from '../types';\n\nexport const LEGACY_PRICING_PAGE_ID = 'membership_plan_picker_tpa';\n\nexport function findLegacyPricingPage(pages: Pages): Page | undefined {\n return findAppPage(pages, LEGACY_PRICING_PAGE_ID);\n}\n","import { appPageUrl } from '../app-pages';\nimport type {\n BiOptions,\n CheckoutOptions,\n NavigateToPricingPageOptions,\n UrlContext,\n} from '../types';\nimport { encodePricingVariants, queryOf, withQuery } from '../url';\nimport { LEGACY_PRICING_PAGE_ID } from './pages';\n\nexport function legacyPricingPageUrl(\n context: UrlContext,\n options: NavigateToPricingPageOptions,\n): string | undefined {\n const url = appPageUrl(context, LEGACY_PRICING_PAGE_ID);\n\n return url && withQuery(url, pricingPageQuery(options));\n}\n\nfunction pricingPageQuery({\n planIds,\n pricingVariantsByPlanId,\n title,\n subtitle,\n biOptions,\n checkout,\n}: NavigateToPricingPageOptions): URLSearchParams {\n const pricingVariants = pricingVariantsByPlanId && encodePricingVariants(pricingVariantsByPlanId);\n\n return queryOf([\n ...integrationQueryEntries({ biOptions, checkout }),\n pricingVariants ? ['pricingVariants', pricingVariants] : ['planIds', planIds?.join(',')],\n ['title', title],\n ['subtitle', subtitle],\n ]);\n}\n\nexport function integrationQueryEntries({\n biOptions,\n checkout,\n}: {\n biOptions?: BiOptions;\n checkout?: CheckoutOptions;\n}): Array<[string, string | undefined]> {\n const { content, navigation } = checkout?.thankYouPage ?? {};\n\n return [\n ['destination', navigation?.type === 'url' ? navigation.url : undefined],\n ['page', navigation?.type === 'page' ? navigation.pageId : undefined],\n ['section', navigation?.type === 'section' ? encodeBase64Url(navigation.options) : undefined],\n ['referral', biOptions?.referralInfo],\n ['referralId', biOptions?.referralId],\n ['maxStartDate', checkout?.maxStartDate],\n ['minStartDate', checkout?.minStartDate],\n ['thankYouTitle', content?.title],\n ['thankYouMessage', content?.message],\n ['thankYouCTA', content?.cta],\n ];\n}\n\nfunction encodeBase64Url(input: unknown): string {\n const bytes = encodeURIComponent(JSON.stringify(input)).replace(/%[0-9A-F]{2}/g, (percent) =>\n String.fromCharCode(parseInt(percent.slice(1), 16)),\n );\n\n return btoa(bytes).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n}\n","import { appPageUrl } from '../app-pages';\nimport type { CheckoutOptions, NavigateToPlanPageOptions, UrlContext } from '../types';\nimport { queryOf, withQuery, withSearchParams } from '../url';\nimport { integrationQueryEntries } from './pricing-page-url';\n\nconst LEGACY_PLAN_CUSTOMIZATION_PAGE_ID = 'Plan Customization';\nconst LEGACY_THANK_YOU_PAGE_ID = 'Thank You';\n\nexport function legacyPlanCustomizationUrl(\n context: UrlContext,\n { planId, pricingVariantId, checkoutFlowId, biOptions, ...checkout }: NavigateToPlanPageOptions,\n): string | undefined {\n const url = appPageUrl(context, LEGACY_PLAN_CUSTOMIZATION_PAGE_ID);\n\n return (\n url &&\n withQuery(\n url,\n queryOf([\n ...integrationQueryEntries({ biOptions, checkout }),\n ['planId', planId],\n ['checkoutFlowId', checkoutFlowId],\n ['pricingVariantId', pricingVariantId],\n ]),\n )\n );\n}\n\nexport function isCustomPurchaseFlow({ thankYouPage }: CheckoutOptions): boolean {\n return Boolean(\n thankYouPage?.content ||\n thankYouPage?.navigation?.type === 'section' ||\n thankYouPage?.navigation?.type === 'page',\n );\n}\n\nexport function legacyCheckoutUrl(\n context: UrlContext,\n checkoutUrl: string,\n cartId: string,\n options: NavigateToPlanPageOptions,\n): string {\n const successUrl = legacySuccessUrl(context, cartId, options);\n\n return withSearchParams(context.siteUrl, checkoutUrl, [\n // Encoded once more, the way the legacy app hands it to eCom checkout.\n ['successUrl', successUrl && encodeURIComponent(successUrl)],\n ['disableContinueShopping', 'true'],\n ]);\n}\n\nfunction legacySuccessUrl(\n context: UrlContext,\n cartId: string,\n { planId, biOptions, ...checkout }: NavigateToPlanPageOptions,\n): string | undefined {\n const url = appPageUrl(context, LEGACY_THANK_YOU_PAGE_ID);\n\n if (!url || !isCustomPurchaseFlow(checkout)) return;\n\n return withQuery(\n url,\n queryOf([\n ...integrationQueryEntries({ biOptions, checkout }),\n ['isEcom', 'true'],\n ['cartId', cartId],\n ['planId', planId],\n ]),\n );\n}\n","import {\n isCustomPurchaseFlow,\n legacyCheckoutUrl,\n legacyPlanCustomizationUrl,\n} from '../legacy/plan-page-url';\nimport { legacyPricingPageUrl } from '../legacy/pricing-page-url';\nimport type { SiteApiContext, PricingPlansSiteApi } from '../types';\nimport { getPageUrl, navigateToPage } from './navigate-to-page';\nimport { purchasePlan } from './purchase-plan';\n\nexport function createLegacyOoiSiteApi({\n navigateTo,\n ...context\n}: SiteApiContext): PricingPlansSiteApi {\n return {\n navigateToPricingPage: (options = {}) =>\n navigateToPage(navigateTo, legacyPricingPageUrl(context, options), 'pricing page'),\n getPricingPageUrl: (options = {}) =>\n getPageUrl(legacyPricingPageUrl(context, options), 'pricing page'),\n // Keep in sync with the legacy app's navigateToCheckout on eCommerce sites:\n // pricing-plans-tpa/src/viewer.app.ts and services/ecom-client.ts in wix-private/pricing-plans.\n navigateToPlanPage: (options) => {\n const checkoutFlowId = options.checkoutFlowId ?? crypto.randomUUID();\n const flowOptions = { ...options, checkoutFlowId };\n\n return purchasePlan(navigateTo, flowOptions, {\n cart: { membersOnly: isCustomPurchaseFlow(options), checkoutFlowId },\n customizationUrl: (purchaseOptions) => legacyPlanCustomizationUrl(context, purchaseOptions),\n checkoutUrl: (checkoutUrl, cartId) =>\n legacyCheckoutUrl(context, checkoutUrl, cartId, flowOptions),\n });\n },\n };\n}\n","import type { PricingPlansSiteApi } from '../types';\n\nconst notInstalled = () => Promise.reject(new Error('Pricing Plans is not installed on the site.'));\n\nexport function createNotInstalledSiteApi(): PricingPlansSiteApi {\n return {\n navigateToPricingPage: notInstalled,\n getPricingPageUrl: notInstalled,\n navigateToPlanPage: notInstalled,\n };\n}\n","import { createBuilderSiteApi } from './adapters/builder';\nimport { createLegacyOoiSiteApi } from './adapters/legacy-ooi';\nimport { createNotInstalledSiteApi } from './adapters/not-installed';\nimport { findAppPage } from './app-pages';\nimport { BUILDER_PLAN_PAGE_ID } from './builder/plan-page-url';\nimport { BUILDER_PRICING_PAGE_ID } from './builder/pricing-page-url';\nimport { BUILDER_THANK_YOU_PAGE_ID } from './builder/success-url';\nimport { PRICING_PLANS_APP_ID } from './constants';\nimport { findLegacyPricingPage } from './legacy/pages';\nimport type { SiteApiContext, PricingPlansSiteApi } from './types';\n\nconst BUILDER_PAGE_IDS = [BUILDER_PRICING_PAGE_ID, BUILDER_PLAN_PAGE_ID, BUILDER_THANK_YOU_PAGE_ID];\n\nexport function createSiteApi(context: SiteApiContext): PricingPlansSiteApi {\n if (findLegacyPricingPage(context.pages)) {\n return createLegacyOoiSiteApi(context);\n }\n\n if (\n Object.values(context.pages).some((page) => page.appDefinitionId === PRICING_PLANS_APP_ID) ||\n BUILDER_PAGE_IDS.some((appPageId) => findAppPage(context.pages, appPageId))\n ) {\n return createBuilderSiteApi(context);\n }\n\n return createNotInstalledSiteApi();\n}\n","import { usePages } from '@wix/react-component-utils';\nimport { useGetService, useService } from '@wix/services-manager-react';\nimport { RouterDefinition } from '@wix/site-service-router/definition';\nimport { UrlDefinition } from '@wix/site-service-url/definition';\nimport { useMemo } from 'react';\nimport { createSiteApi } from './create-site-api';\nimport type { PricingPlansSiteApi } from './types';\n\n/**\n * Navigation to Pricing Plans pages that works with both versions of the Pricing Plans app: the\n * legacy app (OOI) and the Builder app. The hook detects which one the site runs and uses its\n * pages, so the calls are the same for both.\n *\n * Calling the hook is safe on any site. When Pricing Plans isn't installed on the site, every method\n * it returns rejects with the error `Pricing Plans is not installed on the site.` and doesn't\n * navigate. The hook treats Pricing Plans as installed when the site has at least one Pricing Plans\n * page.\n *\n * Use it inside a site component or context provider, and list these services in the extension's\n * `serviceDependencies`: `@wix/site-service-pages`, `@wix/site-service-url` and\n * `@wix/site-service-router`.\n *\n * @example\n * const { navigateToPlanPage } = usePricingPlansSiteApi();\n *\n * <button onClick={() => navigateToPlanPage({ planId })}>Buy plan</button>\n */\nexport function usePricingPlansSiteApi(): PricingPlansSiteApi {\n const pages = usePages();\n const url = useService(UrlDefinition);\n const getService = useGetService();\n\n return useMemo(\n () =>\n createSiteApi({\n pages,\n siteUrl: url.siteUrl,\n sectionUrl: (appDefinitionId, sectionId, discardRouterPageSuffix) =>\n url.appSectionRelativeUrl(appDefinitionId, sectionId, discardRouterPageSuffix),\n navigateTo: (href) => getService(RouterDefinition).navigateTo({ href }),\n }),\n [pages, url, getService],\n );\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/pricing-plans-site-api",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -24,8 +24,7 @@
|
|
|
24
24
|
"build": "yarn generate-translation-keys && yarn typecheck && rolldown -c",
|
|
25
25
|
"typecheck": "tsc --noEmit",
|
|
26
26
|
"test": "vitest",
|
|
27
|
-
"generate-translation-keys": "babel-cli"
|
|
28
|
-
"postinstall": "yarn generate-translation-keys"
|
|
27
|
+
"generate-translation-keys": "babel-cli"
|
|
29
28
|
},
|
|
30
29
|
"dependencies": {
|
|
31
30
|
"@wix/ecom": "^1.0.2514",
|
|
@@ -66,5 +65,5 @@
|
|
|
66
65
|
]
|
|
67
66
|
}
|
|
68
67
|
},
|
|
69
|
-
"falconPackageHash": "
|
|
68
|
+
"falconPackageHash": "d94ec0e506a298d709b6991aa42a0abfd8b691c6dace7aa6dd48a092"
|
|
70
69
|
}
|