diff --git a/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx b/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx index e867f6f31d..b1cae6c72a 100644 --- a/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx +++ b/apps/web/app/(use-page-wrapper)/(main-nav)/availability/page.tsx @@ -3,11 +3,15 @@ import type { PageProps, ReadonlyHeaders, ReadonlyRequestCookies } from "app/_ty import { _generateMetadata, getTranslate } from "app/_utils"; import { unstable_cache } from "next/cache"; import { cookies, headers } from "next/headers"; +import { redirect } from "next/navigation"; +import { checkAdminOrOwner } from "@calcom/features/auth/lib/checkAdminOrOwner"; +import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { AvailabilitySliderTable } from "@calcom/features/timezone-buddy/components/AvailabilitySliderTable"; import { OrganizationRepository } from "@calcom/lib/server/repository/organization"; import { availabilityRouter } from "@calcom/trpc/server/routers/viewer/availability/_router"; -import { meRouter } from "@calcom/trpc/server/routers/viewer/me/_router"; + +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; import { AvailabilityList, AvailabilityCTA } from "~/availability/availability-view"; @@ -23,15 +27,6 @@ export const generateMetadata = async () => { ); }; -const getCachedMe = unstable_cache( - async (headers: ReadonlyHeaders, cookies: ReadonlyRequestCookies) => { - const meCaller = await createRouterCaller(meRouter, await getTRPCContext(headers, cookies)); - return await meCaller.get(); - }, - ["viewer.me.get"], - { revalidate: 3600 } // Cache for 1 hour -); - const getCachedAvailabilities = unstable_cache( async (headers: ReadonlyHeaders, cookies: ReadonlyRequestCookies) => { const availabilityCaller = await createRouterCaller( @@ -49,11 +44,12 @@ const Page = async ({ searchParams: _searchParams }: PageProps) => { const t = await getTranslate(); const _headers = await headers(); const _cookies = await cookies(); + const session = await getServerSession({ req: buildLegacyRequest(_headers, _cookies) }); + if (!session?.user?.id) { + return redirect("/auth/login"); + } - const [me, cachedAvailabilities] = await Promise.all([ - getCachedMe(_headers, _cookies), - getCachedAvailabilities(_headers, _cookies), - ]); + const cachedAvailabilities = await getCachedAvailabilities(_headers, _cookies); // Transform the data to ensure startTime, endTime, and date are Date objects // This is because the data is cached and as a result the data is converted to a string @@ -70,13 +66,14 @@ const Page = async ({ searchParams: _searchParams }: PageProps) => { })), }; - const organizationId = me.organization?.id ?? me.profiles[0]?.organizationId; + const organizationId = session?.user?.profile?.organizationId ?? session?.user.org?.id; const isOrgPrivate = organizationId ? await OrganizationRepository.checkIfPrivate({ orgId: organizationId, }) : false; - const canViewTeamAvailability = me.organization?.isOrgAdmin || !isOrgPrivate; + const isOrgAdminOrOwner = checkAdminOrOwner(session?.user?.org?.role); + const canViewTeamAvailability = isOrgAdminOrOwner || !isOrgPrivate; return ( { /> }> {searchParams?.type === "team" && canViewTeamAvailability ? ( - + ) : ( - + )} ); diff --git a/apps/web/app/(use-page-wrapper)/(main-nav)/event-types/page.tsx b/apps/web/app/(use-page-wrapper)/(main-nav)/event-types/page.tsx index 79873c2613..2a8187a624 100644 --- a/apps/web/app/(use-page-wrapper)/(main-nav)/event-types/page.tsx +++ b/apps/web/app/(use-page-wrapper)/(main-nav)/event-types/page.tsx @@ -9,9 +9,8 @@ import { redirect } from "next/navigation"; import { getServerSession } from "@calcom/features/auth/lib/getServerSession"; import { getTeamsFiltersFromQuery } from "@calcom/features/filters/lib/getTeamsFiltersFromQuery"; import { eventTypesRouter } from "@calcom/trpc/server/routers/viewer/eventTypes/_router"; -import { meRouter } from "@calcom/trpc/server/routers/viewer/me/_router"; -import { buildLegacyCtx } from "@lib/buildLegacyCtx"; +import { buildLegacyRequest } from "@lib/buildLegacyCtx"; import EventTypes, { EventTypesCTA } from "~/event-types/views/event-types-listing-view"; @@ -24,15 +23,6 @@ export const generateMetadata = async () => "/event-types" ); -const getCachedMe = unstable_cache( - async (headers: ReadonlyHeaders, cookies: ReadonlyRequestCookies) => { - const meCaller = await createRouterCaller(meRouter, await getTRPCContext(headers, cookies)); - return await meCaller.get(); - }, - ["viewer.me.get"], - { revalidate: 3600 } // seconds -); - const getCachedEventGroups = unstable_cache( async ( headers: ReadonlyHeaders, @@ -53,30 +43,26 @@ const getCachedEventGroups = unstable_cache( { revalidate: 3600 } // seconds ); -const Page = async ({ params, searchParams }: PageProps) => { +const Page = async ({ searchParams }: PageProps) => { const _searchParams = await searchParams; const _headers = await headers(); const _cookies = await cookies(); - const context = buildLegacyCtx(_headers, _cookies, await params, _searchParams); - const session = await getServerSession({ req: context.req }); + const session = await getServerSession({ req: buildLegacyRequest(_headers, _cookies) }); if (!session?.user?.id) { - redirect("/auth/login"); + return redirect("/auth/login"); } const t = await getTranslate(); const filters = getTeamsFiltersFromQuery(_searchParams); - const [me, userEventGroupsData] = await Promise.all([ - getCachedMe(_headers, _cookies), - getCachedEventGroups(_headers, _cookies, filters), - ]); + const userEventGroupsData = await getCachedEventGroups(_headers, _cookies, filters); return ( }> - + ); }; diff --git a/apps/web/modules/availability/availability-view.tsx b/apps/web/modules/availability/availability-view.tsx index 9064ca8ee4..1e33099015 100644 --- a/apps/web/modules/availability/availability-view.tsx +++ b/apps/web/modules/availability/availability-view.tsx @@ -15,19 +15,20 @@ import { useLocale } from "@calcom/lib/hooks/useLocale"; import { HttpError } from "@calcom/lib/http-error"; import type { RouterOutputs } from "@calcom/trpc/react"; import { trpc } from "@calcom/trpc/react"; +import useMeQuery from "@calcom/trpc/react/hooks/useMeQuery"; import { EmptyScreen } from "@calcom/ui/components/empty-screen"; import { ToggleGroup } from "@calcom/ui/components/form"; import { showToast } from "@calcom/ui/components/toast"; type AvailabilityListProps = { - me: RouterOutputs["viewer"]["me"]["get"]; availabilities: RouterOutputs["viewer"]["availability"]["list"]; }; -export function AvailabilityList({ availabilities, me }: AvailabilityListProps) { +export function AvailabilityList({ availabilities }: AvailabilityListProps) { const { t } = useLocale(); const [bulkUpdateModal, setBulkUpdateModal] = useState(false); const utils = trpc.useUtils(); const router = useRouter(); + const { data: user } = useMeQuery(); const deleteMutation = trpc.viewer.availability.schedule.delete.useMutation({ onMutate: async ({ scheduleId }) => { @@ -141,9 +142,9 @@ export function AvailabilityList({ availabilities, me }: AvailabilityListProps) {availabilities.schedules.map((schedule) => ( ) => { diff --git a/packages/features/auth/lib/getServerSession.ts b/packages/features/auth/lib/getServerSession.ts index dde207f1e0..3512da13d9 100644 --- a/packages/features/auth/lib/getServerSession.ts +++ b/packages/features/auth/lib/getServerSession.ts @@ -96,6 +96,7 @@ export async function getServerSession(options: { email: user.email, emailVerified: user.emailVerified, email_verified: user.emailVerified !== null, + completedOnboarding: user.completedOnboarding, role: user.role, image: getUserAvatarUrl({ avatarUrl: user.avatarUrl, diff --git a/packages/features/timezone-buddy/components/AvailabilitySliderTable.tsx b/packages/features/timezone-buddy/components/AvailabilitySliderTable.tsx index 5792051f0e..31dc02d01d 100644 --- a/packages/features/timezone-buddy/components/AvailabilitySliderTable.tsx +++ b/packages/features/timezone-buddy/components/AvailabilitySliderTable.tsx @@ -67,7 +67,7 @@ function UpgradeTeamTip() { ); } -export function AvailabilitySliderTable(props: { userTimeFormat: number | null; isOrg: boolean }) { +export function AvailabilitySliderTable(props: { isOrg: boolean }) { return ( @@ -75,7 +75,7 @@ export function AvailabilitySliderTable(props: { userTimeFormat: number | null; ); } -function AvailabilitySliderTableContent(props: { userTimeFormat: number | null; isOrg: boolean }) { +function AvailabilitySliderTableContent(props: { isOrg: boolean }) { const tableContainerRef = useRef(null); const [browsingDate, setBrowsingDate] = useState(dayjs()); const [editSheetOpen, setEditSheetOpen] = useState(false); diff --git a/packages/types/next-auth.d.ts b/packages/types/next-auth.d.ts index 487cc5f3bb..22be1aa06a 100644 --- a/packages/types/next-auth.d.ts +++ b/packages/types/next-auth.d.ts @@ -20,6 +20,7 @@ declare module "next-auth" { id: PrismaUser["id"]; emailVerified?: PrismaUser["emailVerified"]; email_verified?: boolean; + completedOnboarding?: boolean; impersonatedBy?: { id: number; role: PrismaUser["role"];