修复(#122): 补齐促销价档位提交
PR Check / Lint, Check, Test and Build (push) Has been cancelled
Build and Release / Build (push) Has been cancelled

This commit is contained in:
2026-05-29 02:32:01 -07:00
parent a7d89acc7f
commit d66b664198
14 changed files with 369 additions and 34 deletions
@@ -17,6 +17,7 @@ import CouponInput from "@/sections/subscribe/coupon-input";
import { SubscribeDetail } from "@/sections/subscribe/detail";
import DurationSelector from "@/sections/subscribe/duration-selector";
import PaymentMethods from "@/sections/subscribe/payment-methods";
import { PromoInfo } from "@/sections/subscribe/promo-info";
import { useGlobalStore } from "@/stores/global";
export default function Content({
@@ -49,6 +50,9 @@ export default function Content({
valid: false,
message: "",
});
const selectedDiscount = subscription?.discount?.find(
(item) => item.quantity === params.quantity
);
const { data: order } = useQuery({
enabled: !!subscription?.id && !!params.payment,
@@ -103,7 +107,10 @@ export default function Content({
navigate({ to: "/purchasing/order", search: { order_no } });
}
} catch (error) {
console.log(error);
setIsEmailValid((prev) => ({
...prev,
message: error instanceof Error ? error.message : prev.message,
}));
}
});
}, [params, navigate]);
@@ -285,6 +292,7 @@ export default function Content({
show_original_price: subscription?.show_original_price,
}}
/>
<PromoInfo discount={selectedDiscount} />
</CardContent>
</Card>
</div>
@@ -0,0 +1,33 @@
import { Badge } from "@workspace/ui/components/badge";
import { useTranslation } from "react-i18next";
import { Display } from "@/components/display";
interface PromoInfoProps {
discount?: API.SubscribeDiscount;
}
export function PromoInfo({ discount }: Readonly<PromoInfoProps>) {
const { t } = useTranslation("subscribe");
const promo = discount?.promo;
if (!promo) return null;
return (
<div className="flex flex-wrap items-center justify-between gap-2 rounded-md border bg-muted/40 p-3 text-sm">
<div className="grid gap-1">
<span className="font-medium">
{promo.rule_name || t("promo.available", "Promo Available")}
</span>
{promo.end_time && (
<span className="text-muted-foreground text-xs">
{t("promo.validUntil", "Valid until")}:{" "}
{new Date(promo.end_time * 1000).toLocaleString()}
</span>
)}
</div>
<Badge variant="secondary">
<Display type="currency" value={promo.promo_price} />
</Badge>
</div>
);
}
@@ -18,6 +18,7 @@ import { useTranslation } from "react-i18next";
import CouponInput from "@/sections/subscribe/coupon-input";
import DurationSelector from "@/sections/subscribe/duration-selector";
import PaymentMethods from "@/sections/subscribe/payment-methods";
import { PromoInfo } from "@/sections/subscribe/promo-info";
import { useGlobalStore } from "@/stores/global";
import { SubscribeBilling } from "./billing";
import { SubscribeDetail } from "./detail";
@@ -41,7 +42,12 @@ export default function Purchase({
coupon: "",
});
const [loading, startTransition] = useTransition();
const lastSuccessOrderRef = useRef<any>(null);
const lastSuccessOrderRef = useRef<API.PreOrderResponse | undefined>(
undefined
);
const selectedDiscount = subscribe?.discount?.find(
(item) => item.quantity === params.quantity
);
const { data: order } = useQuery({
enabled: !!subscribe?.id,
@@ -140,6 +146,7 @@ export default function Purchase({
show_original_price: subscribe?.show_original_price,
}}
/>
<PromoInfo discount={selectedDiscount} />
</CardContent>
</Card>
<div className="flex flex-col justify-between text-sm">