import { zodResolver } from "@hookform/resolvers/zod"; import { useQuery } from "@tanstack/react-query"; import { Button } from "@workspace/ui/components/button"; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from "@workspace/ui/components/form"; import { ScrollArea } from "@workspace/ui/components/scroll-area"; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from "@workspace/ui/components/sheet"; import { Switch } from "@workspace/ui/components/switch"; import { EnhancedInput } from "@workspace/ui/composed/enhanced-input"; import { Icon } from "@workspace/ui/composed/icon"; import { getInviteConfig, updateInviteConfig, } from "@workspace/ui/services/admin/system"; import { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import { z } from "zod"; const inviteSchema = z.object({ forced_invite: z.boolean().optional(), referral_percentage: z.number().optional(), only_first_purchase: z.boolean().optional(), gift_days: z.number().optional(), }); type InviteFormData = z.infer; export default function InviteConfig() { const { t } = useTranslation("system"); const [open, setOpen] = useState(false); const [loading, setLoading] = useState(false); const { data, refetch } = useQuery({ queryKey: ["getInviteConfig"], queryFn: async () => { const { data } = await getInviteConfig(); return data.data; }, enabled: open, }); const form = useForm({ resolver: zodResolver(inviteSchema), defaultValues: { forced_invite: false, referral_percentage: 0, only_first_purchase: false, gift_days: 0, }, }); useEffect(() => { if (data) { form.reset(data); } }, [data, form]); async function onSubmit(values: InviteFormData) { setLoading(true); try { await updateInviteConfig(values as API.InviteConfig); toast.success(t("invite.saveSuccess", "Save Successful")); refetch(); setOpen(false); } catch (_error) { toast.error(t("invite.saveFailed", "Save Failed")); } finally { setLoading(false); } } return (

{t("invite.title", "Invitation Settings")}

{t( "invite.description", "Configure user invitation and referral reward settings" )}

{t("invite.title", "Invitation Settings")}
( {t( "invite.forcedInvite", "Require Invitation to Register" )} {t( "invite.forcedInviteDescription", "When enabled, users must register through an invitation link" )} )} /> ( {t( "invite.referralPercentage", "Referral Reward Percentage" )} field.onChange(Number(value))} placeholder={t( "invite.inputPlaceholder", "Please enter" )} suffix="%" type="number" value={field.value} /> {t( "invite.referralPercentageDescription", "Percentage of reward given to referrers" )} )} /> ( {t("invite.giftDays", "Invite Gift Days")} field.onChange(Number(value))} placeholder={t( "invite.giftDaysPlaceholder", "Enter days" )} suffix={t("invite.giftDaysSuffix", "day(s)")} type="number" value={field.value} /> {t( "invite.giftDaysDescription", "When referral percentage is 0, both the inviter and invitee receive extra subscription days after a purchase" )} )} /> ( {t( "invite.onlyFirstPurchase", "First Purchase Reward Only" )} {t( "invite.onlyFirstPurchaseDescription", "When enabled, referrers only receive rewards for the first purchase by referred users" )} )} />
); }