Add copy registration token modal

This commit is contained in:
Manuel
2023-07-31 20:36:36 +02:00
parent f24daa2b34
commit 129fd1336c
4 changed files with 60 additions and 3 deletions

View File

@@ -0,0 +1,43 @@
import { Button, Mark, Stack, Text } from '@mantine/core';
import { ContextModalProps, modals } from '@mantine/modals';
import Link from 'next/link';
export const CopyRegistrationToken = ({
context,
id,
innerProps,
}: ContextModalProps<{ id: string; token: string; expire: Date }>) => {
return (
<Stack>
<Text>
Your invitation has been generated. After this modal closes,{' '}
<b>you'll not be able to copy this link anymore</b>. If you do no longer wish to invite said
person, you can delete this invitation any time.
</Text>
<Link href={`/auth/invite/${innerProps.id}?token=${innerProps.token}`}>Invitation link</Link>
<Stack spacing="xs">
<Text weight="bold">ID:</Text>
<Mark style={{ borderRadius: 4 }} color="gray" px={5}>
{innerProps.id}
</Mark>
<Text weight="bold">Token:</Text>
<Mark style={{ borderRadius: 4 }} color="gray" px={5}>
{innerProps.token}
</Mark>
</Stack>
<Button
onClick={() => {
modals.close(id);
}}
variant="default"
fullWidth
>
Cancel
</Button>
</Stack>
);
};

View File

@@ -14,9 +14,15 @@ export const CreateRegistrationTokenModal = ({
}: ContextModalProps<{}>) => { }: ContextModalProps<{}>) => {
const apiContext = api.useContext(); const apiContext = api.useContext();
const { isLoading, mutateAsync } = api.registrationTokens.createRegistrationToken.useMutation({ const { isLoading, mutateAsync } = api.registrationTokens.createRegistrationToken.useMutation({
onSuccess: async () => { onSuccess: async (data) => {
await apiContext.registrationTokens.getAllInvites.invalidate(); await apiContext.registrationTokens.getAllInvites.invalidate();
modals.close(id); modals.close(id);
modals.openContextModal({
modal: 'copyRegistrationTokenModal',
title: <Text weight="bold">Copy invitation</Text>,
innerProps: data,
})
}, },
}); });

View File

@@ -10,6 +10,7 @@ import { DeleteUserModal } from './delete-user/delete-user.modal';
import { CreateRegistrationTokenModal } from './create-registration-token/create-registration-token.modal'; import { CreateRegistrationTokenModal } from './create-registration-token/create-registration-token.modal';
import { DeleteRegistrationTokenModal } from './delete-registration-token/delete-registration-token.modal'; import { DeleteRegistrationTokenModal } from './delete-registration-token/delete-registration-token.modal';
import { CreateDashboardModal } from './create-dashboard/create-dashboard.modal'; import { CreateDashboardModal } from './create-dashboard/create-dashboard.modal';
import { CopyRegistrationToken } from './copy-regristration-token/copy-registration-token.modal';
export const modals = { export const modals = {
editApp: EditAppModal, editApp: EditAppModal,
@@ -22,7 +23,8 @@ export const modals = {
deleteUserModal: DeleteUserModal, deleteUserModal: DeleteUserModal,
createRegistrationTokenModal: CreateRegistrationTokenModal, createRegistrationTokenModal: CreateRegistrationTokenModal,
deleteRegistrationTokenModal: DeleteRegistrationTokenModal, deleteRegistrationTokenModal: DeleteRegistrationTokenModal,
createDashboardModal: CreateDashboardModal createDashboardModal: CreateDashboardModal,
copyRegistrationTokenModal: CopyRegistrationToken,
}; };
declare module '@mantine/modals' { declare module '@mantine/modals' {

View File

@@ -44,12 +44,18 @@ export const inviteRouter = createTRPCRouter({
}) })
) )
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
await ctx.prisma.registrationToken.create({ const token = await ctx.prisma.registrationToken.create({
data: { data: {
expires: input.expiration, expires: input.expiration,
token: randomBytes(20).toString('hex'), token: randomBytes(20).toString('hex'),
}, },
}); });
return {
id: token.id,
token: token.token,
expires: token.expires,
};
}), }),
deleteRegistrationToken: publicProcedure deleteRegistrationToken: publicProcedure
.input(z.object({ tokenId: z.string() })) .input(z.object({ tokenId: z.string() }))