mirror of
https://github.com/hanzoai/calendar.git
synced 2026-10-30 14:46:43 +00:00
* 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>
102 lines
3.4 KiB
TypeScript
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>
|
|
</>
|
|
);
|
|
};
|