Skip to content

Commit 6b9115d

Browse files
hbjORbjAmit91848
andauthored
perf: server-fetch data for all pages in /settings/my-account (calcom#20712)
* wip * fix type check * refactor "/settings/my-account/profile" * refactor "settings/my-account/general" * refactor "/settings/my-accouunt/calendars" * refactor "/settings/my-account/appearance" * fix: type-check --------- Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: Amit Sharma <samit91848@gmail.com>
1 parent 6259b0b commit 6b9115d

32 files changed

Lines changed: 722 additions & 525 deletions

File tree

apps/web/app/(use-page-wrapper)/apps/installed/[category]/page.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1+
import { createRouterCaller } from "app/_trpc/context";
12
import type { PageProps } from "app/_types";
23
import { _generateMetadata } from "app/_utils";
34
import { redirect } from "next/navigation";
45
import { z } from "zod";
56

67
import { AppCategories } from "@calcom/prisma/enums";
8+
import { appsRouter } from "@calcom/trpc/server/routers/viewer/apps/_router";
9+
import { calendarsRouter } from "@calcom/trpc/server/routers/viewer/calendars/_router";
710

811
import InstalledApps from "~/apps/installed/[category]/installed-category-view";
912

@@ -28,7 +31,24 @@ const InstalledAppsWrapper = async ({ params }: PageProps) => {
2831
redirect("/apps/installed/calendar");
2932
}
3033

31-
return <InstalledApps category={parsedParams.data.category} />;
34+
const [calendarsCaller, appsCaller] = await Promise.all([
35+
createRouterCaller(calendarsRouter),
36+
createRouterCaller(appsRouter),
37+
]);
38+
39+
const connectedCalendars = await calendarsCaller.connectedCalendars();
40+
const installedCalendars = await appsCaller.integrations({
41+
variant: "calendar",
42+
onlyInstalled: true,
43+
});
44+
45+
return (
46+
<InstalledApps
47+
connectedCalendars={connectedCalendars}
48+
installedCalendars={installedCalendars}
49+
category={parsedParams.data.category}
50+
/>
51+
);
3252
};
3353

3454
export default InstalledAppsWrapper;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"use server";
2+
3+
import { revalidatePath } from "next/cache";
4+
5+
export async function revalidateSettingsAppearance() {
6+
revalidatePath("/settings/my-account/appearance");
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { SkeletonLoader } from "~/settings/my-account/appearance-skeleton";
2+
3+
export default function Loading() {
4+
return <SkeletonLoader />;
5+
}
Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,15 @@
1+
import { createRouterCaller } from "app/_trpc/context";
12
import { _generateMetadata } from "app/_utils";
2-
import { getTranslate } from "app/_utils";
3+
import { cookies, headers } from "next/headers";
4+
import { redirect } from "next/navigation";
35

4-
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
6+
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
7+
import { IS_SELF_HOSTED } from "@calcom/lib/constants";
8+
import hasKeyInMetadata from "@calcom/lib/hasKeyInMetadata";
9+
import { meRouter } from "@calcom/trpc/server/routers/viewer/me/_router";
10+
import { getCachedHasTeamPlan } from "@calcom/web/app/cache/membership";
11+
12+
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
513

614
import AppearancePage from "~/settings/my-account/appearance-view";
715

@@ -15,13 +23,29 @@ export const generateMetadata = async () =>
1523
);
1624

1725
const Page = async () => {
18-
const t = await getTranslate();
26+
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
27+
const userId = session?.user?.id;
28+
const redirectUrl = "/auth/login?callbackUrl=/settings/my-account/appearance";
1929

20-
return (
21-
<SettingsHeader title={t("appearance")} description={t("appearance_description")}>
22-
<AppearancePage />
23-
</SettingsHeader>
24-
);
30+
if (!userId) {
31+
redirect(redirectUrl);
32+
}
33+
34+
const [meCaller, hasTeamPlan] = await Promise.all([
35+
createRouterCaller(meRouter),
36+
getCachedHasTeamPlan(userId),
37+
]);
38+
39+
const user = await meCaller.get();
40+
41+
if (!user) {
42+
redirect(redirectUrl);
43+
}
44+
const isCurrentUsernamePremium =
45+
user && hasKeyInMetadata(user, "isPremium") ? !!user.metadata.isPremium : false;
46+
const hasPaidPlan = IS_SELF_HOSTED ? true : hasTeamPlan?.hasTeamPlan || isCurrentUsernamePremium;
47+
48+
return <AppearancePage user={user} hasPaidPlan={hasPaidPlan} />;
2549
};
2650

2751
export default Page;
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { CalendarListContainerSkeletonLoader } from "@components/apps/CalendarListContainer";
2+
3+
export default function Loading() {
4+
return <CalendarListContainerSkeletonLoader />;
5+
}

