@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 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. The Builder app reads fewer options:
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 the Builder app 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.
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 omitted.
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, or when the site has no page to buy it on.
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` and `@wix/site-service-public-api-caller`.
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
- const successUrl = new URL(thankYouPage);
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: async (options) => {
382
- const purchase = planPurchase(await loadPublicPlan(options.planId), options.pricingVariantId);
383
- if (!purchase) throw new Error("Plan is not available for online purchase.");
384
- if (purchase.requiresCustomization) return navigateToPage(navigateTo, builderPlanPageUrl(context, {
385
- ...options,
386
- pricingVariantId: purchase.pricingVariantId
387
- }), "plan page");
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
- pricingVariants ? ["pricingVariants", pricingVariants] : ["planIds", planIds?.join(",")],
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, callPublicApi, ...context }) {
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: async (options) => {
434
- await callPublicApi("navigateToPlanPage", [options]);
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` and `@wix/site-service-public-api-caller`.
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.0.7",
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": "41b286bb03dba0afa07cac4b82f9c665b2b953909b37fb0b77c4caef"
68
+ "falconPackageHash": "d94ec0e506a298d709b6991aa42a0abfd8b691c6dace7aa6dd48a092"
70
69
  }