refactor(stores): tighten chat and payment boundaries

This commit is contained in:
2026-07-01 10:12:19 +08:00
parent b7bccaa4cf
commit 5d9ed7e027
9 changed files with 435 additions and 431 deletions
@@ -41,6 +41,45 @@ export function getDefaultPlanId(plans: readonly PaymentPlan[]): string {
);
}
export function hydratePlansState(
plans: PaymentPlan[],
selectedPlanId: string,
): Pick<PaymentState, "plans" | "selectedPlanId" | "autoRenew" | "errorMessage"> {
const nextSelectedPlanId = selectedPlanId || getDefaultPlanId(plans);
return {
plans,
selectedPlanId: nextSelectedPlanId,
autoRenew: defaultAutoRenewForPlan(nextSelectedPlanId, plans),
errorMessage: null,
};
}
export function refreshPlansState(
plans: PaymentPlan[],
selectedPlanId: string,
): Pick<PaymentState, "plans" | "selectedPlanId" | "autoRenew" | "errorMessage"> {
const nextSelectedPlanId = plans.some((plan) => plan.planId === selectedPlanId)
? selectedPlanId
: getDefaultPlanId(plans);
return {
plans,
selectedPlanId: nextSelectedPlanId,
autoRenew: defaultAutoRenewForPlan(nextSelectedPlanId, plans),
errorMessage: null,
};
}
export function selectPlanState(
planId: string,
plans: readonly PaymentPlan[],
): Partial<PaymentState> {
return {
...resetOrderState(),
selectedPlanId: planId,
autoRenew: defaultAutoRenewForPlan(planId, plans),
};
}
export function resetOrderState(): Partial<PaymentState> {
return {
currentOrderId: null,
+8 -34
View File
@@ -12,11 +12,12 @@ import {
refreshPaymentPlansActor,
} from "./payment-machine.actors";
import {
defaultAutoRenewForPlan,
getDefaultPlanId,
hasOrderPollingTimedOut,
hydratePlansState,
PAYMENT_TIMEOUT_ERROR_MESSAGE,
refreshPlansState,
resetOrderState,
selectPlanState,
toPaymentErrorMessage,
} from "./payment-machine.helpers";
@@ -58,14 +59,7 @@ export const paymentMachine = setup({
target: "refreshingPlans",
actions: assign(({ context, event }) => {
const plans = event.output?.plans ?? [];
const selectedPlanId =
context.selectedPlanId || getDefaultPlanId(plans);
return {
plans,
selectedPlanId,
autoRenew: defaultAutoRenewForPlan(selectedPlanId, plans),
errorMessage: null,
};
return hydratePlansState(plans, context.selectedPlanId);
}),
},
{
@@ -85,14 +79,7 @@ export const paymentMachine = setup({
target: "ready",
actions: assign(({ context, event }) => {
const plans = event.output.plans;
const selectedPlanId =
context.selectedPlanId || getDefaultPlanId(plans);
return {
plans,
selectedPlanId,
autoRenew: defaultAutoRenewForPlan(selectedPlanId, plans),
errorMessage: null,
};
return hydratePlansState(plans, context.selectedPlanId);
}),
},
onError: {
@@ -111,16 +98,7 @@ export const paymentMachine = setup({
target: "ready",
actions: assign(({ context, event }) => {
const plans = event.output.plans;
const selectedPlanId =
plans.some((plan) => plan.planId === context.selectedPlanId)
? context.selectedPlanId
: getDefaultPlanId(plans);
return {
plans,
selectedPlanId,
autoRenew: defaultAutoRenewForPlan(selectedPlanId, plans),
errorMessage: null,
};
return refreshPlansState(plans, context.selectedPlanId);
}),
},
onError: {
@@ -137,9 +115,7 @@ export const paymentMachine = setup({
PaymentInit: "refreshingPlans",
PaymentPlanSelected: {
actions: assign(({ context, event }) => ({
...resetOrderState(),
selectedPlanId: event.planId,
autoRenew: defaultAutoRenewForPlan(event.planId, context.plans),
...selectPlanState(event.planId, context.plans),
})),
},
PaymentPayChannelChanged: {
@@ -283,9 +259,7 @@ export const paymentMachine = setup({
PaymentPlanSelected: {
target: "ready",
actions: assign(({ context, event }) => ({
...resetOrderState(),
selectedPlanId: event.planId,
autoRenew: defaultAutoRenewForPlan(event.planId, context.plans),
...selectPlanState(event.planId, context.plans),
})),
},
PaymentPayChannelChanged: {