diff --git a/apps/webapp/app/models/member.server.ts b/apps/webapp/app/models/member.server.ts
index 716590898e4..bfb51bdf778 100644
--- a/apps/webapp/app/models/member.server.ts
+++ b/apps/webapp/app/models/member.server.ts
@@ -225,3 +225,36 @@ export async function resendInvite({ inviteId }: { inviteId: string }) {
},
});
}
+
+export async function revokeInvite({
+ userId,
+ slug,
+ inviteId,
+}: {
+ userId: string;
+ slug: string;
+ inviteId: string;
+}) {
+ const org = await prisma.organization.findFirst({
+ where: { slug, members: { some: { userId } } },
+ });
+
+ if (!org) {
+ throw new Error("User does not have access to this organization");
+ }
+ const invite = await prisma.orgMemberInvite.delete({
+ where: {
+ id: inviteId,
+ },
+ select: {
+ email: true,
+ organization: true,
+ },
+ });
+
+ if (!invite) {
+ throw new Error("Invite not found");
+ }
+
+ return { email: invite.email, organization: invite.organization };
+}
diff --git a/apps/webapp/app/routes/_app.orgs.$organizationSlug.team/route.tsx b/apps/webapp/app/routes/_app.orgs.$organizationSlug.team/route.tsx
index 80718a213b4..f6cd7a4fc53 100644
--- a/apps/webapp/app/routes/_app.orgs.$organizationSlug.team/route.tsx
+++ b/apps/webapp/app/routes/_app.orgs.$organizationSlug.team/route.tsx
@@ -31,7 +31,12 @@ import { useUser } from "~/hooks/useUser";
import { getTeamMembersAndInvites, removeTeamMember } from "~/models/member.server";
import { redirectWithSuccessMessage } from "~/models/message.server";
import { requireUserId } from "~/services/session.server";
-import { inviteTeamMemberPath, organizationTeamPath, resendInvitePath } from "~/utils/pathBuilder";
+import {
+ inviteTeamMemberPath,
+ organizationTeamPath,
+ resendInvitePath,
+ revokeInvitePath,
+} from "~/utils/pathBuilder";
export const loader = async ({ request, params }: LoaderFunctionArgs) => {
const userId = await requireUserId(request);
@@ -147,8 +152,9 @@ export default function Page() {
Invite sent {