apps/web/app/(use-page-wrapper)/settings/(settings-layout)/my-account/calendars/page.tsx

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
import { createRouterCaller } from "app/_trpc/context";
12
import { _generateMetadata } from "app/_utils";
2-
import { getTranslate } from "app/_utils";
33

4-
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
5-
import { Button } from "@calcom/ui/components/button";
4+
import { appsRouter } from "@calcom/trpc/server/routers/viewer/apps/_router";
5+
import { calendarsRouter } from "@calcom/trpc/server/routers/viewer/calendars/_router";
66

77
import { CalendarListContainer } from "@components/apps/CalendarListContainer";
88

@@ -16,25 +16,18 @@ export const generateMetadata = async () =>
1616
);
1717

1818
const Page = async () => {
19-
const t = await getTranslate();
20-
21-
const AddCalendarButton = () => {
22-
return (
23-
<>
24-
<Button color="secondary" StartIcon="plus" href="/apps/categories/calendar">
25-
{t("add_calendar")}
26-
</Button>
27-
</>
28-
);
29-
};
19+
const [calendarsCaller, appsCaller] = await Promise.all([
20+
createRouterCaller(calendarsRouter),
21+
createRouterCaller(appsRouter),
22+
]);
3023

24+
const connectedCalendars = await calendarsCaller.connectedCalendars();
25+
const installedCalendars = await appsCaller.integrations({
26+
variant: "calendar",
27+
onlyInstalled: true,
28+
});
3129
return (
32-
<SettingsHeader
33-
title={t("calendars")}
34-
description={t("calendars_description")}
35-
CTA={<AddCalendarButton />}>
36-
<CalendarListContainer />
37-
</SettingsHeader>
30+
<CalendarListContainer connectedCalendars={connectedCalendars} installedCalendars={installedCalendars} />
3831
);
3932
};
4033

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { _generateMetadata } from "app/_utils";
2-
import { getTranslate } from "app/_utils";
32

43
import { ConferencingAppsViewWebWrapper } from "@calcom/atoms/connect/conferencing-apps/ConferencingAppsViewWebWrapper";
54

@@ -13,15 +12,7 @@ export const generateMetadata = async () =>
1312
);
1413

1514
const Page = async () => {
16-
const t = await getTranslate();
17-
18-
return (
19-
<ConferencingAppsViewWebWrapper
20-
title={t("conferencing")}
21-
description={t("conferencing_description")}
22-
add={t("add")}
23-
/>
24-
);
15+
return <ConferencingAppsViewWebWrapper />;
2516
};
2617

2718
export default Page;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"use server";
2+
3+
import { revalidatePath } from "next/cache";
4+
5+
export async function revalidateSettingsGeneral() {
6+
revalidatePath("/settings/my-account/general");
7+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { SkeletonLoader } from "~/settings/my-account/general-skeleton";
2+
3+
export default function Loading() {
4+
return <SkeletonLoader />;
5+
}
Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
1+
import { createRouterCaller } from "app/_trpc/context";
12
import { _generateMetadata } from "app/_utils";
2-
import { getTranslate } from "app/_utils";
3-
import { revalidatePath } from "next/cache";
3+
import { cookies, headers } from "next/headers";
4+
import { redirect } from "next/navigation";
45

5-
import SettingsHeader from "@calcom/features/settings/appDir/SettingsHeader";
6+
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
7+
import { meRouter } from "@calcom/trpc/server/routers/viewer/me/_router";
8+
import { getTravelSchedule } from "@calcom/web/app/cache/travelSchedule";
69

7-
import GeneralQueryView from "~/settings/my-account/general-view";
10+
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
11+
12+
import GeneralView from "~/settings/my-account/general-view";
813

914
export const generateMetadata = async () =>
1015
await _generateMetadata(
@@ -16,17 +21,20 @@ export const generateMetadata = async () =>
1621
);
1722

1823
const Page = async () => {
19-
const t = await getTranslate();
20-
const revalidatePage = async () => {
21-
"use server";
22-
revalidatePath("settings/my-account/general");
23-
};
24-
25-
return (
26-
<SettingsHeader title={t("general")} description={t("general_description")} borderInShellHeader={true}>
27-
<GeneralQueryView revalidatePage={revalidatePage} />
28-
</SettingsHeader>
29-
);
24+
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
25+
const userId = session?.user?.id;
26+
const redirectUrl = "/auth/login?callbackUrl=/settings/my-account/general";
27+
28+
if (!userId) {
29+
return redirect(redirectUrl);
30+
}
31+
32+
const meCaller = await createRouterCaller(meRouter);
33+
const [user, travelSchedules] = await Promise.all([meCaller.get(), getTravelSchedule(userId)]);
34+
if (!user) {
35+
redirect(redirectUrl);
36+
}
37+
return <GeneralView user={user} travelSchedules={travelSchedules ?? []} />;
3038
};
3139

3240
export default Page;

0 commit comments

Comments
 (0)