Skip to content

Commit e6da5c8

Browse files
authored
perf: remove me fetching from teams by refactoring (calcom#22444)
1 parent bfc6d6e commit e6da5c8

6 files changed

Lines changed: 39 additions & 24 deletions

File tree

apps/web/app/(use-page-wrapper)/(main-nav)/teams/server-page.tsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import { createRouterCaller } from "app/_trpc/context";
21
import type { SearchParams } from "app/_types";
32
import type { Session } from "next-auth";
43
import { unstable_cache } from "next/cache";
54

5+
import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner";
66
import { TeamsListing } from "@calcom/features/ee/teams/components/TeamsListing";
77
import { TeamRepository } from "@calcom/lib/server/repository/team";
88
import { TeamService } from "@calcom/lib/server/service/team";
99
import prisma from "@calcom/prisma";
10-
import { meRouter } from "@calcom/trpc/server/routers/viewer/me/_router";
1110

1211
import { TRPCError } from "@trpc/server";
1312

@@ -47,18 +46,24 @@ export const ServerTeamsListing = async ({
4746
}
4847
}
4948

50-
const meCaller = await createRouterCaller(meRouter);
51-
const [user, teams] = await Promise.all([meCaller.get(), getCachedTeams(userId)]);
49+
const teams = await getCachedTeams(userId);
50+
const userProfile = session?.user?.profile;
51+
const orgId = userProfile?.organizationId ?? session?.user.org?.id;
52+
const orgRole =
53+
session?.user?.org?.role ??
54+
userProfile?.organization?.members.find((m: { userId: number }) => m.userId === userId)?.role;
55+
const isOrgAdminOrOwner = checkAdminOrOwner(orgRole);
5256

5357
return {
5458
Main: (
5559
<TeamsListing
5660
teams={teams}
57-
user={user}
61+
orgId={orgId ?? null}
62+
isOrgAdmin={isOrgAdminOrOwner}
5863
teamNameFromInvite={teamNameFromInvite ?? null}
5964
errorMsgFromInvite={errorMsgFromInvite}
6065
/>
6166
),
62-
CTA: !user.organizationId || user.organization.isOrgAdmin ? <TeamsCTA /> : null,
67+
CTA: !orgId || isOrgAdminOrOwner ? <TeamsCTA /> : null,
6368
};
6469
};

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/organizations/(org-admin-only)/layout.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import { buildLegacyRequest } from "@lib/buildLegacyCtx";
88

99
const OrgAdminOnlyLayout = async ({ children }: { children: React.ReactNode }) => {
1010
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
11-
const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role);
11+
const userProfile = session?.user?.profile;
12+
const userId = session?.user?.id;
13+
const orgRole =
14+
session?.user?.org?.role ??
15+
userProfile?.organization?.members.find((m: { userId: number }) => m.userId === userId)?.role;
16+
const isOrgAdminOrOwner = checkAdminOrOwner(orgRole);
1217

