* fix: remove @calcom/web imports from packages/features to eliminate circular dependency - Migrate UserTableUser and MemberPermissions types to packages/features/users/types/user-table.ts - Migrate useGeo hook to packages/features/geo/GeoContext.tsx - Migrate buildLegacyRequest to packages/lib/buildLegacyCtx.ts - Migrate Calendar component to packages/features/calendars/weeklyview/components/ - Move test utilities (bookingScenario, fixtures) to packages/features/test/ - Update all imports in packages/features to use new locations - Add re-exports in apps/web for backward compatibility Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: delete original implementation files and fix type issues - Delete original calendar component files in apps/web (keep only re-export stubs) - Migrate OutOfOfficeInSlots to packages/features/bookings/components - Convert apps/web OutOfOfficeInSlots to re-export stub - Fix className vs class issue in Calendar.tsx - Fix @calcom/trpc import violation in user-table.ts by using structural type Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: add missing isGroup and contains fields to UserTableUser attributes type Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update customRole type to match actual Prisma Role model Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix build * fix * fix * cleanup weeklyview * fix * refactor to mv MemberPermissions to types package * add types dependency to features * fix * fix * fix * fix * fix * fix * rename * rename * migrate * migrate * migrate * fix * fix * fix * refactor: move test utilities from packages/features/test to tests/libs - Move bookingScenario utilities to tests/libs/bookingScenario - Move fixtures to tests/libs/fixtures - Update all imports in packages/features test files to use new location - Update all imports in apps/web test files to use new location - Eliminates duplication of test utilities between packages/features and apps/web Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: correct relative import paths for tests/libs in test files Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * refactor: replace test utility implementations with re-exports to tests/libs Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: fix test import paths and move signup handler tests to apps/web Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: move buildLegacyCtx to packages/lib and restore handlers to packages/features - Move buildLegacyCtx from apps/web/lib to packages/lib to break circular dependency - Update apps/web/lib/buildLegacyCtx.ts to re-export from @calcom/lib - Restore signup handlers and tests to packages/features/auth/signup/handlers - Update handler imports to use @calcom/lib/buildLegacyCtx instead of @calcom/web/lib/buildLegacyCtx Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update recurring-event.test.ts imports to use tests/libs path Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * refactor: delete test re-export files and update imports to use tests/libs directly Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update remaining test imports to use tests/libs directly Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: update handleRecurringEventBooking calls to match function signature (1 arg) Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * remove * migrate tests * migrate tests * refactor: update test mock imports by removing and using async for mock creators. * fix type errors * fix: add type assertion for MockUser in p2002.test-suite.ts Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: restore locale import in compareReminderBodyToTemplate.test.ts using relative path Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * feat: create @calcom/testing package and migrate tests from /tests directory - Created new @calcom/testing package in /packages/testing - Moved all files from /tests to /packages/testing - Updated all imports across the codebase to use @calcom/testing alias - Removed /tests directory at root level This allows other packages like @calcom/features and @calcom/web to import testing utilities using the @calcom/testing alias instead of relative paths. Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix * fix * fix: add missing useBookings export to @calcom/atoms package Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: add missing useCalendarsBusyTimes and useConnectedCalendars exports to @calcom/atoms Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * chore: add @calcom/testing as explicit devDependency to packages that use it Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * refactor: move setupVitest.ts into @calcom/testing package Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix * chore: add biome rules to restrict @calcom/testing imports Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix * rename libs to lib * rename libs to lib * add rule * add rule * refactor: remove @calcom/features imports from @calcom/testing - Move mockPaymentSuccessWebhookFromStripe to fresh-booking.test.ts - Replace ProfileRepository.generateProfileUid() with uuidv4() - Clone Tracking type into @calcom/testing/src/lib/types.ts - Update imports in expects.ts and getMockRequestDataForBooking.ts - Move source files into src/ folder - Move CalendarManager mock to @calcom/features Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * fix: add explicit exports for nested paths in @calcom/testing Co-Authored-By: benny@cal.com <sldisek783@gmail.com> * improve * improve * fix * fix * fix type checks * fix type checks * fix type checks * fix tests --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
125 lines
4.0 KiB
TypeScript
125 lines
4.0 KiB
TypeScript
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
import { trpc } from "@calcom/trpc/react";
|
|
import { Badge } from "@calcom/ui/components/badge";
|
|
import { Button } from "@calcom/ui/components/button";
|
|
import { Switch } from "@calcom/ui/components/form";
|
|
|
|
import { TroubleshooterListItemContainer } from "./TroubleshooterListItemContainer";
|
|
|
|
const SELECTION_COLORS = ["#f97316", "#84cc16", "#06b6d4", "#8b5cf6", "#ec4899", "#f43f5e"];
|
|
|
|
interface CalendarToggleItemProps {
|
|
title: string;
|
|
subtitle: string;
|
|
colorDot?: string;
|
|
status: "connected" | "not_found";
|
|
calendars?: {
|
|
active?: boolean;
|
|
name?: string;
|
|
}[];
|
|
}
|
|
function CalendarToggleItem(props: CalendarToggleItemProps) {
|
|
const badgeStatus = props.status === "connected" ? "green" : "orange";
|
|
const badgeText = props.status === "connected" ? "Connected" : "Not found";
|
|
return (
|
|
<TroubleshooterListItemContainer
|
|
title={props.title}
|
|
subtitle={props.subtitle}
|
|
prefixSlot={
|
|
<>
|
|
<div
|
|
className="h-4 w-4 self-center rounded-[4px]"
|
|
style={{
|
|
backgroundColor: props.colorDot,
|
|
}}
|
|
/>
|
|
</>
|
|
}
|
|
suffixSlot={
|
|
<div>
|
|
<Badge variant={badgeStatus} withDot size="sm">
|
|
{badgeText}
|
|
</Badge>
|
|
</div>
|
|
}>
|
|
<div className="[&>*]:text-emphasis flex flex-col gap-3">
|
|
{props.calendars?.map((calendar) => {
|
|
return <Switch key={calendar.name} checked={calendar.active} label={calendar.name} disabled />;
|
|
})}
|
|
</div>
|
|
</TroubleshooterListItemContainer>
|
|
);
|
|
}
|
|
|
|
function EmptyCalendarToggleItem() {
|
|
const { t } = useLocale();
|
|
|
|
return (
|
|
<TroubleshooterListItemContainer
|
|
title={t("installed", { count: 0 })}
|
|
subtitle={t("please_install_a_calendar")}
|
|
prefixSlot={
|
|
<>
|
|
<div className="h-4 w-4 self-center rounded-[4px] bg-blue-500" />
|
|
</>
|
|
}
|
|
suffixSlot={
|
|
<div>
|
|
<Badge variant="orange" withDot size="sm">
|
|
{t("unavailable")}
|
|
</Badge>
|
|
</div>
|
|
}>
|
|
<div className="flex flex-col gap-3">
|
|
<Button color="secondary" className="justify-center gap-2" href="/apps/categories/calendar">
|
|
{t("install_calendar")}
|
|
</Button>
|
|
</div>
|
|
</TroubleshooterListItemContainer>
|
|
);
|
|
}
|
|
|
|
export function CalendarToggleContainer() {
|
|
const { t } = useLocale();
|
|
const { data, isLoading } = trpc.viewer.calendars.connectedCalendars.useQuery();
|
|
|
|
const hasConnectedCalendars = data && data?.connectedCalendars.length > 0;
|
|
|
|
return (
|
|
<div className="flex flex-col stack-y-3">
|
|
<p className="text-sm font-medium leading-none">{t("calendars_were_checking_for_conflicts")}</p>
|
|
{hasConnectedCalendars && !isLoading ? (
|
|
<>
|
|
{data.connectedCalendars.map((calendar) => {
|
|
const foundPrimary = calendar.calendars?.find((item) => item.primary);
|
|
// Will be used when getAvailbility is modified to use externalId instead of appId for source.
|
|
// const color = SELECTION_COLORS[idx] || "#000000";
|
|
// // Add calendar to color map using externalId (what we use on the backend to determine source)
|
|
// addToColorMap(foundPrimary?.externalId, color);
|
|
return (
|
|
<CalendarToggleItem
|
|
key={calendar.credentialId}
|
|
title={calendar.integration.name}
|
|
colorDot="#000000"
|
|
subtitle={foundPrimary?.name ?? "Nameless Calendar"}
|
|
status={calendar.error ? "not_found" : "connected"}
|
|
calendars={calendar.calendars?.map((item) => {
|
|
return {
|
|
active: item.isSelected,
|
|
name: item.name,
|
|
};
|
|
})}
|
|
/>
|
|
);
|
|
})}
|
|
<Button color="secondary" className="justify-center gap-2" href="/settings/my-account/calendars">
|
|
{t("manage_calendars")}
|
|
</Button>
|
|
</>
|
|
) : (
|
|
<EmptyCalendarToggleItem />
|
|
)}
|
|
</div>
|
|
);
|
|
}
|