fix(private-room): preserve payment return route

This commit is contained in:
2026-07-16 18:06:15 +08:00
parent b64a90f0e3
commit 4981de9b18
17 changed files with 280 additions and 21 deletions
@@ -54,6 +54,17 @@ describe("navigation resolver", () => {
).toBe(ROUTE_BUILDERS.authWithRedirect(subscriptionUrl));
});
it("builds private room subscription return urls", () => {
expect(
ROUTE_BUILDERS.subscription("topup", {
payChannel: "stripe",
returnTo: "private-room",
}),
).toBe(
"/subscription?type=topup&payChannel=stripe&returnTo=private-room",
);
});
it("allows not logged in users to enter chat for guest bootstrap", () => {
expect(
resolveRouteGuardRedirect({
+1 -1
View File
@@ -7,7 +7,7 @@ import type {
} from "@/data/storage/navigation";
export type AppSubscriptionType = "vip" | "topup";
export type AppSubscriptionReturnTo = "chat" | null;
export type AppSubscriptionReturnTo = "chat" | "private-room" | null;
export interface OpenSubscriptionInput {
type: AppSubscriptionType;
+2 -1
View File
@@ -8,6 +8,7 @@
*/
import type { PayChannel } from "@/data/dto/payment";
import type { AppSubscriptionReturnTo } from "@/router/navigation-types";
import {
PAYMENT_ANALYTICS_ENTRY_PARAM,
PAYMENT_ANALYTICS_REASON_PARAM,
@@ -36,7 +37,7 @@ export const ROUTE_BUILDERS = {
type: "vip" | "topup",
options: {
payChannel?: PayChannel;
returnTo?: "chat";
returnTo?: Exclude<AppSubscriptionReturnTo, null>;
analytics?: PaymentAnalyticsContext;
} = {},
): `/subscription?${string}` => {
+2 -7
View File
@@ -7,7 +7,7 @@ import { NavigationStorage } from "@/data/storage/navigation";
import type { SubscriptionReturnTo } from "@/lib/navigation/subscription_exit";
import {
consumeSubscriptionExitUrl,
peekSubscriptionExplicitExitUrl,
resolveSubscriptionSuccessExitUrl,
} from "@/lib/navigation/subscription_exit";
import { getDefaultPayChannelForCountryCode } from "@/lib/payment/default_pay_channel";
import {
@@ -193,12 +193,7 @@ export function useAppNavigator(): AppNavigator {
const exitSubscriptionAfterSuccess = useCallback((returnTo: SubscriptionReturnTo): void => {
void (async () => {
const pendingExitUrl = await peekSubscriptionExplicitExitUrl();
if (pendingExitUrl) {
router.replace(pendingExitUrl);
return;
}
router.replace(await consumeSubscriptionExitUrl(returnTo));
router.replace(await resolveSubscriptionSuccessExitUrl(returnTo));
})();
}, [router]);