@monetize.software/sdk 3.0.0-alpha.8 → 3.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/PaywallUI-CCwYgagL.js +26 -0
- package/dist/chunks/PaywallUI-CCwYgagL.js.map +1 -0
- package/dist/chunks/PaywallUI-CDlJL5Em.js +3599 -0
- package/dist/chunks/PaywallUI-CDlJL5Em.js.map +1 -0
- package/dist/chunks/ar-CViBaj16.js +2 -0
- package/dist/chunks/ar-CViBaj16.js.map +1 -0
- package/dist/chunks/{ar-CHae8g-2.js → ar-ClwBmll7.js} +6 -2
- package/dist/chunks/ar-ClwBmll7.js.map +1 -0
- package/dist/chunks/{cs-eZTedzaK.js → cs-Cc_D0W4S.js} +6 -2
- package/dist/chunks/cs-Cc_D0W4S.js.map +1 -0
- package/dist/chunks/cs-DQJWP65K.js +2 -0
- package/dist/chunks/cs-DQJWP65K.js.map +1 -0
- package/dist/chunks/{da-Dca6j8fp.js → da-BtKcMSxH.js} +6 -2
- package/dist/chunks/da-BtKcMSxH.js.map +1 -0
- package/dist/chunks/da-Cyr_IXhb.js +2 -0
- package/dist/chunks/da-Cyr_IXhb.js.map +1 -0
- package/dist/chunks/de-BOCUj1pF.js +2 -0
- package/dist/chunks/de-BOCUj1pF.js.map +1 -0
- package/dist/chunks/{de-BCjn3PUI.js → de-iwQW5eYl.js} +6 -2
- package/dist/chunks/de-iwQW5eYl.js.map +1 -0
- package/dist/chunks/{el-BpXtDTez.js → el-BoH65CeJ.js} +6 -2
- package/dist/chunks/el-BoH65CeJ.js.map +1 -0
- package/dist/chunks/el-C6jLHiEF.js +2 -0
- package/dist/chunks/el-C6jLHiEF.js.map +1 -0
- package/dist/chunks/es-CARHLxHR.js +2 -0
- package/dist/chunks/es-CARHLxHR.js.map +1 -0
- package/dist/chunks/{es-B3P4nlMw.js → es-CkP16_8K.js} +6 -2
- package/dist/chunks/es-CkP16_8K.js.map +1 -0
- package/dist/chunks/fi-B8OhRbwY.js +2 -0
- package/dist/chunks/fi-B8OhRbwY.js.map +1 -0
- package/dist/chunks/{fi-BbQ_Bs0Z.js → fi-yUXSmK1E.js} +6 -2
- package/dist/chunks/fi-yUXSmK1E.js.map +1 -0
- package/dist/chunks/fr-CoM18zzM.js +2 -0
- package/dist/chunks/fr-CoM18zzM.js.map +1 -0
- package/dist/chunks/{fr-BKDUXceO.js → fr-DSZRGsxI.js} +6 -2
- package/dist/chunks/fr-DSZRGsxI.js.map +1 -0
- package/dist/chunks/he-DTDVc3lA.js +2 -0
- package/dist/chunks/he-DTDVc3lA.js.map +1 -0
- package/dist/chunks/{he-BVCHlTtT.js → he-ZUo7cQjk.js} +8 -4
- package/dist/chunks/he-ZUo7cQjk.js.map +1 -0
- package/dist/chunks/hi-BjnS9UeE.js +2 -0
- package/dist/chunks/hi-BjnS9UeE.js.map +1 -0
- package/dist/chunks/{hi-H_Hshh-7.js → hi-CEutBKiG.js} +6 -2
- package/dist/chunks/hi-CEutBKiG.js.map +1 -0
- package/dist/chunks/hu-CN06FMhV.js +2 -0
- package/dist/chunks/hu-CN06FMhV.js.map +1 -0
- package/dist/chunks/{hu-ZWiNfzvN.js → hu-DvEAWGS7.js} +6 -2
- package/dist/chunks/hu-DvEAWGS7.js.map +1 -0
- package/dist/chunks/id-BITgaBxq.js +2 -0
- package/dist/chunks/id-BITgaBxq.js.map +1 -0
- package/dist/chunks/{id-DeiRYsJ1.js → id-_eEMrYMW.js} +6 -2
- package/dist/chunks/id-_eEMrYMW.js.map +1 -0
- package/dist/chunks/index-CLB1AgLg.js +2074 -0
- package/dist/chunks/index-CLB1AgLg.js.map +1 -0
- package/dist/chunks/index-CzDSBl4d.js +2 -0
- package/dist/chunks/index-CzDSBl4d.js.map +1 -0
- package/dist/chunks/{it-UH9OzFhg.js → it-BAmsQbIl.js} +6 -2
- package/dist/chunks/it-BAmsQbIl.js.map +1 -0
- package/dist/chunks/it-DVcsq015.js +2 -0
- package/dist/chunks/it-DVcsq015.js.map +1 -0
- package/dist/chunks/ja-Bim7Ok2e.js +2 -0
- package/dist/chunks/ja-Bim7Ok2e.js.map +1 -0
- package/dist/chunks/{ja-BYC8FRN8.js → ja-BqCZWVKK.js} +8 -4
- package/dist/chunks/ja-BqCZWVKK.js.map +1 -0
- package/dist/chunks/{ko-Bjs2ZRcF.js → ko-CkIzeOzb.js} +8 -4
- package/dist/chunks/ko-CkIzeOzb.js.map +1 -0
- package/dist/chunks/ko-DqEfcVCB.js +2 -0
- package/dist/chunks/ko-DqEfcVCB.js.map +1 -0
- package/dist/chunks/nl-DSNuJWIo.js +2 -0
- package/dist/chunks/nl-DSNuJWIo.js.map +1 -0
- package/dist/chunks/{nl-Ch5HFWQO.js → nl-Mu_KNzli.js} +6 -2
- package/dist/chunks/nl-Mu_KNzli.js.map +1 -0
- package/dist/chunks/{no-CljpinWz.js → no-9HMjljBs.js} +6 -2
- package/dist/chunks/no-9HMjljBs.js.map +1 -0
- package/dist/chunks/no-B5HY_A8_.js +2 -0
- package/dist/chunks/no-B5HY_A8_.js.map +1 -0
- package/dist/chunks/{pl-CUcSS0zZ.js → pl-Cbr2qDwv.js} +6 -2
- package/dist/chunks/pl-Cbr2qDwv.js.map +1 -0
- package/dist/chunks/pl-ChGLn9Sy.js +2 -0
- package/dist/chunks/pl-ChGLn9Sy.js.map +1 -0
- package/dist/chunks/pt-CDLEktT9.js +2 -0
- package/dist/chunks/pt-CDLEktT9.js.map +1 -0
- package/dist/chunks/{pt-BHK0LwkC.js → pt-_jirA6IR.js} +6 -2
- package/dist/chunks/pt-_jirA6IR.js.map +1 -0
- package/dist/chunks/ro-BHCHiXY3.js +2 -0
- package/dist/chunks/ro-BHCHiXY3.js.map +1 -0
- package/dist/chunks/{ro-Bj8cwU2n.js → ro-oZLxhwHc.js} +6 -2
- package/dist/chunks/ro-oZLxhwHc.js.map +1 -0
- package/dist/chunks/ru-B6HgmINj.js +2 -0
- package/dist/chunks/ru-B6HgmINj.js.map +1 -0
- package/dist/chunks/{ru-CgqNy0Gb.js → ru-C2-sqY7B.js} +6 -2
- package/dist/chunks/ru-C2-sqY7B.js.map +1 -0
- package/dist/chunks/sv-DoSs4a9n.js +2 -0
- package/dist/chunks/sv-DoSs4a9n.js.map +1 -0
- package/dist/chunks/{sv-H7jroOQ5.js → sv-y385MWVy.js} +6 -2
- package/dist/chunks/sv-y385MWVy.js.map +1 -0
- package/dist/chunks/{th-Dqm-gpGe.js → th-Bjbv4M1s.js} +6 -2
- package/dist/chunks/th-Bjbv4M1s.js.map +1 -0
- package/dist/chunks/th-UeweOhwg.js +2 -0
- package/dist/chunks/th-UeweOhwg.js.map +1 -0
- package/dist/chunks/tr-BbBr5tyB.js +2 -0
- package/dist/chunks/tr-BbBr5tyB.js.map +1 -0
- package/dist/chunks/{tr-D3zPcNtT.js → tr-DmHo9F8i.js} +8 -4
- package/dist/chunks/tr-DmHo9F8i.js.map +1 -0
- package/dist/chunks/uk-CJTA1SJK.js +2 -0
- package/dist/chunks/uk-CJTA1SJK.js.map +1 -0
- package/dist/chunks/{uk-CoIIs3QI.js → uk-DwvAoTe5.js} +6 -2
- package/dist/chunks/uk-DwvAoTe5.js.map +1 -0
- package/dist/chunks/{vi-C_fruIbh.js → vi-BEpwsVLR.js} +6 -2
- package/dist/chunks/vi-BEpwsVLR.js.map +1 -0
- package/dist/chunks/vi-ZvBo7PbB.js +2 -0
- package/dist/chunks/vi-ZvBo7PbB.js.map +1 -0
- package/dist/chunks/zh-CPZBEb3d.js +2 -0
- package/dist/chunks/zh-CPZBEb3d.js.map +1 -0
- package/dist/chunks/{zh-LDkEV2D9.js → zh-DrG18oGe.js} +7 -3
- package/dist/chunks/zh-DrG18oGe.js.map +1 -0
- package/dist/core.cjs +1 -1
- package/dist/core.cjs.map +1 -1
- package/dist/core.d.ts +110 -17
- package/dist/core.js +17 -1984
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +209 -18
- package/dist/index.js +17 -13
- package/dist/ui.cjs +1 -1
- package/dist/ui.d.ts +174 -17
- package/dist/ui.js +1 -1
- package/package.json +1 -1
- package/dist/chunks/PaywallUI-BrDiS6zg.js +0 -3219
- package/dist/chunks/PaywallUI-BrDiS6zg.js.map +0 -1
- package/dist/chunks/PaywallUI-Bvx8nRL0.js +0 -26
- package/dist/chunks/PaywallUI-Bvx8nRL0.js.map +0 -1
- package/dist/chunks/ar-CHae8g-2.js.map +0 -1
- package/dist/chunks/ar-E1mc8SO_.js +0 -2
- package/dist/chunks/ar-E1mc8SO_.js.map +0 -1
- package/dist/chunks/cs-Dccq6LAT.js +0 -2
- package/dist/chunks/cs-Dccq6LAT.js.map +0 -1
- package/dist/chunks/cs-eZTedzaK.js.map +0 -1
- package/dist/chunks/da-C_4MbEh5.js +0 -2
- package/dist/chunks/da-C_4MbEh5.js.map +0 -1
- package/dist/chunks/da-Dca6j8fp.js.map +0 -1
- package/dist/chunks/de-BCjn3PUI.js.map +0 -1
- package/dist/chunks/de-DulxcJj-.js +0 -2
- package/dist/chunks/de-DulxcJj-.js.map +0 -1
- package/dist/chunks/el-BpXtDTez.js.map +0 -1
- package/dist/chunks/el-CVG_1iKB.js +0 -2
- package/dist/chunks/el-CVG_1iKB.js.map +0 -1
- package/dist/chunks/es-B3P4nlMw.js.map +0 -1
- package/dist/chunks/es-ri0uKzUW.js +0 -2
- package/dist/chunks/es-ri0uKzUW.js.map +0 -1
- package/dist/chunks/fi-BbQ_Bs0Z.js.map +0 -1
- package/dist/chunks/fi-CNZqWHjw.js +0 -2
- package/dist/chunks/fi-CNZqWHjw.js.map +0 -1
- package/dist/chunks/fr-BKDUXceO.js.map +0 -1
- package/dist/chunks/fr-CfFOw4hD.js +0 -2
- package/dist/chunks/fr-CfFOw4hD.js.map +0 -1
- package/dist/chunks/he-BVCHlTtT.js.map +0 -1
- package/dist/chunks/he-DN2JEtQb.js +0 -2
- package/dist/chunks/he-DN2JEtQb.js.map +0 -1
- package/dist/chunks/hi-DxfOerNP.js +0 -2
- package/dist/chunks/hi-DxfOerNP.js.map +0 -1
- package/dist/chunks/hi-H_Hshh-7.js.map +0 -1
- package/dist/chunks/hu-BTImywuV.js +0 -2
- package/dist/chunks/hu-BTImywuV.js.map +0 -1
- package/dist/chunks/hu-ZWiNfzvN.js.map +0 -1
- package/dist/chunks/id-DeiRYsJ1.js.map +0 -1
- package/dist/chunks/id-YFuArJA6.js +0 -2
- package/dist/chunks/id-YFuArJA6.js.map +0 -1
- package/dist/chunks/it-UH9OzFhg.js.map +0 -1
- package/dist/chunks/it-mhkzXBM9.js +0 -2
- package/dist/chunks/it-mhkzXBM9.js.map +0 -1
- package/dist/chunks/ja-6l_z_G9k.js +0 -2
- package/dist/chunks/ja-6l_z_G9k.js.map +0 -1
- package/dist/chunks/ja-BYC8FRN8.js.map +0 -1
- package/dist/chunks/ko-Bjs2ZRcF.js.map +0 -1
- package/dist/chunks/ko-YAl4XwHu.js +0 -2
- package/dist/chunks/ko-YAl4XwHu.js.map +0 -1
- package/dist/chunks/nl-C-9zHtfb.js +0 -2
- package/dist/chunks/nl-C-9zHtfb.js.map +0 -1
- package/dist/chunks/nl-Ch5HFWQO.js.map +0 -1
- package/dist/chunks/no-CljpinWz.js.map +0 -1
- package/dist/chunks/no-qzPitLlx.js +0 -2
- package/dist/chunks/no-qzPitLlx.js.map +0 -1
- package/dist/chunks/pl-CUcSS0zZ.js.map +0 -1
- package/dist/chunks/pl-MAIYeuhW.js +0 -2
- package/dist/chunks/pl-MAIYeuhW.js.map +0 -1
- package/dist/chunks/pt-BHK0LwkC.js.map +0 -1
- package/dist/chunks/pt-DqDabE4v.js +0 -2
- package/dist/chunks/pt-DqDabE4v.js.map +0 -1
- package/dist/chunks/ro-BVs-lHH-.js +0 -2
- package/dist/chunks/ro-BVs-lHH-.js.map +0 -1
- package/dist/chunks/ro-Bj8cwU2n.js.map +0 -1
- package/dist/chunks/ru-CgqNy0Gb.js.map +0 -1
- package/dist/chunks/ru-DP7qDAmE.js +0 -2
- package/dist/chunks/ru-DP7qDAmE.js.map +0 -1
- package/dist/chunks/sv-B3QEYGgd.js +0 -2
- package/dist/chunks/sv-B3QEYGgd.js.map +0 -1
- package/dist/chunks/sv-H7jroOQ5.js.map +0 -1
- package/dist/chunks/th-Dqm-gpGe.js.map +0 -1
- package/dist/chunks/th-DzQau9aW.js +0 -2
- package/dist/chunks/th-DzQau9aW.js.map +0 -1
- package/dist/chunks/tr-D3zPcNtT.js.map +0 -1
- package/dist/chunks/tr-cG1YuE1E.js +0 -2
- package/dist/chunks/tr-cG1YuE1E.js.map +0 -1
- package/dist/chunks/uk-CoIIs3QI.js.map +0 -1
- package/dist/chunks/uk-Cvbo0IBW.js +0 -2
- package/dist/chunks/uk-Cvbo0IBW.js.map +0 -1
- package/dist/chunks/vi-BRtYSBUp.js +0 -2
- package/dist/chunks/vi-BRtYSBUp.js.map +0 -1
- package/dist/chunks/vi-C_fruIbh.js.map +0 -1
- package/dist/chunks/zh-CwczPMPp.js +0 -2
- package/dist/chunks/zh-CwczPMPp.js.map +0 -1
- package/dist/chunks/zh-LDkEV2D9.js.map +0 -1
package/dist/core.d.ts
CHANGED
|
@@ -248,10 +248,8 @@ export declare class AuthClient {
|
|
|
248
248
|
* когда сервер начнёт возвращать challenge_required в риск-сценариях,
|
|
249
249
|
* SDK сможет передать proof-of-something обратно без breaking change.
|
|
250
250
|
*
|
|
251
|
-
* `
|
|
252
|
-
* нового anon-юзера). Используется в switch-account flow.
|
|
253
|
-
* остаётся `forceCaptcha`, хотя капчи там больше нет — менять имя ломает
|
|
254
|
-
* host-сигнатуру; смысл «принудительно новая anon-сессия» сохранён.
|
|
251
|
+
* `forceNewAnon: true` пропускает шаги 1-2 и сразу делает /signin (создаёт
|
|
252
|
+
* нового anon-юзера). Используется в switch-account flow.
|
|
255
253
|
*
|
|
256
254
|
* Параллельные вызовы дедуплицируются через `inflightAnonSignin` — два
|
|
257
255
|
* click'а на «Войти как гость» не создадут двух anon-юзеров (два /signup =
|
|
@@ -260,7 +258,7 @@ export declare class AuthClient {
|
|
|
260
258
|
signInAnonymously(input?: {
|
|
261
259
|
captchaToken?: string;
|
|
262
260
|
userMeta?: Record<string, string>;
|
|
263
|
-
|
|
261
|
+
forceNewAnon?: boolean;
|
|
264
262
|
}): Promise<AuthSession>;
|
|
265
263
|
/**
|
|
266
264
|
* Внутренний resume — пробует /auth/refresh с сохранённым anon refresh_token.
|
|
@@ -612,6 +610,13 @@ export declare class BillingClient {
|
|
|
612
610
|
}): Promise<PaywallPrice[]>;
|
|
613
611
|
/** Sync-снимок цен из последнего bootstrap'а. null = ещё не загружали. */
|
|
614
612
|
getCachedPrices(): PaywallPrice[] | null;
|
|
613
|
+
/** Sync-снимок офферов из последнего bootstrap'а. null = bootstrap ещё не
|
|
614
|
+
* загружали, пустой массив = бэк отдал пейвол без офферов. Бэк уже
|
|
615
|
+
* применил серверный таргетинг (target_countries / target_emails /
|
|
616
|
+
* targeting_mode из offer_settings) — наружу выезжает только то, что
|
|
617
|
+
* применимо к текущему юзеру. Клиентская сторона остаётся ответственной
|
|
618
|
+
* за price_id-matching и countdown (см. core/offer.ts → resolveOffer). */
|
|
619
|
+
getCachedOffers(): PaywallOffer[] | null;
|
|
615
620
|
/**
|
|
616
621
|
* Снимок того, какой язык SDK сейчас считает «языком юзера». Полезно для
|
|
617
622
|
* синхронизации i18n хоста с тем, что фактически показывает пейвол — чтобы
|
|
@@ -738,6 +743,17 @@ export declare class BillingClient {
|
|
|
738
743
|
errorUrl?: string;
|
|
739
744
|
shopUrl?: string;
|
|
740
745
|
trialDays?: number;
|
|
746
|
+
/** Активный offer для этой цены — резолвится host'ом через
|
|
747
|
+
* `paywall.getOfferForPrice(priceId)?.offer.id` или
|
|
748
|
+
* `findApplicableOffer(client.getCachedOffers(), priceId)?.id`. Без
|
|
749
|
+
* явной передачи бэк сделает auto-resolve по email — но только для
|
|
750
|
+
* end_date-офферов. duration_minutes-офферы тикают в clientStorage и
|
|
751
|
+
* сервер их не видит: для них offerId ОБЯЗАН прийти от клиента, иначе
|
|
752
|
+
* скидка не применится на чекауте, хотя UI её показывал.
|
|
753
|
+
*
|
|
754
|
+
* Передавать offer-id всегда безопасно — бэк сам проверит applicable
|
|
755
|
+
* ли offer к этому юзеру (страна/email/режим) и игнорирует если нет. */
|
|
756
|
+
offerId?: string;
|
|
741
757
|
/**
|
|
742
758
|
* Stage 1 защиты от дубликатов покупок. Идемпотентный ключ запроса
|
|
743
759
|
* (UUID). Повторный вызов с тем же ключом вернёт тот же checkout-URL
|
|
@@ -764,7 +780,9 @@ export declare class BillingClient {
|
|
|
764
780
|
* инвойсы). Опен-флоу управляется host'ом:
|
|
765
781
|
*
|
|
766
782
|
* ```ts
|
|
767
|
-
* const { url } = await billing.getCustomerPortalUrl(
|
|
783
|
+
* const { url } = await billing.getCustomerPortalUrl({
|
|
784
|
+
* returnUrl: 'https://your-app.com/account'
|
|
785
|
+
* });
|
|
768
786
|
* window.open(url, '_blank');
|
|
769
787
|
* ```
|
|
770
788
|
*
|
|
@@ -776,6 +794,14 @@ export declare class BillingClient {
|
|
|
776
794
|
*/
|
|
777
795
|
getCustomerPortalUrl(opts?: {
|
|
778
796
|
signal?: AbortSignal;
|
|
797
|
+
/** URL для return-button у провайдера (Stripe «Return to ...», Paddle
|
|
798
|
+
* и Chargebee redirect_url'ы). Передавай туда страницу-аккаунт твоего
|
|
799
|
+
* app'а — `https://your-app.com/account`. Без явного returnUrl бэк
|
|
800
|
+
* применяет fallback в порядке: `paywall_settings.shop_url` →
|
|
801
|
+
* custom_domain пейвола → NEXT_PUBLIC_ONLINE_ORIGIN (последнее — это
|
|
802
|
+
* страница в самом online-сервисе, годится только для legacy
|
|
803
|
+
* v2-iframe-флоу). */
|
|
804
|
+
returnUrl?: string;
|
|
779
805
|
}): Promise<{
|
|
780
806
|
url: string;
|
|
781
807
|
}>;
|
|
@@ -786,21 +812,31 @@ export declare class BillingClient {
|
|
|
786
812
|
* `/api/v1/paywall/[id]/user` без unstable_cache, потому что list для UI
|
|
787
813
|
* должен быть свежим после cancel-а.
|
|
788
814
|
*
|
|
789
|
-
* Auth
|
|
790
|
-
*
|
|
815
|
+
* Auth (два пути):
|
|
816
|
+
* - Bearer (через AuthClient) — user.id резолвится из сессии, identity
|
|
817
|
+
* в query игнорируется.
|
|
818
|
+
* - `apiKey` + `identity.email`/`identity.userId` — server-SDK путь для
|
|
819
|
+
* интеграций со своей авторизацией. Бэк проверяет, что identity линкована
|
|
820
|
+
* к этому пейволу (защита от cross-paywall lookup).
|
|
821
|
+
* Без auth и без apiKey+identity — `identity_required`.
|
|
791
822
|
*/
|
|
792
823
|
listPurchases(opts?: {
|
|
793
824
|
signal?: AbortSignal;
|
|
794
825
|
}): Promise<PaywallPurchaseDetailed[]>;
|
|
795
826
|
/**
|
|
796
|
-
* Отменить подписку. Бэк
|
|
797
|
-
*
|
|
798
|
-
*
|
|
827
|
+
* Отменить подписку. Бэк проверит, что subscription принадлежит юзеру
|
|
828
|
+
* (Bearer-путь — из сессии; apiKey-путь — из identity), и сделает cancel у
|
|
829
|
+
* acquiring'а (Stripe/Paddle/Chargebee/Overpay). По умолчанию cancel в
|
|
830
|
+
* конце текущего периода — юзер сохраняет access до renewal date'ы.
|
|
799
831
|
*
|
|
800
|
-
* `reason` обязательна (валидация на бэке).
|
|
801
|
-
* причин в host-UI, как в legacy customer portal'е.
|
|
832
|
+
* `reason` обязательна (валидация на бэке).
|
|
802
833
|
*
|
|
803
|
-
* Auth
|
|
834
|
+
* Auth (два пути):
|
|
835
|
+
* - Bearer (через AuthClient) — стандартный путь для UI customer-portal'a.
|
|
836
|
+
* - `apiKey` + `identity.email`/`identity.userId` — для self-service UI на
|
|
837
|
+
* бэке клиента со своей авторизацией. Бэк дополнительно фильтрует
|
|
838
|
+
* subscription по paywall_id, чтобы owner пейвола A не отменил подписку
|
|
839
|
+
* пейвола B.
|
|
804
840
|
*/
|
|
805
841
|
cancelSubscription(params: {
|
|
806
842
|
subscriptionId: string;
|
|
@@ -931,6 +967,11 @@ export declare interface EventTrackerOptions {
|
|
|
931
967
|
sendBeacon?: (url: string, data: BodyInit) => boolean;
|
|
932
968
|
}
|
|
933
969
|
|
|
970
|
+
/** Pick the offer applicable to a price. Targeted (`price_id === id`) wins
|
|
971
|
+
* over the global default (`price_id === null`). Offers without a positive
|
|
972
|
+
* `discount_percent` are ignored. */
|
|
973
|
+
export declare function findApplicableOffer(offers: PaywallOffer[] | null | undefined, priceId: string): PaywallOffer | null;
|
|
974
|
+
|
|
934
975
|
export declare function generateVisitorId(): string;
|
|
935
976
|
|
|
936
977
|
export declare interface Identity {
|
|
@@ -1091,6 +1132,11 @@ export declare interface LocaleOverrides {
|
|
|
1091
1132
|
|
|
1092
1133
|
export declare type OAuthProvider = 'google' | 'apple' | 'github' | 'facebook';
|
|
1093
1134
|
|
|
1135
|
+
/** Storage key under which a relative `duration_minutes` offer records its
|
|
1136
|
+
* first-view timestamp. Shared between the renderer (which writes the
|
|
1137
|
+
* start on first open) and the host SDK helpers (which read it). */
|
|
1138
|
+
export declare function offerStartStorageKey(offerId: string): string;
|
|
1139
|
+
|
|
1094
1140
|
export declare type OtpVerifyType = 'email' | 'recovery' | 'signup' | 'magiclink' | 'invite';
|
|
1095
1141
|
|
|
1096
1142
|
export declare interface PaywallBootstrap {
|
|
@@ -1131,8 +1177,10 @@ export declare interface PaywallOffer {
|
|
|
1131
1177
|
expires_at: string | null;
|
|
1132
1178
|
/** Относительный таймер: сколько минут offer живёт **от первого просмотра
|
|
1133
1179
|
* пейвола** данным юзером. Старт хранится в clientStorage под ключом
|
|
1134
|
-
* `pw-offer-{id}-start
|
|
1135
|
-
*
|
|
1180
|
+
* `pw-offer-{id}-start` и остаётся там **после** expiry — это
|
|
1181
|
+
* forever-marker, чтобы юзер не мог «фармить» offer (re-open пейвола
|
|
1182
|
+
* не запускает countdown заново). Используется, когда бэк хочет
|
|
1183
|
+
* показывать "remaining time" без жёсткой server-time, а считать
|
|
1136
1184
|
* относительно сессии юзера. expires_at имеет приоритет если задано. */
|
|
1137
1185
|
duration_minutes?: number | null;
|
|
1138
1186
|
price_id: string | null;
|
|
@@ -1159,7 +1207,7 @@ export declare interface PaywallPrice {
|
|
|
1159
1207
|
* идёт из `/user-state` и имеет минимум для access-gate'а), этот shape
|
|
1160
1208
|
* включает цену/валюту/discount — чтобы host мог нарисовать список подписок
|
|
1161
1209
|
* как в legacy customer portal'е. */
|
|
1162
|
-
declare interface PaywallPurchaseDetailed {
|
|
1210
|
+
export declare interface PaywallPurchaseDetailed {
|
|
1163
1211
|
id: string;
|
|
1164
1212
|
status: string | null;
|
|
1165
1213
|
cancel_at: string | null;
|
|
@@ -1279,6 +1327,51 @@ export declare class QuotaExceededError extends PaywallError {
|
|
|
1279
1327
|
});
|
|
1280
1328
|
}
|
|
1281
1329
|
|
|
1330
|
+
/** Safe browser localStorage getter — returns null in SSR / private mode. */
|
|
1331
|
+
export declare function readBrowserOfferStart(offerId: string): string | null;
|
|
1332
|
+
|
|
1333
|
+
/**
|
|
1334
|
+
* Resolved view of a paywall offer — what host UI actually needs to render
|
|
1335
|
+
* a strike-through price + countdown without re-implementing the math.
|
|
1336
|
+
*
|
|
1337
|
+
* `remainingMs` ticks down with wall-clock time and reaches 0 on expiry.
|
|
1338
|
+
* `totalMs` stays constant — useful for progress bars / share-of-time UX.
|
|
1339
|
+
* `expiresAt` is the Date.now()-comparable epoch ms of expiry.
|
|
1340
|
+
*
|
|
1341
|
+
* For offers without an expiry mechanism (no `expires_at` and no
|
|
1342
|
+
* `duration_minutes`), `remainingMs`/`totalMs`/`expiresAt` are all `null`,
|
|
1343
|
+
* but the resolved view is still returned — discount badge / strike-through
|
|
1344
|
+
* still make sense for "perpetual sale" offers.
|
|
1345
|
+
*/
|
|
1346
|
+
export declare interface ResolvedOffer {
|
|
1347
|
+
offer: PaywallOffer;
|
|
1348
|
+
discountPercent: number;
|
|
1349
|
+
remainingMs: number | null;
|
|
1350
|
+
totalMs: number | null;
|
|
1351
|
+
expiresAt: number | null;
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
/** Compute the resolved view of an offer. Pure, no side-effects. */
|
|
1355
|
+
export declare function resolveOffer(offer: PaywallOffer, opts?: ResolveOfferOptions): ResolvedOffer | null;
|
|
1356
|
+
|
|
1357
|
+
export declare interface ResolveOfferOptions {
|
|
1358
|
+
/** Current epoch ms. Inject for deterministic tests; default `Date.now()`. */
|
|
1359
|
+
now?: number;
|
|
1360
|
+
/**
|
|
1361
|
+
* Synchronous reader for the `duration_minutes` start-timestamp ISO string.
|
|
1362
|
+
* Host passes a closure over its sync storage (browser → `localStorage`,
|
|
1363
|
+
* memory → in-process map). Return `null` if no start has been recorded.
|
|
1364
|
+
*
|
|
1365
|
+
* Intentionally synchronous, because consumers call this from UI render —
|
|
1366
|
+
* an async StorageAdapter would force every price card to suspend.
|
|
1367
|
+
*
|
|
1368
|
+
* If omitted, `duration_minutes`-only offers return `expiresAt = null`,
|
|
1369
|
+
* which makes the resolved view treat them as "not yet started" (the
|
|
1370
|
+
* renderer is responsible for writing the start on first paywall view).
|
|
1371
|
+
*/
|
|
1372
|
+
readStart?: (offerId: string) => string | null;
|
|
1373
|
+
}
|
|
1374
|
+
|
|
1282
1375
|
export declare const SDK_VERSION = "3.0.0-alpha.0";
|
|
1283
1376
|
|
|
1284
1377
|
export declare type SignUpResult = {
|