Files
Benny JooGitHubDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
ab21c7f805 refactor: Cal.diy (#28903)
* feat: Cal.diy — community-driven MIT-licensed fork of Cal.com

This squashed commit contains all Cal.diy changes applied on top of calcom/cal.com main:

- Rebrand Cal.com to Cal.diy across the entire codebase
- Remove Enterprise Edition (EE) features, license checks, and AGPL restrictions
- Switch license from AGPL-3.0 to MIT
- Remove docs/ directory (migrated to Nextra at cal.diy)
- Remove dead code: org tests, EE tips, platform nav, premium username, SAML/SSO, etc.
- Clean up .env.example for self-hosted Cal.diy
- Update Docker image references to calcom/cal.diy
- Update README, CONTRIBUTING.md, and issue templates for Cal.diy community fork
- Add PR welcome bot for Cal.diy contributors
- Fix API v2 breaking changes oasdiff ignore entries
- Replace Blacksmith CI runners with default GitHub Actions

3893 files changed, 20789 insertions(+), 411020 deletions(-)

Co-Authored-By: [email protected] <[email protected]>

* refactor: remove org-specific /organizations/:orgId endpoints from API v2 atoms controllers (#1701)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* fix: revert Cal.diy Inc to Cal.com, Inc. in license files, copyright notices, and package metadata (#1702)

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>

* rip out org related comments in api v2

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-04-15 09:52:36 -03:00

102 lines
3.4 KiB
TypeScript

import { useIsPlatform } from "@calcom/atoms/hooks/useIsPlatform";
import { useIsEmbed } from "@calcom/embed-core/embed-iframe";
import { useBookerStore } from "@calcom/features/bookings/Booker/store";
import type { BookerEvent } from "@calcom/features/bookings/types";
import { WEBAPP_URL } from "@calcom/lib/constants";
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
import { SchedulingType } from "@calcom/prisma/enums";
import { AvatarGroup } from "@calcom/ui/components/avatar";
export interface EventMembersProps {
/**
* Used to determine whether all members should be shown or not.
* In case of Round Robin type, members aren't shown.
*/
schedulingType: BookerEvent["schedulingType"];
users: BookerEvent["subsetOfUsers"];
profile: BookerEvent["profile"];
entity: BookerEvent["entity"];
isPrivateLink: boolean;
roundRobinHideOrgAndTeam?: boolean;
hideOrgTeamAvatar?: boolean;
}
export const EventMembers = ({
schedulingType,
users,
profile,
entity,
isPrivateLink,
roundRobinHideOrgAndTeam,
hideOrgTeamAvatar,
}: EventMembersProps) => {
const username = useBookerStore((state) => state.username);
const isDynamic = !!(username && username.indexOf("+") > -1);
const isEmbed = useIsEmbed();
const isPlatform = useIsPlatform();
const showMembers = schedulingType !== SchedulingType.ROUND_ROBIN;
const shownUsers = showMembers ? users : [];
// In some cases we don't show the user's names, but only show the profile name.
const showOnlyProfileName =
(profile.name && schedulingType === SchedulingType.ROUND_ROBIN) ||
!users.length ||
(profile.name !== users[0].name && schedulingType === SchedulingType.COLLECTIVE);
if (schedulingType === SchedulingType.ROUND_ROBIN && roundRobinHideOrgAndTeam) {
return <div className="h-6" />;
}
if (schedulingType === SchedulingType.ROUND_ROBIN && hideOrgTeamAvatar) {
return <p className="pt-6 font-semibold text-sm text-subtle">{profile.name}</p>;
}
const orgOrTeamAvatarItem =
hideOrgTeamAvatar || isDynamic || (!profile.image && !entity.logoUrl) || !entity.teamSlug
? []
: [
{
// We don't want booker to be able to see the list of other users or teams inside the embed
href:
isEmbed || isPlatform || isPrivateLink || entity.hideProfileLink
? null
: entity.teamSlug
? `${WEBAPP_URL}/team/${entity.teamSlug}`
: WEBAPP_URL,
image: entity.logoUrl ?? profile.image ?? "",
alt: entity.name ?? profile.name ?? "",
title: entity.name ?? profile.name ?? "",
},
];
return (
<>
<AvatarGroup
size="sm"
className="border-muted"
items={[
...orgOrTeamAvatarItem,
...shownUsers.map((user) => ({
href:
isPlatform || isPrivateLink || entity.hideProfileLink
? null
: `${WEBAPP_URL}/${user.profile?.username}?redirect=false`,
alt: user.name || "",
title: user.name || "",
image: getUserAvatarUrl(user),
})),
]}
/>
<p className="mt-2 font-semibold text-sm text-subtle">
{showOnlyProfileName
? profile.name
: shownUsers
.map((user) => user.name)
.filter((name) => name)
.join(", ")}
</p>
</>
);
};