diff --git a/packages/features/ee/workflows/components/WorkflowStepContainer.tsx b/packages/features/ee/workflows/components/WorkflowStepContainer.tsx index bac8922008..e4d62c8ba3 100644 --- a/packages/features/ee/workflows/components/WorkflowStepContainer.tsx +++ b/packages/features/ee/workflows/components/WorkflowStepContainer.tsx @@ -91,7 +91,7 @@ export default function WorkflowStepContainer(props: WorkflowStepProps) { { enabled: !!teamId } ); - const { hasActiveTeamPlan } = useHasActiveTeamPlan(teamId); + const { hasActiveTeamPlan } = useHasActiveTeamPlan(); const { data: _verifiedEmails } = trpc.viewer.workflows.getVerifiedEmails.useQuery({ teamId }); diff --git a/packages/lib/hooks/useHasPaidPlan.ts b/packages/lib/hooks/useHasPaidPlan.ts index eec39051f1..ca37686ea0 100644 --- a/packages/lib/hooks/useHasPaidPlan.ts +++ b/packages/lib/hooks/useHasPaidPlan.ts @@ -42,7 +42,7 @@ export function useHasEnterprisePlan() { export function useHasActiveTeamPlan(teamId?: number) { if (IS_SELF_HOSTED) return { isPending: false, hasActiveTeamPlan: true }; - const { data, isPending } = trpc.viewer.teams.hasActiveTeamPlan.useQuery({ teamId }); + const { data, isPending } = trpc.viewer.teams.hasActiveTeamPlan.useQuery(); return { isPending, hasActiveTeamPlan: !!data }; } diff --git a/packages/trpc/server/routers/viewer/teams/_router.tsx b/packages/trpc/server/routers/viewer/teams/_router.tsx index a9cffda85a..4db308e7b4 100644 --- a/packages/trpc/server/routers/viewer/teams/_router.tsx +++ b/packages/trpc/server/routers/viewer/teams/_router.tsx @@ -12,7 +12,6 @@ import { ZGetSchema } from "./get.schema"; import { ZGetMemberAvailabilityInputSchema } from "./getMemberAvailability.schema"; import { ZGetMembershipbyUserInputSchema } from "./getMembershipbyUser.schema"; import { ZGetUserConnectedAppsInputSchema } from "./getUserConnectedApps.schema"; -import { ZHasActiveTeamPlanSchema } from "./hasActiveTeamPlan.schema"; import { ZHasEditPermissionForUserSchema } from "./hasEditPermissionForUser.schema"; import { ZInviteMemberInputSchema } from "./inviteMember/inviteMember.schema"; import { ZInviteMemberByTokenSchemaInputSchema } from "./inviteMemberByToken.schema"; @@ -223,7 +222,7 @@ export const viewerTeamsRouter = router({ ); return handler(opts); }), - hasActiveTeamPlan: authedProcedure.input(ZHasActiveTeamPlanSchema).query(async (opts) => { + hasActiveTeamPlan: authedProcedure.query(async (opts) => { const handler = await importHandler( namespaced("hasActiveTeamPlan"), () => import("./hasActiveTeamPlan.handler") diff --git a/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.handler.ts b/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.handler.ts index f7b2b0a9c8..8b817b2e22 100644 --- a/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.handler.ts +++ b/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.handler.ts @@ -3,39 +3,37 @@ import { IS_SELF_HOSTED } from "@calcom/lib/constants"; import { prisma } from "@calcom/prisma"; import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; -import type { THasActiveTeamPlanSchema } from "./hasActiveTeamPlan.schema"; - type HasActiveTeamPlanOptions = { ctx: { user: NonNullable; }; - input: THasActiveTeamPlanSchema; }; -export const hasActiveTeamPlanHandler = async ({ input, ctx }: HasActiveTeamPlanOptions) => { +export const hasActiveTeamPlanHandler = async ({ ctx }: HasActiveTeamPlanOptions) => { if (IS_SELF_HOSTED) return true; - - if (!input.teamId) return false; - - const userId = ctx.user.id; - - // Check if the user is a member of the requested team - const team = await prisma.team.findFirst({ + const teams = await prisma.team.findMany({ where: { - id: input.teamId, members: { some: { - userId: userId, + userId: ctx.user.id, accepted: true, }, }, }, }); - if (!team) return false; - // Get the current team's subscription - const teamBillingService = new InternalTeamBilling(team); - return await teamBillingService.checkIfTeamHasActivePlan(); + if (!teams.length) return false; + + // check if user has at least on membership with an active plan + for (const team of teams) { + const teamBillingService = new InternalTeamBilling(team); + const isPlanActive = await teamBillingService.checkIfTeamHasActivePlan(); + if (isPlanActive) { + return true; + } + } + + return false; }; export default hasActiveTeamPlanHandler; diff --git a/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.schema.ts b/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.schema.ts index 90a3e1bee4..cb0ff5c3b5 100644 --- a/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.schema.ts +++ b/packages/trpc/server/routers/viewer/teams/hasActiveTeamPlan.schema.ts @@ -1,7 +1 @@ -import { z } from "zod"; - -export const ZHasActiveTeamPlanSchema = z.object({ - teamId: z.number().optional(), -}); - -export type THasActiveTeamPlanSchema = z.infer; +export {}; diff --git a/packages/trpc/server/routers/viewer/workflows/update.handler.ts b/packages/trpc/server/routers/viewer/workflows/update.handler.ts index d47da0c950..3ed9d91b48 100755 --- a/packages/trpc/server/routers/viewer/workflows/update.handler.ts +++ b/packages/trpc/server/routers/viewer/workflows/update.handler.ts @@ -84,7 +84,6 @@ export const updateHandler = async ({ ctx, input }: UpdateOptions) => { if (!isCurrentUsernamePremium) { isTeamsPlan = await hasActiveTeamPlanHandler({ ctx, - input: { teamId: userWorkflow?.teamId ?? undefined }, }); } const hasPaidPlan = IS_SELF_HOSTED || isCurrentUsernamePremium || isTeamsPlan;