* refactor: move shared components from apps/web to packages/features Move components that don't require dependency injection: - DisconnectIntegrationModal - Booking components (Header, Section, TimeFormatToggle, PayIcon, Price) - useInitializeWeekStart hook - TeamEventTypeForm - Event type components (AssignAllTeamMembers, BulkEditDefaultForEventsModal, etc.) - Event type dialogs (HostEditDialogs, ManagedEventDialog) - Location components (LocationInput, types) - Tab components (EventLimitsTab, EventRecurringTab, etc.) Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * refactor: update import paths to use @calcom/features Update imports in apps/web and packages/platform/atoms to reference the moved components from @calcom/features instead of @calcom/web. Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * refactor: delete original files from apps/web/modules Complete the file move by deleting the original files that were copied to packages/features. This makes it a proper move instead of a copy, reducing the PR size significantly. Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update import paths to use @calcom/features for moved files Update import paths in apps/web files that reference components that were moved from apps/web/modules to packages/features: - LearnMoreLink - ChildrenEventTypeSelect - AssignAllTeamMembers - WeightDescription - LocationCustomClassNames (types) Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update additional import paths for moved components Update import paths in apps/web files that reference components moved from apps/web/modules to packages/features: - AppList.tsx: BulkEditDefaultForEventsModal - schedule-view.tsx: BulkUpdatParams type - AddMembersWithSwitch.tsx: AssignAllTeamMembers, CheckedTeamSelect - EventTypeWebWrapper.tsx: ChildrenEventType, ManagedEventDialog - DefaultLocationSettings.tsx: LocationCustomClassNames, LocationInput - Locations.tsx: LocationCustomClassNames, LocationInput Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: resolve circular dependency by adding isPlatform prop to Header This fixes the circular dependency where @calcom/atoms (CalendarViewComponent) was importing Header from @calcom/features, but Header was importing useIsPlatform from @calcom/atoms. The fix adds an isPlatform prop to the Header component so it no longer needs to import useIsPlatform from @calcom/atoms. Callers now pass the isPlatform value directly: - atoms components pass isPlatform={true} - web components pass the isPlatform prop they receive Fix confidence: 9/10 (Cubic AI) Co-Authored-By: unknown <> * fix * fix * fix * fix * fix * fix --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
64 lines
2.0 KiB
TypeScript
64 lines
2.0 KiB
TypeScript
import type { MotionProps } from "framer-motion";
|
|
import { m } from "framer-motion";
|
|
import { forwardRef } from "react";
|
|
|
|
import { useBookerStoreContext } from "@calcom/features/bookings/Booker/BookerStoreProvider";
|
|
import classNames from "@calcom/ui/classNames";
|
|
|
|
import type { BookerAreas, BookerLayout } from "@calcom/features/bookings/Booker/types";
|
|
|
|
/**
|
|
* Define what grid area a section should be in.
|
|
* Value is either a string (in case it's always the same area), or an object
|
|
* looking like:
|
|
* {
|
|
* // Where default is the required default area.
|
|
* default: "calendar",
|
|
* // Any optional overrides for different layouts by their layout name.
|
|
* week_view: "main",
|
|
* }
|
|
*/
|
|
type GridArea = BookerAreas | ({ [key in BookerLayout]?: BookerAreas } & { default: BookerAreas });
|
|
|
|
type BookerSectionProps = {
|
|
children: React.ReactNode;
|
|
area: GridArea;
|
|
visible?: boolean;
|
|
className?: string;
|
|
} & MotionProps;
|
|
|
|
// This map with strings is needed so Tailwind generates all classnames,
|
|
// If we would concatenate them with JS, Tailwind would not generate them.
|
|
const gridAreaClassNameMap: { [key in BookerAreas]: string } = {
|
|
calendar: "[grid-area:calendar]",
|
|
main: "[grid-area:main]",
|
|
meta: "[grid-area:meta]",
|
|
timeslots: "[grid-area:timeslots]",
|
|
header: "[grid-area:header]",
|
|
};
|
|
|
|
/**
|
|
* Small helper component that renders a booker section in a specific grid area.
|
|
*/
|
|
export const BookerSection = forwardRef<HTMLDivElement, BookerSectionProps>(function BookerSection(
|
|
{ children, area, visible, className, ...props },
|
|
ref
|
|
) {
|
|
const layout = useBookerStoreContext((state) => state.layout);
|
|
let gridClassName: string;
|
|
|
|
if (typeof area === "string") {
|
|
gridClassName = gridAreaClassNameMap[area];
|
|
} else {
|
|
gridClassName = gridAreaClassNameMap[area[layout] || area.default];
|
|
}
|
|
|
|
if (!visible && typeof visible !== "undefined") return null;
|
|
|
|
return (
|
|
<m.div ref={ref} className={classNames(gridClassName, className)} layout {...props}>
|
|
{children}
|
|
</m.div>
|
|
);
|
|
});
|