refactor: Remove trpc/server dependency from @calcom/atoms (#26717)

* mv useTeamMembersWithSegment

* remove

* fix ts error

* remove

* remove

* remove

* biome rule

* wip

* refactor: remove remaining @calcom/trpc/server imports from atoms

- Create local types for schedule handlers (CreateScheduleHandlerReturn, DuplicateScheduleHandlerReturn, GetAvailabilityListHandlerReturn, CreateScheduleInput)
- Create local GetAvailableSlotsResponse type for slots hook
- Update imports in useAtomCreateSchedule, useAtomDuplicateSchedule, useAtomGetAllSchedules, and useAvailableSlots

Co-Authored-By: benny@cal.com <sldisek783@gmail.com>

* fix

* fix: add userId to Schedule type and create ScheduleForList type

- Schedule type now includes userId for create/duplicate handlers
- Created ScheduleForList type for list handler (uses select without userId)

Co-Authored-By: benny@cal.com <sldisek783@gmail.com>

* fix

* fix

* fix

* fix

* fix: correct fromUser/toUser types in GetAvailableSlotsResponse

- fromUser: { id, displayName } (matches IFromUser)
- toUser: { id, username, displayName } (matches IToUser)

Co-Authored-By: benny@cal.com <sldisek783@gmail.com>

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Benny Joo
2026-01-12 07:06:22 -03:00
committed by GitHub
co-authored by Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent f7dee536d7
commit fc0a2b5a37
11 changed files with 79 additions and 24 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
import { diff } from "jest-diff";
import { expect } from "vitest";
import type { Slot } from "@calcom/trpc/server/routers/viewer/slots/types";
import type { Slot } from "@calcom/atoms/booker/types";
export const expectedSlotsForSchedule = {
IstWorkHours: {
+6 -6
View File
@@ -337,17 +337,17 @@
"patterns": [
{
"group": [
"@calcom/trpc/react",
"@calcom/trpc/react/**"
"@calcom/trpc",
"@calcom/trpc/**"
],
"message": "atoms package should not import from @calcom/trpc/react."
"message": "atoms package should not import from @calcom/trpc."
},
{
"group": [
"../../trpc/react",
"../../trpc/react/**"
"../../trpc",
"../../trpc/**"
],
"message": "atoms package should not import from trpc/react."
"message": "atoms package should not import from trpc."
}
]
}
+31 -1
View File
@@ -11,10 +11,17 @@ import type {
ApiSuccessResponseWithoutData,
RoutingFormSearchParams,
} from "@calcom/platform-types";
import type { Slot } from "@calcom/trpc/server/routers/viewer/slots/types";
import type { UseCreateBookingInput } from "../hooks/bookings/useCreateBooking";
export type Slot = {
time: string;
userIds?: number[];
attendees?: number;
bookingUid?: string;
users?: string[];
};
// Type that includes only the data values from BookerStore (excluding functions)
export type BookerStoreValues = Omit<
BookerStore,
@@ -104,3 +111,26 @@ export type BookerPlatformWrapperAtomPropsForTeam = BookerPlatformWrapperAtomPro
routingFormSearchParams?: RoutingFormSearchParams;
rrHostSubsetIds?: number[];
};
type SlotInfo = {
time: string;
attendees?: number;
bookingUid?: string;
away?: boolean;
fromUser?: {
id: number;
displayName: string | null;
};
toUser?: {
id: number;
username: string | null;
displayName: string | null;
};
reason?: string;
emoji?: string;
showNotePublicly?: boolean;
};
export type GetAvailableSlotsResponse = {
slots: Record<string, SlotInfo[]>;
};
@@ -0,0 +1,36 @@
type Schedule = {
id: number;
userId: number;
name: string;
timeZone: string | null;
};
export type CreateScheduleHandlerReturn = {
schedule: Schedule;
};
export type DuplicateScheduleHandlerReturn = {
schedule: Schedule;
};
export type GetAvailabilityListHandlerReturn = {
schedules: (Omit<Schedule, "userId"> & {
availability: {
id: number;
userId: number | null;
eventTypeId: number | null;
days: number[];
startTime: Date;
endTime: Date;
date: Date | null;
scheduleId: number | null;
}[];
isDefault: boolean;
})[];
};
export type CreateScheduleInput = {
name: string;
schedule?: { start: Date; end: Date }[][];
eventTypeId?: number;
};
@@ -2,10 +2,9 @@ import { useMutation, useQueryClient } from "@tanstack/react-query";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import type { ApiResponse, ApiErrorResponse, ApiSuccessResponse } from "@calcom/platform-types";
import type { CreateScheduleHandlerReturn } from "@calcom/trpc/server/routers/viewer/availability/schedule/create.handler";
import { TCreateInputSchema as CreateScheduleSchema } from "@calcom/trpc/server/routers/viewer/availability/schedule/create.schema";
import http from "../../lib/http";
import type { CreateScheduleHandlerReturn, CreateScheduleInput as CreateScheduleSchema } from "./types";
import { QUERY_KEY as SchedulesQueryKey } from "./useAtomGetAllSchedules";
import { QUERY_KEY as ScheduleQueryKey } from "./useAtomSchedule";
@@ -2,9 +2,9 @@ import { useMutation, useQueryClient } from "@tanstack/react-query";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import type { ApiResponse, ApiErrorResponse } from "@calcom/platform-types";
import type { DuplicateScheduleHandlerReturn } from "@calcom/trpc/server/routers/viewer/availability/schedule/duplicate.handler";
import http from "../../lib/http";
import type { DuplicateScheduleHandlerReturn } from "./types";
import { QUERY_KEY as ScheduleQueryKey } from "./useAtomSchedule";
interface useAtomDuplicateScheduleOptions {
@@ -2,9 +2,9 @@ import { useQuery } from "@tanstack/react-query";
import { SUCCESS_STATUS } from "@calcom/platform-constants";
import type { ApiResponse } from "@calcom/platform-types";
import type { GetAvailabilityListHandlerReturn } from "@calcom/trpc/server/routers/viewer/availability/list.handler";
import http from "../../lib/http";
import type { GetAvailabilityListHandlerReturn } from "./types";
import { useAtomsContext } from "../useAtomsContext";
export const QUERY_KEY = "use-atom-user-schedules";
@@ -6,9 +6,9 @@ import type {
ApiResponse,
ApiSuccessResponse,
} from "@calcom/platform-types";
import type { GetAvailableSlotsResponse } from "@calcom/trpc/server/routers/viewer/slots/util";
import http from "../lib/http";
import type { GetAvailableSlotsResponse } from "../booker/types";
export const QUERY_KEY = "get-available-slots";
+1 -1
View File
@@ -55,7 +55,7 @@
},
"./add-members-switch/AddMembersWithSwitchPlatformWrapper": "./add-members-switch/AddMembersWithSwitchPlatformWrapper.tsx",
"./availability/AvailabilitySettings": "./availability/AvailabilitySettings.tsx",
"./booker": "./booker/index.ts",
"./booker/types": "./booker/types.ts",
"./selected-calendars/SelectedCalendarsSettings": "./selected-calendars/SelectedCalendarsSettings.tsx",
"./components/ui/shell": "./src/components/ui/shell.tsx",
"./dist/index.ts": "./index.ts",
-2
View File
@@ -38,8 +38,6 @@
"../../dayjs",
"../../prisma/zod-utils.ts",
"../../prisma/zod",
"../../trpc/server/routers/viewer/slots",
"../../trpc/server/types",
"../../features/eventtypes",
"../../features/schedules",
"../../features/bookings/Booker",
@@ -76,14 +76,6 @@ export const reserveSlotSchema = z
"Either slotUtcStartDate, slotUtcEndDate or eventTypeId should be filled in."
);
export type Slot = {
time: string;
userIds?: number[];
attendees?: number;
bookingUid?: string;
users?: string[];
};
export const removeSelectedSlotSchema = z.object({
uid: z.string().nullable(),
});