mirror of
https://github.com/documenso/documenso.git
synced 2025-11-16 01:32:06 +10:00
feat: expiry links
This commit is contained in:
@ -11,7 +11,7 @@ import {
|
||||
TeamMemberRole,
|
||||
} from '@prisma/client';
|
||||
import { InfoIcon } from 'lucide-react';
|
||||
import { useForm } from 'react-hook-form';
|
||||
import { useForm, useWatch } from 'react-hook-form';
|
||||
import { match } from 'ts-pattern';
|
||||
|
||||
import { useCurrentOrganisation } from '@documenso/lib/client-only/providers/organisation';
|
||||
@ -56,6 +56,7 @@ import { MultiSelectCombobox } from '@documenso/ui/primitives/multi-select-combo
|
||||
|
||||
import { DocumentSignatureSettingsTooltip } from '../../components/document/document-signature-settings-tooltip';
|
||||
import { Combobox } from '../combobox';
|
||||
import { ExpirySettingsPicker } from '../expiry-settings-picker';
|
||||
import { Input } from '../input';
|
||||
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../select';
|
||||
import { useStep } from '../stepper';
|
||||
@ -71,6 +72,18 @@ import {
|
||||
} from './document-flow-root';
|
||||
import type { DocumentFlowStep } from './types';
|
||||
|
||||
const isExpiryUnit = (
|
||||
value: unknown,
|
||||
): value is 'minutes' | 'hours' | 'days' | 'weeks' | 'months' => {
|
||||
return (
|
||||
value === 'minutes' ||
|
||||
value === 'hours' ||
|
||||
value === 'days' ||
|
||||
value === 'weeks' ||
|
||||
value === 'months'
|
||||
);
|
||||
};
|
||||
|
||||
export type AddSettingsFormProps = {
|
||||
documentFlow: DocumentFlowStep;
|
||||
recipients: Recipient[];
|
||||
@ -98,6 +111,9 @@ export const AddSettingsFormPartial = ({
|
||||
documentAuth: document.authOptions,
|
||||
});
|
||||
|
||||
const documentExpiryUnit = document.documentMeta?.expiryUnit;
|
||||
const initialExpiryUnit = isExpiryUnit(documentExpiryUnit) ? documentExpiryUnit : undefined;
|
||||
|
||||
const form = useForm<TAddSettingsFormSchema>({
|
||||
resolver: zodResolver(ZAddSettingsFormSchema),
|
||||
defaultValues: {
|
||||
@ -117,6 +133,8 @@ export const AddSettingsFormPartial = ({
|
||||
redirectUrl: document.documentMeta?.redirectUrl ?? '',
|
||||
language: document.documentMeta?.language ?? 'en',
|
||||
signatureTypes: extractTeamSignatureSettings(document.documentMeta),
|
||||
expiryAmount: document.documentMeta?.expiryAmount ?? undefined,
|
||||
expiryUnit: initialExpiryUnit,
|
||||
},
|
||||
},
|
||||
});
|
||||
@ -127,6 +145,9 @@ export const AddSettingsFormPartial = ({
|
||||
(recipient) => recipient.sendStatus === SendStatus.SENT,
|
||||
);
|
||||
|
||||
const expiryAmount = useWatch({ control: form.control, name: 'meta.expiryAmount' });
|
||||
const expiryUnit = useWatch({ control: form.control, name: 'meta.expiryUnit' });
|
||||
|
||||
const canUpdateVisibility = match(currentTeamMemberRole)
|
||||
.with(TeamMemberRole.ADMIN, () => true)
|
||||
.with(
|
||||
@ -469,6 +490,33 @@ export const AddSettingsFormPartial = ({
|
||||
</FormItem>
|
||||
)}
|
||||
/>
|
||||
|
||||
<div>
|
||||
<FormLabel className="mb-4 block">
|
||||
<Trans>Link Expiry</Trans>
|
||||
</FormLabel>
|
||||
<ExpirySettingsPicker
|
||||
value={{
|
||||
expiryDuration:
|
||||
expiryAmount && expiryUnit
|
||||
? {
|
||||
amount: expiryAmount,
|
||||
unit: expiryUnit,
|
||||
}
|
||||
: undefined,
|
||||
}}
|
||||
disabled={documentHasBeenSent}
|
||||
onValueChange={(value) => {
|
||||
if (value.expiryDuration) {
|
||||
form.setValue('meta.expiryAmount', value.expiryDuration.amount);
|
||||
form.setValue('meta.expiryUnit', value.expiryDuration.unit);
|
||||
} else {
|
||||
form.setValue('meta.expiryAmount', undefined);
|
||||
form.setValue('meta.expiryUnit', undefined);
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</AccordionContent>
|
||||
</AccordionItem>
|
||||
|
||||
Reference in New Issue
Block a user