admin: subscription controls + show original price

This commit is contained in:
web-ppanel 2026-01-27 17:57:46 +00:00
parent 0ec4f84fa9
commit 7223eb41c6
2 changed files with 103 additions and 0 deletions

View File

@ -77,6 +77,7 @@ const defaultValues = {
purchase_with_discount: false, purchase_with_discount: false,
reset_cycle: 0, reset_cycle: 0,
renewal_reset: false, renewal_reset: false,
show_original_price: false,
deduction_mode: "auto", deduction_mode: "auto",
}; };
@ -120,6 +121,7 @@ export default function SubscribeForm<T extends Record<string, any>>({
allow_deduction: z.boolean().optional(), allow_deduction: z.boolean().optional(),
reset_cycle: z.number().optional(), reset_cycle: z.number().optional(),
renewal_reset: z.boolean().optional(), renewal_reset: z.boolean().optional(),
show_original_price: z.boolean().optional(),
}); });
const form = useForm<z.infer<typeof formSchema>>({ const form = useForm<z.infer<typeof formSchema>>({
@ -837,6 +839,41 @@ export default function SubscribeForm<T extends Record<string, any>>({
</FormItem> </FormItem>
)} )}
/> />
<FormField
control={form.control}
name="show_original_price"
render={({ field }) => (
<FormItem>
<div className="flex items-center justify-between">
<div className="space-y-0.5">
<FormLabel>
{t(
"form.showOriginalPrice",
"Show Original Price"
)}
</FormLabel>
<FormDescription>
{t(
"form.showOriginalPriceDescription",
"Display original price in the storefront"
)}
</FormDescription>
</div>
<FormControl>
<Switch
checked={!!field.value}
onCheckedChange={(value) =>
form.setValue(field.name, value)
}
/>
</FormControl>
</div>
<FormMessage />
</FormItem>
)}
/>
<FormField <FormField
control={form.control} control={form.control}
name="allow_deduction" name="allow_deduction"

View File

@ -15,6 +15,9 @@ import {
createUserSubscribe, createUserSubscribe,
deleteUserSubscribe, deleteUserSubscribe,
getUserSubscribe, getUserSubscribe,
resetUserSubscribeToken,
resetUserSubscribeTraffic,
toggleUserSubscribeStatus,
updateUserSubscribe, updateUserSubscribe,
} from "@workspace/ui/services/admin/user"; } from "@workspace/ui/services/admin/user";
import { useRef, useState } from "react"; import { useRef, useState } from "react";
@ -68,6 +71,69 @@ export default function UserSubscription({ userId }: { userId: number }) {
> >
{t("copySubscription", "Copy Subscription")} {t("copySubscription", "Copy Subscription")}
</Button>, </Button>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
description={t(
"resetSubscriptionTokenDescription",
"This will reset the subscription token. Old links will become invalid."
)}
key="reset-token"
onConfirm={async () => {
await resetUserSubscribeToken({ user_subscribe_id: row.id });
toast.success(t("resetSuccess", "Reset successfully"));
ref.current?.refresh();
}}
title={t("resetSubscriptionToken", "Reset Token")}
trigger={
<Button variant="outline">
{t("resetToken", "Reset Token")}
</Button>
}
/>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
description={t(
"resetSubscriptionTrafficDescription",
"This will reset the subscription traffic counters."
)}
key="reset-traffic"
onConfirm={async () => {
await resetUserSubscribeTraffic({ user_subscribe_id: row.id });
toast.success(t("resetSuccess", "Reset successfully"));
ref.current?.refresh();
}}
title={t("resetSubscriptionTraffic", "Reset Traffic")}
trigger={
<Button variant="outline">
{t("resetTraffic", "Reset Traffic")}
</Button>
}
/>,
<ConfirmButton
cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")}
description={t(
"toggleSubscriptionStatusDescription",
"This will toggle the subscription status."
)}
key="toggle-status"
onConfirm={async () => {
await toggleUserSubscribeStatus({ user_subscribe_id: row.id });
toast.success(t("updateSuccess", "Updated successfully"));
ref.current?.refresh();
}}
title={t("toggleSubscriptionStatus", "Toggle Status")}
trigger={
<Button variant="outline">
{t("toggleStatus", "Toggle Status")}
</Button>
}
/>,
<ConfirmButton <ConfirmButton
cancelText={t("cancel", "Cancel")} cancelText={t("cancel", "Cancel")}
confirmText={t("confirm", "Confirm")} confirmText={t("confirm", "Confirm")}