Merge branch 'main' into refactor/create-booking
This commit is contained in:
commit
97e998f107
|
@ -1,3 +1,4 @@
|
|||
import { CAL_URL } from "@calcom/lib/constants";
|
||||
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
|
||||
import type { User } from "@calcom/prisma/client";
|
||||
import { AvatarGroup } from "@calcom/ui";
|
||||
|
@ -11,6 +12,7 @@ export function UserAvatarGroup(props: UserAvatarProps) {
|
|||
<AvatarGroup
|
||||
{...rest}
|
||||
items={users.map((user) => ({
|
||||
href: `${CAL_URL}/${user.username}?redirect=false`,
|
||||
alt: user.name || "",
|
||||
title: user.name || "",
|
||||
image: getUserAvatarUrl(user),
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
|
||||
import { CAL_URL, WEBAPP_URL } from "@calcom/lib/constants";
|
||||
import { getUserAvatarUrl } from "@calcom/lib/getAvatarUrl";
|
||||
import type { Team, User } from "@calcom/prisma/client";
|
||||
import { AvatarGroup } from "@calcom/ui";
|
||||
|
@ -10,8 +11,11 @@ type UserAvatarProps = Omit<React.ComponentProps<typeof AvatarGroup>, "items"> &
|
|||
|
||||
export function UserAvatarGroupWithOrg(props: UserAvatarProps) {
|
||||
const { users, organization, ...rest } = props;
|
||||
const orgBranding = useOrgBranding();
|
||||
const baseUrl = `${orgBranding?.fullDomain ?? CAL_URL}`;
|
||||
const items = [
|
||||
{
|
||||
href: baseUrl,
|
||||
image: `${WEBAPP_URL}/team/${organization.slug}/avatar.png`,
|
||||
alt: organization.name || undefined,
|
||||
title: organization.name,
|
||||
|
@ -19,6 +23,7 @@ export function UserAvatarGroupWithOrg(props: UserAvatarProps) {
|
|||
].concat(
|
||||
users.map((user) => {
|
||||
return {
|
||||
href: `${baseUrl}/${user.username}/?redirect=false`,
|
||||
image: getUserAvatarUrl(user),
|
||||
alt: user.name || undefined,
|
||||
title: user.name || user.username || "",
|
||||
|
|
|
@ -54,6 +54,7 @@ export function UserPage(props: InferGetServerSidePropsType<typeof getServerSide
|
|||
// So it doesn't display in the Link (and make tests fail)
|
||||
user: _user,
|
||||
orgSlug: _orgSlug,
|
||||
redirect: _redirect,
|
||||
...query
|
||||
} = useRouterQuery();
|
||||
|
||||
|
@ -388,6 +389,16 @@ export const getServerSideProps: GetServerSideProps<UserPageProps> = async (cont
|
|||
descriptionAsSafeHTML: markdownToSafeHTML(eventType.description),
|
||||
}));
|
||||
|
||||
// if profile only has one public event-type, redirect to it
|
||||
if (eventTypes.length === 1 && context.query.redirect !== "false") {
|
||||
return {
|
||||
redirect: {
|
||||
permanent: false,
|
||||
destination: `/${user.username}/${eventTypes[0].slug}`,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
const safeBio = markdownToSafeHTML(user.bio) || "";
|
||||
|
||||
const markdownStrippedBio = stripMarkdown(user?.bio || "");
|
||||
|
|
|
@ -97,7 +97,7 @@ export default function Bookings() {
|
|||
}
|
||||
);
|
||||
|
||||
// Animate page (tab) tranistions to look smoothing
|
||||
// Animate page (tab) transitions to look smoothing
|
||||
|
||||
const buttonInView = useInViewObserver(() => {
|
||||
if (!query.isFetching && query.hasNextPage && query.status === "success") {
|
||||
|
|
|
@ -13,7 +13,7 @@ import { getLayout } from "@calcom/features/MainLayout";
|
|||
import { useOrgBranding } from "@calcom/features/ee/organizations/context/provider";
|
||||
import useIntercom from "@calcom/features/ee/support/lib/intercom/useIntercom";
|
||||
import { EventTypeEmbedButton, EventTypeEmbedDialog } from "@calcom/features/embed/EventTypeEmbed";
|
||||
import { EventTypeDescriptionLazy as EventTypeDescription } from "@calcom/features/eventtypes/components";
|
||||
import { EventTypeDescription } from "@calcom/features/eventtypes/components";
|
||||
import CreateEventTypeDialog from "@calcom/features/eventtypes/components/CreateEventTypeDialog";
|
||||
import { DuplicateDialog } from "@calcom/features/eventtypes/components/DuplicateDialog";
|
||||
import { TeamsFilter } from "@calcom/features/filters/components/TeamsFilter";
|
||||
|
|
|
@ -26,7 +26,7 @@ export const getServerSideProps = async (ctx: GetServerSidePropsContext) => {
|
|||
if (team) {
|
||||
return GSSTeamPage({ ...ctx, query: { slug: ctx.query.user } });
|
||||
}
|
||||
return GSSUserPage({ ...ctx, query: { user: ctx.query.user } });
|
||||
return GSSUserPage({ ...ctx, query: { user: ctx.query.user, redirect: ctx.query.redirect } });
|
||||
};
|
||||
|
||||
type Props = UserPageProps | TeamPageProps;
|
||||
|
|
|
@ -155,7 +155,7 @@
|
|||
"webhook_updated_successfully": "Webhook erfolgreich aktualisiert!",
|
||||
"webhook_removed_successfully": "Webhook erfolgreich entfernt!",
|
||||
"payload_template": "Payload Vorlage",
|
||||
"dismiss": "Abbrechen",
|
||||
"dismiss": "Ignorieren",
|
||||
"no_data_yet": "Noch keine Daten",
|
||||
"ping_test": "Pingtest",
|
||||
"add_to_homescreen": "Fügen Sie diese App Ihrem Startbildschirm für schnelleren Zugriff hinzu.",
|
||||
|
@ -295,7 +295,7 @@
|
|||
"other": "Sonstige",
|
||||
"email_sign_in_subject": "Ihr Anmelde-Link für {{appName}}",
|
||||
"emailed_you_and_attendees": "Wir haben eine E-Mail mit einer Kalendereinladung mit den Details an alle gesendet.",
|
||||
"emailed_you_and_attendees_recurring": "Wir haben eine E-Mail mit einer Kalendereinladung mit den Details für das erste dieser wiederkehrenden Ereignisse an alle gesendet.",
|
||||
"emailed_you_and_attendees_recurring": "Wir haben eine E-Mail mit einer Kalendereinladung mit den Details für das erste dieser wiederkehrenden Termine an alle gesendet.",
|
||||
"emailed_you_and_any_other_attendees": "Wir haben eine E-Mail mit diesen Informationen an alle gesendet.",
|
||||
"needs_to_be_confirmed_or_rejected": "Ihr Termin muss noch bestätigt oder abgelehnt werden.",
|
||||
"needs_to_be_confirmed_or_rejected_recurring": "Ihr wiederkehrender Termin muss noch bestätigt oder abgelehnt werden.",
|
||||
|
@ -683,7 +683,7 @@
|
|||
"plan_upgrade_teams": "Du musst deinen Plan upgraden, um ein Team zu erstellen.",
|
||||
"plan_upgrade_instructions": "Sie können <1>hier upgraden</1>.",
|
||||
"event_types_page_title": "Ereignistypen",
|
||||
"event_types_page_subtitle": "Erstellen Sie teilbare Ereignisse, die andere Personen buchen können.",
|
||||
"event_types_page_subtitle": "Erstellen Sie teilbare Termine, die andere Personen buchen können.",
|
||||
"new": "Neu",
|
||||
"new_event_type_btn": "Neuer Ereignistyp",
|
||||
"new_event_type_heading": "Erstellen Sie Ihren ersten Ereignistyp",
|
||||
|
@ -703,7 +703,7 @@
|
|||
"repeats_up_to_other": "Wiederholt sich bis zu {{count}} mal",
|
||||
"every_for_freq": "Alle {{freq}} für",
|
||||
"event_remaining_one": "{{count}} Ereignis übrig",
|
||||
"event_remaining_other": "{{count}} Ereignisse übrig",
|
||||
"event_remaining_other": "{{count}} Termine übrig",
|
||||
"repeats_every": "Wiederholt sich alle",
|
||||
"occurrence_one": "Vorkommnis",
|
||||
"occurrence_other": "Vorkommnisse",
|
||||
|
@ -1110,7 +1110,7 @@
|
|||
"zapier_invite_link": "Zapier Einladungs-Link",
|
||||
"meeting_url_provided_after_confirmed": "Eine Termin-URL wird angelegt, sobald der Termin bestätigt wurde.",
|
||||
"dynamically_display_attendee_or_organizer": "Zeigt dynamisch entweder Ihnen den Namen Ihres Teilnehmers bzw. Ihrer Teilnehmerin an oder zeigt Ihrem/Ihrer Teilnehmerin Ihren Namen an",
|
||||
"event_location": "Ort des Ereignisses",
|
||||
"event_location": "Ort des Termins",
|
||||
"reschedule_optional": "Grund für die Verschiebung (optional)",
|
||||
"reschedule_placeholder": "Lassen Sie andere wissen, warum Sie den Termin verschieben müssen",
|
||||
"event_cancelled": "Dieser Termin ist abgesagt",
|
||||
|
@ -1277,7 +1277,7 @@
|
|||
"2fa_required": "Zwei-Faktor-Authentifizierung erforderlich",
|
||||
"incorrect_2fa": "Falscher Zwei-Faktor-Authentifizierungscode",
|
||||
"which_event_type_apply": "Auf welchen Termintyp wird dies angewandt?",
|
||||
"no_workflows_description": "Workflows ermöglichen die einfache Automatisierung des Versands von Benachrichtigungen und Erinnerungen, so dass Sie Prozesse rund um Ihre Ereignisse erstellen können.",
|
||||
"no_workflows_description": "Workflows ermöglichen die einfache Automatisierung des Versands von Benachrichtigungen und Erinnerungen, so dass Sie Prozesse rund um Ihre Termine erstellen können.",
|
||||
"timeformat_profile_hint": "Dies ist eine interne Einstellung, die keinen Einfluss darauf hat, wie die Zeiten auf den öffentlichen Buchungsseiten für Sie oder jemanden, der Sie buchen möchte, angezeigt werden.",
|
||||
"create_workflow": "Einen Workflow erstellen",
|
||||
"do_this": "Mache dies",
|
||||
|
@ -1362,7 +1362,7 @@
|
|||
"add_dynamic_variables": "Dynamische Textvariablen hinzufügen",
|
||||
"event_name_info": "Name des Ereignistyps",
|
||||
"event_date_info": "Das Datum der Veranstaltung",
|
||||
"event_time_info": "Die Startzeit des Ereignisses",
|
||||
"event_time_info": "Die Startzeit des Termins",
|
||||
"location_info": "Der Ort des Events",
|
||||
"additional_notes_info": "Die zusätzlichen Anmerkungen der Buchung",
|
||||
"attendee_name_info": "Name der buchenden Person",
|
||||
|
@ -1380,7 +1380,7 @@
|
|||
"create_your_first_webhook_description": "Mit Webhooks können Sie Meetingdaten in Echtzeit erhalten, sobald etwas in {{appName}} passiert.",
|
||||
"for_a_maximum_of": "Für maximal",
|
||||
"event_one": "Ereignis",
|
||||
"event_other": "Ereignisse",
|
||||
"event_other": "Termine",
|
||||
"profile_team_description": "Einstellungen für Ihr Teamprofil verwalten",
|
||||
"profile_org_description": "Einstellungen für Ihr Organization-Profil verwalten",
|
||||
"members_team_description": "Benutzer in der Gruppe",
|
||||
|
@ -1502,13 +1502,13 @@
|
|||
"require_additional_notes": "Zusätzliche Notizen erforderlich",
|
||||
"require_additional_notes_description": "Zusätzliche Notizen bei der Buchung erforderlich machen",
|
||||
"email_address_action": "eine E-Mail an eine bestimmte E-Mail-Adresse senden",
|
||||
"after_event_trigger": "nach Ende des Ereignisses",
|
||||
"how_long_after": "Wie lange nach Ende des Ereignisses?",
|
||||
"after_event_trigger": "nach Ende des Termins",
|
||||
"how_long_after": "Wie lange nach Ende des Termins?",
|
||||
"no_available_slots": "Keine verfügbaren Plätze",
|
||||
"time_available": "Zeit verfügbar",
|
||||
"cant_find_the_right_video_app_visit_our_app_store": "Sie können die richtige Video-App nicht finden? Besuchen Sie unseren <1>App Store</1>.",
|
||||
"install_new_calendar_app": "Neue Kalender-App installieren",
|
||||
"make_phone_number_required": "Telefonnummer für die Buchung des Ereignisses erforderlich machen",
|
||||
"make_phone_number_required": "Telefonnummer für die Buchung des Termins erforderlich machen",
|
||||
"new_event_type_availability": "{{eventTypeTitle}} | Verfügbarkeit",
|
||||
"error_editing_availability": "Fehler beim Bearbeiten der Verfügbarkeit",
|
||||
"dont_have_permission": "Ihnen fehlt die Berechtigung, auf diese Ressource zuzugreifen.",
|
||||
|
@ -1813,7 +1813,7 @@
|
|||
"can_you_try_again": "Können Sie es zu einem anderen Zeitpunkt erneut versuchen?",
|
||||
"verify": "Bestätigen",
|
||||
"timezone_info": "Die Zeitzone der empfangenden Person",
|
||||
"event_end_time_variable": "Endzeitpunkt des Ereignisses",
|
||||
"event_end_time_variable": "Endzeitpunkt des Termins",
|
||||
"event_end_time_info": "Der Endzeitpunkt des Termins",
|
||||
"cancel_url_variable": "Absage-URL",
|
||||
"cancel_url_info": "Die URL, um die Buchung abzusagen",
|
||||
|
@ -1849,15 +1849,15 @@
|
|||
"select_user": "Benutzer auswählen",
|
||||
"select_event_type": "Ereignistyp auswählen",
|
||||
"select_date_range": "Datumsbereich auswählen",
|
||||
"popular_events": "Beliebte Ereignisse",
|
||||
"popular_events": "Beliebte Termine",
|
||||
"no_event_types_found": "Keine Ereignistypen gefunden",
|
||||
"average_event_duration": "Durchschnittliche Ereignisdauer",
|
||||
"most_booked_members": "Meistgebuchte Mitglieder",
|
||||
"least_booked_members": "Am wenigsten gebuchte Mitglieder",
|
||||
"events_created": "Ereignisse erstellt",
|
||||
"events_completed": "Ereignisse abgeschlossen",
|
||||
"events_created": "Termine erstellt",
|
||||
"events_completed": "Termine abgeschlossen",
|
||||
"events_cancelled": "Termine abgesagt",
|
||||
"events_rescheduled": "Ereignisse neu geplant",
|
||||
"events_rescheduled": "Termine neu geplant",
|
||||
"from_last_period": "seit dem letzten Zeitraum",
|
||||
"from_to_date_period": "Von: {{startDate}} Bis: {{endDate}}",
|
||||
"redirect_url_warning": "Das Hinzufügen einer Umleitung wird die Erfolgsseite deaktivieren. Erwähnen Sie \"Buchung bestätigt\" auf Ihrer benutzerdefinierten Erfolgsseite.",
|
||||
|
@ -1996,7 +1996,7 @@
|
|||
"insights_all_org_filter": "Alle Apps",
|
||||
"insights_team_filter": "Team: {{teamName}}",
|
||||
"insights_user_filter": "Benutzer: {{userName}}",
|
||||
"insights_subtitle": "Sehen Sie sich Buchungs-Insights zu Ihren Termine an",
|
||||
"insights_subtitle": "Erfahren Sie mehr über Ihre Termine und Ihr Team",
|
||||
"location_options": "{{locationCount}} Veranstaltungsort-Optionen",
|
||||
"custom_plan": "Maßgeschneiderter Tarif",
|
||||
"email_embed": "E-Mail Einbettung",
|
||||
|
|
|
@ -6,84 +6,12 @@ import { Card } from "@calcom/ui";
|
|||
|
||||
export const tips = [
|
||||
{
|
||||
id: 1,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/60HJt8DOVNo/0.jpg",
|
||||
mediaLink: "https://go.cal.com/dynamic-video",
|
||||
title: "Dynamic booking links",
|
||||
description: "Booking link that allows people to quickly schedule meetings.",
|
||||
href: "https://cal.com/blog/cal-v-1-9",
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/EAc46SPL6iA/0.jpg",
|
||||
mediaLink: "https://go.cal.com/teams-video",
|
||||
title: "How to set up Teams",
|
||||
description: "Learn how to use round-robin and collective events.",
|
||||
href: "https://cal.com/docs/enterprise-features/teams",
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/c7ZKFuLy1fg/0.jpg",
|
||||
mediaLink: "https://go.cal.com/routing-video",
|
||||
title: "Routing Forms, Workflows",
|
||||
description: "Ask screening questions of potential bookers to connect them with the right person",
|
||||
href: "https://cal.com/blog/cal-v-1-8",
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/zGr_s-fG84k/0.jpg",
|
||||
mediaLink: "https://go.cal.com/confirmation-video",
|
||||
title: "Requires Confirmation",
|
||||
description: "Learn how to be in charge of your bookings",
|
||||
href: "https://cal.com/resources/feature/opt-in",
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/0v_nQtpxC_4/0.jpg",
|
||||
mediaLink: "https://go.cal.com/payments-video",
|
||||
title: "Accept Payments",
|
||||
description: "Charge for your time with Cal.com's Stripe App",
|
||||
href: "https://app.cal.com/apps/stripe",
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/yGiZo1Ry5-8/0.jpg",
|
||||
mediaLink: "https://go.cal.com/recurring-video",
|
||||
title: "Recurring Bookings",
|
||||
description: "Learn how to create a recurring schedule",
|
||||
href: "https://go.cal.com/recurring-video",
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/UVXgo12cY4g/0.jpg",
|
||||
mediaLink: "https://go.cal.com/routing-forms",
|
||||
title: "Routing Forms",
|
||||
description: "Ask questions and route to the correct person",
|
||||
href: "https://go.cal.com/routing-forms",
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/piKlAiibAFo/0.jpg",
|
||||
mediaLink: "https://go.cal.com/workflows",
|
||||
title: "Automate Workflows",
|
||||
description: "Make time work for you and automate tasks",
|
||||
href: "https://go.cal.com/workflows",
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/93iOmzHieCU/0.jpg",
|
||||
mediaLink: "https://go.cal.com/round-robin",
|
||||
title: "Round-Robin",
|
||||
description: "Create advanced group meetings with round-robin",
|
||||
href: "https://go.cal.com/round-robin",
|
||||
},
|
||||
{
|
||||
id: 10,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/jvaBafzVUQc/0.jpg",
|
||||
mediaLink: "https://go.cal.com/video",
|
||||
title: "Cal Video",
|
||||
description: "Free video conferencing with recording",
|
||||
href: "https://go.cal.com/video",
|
||||
id: 12,
|
||||
thumbnailUrl: "https://cal.com/og-image-cal-ai.jpg",
|
||||
mediaLink: "https://go.cal.com/cal-ai",
|
||||
title: "Cal.ai",
|
||||
description: "Your personal AI scheduling assistant",
|
||||
href: "https://go.cal.com/cal-ai",
|
||||
},
|
||||
{
|
||||
id: 11,
|
||||
|
@ -94,13 +22,84 @@ export const tips = [
|
|||
href: "https://go.cal.com/insights",
|
||||
},
|
||||
{
|
||||
id: 12,
|
||||
thumbnailUrl:
|
||||
"https://cal.com/og-image-cal-ai.jpg",
|
||||
mediaLink: "https://go.cal.com/cal-ai",
|
||||
title: "Cal.ai",
|
||||
description: "Your personal AI scheduling assistant",
|
||||
href: "https://go.cal.com/cal-ai",
|
||||
id: 10,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/jvaBafzVUQc/0.jpg",
|
||||
mediaLink: "https://go.cal.com/video",
|
||||
title: "Cal Video",
|
||||
description: "Free video conferencing with recording",
|
||||
href: "https://go.cal.com/video",
|
||||
},
|
||||
{
|
||||
id: 9,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/93iOmzHieCU/0.jpg",
|
||||
mediaLink: "https://go.cal.com/round-robin",
|
||||
title: "Round-Robin",
|
||||
description: "Create advanced group meetings with round-robin",
|
||||
href: "https://go.cal.com/round-robin",
|
||||
},
|
||||
{
|
||||
id: 8,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/piKlAiibAFo/0.jpg",
|
||||
mediaLink: "https://go.cal.com/workflows",
|
||||
title: "Automate Workflows",
|
||||
description: "Make time work for you and automate tasks",
|
||||
href: "https://go.cal.com/workflows",
|
||||
},
|
||||
{
|
||||
id: 7,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/UVXgo12cY4g/0.jpg",
|
||||
mediaLink: "https://go.cal.com/routing-forms",
|
||||
title: "Routing Forms",
|
||||
description: "Ask questions and route to the correct person",
|
||||
href: "https://go.cal.com/routing-forms",
|
||||
},
|
||||
{
|
||||
id: 6,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/yGiZo1Ry5-8/0.jpg",
|
||||
mediaLink: "https://go.cal.com/recurring-video",
|
||||
title: "Recurring Bookings",
|
||||
description: "Learn how to create a recurring schedule",
|
||||
href: "https://go.cal.com/recurring-video",
|
||||
},
|
||||
{
|
||||
id: 5,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/0v_nQtpxC_4/0.jpg",
|
||||
mediaLink: "https://go.cal.com/payments-video",
|
||||
title: "Accept Payments",
|
||||
description: "Charge for your time with Cal.com's Stripe App",
|
||||
href: "https://app.cal.com/apps/stripe",
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/zGr_s-fG84k/0.jpg",
|
||||
mediaLink: "https://go.cal.com/confirmation-video",
|
||||
title: "Requires Confirmation",
|
||||
description: "Learn how to be in charge of your bookings",
|
||||
href: "https://cal.com/resources/feature/opt-in",
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/c7ZKFuLy1fg/0.jpg",
|
||||
mediaLink: "https://go.cal.com/routing-video",
|
||||
title: "Routing Forms, Workflows",
|
||||
description: "Ask screening questions of potential bookers to connect them with the right person",
|
||||
href: "https://cal.com/blog/cal-v-1-8",
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/EAc46SPL6iA/0.jpg",
|
||||
mediaLink: "https://go.cal.com/teams-video",
|
||||
title: "How to set up Teams",
|
||||
description: "Learn how to use round-robin and collective events.",
|
||||
href: "https://cal.com/docs/enterprise-features/teams",
|
||||
},
|
||||
{
|
||||
id: 1,
|
||||
thumbnailUrl: "https://img.youtube.com/vi/60HJt8DOVNo/0.jpg",
|
||||
mediaLink: "https://go.cal.com/dynamic-video",
|
||||
title: "Dynamic booking links",
|
||||
description: "Booking link that allows people to quickly schedule meetings.",
|
||||
href: "https://cal.com/blog/cal-v-1-9",
|
||||
},
|
||||
];
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user