@stackframe/react 2.8.56 → 2.8.59
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/components/api-key-dialogs.js.map +1 -1
- package/dist/components/api-key-table.js.map +1 -1
- package/dist/components/credential-sign-in.js.map +1 -1
- package/dist/components/credential-sign-up.js.map +1 -1
- package/dist/components/elements/form-warning.js.map +1 -1
- package/dist/components/elements/maybe-full-page.js.map +1 -1
- package/dist/components/elements/separator-with-text.js.map +1 -1
- package/dist/components/elements/sidebar-layout.js.map +1 -1
- package/dist/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/components/elements/user-avatar.js.map +1 -1
- package/dist/components/link.js.map +1 -1
- package/dist/components/magic-link-sign-in.js.map +1 -1
- package/dist/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/components/message-cards/message-card.js.map +1 -1
- package/dist/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/components/oauth-button-group.js.map +1 -1
- package/dist/components/oauth-button.js.map +1 -1
- package/dist/components/passkey-button.js.map +1 -1
- package/dist/components/profile-image-editor.js.map +1 -1
- package/dist/components/selected-team-switcher.js.map +1 -1
- package/dist/components/team-icon.js.map +1 -1
- package/dist/components/team-switcher.js.map +1 -1
- package/dist/components/use-in-iframe.js.map +1 -1
- package/dist/components/user-button.js.map +1 -1
- package/dist/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/emails-section.js +4 -3
- package/dist/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/components-page/account-settings/payments/payments-page.js +79 -0
- package/dist/components-page/account-settings/payments/payments-page.js.map +1 -0
- package/dist/components-page/account-settings/payments/payments-panel.js +374 -0
- package/dist/components-page/account-settings/payments/payments-panel.js.map +1 -0
- package/dist/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/components-page/account-settings/section.js.map +1 -1
- package/dist/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/components-page/account-settings.js +22 -2
- package/dist/components-page/account-settings.js.map +1 -1
- package/dist/components-page/auth-page.js.map +1 -1
- package/dist/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/components-page/email-verification.js.map +1 -1
- package/dist/components-page/error-page.js.map +1 -1
- package/dist/components-page/forgot-password.js.map +1 -1
- package/dist/components-page/magic-link-callback.js.map +1 -1
- package/dist/components-page/mfa.js.map +1 -1
- package/dist/components-page/oauth-callback.js.map +1 -1
- package/dist/components-page/onboarding.js +170 -0
- package/dist/components-page/onboarding.js.map +1 -0
- package/dist/components-page/password-reset.js.map +1 -1
- package/dist/components-page/section.js.map +1 -1
- package/dist/components-page/sign-in.js.map +1 -1
- package/dist/components-page/sign-out.js.map +1 -1
- package/dist/components-page/sign-up.js.map +1 -1
- package/dist/components-page/stack-handler-client.js +13 -1
- package/dist/components-page/stack-handler-client.js.map +1 -1
- package/dist/components-page/stack-handler.js.map +1 -1
- package/dist/components-page/team-creation.js.map +1 -1
- package/dist/components-page/team-invitation.js +15 -1
- package/dist/components-page/team-invitation.js.map +1 -1
- package/dist/esm/components/api-key-dialogs.js.map +1 -1
- package/dist/esm/components/api-key-table.js.map +1 -1
- package/dist/esm/components/credential-sign-in.js.map +1 -1
- package/dist/esm/components/credential-sign-up.js.map +1 -1
- package/dist/esm/components/elements/form-warning.js.map +1 -1
- package/dist/esm/components/elements/maybe-full-page.js.map +1 -1
- package/dist/esm/components/elements/separator-with-text.js.map +1 -1
- package/dist/esm/components/elements/sidebar-layout.js.map +1 -1
- package/dist/esm/components/elements/ssr-layout-effect.js.map +1 -1
- package/dist/esm/components/elements/user-avatar.js.map +1 -1
- package/dist/esm/components/link.js.map +1 -1
- package/dist/esm/components/magic-link-sign-in.js.map +1 -1
- package/dist/esm/components/message-cards/known-error-message-card.js.map +1 -1
- package/dist/esm/components/message-cards/message-card.js.map +1 -1
- package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
- package/dist/esm/components/oauth-button-group.js.map +1 -1
- package/dist/esm/components/oauth-button.js.map +1 -1
- package/dist/esm/components/passkey-button.js.map +1 -1
- package/dist/esm/components/profile-image-editor.js.map +1 -1
- package/dist/esm/components/selected-team-switcher.js.map +1 -1
- package/dist/esm/components/team-icon.js.map +1 -1
- package/dist/esm/components/team-switcher.js.map +1 -1
- package/dist/esm/components/use-in-iframe.js.map +1 -1
- package/dist/esm/components/user-button.js.map +1 -1
- package/dist/esm/components-page/account-settings/active-sessions/active-sessions-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/api-keys/api-keys-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/editable-text.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/email-and-auth-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js +4 -3
- package/dist/esm/components-page/account-settings/email-and-auth/emails-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/mfa-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/otp-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/passkey-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/email-and-auth/password-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/notifications/notifications-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/page-layout.js.map +1 -1
- package/dist/esm/components-page/account-settings/payments/payments-page.js +55 -0
- package/dist/esm/components-page/account-settings/payments/payments-page.js.map +1 -0
- package/dist/esm/components-page/account-settings/payments/payments-panel.js +350 -0
- package/dist/esm/components-page/account-settings/payments/payments-panel.js.map +1 -0
- package/dist/esm/components-page/account-settings/profile-page/profile-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/delete-account-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/settings-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/leave-team-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-api-keys-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-creation-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-display-name-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-invitation-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-member-list-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-page.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-image-section.js.map +1 -1
- package/dist/esm/components-page/account-settings/teams/team-profile-user-section.js.map +1 -1
- package/dist/esm/components-page/account-settings.js +23 -3
- package/dist/esm/components-page/account-settings.js.map +1 -1
- package/dist/esm/components-page/auth-page.js.map +1 -1
- package/dist/esm/components-page/cli-auth-confirm.js.map +1 -1
- package/dist/esm/components-page/email-verification.js.map +1 -1
- package/dist/esm/components-page/error-page.js.map +1 -1
- package/dist/esm/components-page/forgot-password.js.map +1 -1
- package/dist/esm/components-page/magic-link-callback.js.map +1 -1
- package/dist/esm/components-page/mfa.js.map +1 -1
- package/dist/esm/components-page/oauth-callback.js.map +1 -1
- package/dist/esm/components-page/onboarding.js +146 -0
- package/dist/esm/components-page/onboarding.js.map +1 -0
- package/dist/esm/components-page/password-reset.js.map +1 -1
- package/dist/esm/components-page/section.js.map +1 -1
- package/dist/esm/components-page/sign-in.js.map +1 -1
- package/dist/esm/components-page/sign-out.js.map +1 -1
- package/dist/esm/components-page/sign-up.js.map +1 -1
- package/dist/esm/components-page/stack-handler-client.js +13 -1
- package/dist/esm/components-page/stack-handler-client.js.map +1 -1
- package/dist/esm/components-page/stack-handler.js.map +1 -1
- package/dist/esm/components-page/team-creation.js.map +1 -1
- package/dist/esm/components-page/team-invitation.js +15 -1
- package/dist/esm/components-page/team-invitation.js.map +1 -1
- package/dist/esm/generated/global-css.js +1 -1
- package/dist/esm/generated/global-css.js.map +1 -1
- package/dist/esm/generated/quetzal-translations.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/esm/integrations/convex.js.map +1 -1
- package/dist/esm/lib/auth.js.map +1 -1
- package/dist/esm/lib/cookie.js.map +1 -1
- package/dist/esm/lib/hooks.js.map +1 -1
- package/dist/esm/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/esm/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js +210 -29
- package/dist/esm/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/esm/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js +40 -27
- package/dist/esm/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/index.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/esm/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/esm/lib/stack-app/common.js.map +1 -1
- package/dist/esm/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/esm/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/esm/lib/stack-app/index.js.map +1 -1
- package/dist/esm/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/esm/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/esm/lib/stack-app/projects/index.js +4 -0
- package/dist/esm/lib/stack-app/projects/index.js.map +1 -1
- package/dist/esm/lib/stack-app/teams/index.js.map +1 -1
- package/dist/esm/lib/stack-app/users/index.js +13 -12
- package/dist/esm/lib/stack-app/users/index.js.map +1 -1
- package/dist/esm/lib/translations.js.map +1 -1
- package/dist/esm/providers/stack-provider-client.js.map +1 -1
- package/dist/esm/providers/stack-provider.js.map +1 -1
- package/dist/esm/providers/theme-provider.js.map +1 -1
- package/dist/esm/providers/translation-provider-client.js.map +1 -1
- package/dist/esm/providers/translation-provider.js.map +1 -1
- package/dist/esm/utils/browser-script.js.map +1 -1
- package/dist/esm/utils/constants.js.map +1 -1
- package/dist/esm/utils/url.js.map +1 -1
- package/dist/generated/global-css.js +1 -1
- package/dist/generated/global-css.js.map +1 -1
- package/dist/generated/quetzal-translations.js.map +1 -1
- package/dist/index.d.mts +306 -17
- package/dist/index.d.ts +306 -17
- package/dist/index.js.map +1 -1
- package/dist/integrations/convex/component/convex.config.js.map +1 -1
- package/dist/integrations/convex.js.map +1 -1
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/cookie.js.map +1 -1
- package/dist/lib/hooks.js.map +1 -1
- package/dist/lib/stack-app/api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js +235 -0
- package/dist/lib/stack-app/apps/implementations/admin-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js +208 -27
- package/dist/lib/stack-app/apps/implementations/client-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/common.js +2 -1
- package/dist/lib/stack-app/apps/implementations/common.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/index.js.map +1 -1
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js +38 -25
- package/dist/lib/stack-app/apps/implementations/server-app-impl.js.map +1 -1
- package/dist/lib/stack-app/apps/index.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/admin-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/client-app.js.map +1 -1
- package/dist/lib/stack-app/apps/interfaces/server-app.js.map +1 -1
- package/dist/lib/stack-app/common.js.map +1 -1
- package/dist/lib/stack-app/connected-accounts/index.js.map +1 -1
- package/dist/lib/stack-app/contact-channels/index.js.map +1 -1
- package/dist/lib/stack-app/customers/index.js.map +1 -1
- package/dist/lib/stack-app/data-vault/index.js.map +1 -1
- package/dist/lib/stack-app/email/index.js.map +1 -1
- package/dist/lib/stack-app/email-templates/index.js.map +1 -1
- package/dist/lib/stack-app/index.js.map +1 -1
- package/dist/lib/stack-app/internal-api-keys/index.js.map +1 -1
- package/dist/lib/stack-app/notification-categories/index.js.map +1 -1
- package/dist/lib/stack-app/permissions/index.js.map +1 -1
- package/dist/lib/stack-app/project-configs/index.js.map +1 -1
- package/dist/lib/stack-app/projects/index.js +4 -0
- package/dist/lib/stack-app/projects/index.js.map +1 -1
- package/dist/lib/stack-app/teams/index.js.map +1 -1
- package/dist/lib/stack-app/users/index.js +15 -14
- package/dist/lib/stack-app/users/index.js.map +1 -1
- package/dist/lib/translations.js.map +1 -1
- package/dist/providers/stack-provider-client.js.map +1 -1
- package/dist/providers/stack-provider.js.map +1 -1
- package/dist/providers/theme-provider.js.map +1 -1
- package/dist/providers/translation-provider-client.js.map +1 -1
- package/dist/providers/translation-provider.js.map +1 -1
- package/dist/utils/browser-script.js.map +1 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/url.js.map +1 -1
- package/package.json +19 -16
- package/CHANGELOG.md +0 -2072
|
@@ -208,6 +208,11 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
208
208
|
}, session);
|
|
209
209
|
}
|
|
210
210
|
);
|
|
211
|
+
this._customerBillingCache = (0, import_common2.createCacheBySession)(
|
|
212
|
+
async (session, [customerType, customerId]) => {
|
|
213
|
+
return await this._interface.getCustomerBilling(customerType, customerId, session);
|
|
214
|
+
}
|
|
215
|
+
);
|
|
211
216
|
this._convexPartialUserCache = (0, import_common2.createCache)(
|
|
212
217
|
async ([ctx]) => await this._getPartialUserFromConvex(ctx)
|
|
213
218
|
);
|
|
@@ -442,7 +447,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
442
447
|
if (!(0, import_env.isBrowserLike)()) {
|
|
443
448
|
throw new import_errors.StackAssertionError("Cannot get browser cookies on the server!");
|
|
444
449
|
}
|
|
445
|
-
return cookie.
|
|
450
|
+
return cookie.parseCookie(document.cookie || "");
|
|
446
451
|
}
|
|
447
452
|
_getRefreshTokenCookieNamePatterns() {
|
|
448
453
|
return {
|
|
@@ -640,7 +645,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
640
645
|
});
|
|
641
646
|
}
|
|
642
647
|
const cookieHeader = tokenStoreInit.headers.get("cookie");
|
|
643
|
-
const parsed = cookie.
|
|
648
|
+
const parsed = cookie.parseCookie(cookieHeader || "");
|
|
644
649
|
const res = new import_stores.Store(this._getTokensFromCookies(parsed));
|
|
645
650
|
this._requestTokenStores.set(tokenStoreInit, res);
|
|
646
651
|
return res;
|
|
@@ -961,32 +966,92 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
961
966
|
displayName: item.product.display_name,
|
|
962
967
|
customerType: item.product.customer_type,
|
|
963
968
|
isServerOnly: item.product.server_only,
|
|
964
|
-
stackable: item.product.stackable
|
|
969
|
+
stackable: item.product.stackable,
|
|
970
|
+
type: item.type,
|
|
971
|
+
subscription: item.subscription ? {
|
|
972
|
+
currentPeriodEnd: item.subscription.current_period_end ? new Date(item.subscription.current_period_end) : null,
|
|
973
|
+
cancelAtPeriodEnd: item.subscription.cancel_at_period_end,
|
|
974
|
+
isCancelable: item.subscription.is_cancelable
|
|
975
|
+
} : null,
|
|
976
|
+
switchOptions: item.switch_options?.map((option) => ({
|
|
977
|
+
productId: option.product_id,
|
|
978
|
+
displayName: option.product.display_name,
|
|
979
|
+
prices: option.product.prices
|
|
980
|
+
}))
|
|
965
981
|
}));
|
|
966
982
|
return Object.assign(products, { nextCursor: response.pagination.next_cursor ?? null });
|
|
967
983
|
}
|
|
984
|
+
_customerBillingFromResponse(response) {
|
|
985
|
+
return {
|
|
986
|
+
hasCustomer: response.has_customer,
|
|
987
|
+
defaultPaymentMethod: response.default_payment_method
|
|
988
|
+
};
|
|
989
|
+
}
|
|
968
990
|
_createAuth(session) {
|
|
969
991
|
const app = this;
|
|
970
992
|
return {
|
|
971
993
|
_internalSession: session,
|
|
972
994
|
currentSession: {
|
|
973
995
|
async getTokens() {
|
|
974
|
-
const tokens = await session.getOrFetchLikelyValidTokens(2e4);
|
|
996
|
+
const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
|
|
975
997
|
return {
|
|
976
998
|
accessToken: tokens?.accessToken.token ?? null,
|
|
977
999
|
refreshToken: tokens?.refreshToken?.token ?? null
|
|
978
1000
|
};
|
|
1001
|
+
},
|
|
1002
|
+
useTokens() {
|
|
1003
|
+
const [_, setCounter] = import_react2.default.useState(0);
|
|
1004
|
+
import_react2.default.useEffect(() => {
|
|
1005
|
+
const { unsubscribe: unsubscribeRefresh } = session.startRefreshingAccessToken(3e4, 6e4);
|
|
1006
|
+
const { unsubscribe: unsubscribeInvalidate } = session.onInvalidate(() => setCounter((c) => c + 1));
|
|
1007
|
+
const { unsubscribe: unsubscribeAccessTokenChange } = session.onAccessTokenChange(() => setCounter((c) => c + 1));
|
|
1008
|
+
return () => {
|
|
1009
|
+
unsubscribeRefresh();
|
|
1010
|
+
unsubscribeInvalidate();
|
|
1011
|
+
unsubscribeAccessTokenChange();
|
|
1012
|
+
};
|
|
1013
|
+
}, []);
|
|
1014
|
+
let accessToken = session.isKnownToBeInvalid() ? null : session.getAccessTokenIfNotExpiredYet(2e4, 75e3);
|
|
1015
|
+
if (accessToken === null) {
|
|
1016
|
+
accessToken = (0, import_react.use)(session.getOrFetchLikelyValidTokens(2e4, 75e3))?.accessToken ?? null;
|
|
1017
|
+
}
|
|
1018
|
+
return {
|
|
1019
|
+
accessToken: accessToken?.token ?? null,
|
|
1020
|
+
refreshToken: session.getRefreshToken()?.token ?? null
|
|
1021
|
+
};
|
|
979
1022
|
}
|
|
980
1023
|
},
|
|
1024
|
+
async getAccessToken() {
|
|
1025
|
+
const tokens = await this.currentSession.getTokens();
|
|
1026
|
+
return tokens.accessToken;
|
|
1027
|
+
},
|
|
1028
|
+
useAccessToken() {
|
|
1029
|
+
return this.currentSession.useTokens().accessToken;
|
|
1030
|
+
},
|
|
1031
|
+
async getRefreshToken() {
|
|
1032
|
+
const tokens = await this.currentSession.getTokens();
|
|
1033
|
+
return tokens.refreshToken;
|
|
1034
|
+
},
|
|
1035
|
+
useRefreshToken() {
|
|
1036
|
+
return this.currentSession.useTokens().refreshToken;
|
|
1037
|
+
},
|
|
981
1038
|
async getAuthHeaders() {
|
|
982
1039
|
return {
|
|
983
1040
|
"x-stack-auth": JSON.stringify(await this.getAuthJson())
|
|
984
1041
|
};
|
|
985
1042
|
},
|
|
1043
|
+
useAuthHeaders() {
|
|
1044
|
+
return {
|
|
1045
|
+
"x-stack-auth": JSON.stringify(this.useAuthJson())
|
|
1046
|
+
};
|
|
1047
|
+
},
|
|
986
1048
|
async getAuthJson() {
|
|
987
1049
|
const tokens = await this.currentSession.getTokens();
|
|
988
1050
|
return tokens;
|
|
989
1051
|
},
|
|
1052
|
+
useAuthJson() {
|
|
1053
|
+
return this.currentSession.useTokens();
|
|
1054
|
+
},
|
|
990
1055
|
signOut(options) {
|
|
991
1056
|
return app._signOut(session, options);
|
|
992
1057
|
}
|
|
@@ -1027,6 +1092,8 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1027
1092
|
passkeyAuthEnabled: crud.passkey_auth_enabled,
|
|
1028
1093
|
isMultiFactorRequired: crud.requires_totp_mfa,
|
|
1029
1094
|
isAnonymous: crud.is_anonymous,
|
|
1095
|
+
isRestricted: crud.is_restricted,
|
|
1096
|
+
restrictedReason: crud.restricted_reason,
|
|
1030
1097
|
toClientJson() {
|
|
1031
1098
|
return crud;
|
|
1032
1099
|
}
|
|
@@ -1057,7 +1124,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1057
1124
|
return this.update({ clientMetadata: metadata });
|
|
1058
1125
|
},
|
|
1059
1126
|
async setSelectedTeam(team) {
|
|
1060
|
-
await this.update({ selectedTeamId: team?.id ?? null });
|
|
1127
|
+
await this.update({ selectedTeamId: typeof team === "string" ? team : team?.id ?? null });
|
|
1061
1128
|
},
|
|
1062
1129
|
getConnectedAccount,
|
|
1063
1130
|
useConnectedAccount,
|
|
@@ -1288,8 +1355,29 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1288
1355
|
}
|
|
1289
1356
|
_createCustomer(userIdOrTeamId, type, session) {
|
|
1290
1357
|
const app = this;
|
|
1358
|
+
const effectiveSession = session ?? app._interface.createSession({ refreshToken: null });
|
|
1291
1359
|
const customerOptions = type === "user" ? { userId: userIdOrTeamId } : { teamId: userIdOrTeamId };
|
|
1292
1360
|
return {
|
|
1361
|
+
async getBilling() {
|
|
1362
|
+
const response = import_results.Result.orThrow(await app._customerBillingCache.getOrWait([effectiveSession, type, userIdOrTeamId], "write-only"));
|
|
1363
|
+
return app._customerBillingFromResponse(response);
|
|
1364
|
+
},
|
|
1365
|
+
useBilling() {
|
|
1366
|
+
const response = (0, import_common3.useAsyncCache)(app._customerBillingCache, [effectiveSession, type, userIdOrTeamId], "customer.useBilling()");
|
|
1367
|
+
return app._customerBillingFromResponse(response);
|
|
1368
|
+
},
|
|
1369
|
+
async createPaymentMethodSetupIntent() {
|
|
1370
|
+
const body = await app._interface.createCustomerPaymentMethodSetupIntent(type, userIdOrTeamId, effectiveSession);
|
|
1371
|
+
return {
|
|
1372
|
+
clientSecret: body.client_secret,
|
|
1373
|
+
stripeAccountId: body.stripe_account_id
|
|
1374
|
+
};
|
|
1375
|
+
},
|
|
1376
|
+
async setDefaultPaymentMethodFromSetupIntent(setupIntentId) {
|
|
1377
|
+
const body = await app._interface.setDefaultCustomerPaymentMethodFromSetupIntent(type, userIdOrTeamId, setupIntentId, effectiveSession);
|
|
1378
|
+
await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
|
|
1379
|
+
return body.default_payment_method;
|
|
1380
|
+
},
|
|
1293
1381
|
async getItem(itemId) {
|
|
1294
1382
|
return await app.getItem({ itemId, ...customerOptions });
|
|
1295
1383
|
},
|
|
@@ -1303,7 +1391,23 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1303
1391
|
return app.useProducts({ ...options, ...customerOptions });
|
|
1304
1392
|
},
|
|
1305
1393
|
async createCheckoutUrl(options) {
|
|
1306
|
-
return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId,
|
|
1394
|
+
return await app._interface.createCheckoutUrl(type, userIdOrTeamId, options.productId, effectiveSession, options.returnUrl);
|
|
1395
|
+
},
|
|
1396
|
+
async switchSubscription(options) {
|
|
1397
|
+
await app._interface.switchSubscription({
|
|
1398
|
+
customer_type: type,
|
|
1399
|
+
customer_id: userIdOrTeamId,
|
|
1400
|
+
from_product_id: options.fromProductId,
|
|
1401
|
+
to_product_id: options.toProductId,
|
|
1402
|
+
price_id: options.priceId,
|
|
1403
|
+
quantity: options.quantity
|
|
1404
|
+
}, effectiveSession);
|
|
1405
|
+
await app._customerBillingCache.refresh([effectiveSession, type, userIdOrTeamId]);
|
|
1406
|
+
if (type === "user") {
|
|
1407
|
+
await app._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === effectiveSession && userId === userIdOrTeamId);
|
|
1408
|
+
} else {
|
|
1409
|
+
await app._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === effectiveSession && teamId === userIdOrTeamId);
|
|
1410
|
+
}
|
|
1307
1411
|
}
|
|
1308
1412
|
};
|
|
1309
1413
|
}
|
|
@@ -1337,6 +1441,25 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1337
1441
|
const response = import_results.Result.orThrow(await this._customProductsCache.getOrWait([session, options.customCustomerId, options.cursor ?? null, options.limit ?? null], "write-only"));
|
|
1338
1442
|
return this._customerProductsFromResponse(response);
|
|
1339
1443
|
}
|
|
1444
|
+
async cancelSubscription(options) {
|
|
1445
|
+
const session = await this._getSession();
|
|
1446
|
+
const user = await this.getUser();
|
|
1447
|
+
if (!user) {
|
|
1448
|
+
throw new import_stack_shared.KnownErrors.UserAuthenticationRequired();
|
|
1449
|
+
}
|
|
1450
|
+
const customerType = "teamId" in options ? "team" : "user";
|
|
1451
|
+
const customerId = "teamId" in options ? options.teamId : user.id;
|
|
1452
|
+
await this._interface.cancelSubscription({
|
|
1453
|
+
customer_type: customerType,
|
|
1454
|
+
customer_id: customerId,
|
|
1455
|
+
product_id: options.productId
|
|
1456
|
+
}, session);
|
|
1457
|
+
if (customerType === "user") {
|
|
1458
|
+
await this._userProductsCache.invalidateWhere(([cachedSession, userId]) => cachedSession === session && userId === customerId);
|
|
1459
|
+
} else {
|
|
1460
|
+
await this._teamProductsCache.invalidateWhere(([cachedSession, teamId]) => cachedSession === session && teamId === customerId);
|
|
1461
|
+
}
|
|
1462
|
+
}
|
|
1340
1463
|
useProducts(options) {
|
|
1341
1464
|
const session = this._useSession();
|
|
1342
1465
|
const cache = "userId" in options ? this._userProductsCache : "teamId" in options ? this._teamProductsCache : this._customProductsCache;
|
|
@@ -1346,15 +1469,13 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1346
1469
|
return this._customerProductsFromResponse(response);
|
|
1347
1470
|
}
|
|
1348
1471
|
_currentUserFromCrud(crud, session) {
|
|
1349
|
-
const currentUser = {
|
|
1472
|
+
const currentUser = (0, import_users.withUserDestructureGuard)({
|
|
1350
1473
|
...this._createBaseUser(crud),
|
|
1351
1474
|
...this._createAuth(session),
|
|
1352
1475
|
...this._createUserExtraFromCurrent(crud, session),
|
|
1353
1476
|
...this._isInternalProject() ? this._createInternalUserExtra(session) : {},
|
|
1354
1477
|
...this._createCustomer(crud.id, "user", session)
|
|
1355
|
-
};
|
|
1356
|
-
(0, import_users.attachUserDestructureGuard)(currentUser);
|
|
1357
|
-
Object.freeze(currentUser);
|
|
1478
|
+
});
|
|
1358
1479
|
return currentUser;
|
|
1359
1480
|
}
|
|
1360
1481
|
_clientSessionFromCrud(crud) {
|
|
@@ -1437,7 +1558,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1437
1558
|
const queryParams = new URLSearchParams(window.location.search);
|
|
1438
1559
|
url = queryParams.get("after_auth_return_to") || url;
|
|
1439
1560
|
}
|
|
1440
|
-
} else if (handlerName === "signIn" || handlerName === "signUp") {
|
|
1561
|
+
} else if (handlerName === "signIn" || handlerName === "signUp" || handlerName === "onboarding") {
|
|
1441
1562
|
if (isReactServer || typeof window === "undefined") {
|
|
1442
1563
|
} else {
|
|
1443
1564
|
const currentUrl = new URL(window.location.href);
|
|
@@ -1486,6 +1607,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1486
1607
|
async redirectToAfterSignUp(options) {
|
|
1487
1608
|
return await this._redirectToHandler("afterSignUp", options);
|
|
1488
1609
|
}
|
|
1610
|
+
async redirectToOnboarding(options) {
|
|
1611
|
+
return await this._redirectToHandler("onboarding", options);
|
|
1612
|
+
}
|
|
1489
1613
|
async redirectToAfterSignOut(options) {
|
|
1490
1614
|
return await this._redirectToHandler("afterSignOut", options);
|
|
1491
1615
|
}
|
|
@@ -1551,16 +1675,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1551
1675
|
return result;
|
|
1552
1676
|
}
|
|
1553
1677
|
async getUser(options) {
|
|
1678
|
+
if (options?.or === "anonymous" && options.includeRestricted === false) {
|
|
1679
|
+
throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
|
|
1680
|
+
}
|
|
1554
1681
|
this._ensurePersistentTokenStore(options?.tokenStore);
|
|
1555
1682
|
const session = await this._getSession(options?.tokenStore);
|
|
1556
1683
|
let crud = import_results.Result.orThrow(await this._currentUserCache.getOrWait([session], "write-only"));
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
if (crud === null) {
|
|
1684
|
+
const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
|
|
1685
|
+
const includeRestricted = options?.includeRestricted === true || includeAnonymous;
|
|
1686
|
+
if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
|
|
1561
1687
|
switch (options?.or) {
|
|
1562
1688
|
case "redirect": {
|
|
1563
|
-
|
|
1689
|
+
if (!crud?.is_anonymous && crud?.is_restricted) {
|
|
1690
|
+
await this.redirectToOnboarding({ replace: true });
|
|
1691
|
+
} else {
|
|
1692
|
+
await this.redirectToSignIn({ replace: true });
|
|
1693
|
+
}
|
|
1564
1694
|
break;
|
|
1565
1695
|
}
|
|
1566
1696
|
case "throw": {
|
|
@@ -1568,7 +1698,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1568
1698
|
}
|
|
1569
1699
|
case "anonymous": {
|
|
1570
1700
|
const tokens = await this._signUpAnonymously();
|
|
1571
|
-
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]" }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1701
|
+
return await this.getUser({ tokenStore: tokens, or: "anonymous-if-exists[deprecated]", includeRestricted: true }) ?? (0, import_errors.throwErr)("Something went wrong while signing up anonymously");
|
|
1572
1702
|
}
|
|
1573
1703
|
case void 0:
|
|
1574
1704
|
case "anonymous-if-exists[deprecated]":
|
|
@@ -1580,16 +1710,22 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1580
1710
|
return crud && this._currentUserFromCrud(crud, session);
|
|
1581
1711
|
}
|
|
1582
1712
|
useUser(options) {
|
|
1713
|
+
if (options?.or === "anonymous" && options.includeRestricted === false) {
|
|
1714
|
+
throw new Error("Cannot use { or: 'anonymous' } with { includeRestricted: false }. Anonymous users implicitly include restricted users.");
|
|
1715
|
+
}
|
|
1583
1716
|
this._ensurePersistentTokenStore(options?.tokenStore);
|
|
1584
1717
|
const session = this._useSession(options?.tokenStore);
|
|
1585
1718
|
let crud = (0, import_common3.useAsyncCache)(this._currentUserCache, [session], "clientApp.useUser()");
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
if (crud === null) {
|
|
1719
|
+
const includeAnonymous = options?.or === "anonymous" || options?.or === "anonymous-if-exists[deprecated]";
|
|
1720
|
+
const includeRestricted = options?.includeRestricted === true || includeAnonymous;
|
|
1721
|
+
if (crud === null || crud.is_anonymous && !includeAnonymous || crud.is_restricted && !includeRestricted) {
|
|
1590
1722
|
switch (options?.or) {
|
|
1591
1723
|
case "redirect": {
|
|
1592
|
-
|
|
1724
|
+
if (!crud?.is_anonymous && crud?.is_restricted) {
|
|
1725
|
+
(0, import_promises.runAsynchronously)(this.redirectToOnboarding({ replace: true }));
|
|
1726
|
+
} else {
|
|
1727
|
+
(0, import_promises.runAsynchronously)(this.redirectToSignIn({ replace: true }));
|
|
1728
|
+
}
|
|
1593
1729
|
(0, import_react.suspend)();
|
|
1594
1730
|
throw new import_errors.StackAssertionError("suspend should never return");
|
|
1595
1731
|
}
|
|
@@ -1617,7 +1753,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1617
1753
|
}, [crud, session, options?.or]);
|
|
1618
1754
|
}
|
|
1619
1755
|
_getTokenPartialUserFromSession(session, options) {
|
|
1620
|
-
const accessToken = session.getAccessTokenIfNotExpiredYet(0);
|
|
1756
|
+
const accessToken = session.getAccessTokenIfNotExpiredYet(0, null);
|
|
1621
1757
|
if (!accessToken) {
|
|
1622
1758
|
return null;
|
|
1623
1759
|
}
|
|
@@ -1630,7 +1766,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1630
1766
|
primaryEmail: accessToken.payload.email,
|
|
1631
1767
|
displayName: accessToken.payload.name,
|
|
1632
1768
|
primaryEmailVerified: accessToken.payload.email_verified,
|
|
1633
|
-
isAnonymous
|
|
1769
|
+
isAnonymous,
|
|
1770
|
+
isRestricted: accessToken.payload.is_restricted,
|
|
1771
|
+
restrictedReason: accessToken.payload.restricted_reason
|
|
1634
1772
|
};
|
|
1635
1773
|
}
|
|
1636
1774
|
async _getPartialUserFromConvex(ctx) {
|
|
@@ -1643,7 +1781,9 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1643
1781
|
displayName: auth.name ?? null,
|
|
1644
1782
|
primaryEmail: auth.email ?? null,
|
|
1645
1783
|
primaryEmailVerified: auth.email_verified,
|
|
1646
|
-
isAnonymous: auth.is_anonymous
|
|
1784
|
+
isAnonymous: auth.is_anonymous,
|
|
1785
|
+
isRestricted: auth.is_restricted,
|
|
1786
|
+
restrictedReason: auth.restricted_reason ?? null
|
|
1647
1787
|
};
|
|
1648
1788
|
}
|
|
1649
1789
|
async getPartialUser(options) {
|
|
@@ -1681,7 +1821,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1681
1821
|
return async (args) => {
|
|
1682
1822
|
const session = await this._getSession(options.tokenStore ?? this._tokenStoreInit);
|
|
1683
1823
|
if (!args.forceRefreshToken) {
|
|
1684
|
-
const tokens2 = await session.getOrFetchLikelyValidTokens(2e4);
|
|
1824
|
+
const tokens2 = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
|
|
1685
1825
|
return tokens2?.accessToken.token ?? null;
|
|
1686
1826
|
}
|
|
1687
1827
|
const tokens = await session.fetchNewTokens();
|
|
@@ -1690,7 +1830,7 @@ var __StackClientAppImplIncomplete = class __StackClientAppImplIncomplete {
|
|
|
1690
1830
|
}
|
|
1691
1831
|
async getConvexHttpClientAuth(options) {
|
|
1692
1832
|
const session = await this._getSession(options.tokenStore);
|
|
1693
|
-
const tokens = await session.getOrFetchLikelyValidTokens(2e4);
|
|
1833
|
+
const tokens = await session.getOrFetchLikelyValidTokens(2e4, 75e3);
|
|
1694
1834
|
return tokens?.accessToken.token ?? "";
|
|
1695
1835
|
}
|
|
1696
1836
|
async _updateClientUser(update, session) {
|
|
@@ -2037,11 +2177,44 @@ ${url}`);
|
|
|
2037
2177
|
await user.signOut({ redirectUrl: options?.redirectUrl });
|
|
2038
2178
|
}
|
|
2039
2179
|
}
|
|
2180
|
+
async getAccessToken(options) {
|
|
2181
|
+
const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2182
|
+
if (user) {
|
|
2183
|
+
return await user.getAccessToken();
|
|
2184
|
+
}
|
|
2185
|
+
return null;
|
|
2186
|
+
}
|
|
2187
|
+
useAccessToken(options) {
|
|
2188
|
+
const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2189
|
+
if (user) {
|
|
2190
|
+
return user.useAccessToken();
|
|
2191
|
+
}
|
|
2192
|
+
return null;
|
|
2193
|
+
}
|
|
2194
|
+
async getRefreshToken(options) {
|
|
2195
|
+
const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2196
|
+
if (user) {
|
|
2197
|
+
return await user.getRefreshToken();
|
|
2198
|
+
}
|
|
2199
|
+
return null;
|
|
2200
|
+
}
|
|
2201
|
+
useRefreshToken(options) {
|
|
2202
|
+
const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2203
|
+
if (user) {
|
|
2204
|
+
return user.useRefreshToken();
|
|
2205
|
+
}
|
|
2206
|
+
return null;
|
|
2207
|
+
}
|
|
2040
2208
|
async getAuthHeaders(options) {
|
|
2041
2209
|
return {
|
|
2042
2210
|
"x-stack-auth": JSON.stringify(await this.getAuthJson(options))
|
|
2043
2211
|
};
|
|
2044
2212
|
}
|
|
2213
|
+
useAuthHeaders(options) {
|
|
2214
|
+
return {
|
|
2215
|
+
"x-stack-auth": JSON.stringify(this.useAuthJson(options))
|
|
2216
|
+
};
|
|
2217
|
+
}
|
|
2045
2218
|
async getAuthJson(options) {
|
|
2046
2219
|
const user = await this.getUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2047
2220
|
if (user) {
|
|
@@ -2049,6 +2222,13 @@ ${url}`);
|
|
|
2049
2222
|
}
|
|
2050
2223
|
return { accessToken: null, refreshToken: null };
|
|
2051
2224
|
}
|
|
2225
|
+
useAuthJson(options) {
|
|
2226
|
+
const user = this.useUser({ tokenStore: options?.tokenStore ?? void 0 });
|
|
2227
|
+
if (user) {
|
|
2228
|
+
return user.useAuthJson();
|
|
2229
|
+
}
|
|
2230
|
+
return { accessToken: null, refreshToken: null };
|
|
2231
|
+
}
|
|
2052
2232
|
async getProject() {
|
|
2053
2233
|
const crud = import_results.Result.orThrow(await this._currentProjectCache.getOrWait([], "write-only"));
|
|
2054
2234
|
return this._clientProjectFromCrud(crud);
|
|
@@ -2085,6 +2265,7 @@ ${url}`);
|
|
|
2085
2265
|
}
|
|
2086
2266
|
async _refreshUser(session) {
|
|
2087
2267
|
await this._refreshSession(session);
|
|
2268
|
+
session.suggestAccessTokenExpired();
|
|
2088
2269
|
}
|
|
2089
2270
|
async _refreshSession(session) {
|
|
2090
2271
|
await this._currentUserCache.refresh([session]);
|