refactor(payment): centralize route lifecycle

This commit is contained in:
2026-07-15 18:47:01 +08:00
parent 7dce1b5d4c
commit 590dee417b
9 changed files with 203 additions and 144 deletions
+19 -18
View File
@@ -1,45 +1,50 @@
import type { PayChannel } from "@/data/dto/payment";
import {
PAYMENT_ANALYTICS_ENTRY_PARAM,
PAYMENT_ANALYTICS_REASON_PARAM,
parsePaymentAnalyticsContext,
} from "@/lib/analytics/payment_analytics_context";
import {
getFirstPaymentSearchParam,
parsePaymentReturnSearchParams,
type PaymentSearchParams,
} from "@/lib/payment/payment_search_params";
import {
SubscriptionScreen,
type SubscriptionType,
} from "./subscription-screen";
type SubscriptionSearchParams = Record<string, string | string[] | undefined>;
export default async function SubscriptionPage({
searchParams,
}: {
searchParams: Promise<SubscriptionSearchParams>;
searchParams: Promise<PaymentSearchParams>;
}) {
const query = await searchParams;
const subscriptionType = toSubscriptionType(firstSearchParam(query.type));
const paymentReturn = parsePaymentReturnSearchParams(query);
const subscriptionType = toSubscriptionType(
getFirstPaymentSearchParam(query.type),
);
const analyticsContext = parsePaymentAnalyticsContext({
entryPoint: firstSearchParam(query[PAYMENT_ANALYTICS_ENTRY_PARAM]),
triggerReason: firstSearchParam(query[PAYMENT_ANALYTICS_REASON_PARAM]),
entryPoint: getFirstPaymentSearchParam(
query[PAYMENT_ANALYTICS_ENTRY_PARAM],
),
triggerReason: getFirstPaymentSearchParam(
query[PAYMENT_ANALYTICS_REASON_PARAM],
),
subscriptionType,
});
return (
<SubscriptionScreen
subscriptionType={subscriptionType}
shouldResumePendingOrder={firstSearchParam(query.paymentReturn) === "1"}
returnTo={toReturnTo(firstSearchParam(query.returnTo))}
initialPayChannel={toPayChannel(firstSearchParam(query.payChannel))}
shouldResumePendingOrder={paymentReturn.shouldResumePendingOrder}
returnTo={toReturnTo(getFirstPaymentSearchParam(query.returnTo))}
initialPayChannel={paymentReturn.initialPayChannel}
analyticsContext={analyticsContext}
/>
);
}
function firstSearchParam(value: string | string[] | undefined): string | null {
return Array.isArray(value) ? (value[0] ?? null) : (value ?? null);
}
function toSubscriptionType(value: string | null): SubscriptionType {
return value === "topup" ? "topup" : "vip";
}
@@ -47,7 +52,3 @@ function toSubscriptionType(value: string | null): SubscriptionType {
function toReturnTo(value: string | null): "chat" | null {
return value === "chat" ? "chat" : null;
}
function toPayChannel(value: string | null): PayChannel | null {
return value === "ezpay" || value === "stripe" ? value : null;
}