import type { TLicenseClaim } from '@documenso/lib/types/license'; import { SUBSCRIPTION_CLAIM_FEATURE_FLAGS } from '@documenso/lib/types/subscription'; import { ZCreateSubscriptionClaimRequestSchema } from '@documenso/trpc/server/admin-router/create-subscription-claim.types'; import { Alert, AlertDescription } from '@documenso/ui/primitives/alert'; import { Checkbox } from '@documenso/ui/primitives/checkbox'; import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@documenso/ui/primitives/form/form'; import { Input } from '@documenso/ui/primitives/input'; import { zodResolver } from '@hookform/resolvers/zod'; import { Trans, useLingui } from '@lingui/react/macro'; import type { SubscriptionClaim } from '@prisma/client'; import { useForm } from 'react-hook-form'; import { Link } from 'react-router'; import type { z } from 'zod'; import { ClaimLimitFields } from '../general/claim-limit-fields'; export type SubscriptionClaimFormValues = z.infer; type SubscriptionClaimFormProps = { subscriptionClaim: Omit; onFormSubmit: (data: SubscriptionClaimFormValues) => Promise; formSubmitTrigger?: React.ReactNode; licenseFlags?: TLicenseClaim; }; export const SubscriptionClaimForm = ({ subscriptionClaim, onFormSubmit, formSubmitTrigger, licenseFlags, }: SubscriptionClaimFormProps) => { const { t } = useLingui(); const hasRestrictedEnterpriseFeatures = Object.values(SUBSCRIPTION_CLAIM_FEATURE_FLAGS).some( // eslint-disable-next-line @typescript-eslint/consistent-type-assertions (flag) => flag.isEnterprise && !licenseFlags?.[flag.key as keyof TLicenseClaim], ); const form = useForm({ resolver: zodResolver(ZCreateSubscriptionClaimRequestSchema), defaultValues: { name: subscriptionClaim.name, teamCount: subscriptionClaim.teamCount, memberCount: subscriptionClaim.memberCount, envelopeItemCount: subscriptionClaim.envelopeItemCount, recipientCount: subscriptionClaim.recipientCount, flags: subscriptionClaim.flags, documentRateLimits: subscriptionClaim.documentRateLimits, documentQuota: subscriptionClaim.documentQuota, emailRateLimits: subscriptionClaim.emailRateLimits, emailQuota: subscriptionClaim.emailQuota, apiRateLimits: subscriptionClaim.apiRateLimits, apiQuota: subscriptionClaim.apiQuota, }, }); return (
( Name )} /> ( Team Count field.onChange(parseInt(e.target.value, 10) || 0)} /> Number of teams allowed. 0 = Unlimited )} /> ( Member Count field.onChange(parseInt(e.target.value, 10) || 0)} /> Number of members allowed. 0 = Unlimited )} /> ( Envelope Item Count field.onChange(parseInt(e.target.value, 10) || 0)} /> Maximum number of uploaded files per envelope allowed )} /> ( Recipient Count field.onChange(parseInt(e.target.value, 10) || 0)} /> Maximum number of recipients per document allowed. 0 = Unlimited )} />
Feature Flags
{Object.values(SUBSCRIPTION_CLAIM_FEATURE_FLAGS).map(({ key, label, isEnterprise }) => { const isRestrictedFeature = isEnterprise && !licenseFlags?.[key as keyof TLicenseClaim]; // eslint-disable-line @typescript-eslint/consistent-type-assertions return ( (
)} /> ); })}
{hasRestrictedEnterpriseFeatures && ( ¹  Your current license does not include these features.{' '} Learn more )}
{formSubmitTrigger}
); };