diff --git a/src/modals/delete-registration-token/delete-registration-token.modal.tsx b/src/modals/delete-registration-token/delete-registration-token.modal.tsx new file mode 100644 index 000000000..d3ff0fd0b --- /dev/null +++ b/src/modals/delete-registration-token/delete-registration-token.modal.tsx @@ -0,0 +1,45 @@ +import { Button, Group, Stack, Text } from '@mantine/core'; +import { ContextModalProps, modals } from '@mantine/modals'; +import { api } from '~/utils/api'; + +export const DeleteRegistrationTokenModal = ({ + context, + id, + innerProps, +}: ContextModalProps<{ tokenId: string }>) => { + const apiContext = api.useContext(); + const { isLoading, mutateAsync } = api.registrationTokens.deleteRegistrationToken.useMutation({ + onSuccess: async () => { + await apiContext.registrationTokens.getAllInvites.invalidate(); + modals.close(id); + }, + }); + return ( + + + Are you sure, that you want to delete this invitation? Users with this link will no longer + be able to register using that link. + + + + + + + + ); +}; diff --git a/src/modals/modals.ts b/src/modals/modals.ts index f58eba345..6dad48ffe 100644 --- a/src/modals/modals.ts +++ b/src/modals/modals.ts @@ -8,6 +8,7 @@ import { CategoryEditModal } from '~/components/Dashboard/Wrappers/Category/Cate import { DeleteUserModal } from './delete-user/delete-user.modal'; import { CreateRegistrationTokenModal } from './create-registration-token/create-registration-token.modal'; +import { DeleteRegistrationTokenModal } from './delete-registration-token/delete-registration-token.modal'; export const modals = { editApp: EditAppModal, @@ -18,7 +19,8 @@ export const modals = { changeAppPositionModal: ChangeAppPositionModal, changeIntegrationPositionModal: ChangeWidgetPositionModal, deleteUserModal: DeleteUserModal, - createRegistrationTokenModal: CreateRegistrationTokenModal + createRegistrationTokenModal: CreateRegistrationTokenModal, + deleteRegistrationTokenModal: DeleteRegistrationTokenModal }; declare module '@mantine/modals' { diff --git a/src/pages/manage/users/invites.tsx b/src/pages/manage/users/invites.tsx index e88a037d8..120cff6c6 100644 --- a/src/pages/manage/users/invites.tsx +++ b/src/pages/manage/users/invites.tsx @@ -68,7 +68,15 @@ const ManageUserInvitesPage = () => { )} - {}} color="red" variant="light"> + { + modals.openContextModal({ + modal: 'deleteRegistrationTokenModal', + title: Delete registration token, + innerProps: { + tokenId: token.id, + } + }) + }} color="red" variant="light"> diff --git a/src/server/api/routers/registrationTokens.ts b/src/server/api/routers/registrationTokens.ts index 5ce1c345d..da2667ef7 100644 --- a/src/server/api/routers/registrationTokens.ts +++ b/src/server/api/routers/registrationTokens.ts @@ -1,8 +1,8 @@ +import { randomBytes } from 'crypto'; import dayjs from 'dayjs'; import { z } from 'zod'; import { createTRPCRouter, publicProcedure } from '../trpc'; -import { randomBytes } from 'crypto'; export const inviteRouter = createTRPCRouter({ getAllInvites: publicProcedure @@ -34,19 +34,30 @@ export const inviteRouter = createTRPCRouter({ nextCursor, }; }), - createRegistrationToken: publicProcedure.input( - z.object({ - expiration: z - .date() - .min(dayjs().add(5, 'minutes').toDate()) - .max(dayjs().add(6, 'months').toDate()), - }) - ).mutation(async ({ ctx, input }) => { - await ctx.prisma.registrationToken.create({ - data: { - expires: input.expiration, - token: randomBytes(20).toString('hex'), - } - }); - }), + createRegistrationToken: publicProcedure + .input( + z.object({ + expiration: z + .date() + .min(dayjs().add(5, 'minutes').toDate()) + .max(dayjs().add(6, 'months').toDate()), + }) + ) + .mutation(async ({ ctx, input }) => { + await ctx.prisma.registrationToken.create({ + data: { + expires: input.expiration, + token: randomBytes(20).toString('hex'), + }, + }); + }), + deleteRegistrationToken: publicProcedure + .input(z.object({ tokenId: z.string() })) + .mutation(async ({ ctx, input }) => { + await ctx.prisma.registrationToken.delete({ + where: { + id: input.tokenId, + }, + }); + }), });