2023-06-06 23:34:14 +00:00
|
|
|
import { useMemo } from "react";
|
|
|
|
import { Controller, useForm } from "react-hook-form";
|
|
|
|
|
|
|
|
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
|
|
import { trpc } from "@calcom/trpc";
|
|
|
|
import { Button, Dialog, DialogContent, DialogFooter, Form, Label, Select, showToast } from "@calcom/ui";
|
|
|
|
|
|
|
|
type InvitationLinkSettingsModalProps = {
|
|
|
|
isOpen: boolean;
|
|
|
|
teamId: number;
|
|
|
|
token: string;
|
|
|
|
expiresInDays?: number;
|
|
|
|
onExit: () => void;
|
|
|
|
};
|
|
|
|
|
|
|
|
export interface LinkSettingsForm {
|
|
|
|
expiresInDays: number | undefined;
|
|
|
|
}
|
|
|
|
|
|
|
|
export default function InviteLinkSettingsModal(props: InvitationLinkSettingsModalProps) {
|
|
|
|
const { t } = useLocale();
|
|
|
|
const trpcContext = trpc.useContext();
|
|
|
|
|
|
|
|
const deleteInviteMutation = trpc.viewer.teams.deleteInvite.useMutation({
|
|
|
|
onSuccess: () => {
|
|
|
|
showToast(t("invite_link_deleted"), "success");
|
|
|
|
trpcContext.viewer.teams.get.invalidate();
|
|
|
|
trpcContext.viewer.teams.list.invalidate();
|
|
|
|
props.onExit();
|
|
|
|
},
|
|
|
|
onError: (e) => {
|
|
|
|
showToast(e.message, "error");
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const setInviteExpirationMutation = trpc.viewer.teams.setInviteExpiration.useMutation({
|
|
|
|
onSuccess: () => {
|
|
|
|
showToast(t("invite_link_updated"), "success");
|
|
|
|
trpcContext.viewer.teams.get.invalidate();
|
|
|
|
trpcContext.viewer.teams.list.invalidate();
|
|
|
|
},
|
|
|
|
onError: (e) => {
|
|
|
|
showToast(e.message, "error");
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
|
|
|
const expiresInDaysOption = useMemo(() => {
|
|
|
|
return [
|
|
|
|
{ value: 1, label: t("one_day") },
|
|
|
|
{ value: 7, label: t("seven_days") },
|
|
|
|
{ value: 30, label: t("thirty_days") },
|
2023-06-08 13:37:54 +00:00
|
|
|
{ value: undefined, label: t("never_expires") },
|
2023-06-06 23:34:14 +00:00
|
|
|
];
|
|
|
|
}, [t]);
|
|
|
|
|
|
|
|
const linkSettingsFormMethods = useForm<LinkSettingsForm>();
|
|
|
|
|
|
|
|
const handleSubmit = (values: LinkSettingsForm) => {
|
|
|
|
setInviteExpirationMutation.mutate({
|
|
|
|
token: props.token,
|
|
|
|
expiresInDays: values.expiresInDays,
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
return (
|
|
|
|
<Dialog
|
|
|
|
open={props.isOpen}
|
|
|
|
onOpenChange={() => {
|
|
|
|
props.onExit();
|
|
|
|
linkSettingsFormMethods.reset();
|
|
|
|
}}>
|
|
|
|
<DialogContent type="creation" title="Invite link settings">
|
|
|
|
<Form form={linkSettingsFormMethods} handleSubmit={handleSubmit}>
|
|
|
|
<Controller
|
|
|
|
name="expiresInDays"
|
|
|
|
control={linkSettingsFormMethods.control}
|
|
|
|
render={({ field: { onChange } }) => (
|
|
|
|
<div>
|
|
|
|
<Label className="text-emphasis font-medium" htmlFor="expiresInDays">
|
|
|
|
{t("link_expires_after")}
|
|
|
|
</Label>
|
|
|
|
<Select
|
|
|
|
options={expiresInDaysOption}
|
|
|
|
defaultValue={expiresInDaysOption.find((option) => option.value === props.expiresInDays)}
|
|
|
|
className="w-full"
|
|
|
|
onChange={(val) => onChange(val?.value)}
|
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
<DialogFooter>
|
|
|
|
<Button
|
|
|
|
type="button"
|
|
|
|
color="secondary"
|
|
|
|
onClick={() => deleteInviteMutation.mutate({ token: props.token })}
|
|
|
|
className="mr-auto"
|
|
|
|
data-testid="copy-invite-link-button">
|
|
|
|
{t("delete")}
|
|
|
|
</Button>
|
|
|
|
<Button type="button" color="minimal" onClick={props.onExit}>
|
|
|
|
{t("back")}
|
|
|
|
</Button>
|
|
|
|
<Button
|
|
|
|
type="submit"
|
|
|
|
color="primary"
|
2023-06-22 22:25:37 +00:00
|
|
|
className="me-2 ms-2"
|
2023-06-06 23:34:14 +00:00
|
|
|
data-testid="invite-new-member-button">
|
|
|
|
{t("save")}
|
|
|
|
</Button>
|
|
|
|
</DialogFooter>
|
|
|
|
</Form>
|
|
|
|
</DialogContent>
|
|
|
|
</Dialog>
|
|
|
|
);
|
|
|
|
}
|