diff --git a/apps/web/components/settings/platform/hooks/usePlatformMe.ts b/apps/web/components/settings/platform/hooks/usePlatformMe.ts index b3e3c61f99..97e3f942e0 100644 --- a/apps/web/components/settings/platform/hooks/usePlatformMe.ts +++ b/apps/web/components/settings/platform/hooks/usePlatformMe.ts @@ -1,21 +1,15 @@ -import { useQuery } from "@tanstack/react-query"; +import { trpc } from "@calcom/trpc/react"; -import type { UserResponse } from "@calcom/platform-types"; - -export const usePlatformMe = () => { - const QUERY_KEY = "get-platform-me"; - const platformMeQuery = useQuery({ - queryKey: [QUERY_KEY], - queryFn: async (): Promise => { - const response = await fetch(`/api/v2/me`, { - method: "get", - headers: { "Content-type": "application/json" }, - }); - const data = await response.json(); - - return data.data as UserResponse; +export function usePlatformMe() { + const meQuery = trpc.viewer.platformMe.useQuery(undefined, { + retry(failureCount) { + return failureCount > 3; }, + // 5 minutes + staleTime: 300000, }); - return platformMeQuery; -}; + return meQuery; +} + +export default usePlatformMe; diff --git a/packages/trpc/server/routers/loggedInViewer/_router.tsx b/packages/trpc/server/routers/loggedInViewer/_router.tsx index 0a42498542..7be92b93eb 100644 --- a/packages/trpc/server/routers/loggedInViewer/_router.tsx +++ b/packages/trpc/server/routers/loggedInViewer/_router.tsx @@ -16,6 +16,7 @@ import { ZLocationOptionsInputSchema } from "./locationOptions.schema"; import { ZNoShowInputSchema } from "./markNoShow.schema"; import { ZOutOfOfficeInputSchema, ZOutOfOfficeDelete } from "./outOfOffice.schema"; import { me } from "./procedures/me"; +import { platformMe } from "./procedures/platformMe"; import { teamsAndUserProfilesQuery } from "./procedures/teamsAndUserProfilesQuery"; import { ZRemoveNotificationsSubscriptionInputSchema } from "./removeNotificationsSubscription.schema"; import { ZRoutingFormOrderInputSchema } from "./routingFormOrder.schema"; @@ -31,6 +32,7 @@ const namespaced = (s: string) => `${NAMESPACE}.${s}`; type AppsRouterHandlerCache = { me?: typeof import("./me.handler").meHandler; + platformMe?: typeof import("./platformMe.handler").platformMeHandler; shouldVerifyEmail?: typeof import("./shouldVerifyEmail.handler").shouldVerifyEmailHandler; deleteMe?: typeof import("./deleteMe.handler").deleteMeHandler; deleteMeWithoutPassword?: typeof import("./deleteMeWithoutPassword.handler").deleteMeWithoutPasswordHandler; @@ -70,6 +72,7 @@ const UNSTABLE_HANDLER_CACHE: AppsRouterHandlerCache = {}; export const loggedInViewerRouter = router({ me, + platformMe, deleteMe: authedProcedure.input(ZDeleteMeInputSchema).mutation(async ({ ctx, input }) => { if (!UNSTABLE_HANDLER_CACHE.deleteMe) { diff --git a/packages/trpc/server/routers/loggedInViewer/platformMe.handler.ts b/packages/trpc/server/routers/loggedInViewer/platformMe.handler.ts new file mode 100644 index 0000000000..b83bb6c0c5 --- /dev/null +++ b/packages/trpc/server/routers/loggedInViewer/platformMe.handler.ts @@ -0,0 +1,39 @@ +import type { Session } from "next-auth"; + +import { ProfileRepository } from "@calcom/lib/server/repository/profile"; +import type { TrpcSessionUser } from "@calcom/trpc/server/trpc"; + +type MeOptions = { + ctx: { + user: NonNullable; + session: Session; + }; +}; + +export const platformMeHandler = async ({ ctx }: MeOptions) => { + const { user: sessionUser } = ctx; + + const allUserEnrichedProfiles = await ProfileRepository.findAllProfilesForUserIncludingMovedUser( + sessionUser + ); + + const mainProfile = + allUserEnrichedProfiles.find((profile) => sessionUser.movedToProfileId === profile.id) || + allUserEnrichedProfiles.find((profile) => sessionUser.organizationId === profile.organizationId) || + allUserEnrichedProfiles[0]; + + return { + id: sessionUser.id, + username: sessionUser.username, + email: sessionUser.email, + timeFormat: sessionUser.timeFormat, + timeZone: sessionUser.timeZone, + defaultScheduleId: sessionUser.defaultScheduleId, + weekStart: sessionUser.weekStart, + organizationId: mainProfile.organizationId, + organization: { + isPlatform: mainProfile.organization?.isPlatform ?? false, + id: mainProfile.organizationId ?? null, + }, + }; +}; diff --git a/packages/trpc/server/routers/loggedInViewer/procedures/platformMe.ts b/packages/trpc/server/routers/loggedInViewer/procedures/platformMe.ts new file mode 100644 index 0000000000..0b6f555d3b --- /dev/null +++ b/packages/trpc/server/routers/loggedInViewer/procedures/platformMe.ts @@ -0,0 +1,7 @@ +import authedProcedure from "../../../procedures/authedProcedure"; + +export const platformMe = authedProcedure.query(async ({ ctx }) => { + const handler = (await import("../platformMe.handler")).platformMeHandler; + + return handler({ ctx }); +});