mirror of
https://github.com/hanzoai/calendar.git
synced 2026-10-30 14:46:43 +00:00
* refactor: apply biome formatting to packages/features (batch 1 - small subdirs) Format small subdirectories in packages/features: di, flags, holidays, oauth, settings, users, assignment-reason, selectedCalendar, hashedLink, host, form, form-builder, availability, data-table, pbac, schedules, troubleshooter, eventtypes, calendar-subscription, and root-level files. Also includes straggler apps/web BookEventForm.tsx. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 2 - medium subdirs) Format medium subdirectories in packages/features: auth, credentials, calendars, routing-forms, routing-trace, attributes, watchlist, calAIPhone, tasker, and webhooks. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 3 - bookings + insights) Format bookings and insights subdirectories in packages/features. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 4 - ee) Format packages/features/ee subdirectory covering billing, workflows, organizations, teams, managed-event-types, round-robin, dsync, integration-attribute-sync, and payments. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 5 - booking-audit part 1) Format booking-audit di, actions, common, dto, repository, and types subdirectories in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <[email protected]> * refactor: apply biome formatting to packages/features (batch 6 - booking-audit part 2) Format booking-audit service subdirectory in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <[email protected]> --------- Co-authored-by: Claude Opus 4.6 <[email protected]>
154 lines
4.7 KiB
TypeScript
154 lines
4.7 KiB
TypeScript
import { useLocale } from "@calcom/lib/hooks/useLocale";
|
|
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";
|
|
|
|
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({
|
|
installCalendarAction,
|
|
}: {
|
|
installCalendarAction?: { href: string } | { onClick: () => void };
|
|
}) {
|
|
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>
|
|
}>
|
|
{installCalendarAction && (
|
|
<div className="flex flex-col gap-3">
|
|
<Button color="secondary" className="justify-center gap-2" {...installCalendarAction}>
|
|
{t("install_calendar")}
|
|
</Button>
|
|
</div>
|
|
)}
|
|
</TroubleshooterListItemContainer>
|
|
);
|
|
}
|
|
|
|
interface ConnectedCalendarItem {
|
|
credentialId: number;
|
|
integration: {
|
|
name: string;
|
|
};
|
|
error?: {
|
|
message: string;
|
|
};
|
|
calendars?: {
|
|
primary: boolean | null;
|
|
isSelected: boolean;
|
|
name?: string;
|
|
}[];
|
|
}
|
|
|
|
interface CalendarToggleContainerComponentProps {
|
|
connectedCalendars: ConnectedCalendarItem[];
|
|
isLoading: boolean;
|
|
manageCalendarsAction?: { href: string } | { onClick: () => void };
|
|
installCalendarAction?: { href: string } | { onClick: () => void };
|
|
}
|
|
|
|
export function CalendarToggleContainerComponent({
|
|
connectedCalendars,
|
|
isLoading,
|
|
manageCalendarsAction,
|
|
installCalendarAction,
|
|
}: CalendarToggleContainerComponentProps): JSX.Element {
|
|
const { t } = useLocale();
|
|
const hasConnectedCalendars = 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 ? (
|
|
<>
|
|
{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 ?? t("nameless_calendar")}
|
|
status={calendar.error ? "not_found" : "connected"}
|
|
calendars={calendar.calendars?.map((item) => {
|
|
return {
|
|
active: item.isSelected,
|
|
name: item.name,
|
|
};
|
|
})}
|
|
/>
|
|
);
|
|
})}
|
|
{manageCalendarsAction && (
|
|
<Button color="secondary" className="justify-center gap-2" {...manageCalendarsAction}>
|
|
{t("manage_calendars")}
|
|
</Button>
|
|
)}
|
|
</>
|
|
) : (
|
|
<EmptyCalendarToggleItem installCalendarAction={installCalendarAction} />
|
|
)}
|
|
</div>
|
|
);
|
|
}
|