1318
if (!isOrgAdminOrOwner) {
1419
return redirect("/settings/organizations/profile");

apps/web/app/(use-page-wrapper)/settings/organizations/(org-admin-only)/layout.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,12 @@ import { buildLegacyRequest } from "@lib/buildLegacyCtx";
88

99
const OrgAdminOnlyLayout = async ({ children }: { children: React.ReactNode }) => {
1010
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
11-
const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role);
11+
const userProfile = session?.user?.profile;
12+
const userId = session?.user?.id;
13+
const orgRole =
14+
session?.user?.org?.role ??
15+
userProfile?.organization?.members.find((m: { userId: number }) => m.userId === userId)?.role;
16+
const isOrgAdminOrOwner = checkAdminOrOwner(orgRole);
1217

1318
if (!isOrgAdminOrOwner) {
1419
return redirect("/settings/organizations/profile");

packages/features/ee/teams/components/TeamList.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import TeamListItem from "./TeamListItem";
1717

1818
interface Props {
1919
teams: RouterOutputs["viewer"]["teams"]["list"];
20-
user: RouterOutputs["viewer"]["me"]["get"];
20+
orgId: number | null;
2121
/**
2222
* True for teams that are pending invite acceptance
2323
*/
@@ -28,7 +28,7 @@ export default function TeamList(props: Props) {
2828
const utils = trpc.useUtils();
2929

3030
const { t } = useLocale();
31-
const { user } = props;
31+
const { orgId } = props;
3232

3333
const [hideDropdown, setHideDropdown] = useState(false);
3434

@@ -56,13 +56,11 @@ export default function TeamList(props: Props) {
5656
deleteTeamMutation.mutate({ teamId });
5757
}
5858

59-
if (!user) return null;
60-
const isUserAlreadyInAnOrganization = user.profile.organization;
6159
return (
6260
<ul className="bg-default divide-subtle border-subtle mb-2 divide-y overflow-hidden rounded-md border">
6361
{ORG_SELF_SERVE_ENABLED &&
6462
!props.pending &&
65-
!isUserAlreadyInAnOrganization &&
63+
!orgId &&
6664
props.teams.length >= ORG_MINIMUM_PUBLISHED_TEAMS_SELF_SERVE_HELPER_DIALOGUE &&
6765
props.teams.map(
6866
(team, i) =>
@@ -116,7 +114,7 @@ export default function TeamList(props: Props) {
116114
<TeamListItem
117115
key={team?.id as number}
118116
team={team}
119-
user={user}
117+
orgId={orgId}
120118
onActionSelect={(action: string) => selectAction(action, team?.id as number)}
121119
isPending={deleteTeamMutation.isPending}
122120
hideDropdown={hideDropdown}

packages/features/ee/teams/components/TeamListItem.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import { TeamRole } from "./TeamPill";
3636

3737
interface Props {
3838
team: RouterOutputs["viewer"]["teams"]["list"][number];
39-
user: RouterOutputs["viewer"]["me"]["get"];
39+
orgId: number | null;
4040
key: number;
4141
onActionSelect: (text: string) => void;
4242
isPending?: boolean;
@@ -48,7 +48,7 @@ export default function TeamListItem(props: Props) {
4848
const searchParams = useCompatSearchParams();
4949
const { t } = useLocale();
5050
const utils = trpc.useUtils();
51-
const { team, user } = props;
51+
const { team, orgId } = props;
5252

5353
const showDialog = searchParams?.get("inviteModal") === "true";
5454
const [openMemberInvitationModal, setOpenMemberInvitationModal] = useState(showDialog);
@@ -63,7 +63,7 @@ export default function TeamListItem(props: Props) {
6363
revalidateTeamsList();
6464
utils.viewer.teams.hasTeamPlan.invalidate();
6565
utils.viewer.teams.listInvites.invalidate();
66-
const userOrganizationId = user?.profile?.organization?.id;
66+
const userOrganizationId = orgId ?? undefined;
6767
const isSubTeamOfDifferentOrg = team.parentId ? team.parentId != userOrganizationId : false;
6868
const isDifferentOrg = team.isOrganization && team.id !== userOrganizationId;
6969
// If the user team being accepted is a sub-team of different organization or the different organization itself then page must be reloaded to let the session change reflect reliably everywhere.

packages/features/ee/teams/components/TeamsListing.tsx

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,16 @@ import { UpgradeTip } from "../../../tips";
1818
import TeamList from "./TeamList";
1919

2020
type TeamsListingProps = {
21-
user: RouterOutputs["viewer"]["me"]["get"];
21+
orgId: number | null;
22+
isOrgAdmin: boolean;
2223
teams: RouterOutputs["viewer"]["teams"]["list"];
2324
teamNameFromInvite: string | null;
2425
errorMsgFromInvite: string | null;
2526
};
2627

2728
export function TeamsListing({
28-
user,
29+
orgId,
30+
isOrgAdmin,
2931
teams: data,
3032
teamNameFromInvite,
3133
errorMsgFromInvite,
@@ -49,7 +51,7 @@ export function TeamsListing({
4951
}
5052
);
5153

52-
const isCreateTeamButtonDisabled = !!(user?.organizationId && !user?.organization?.isOrgAdmin);
54+
const isCreateTeamButtonDisabled = !!(orgId && !isOrgAdmin);
5355

5456
const features = [
5557
{
@@ -105,18 +107,18 @@ export function TeamsListing({
105107
{organizationInvites.length > 0 && (
106108
<div className="bg-subtle mb-6 rounded-md p-5">
107109
<Label className="text-emphasis pb-2 font-semibold">{t("pending_organization_invites")}</Label>
108-
<TeamList user={user} teams={organizationInvites} pending />
110+
<TeamList orgId={orgId} teams={organizationInvites} pending />
109111
</div>
110112
)}
111113

112114
{teamInvites.length > 0 && (
113115
<div className="bg-subtle mb-6 rounded-md p-5">
114116
<Label className="text-emphasis pb-2 font-semibold">{t("pending_invites")}</Label>
115-
<TeamList user={user} teams={teamInvites} pending />
117+
<TeamList orgId={orgId} teams={teamInvites} pending />
116118
</div>
117119
)}
118120

119-
{teams.length > 0 && <TeamList user={user} teams={teams} />}
121+
{teams.length > 0 && <TeamList orgId={orgId} teams={teams} />}
120122

121123
{teams.length === 0 && (
122124
<UpgradeTip
@@ -126,7 +128,7 @@ export function TeamsListing({
126128
features={features}
127129
background="/tips/teams"
128130
buttons={
129-
!user?.organizationId || user?.organization.isOrgAdmin ? (
131+
!orgId || isOrgAdmin ? (
130132
<div className="space-y-2 rtl:space-x-reverse sm:space-x-2">
131133
<ButtonGroup>
132134
<Button color="primary" href={`${WEBAPP_URL}/settings/teams/new`}>

0 commit comments

Comments
 (0)