import { useAutoAnimate } from "@formkit/auto-animate/react"; import { useEffect, useState } from "react"; import { WEBAPP_URL } from "@calcom/lib/constants"; import { useLocale } from "@calcom/lib/hooks/useLocale"; import { localStorage } from "@calcom/lib/webstorage"; import { Button, Icon } from "@calcom/ui"; import Card from "./Card"; 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://docs.cal.com/deep-dives/event-types", }, { 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://docs.cal.com/deep-dives/event-types#opt-in-booking", }, { 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", }, ]; function useLocalList(storageKey: string, initialValue: T[]) { const [list, setList] = useState(initialValue); /** This use effect is used to filter out the items that have been removed from the list we get this from local storage and then we reverse the list so that the newest items are at the top. This is done so that the items are displayed in the order they were added **/ useEffect(() => { const reversedList = initialValue.slice(0).reverse(); const removedListString = localStorage.getItem(storageKey) || ""; const removedListIds = removedListString.split(",").map((id) => parseInt(id, 10)); const filteredList = reversedList.filter((tip) => removedListIds.indexOf(tip.id) === -1); setList(() => [...filteredList]); }, [initialValue, storageKey]); const handleRemoveItem = (id: number) => { setList((currentItems) => { const items = localStorage.getItem(storageKey) || ""; const itemToRemoveIndex = currentItems.findIndex((item) => item.id === id); localStorage.setItem( storageKey, `${currentItems[itemToRemoveIndex].id.toString()}${items.length > 0 ? `,${items.split(",")}` : ""}` ); currentItems.splice(itemToRemoveIndex, 1); return [...currentItems]; }); }; return { list, handleRemoveItem, }; } export default function Tips() { //const [animationRef] = useAutoAnimate(); const { t } = useLocale(); const { list, handleRemoveItem } = useLocalList("removedTipsIds", tips); const baseOriginalList = list.slice(0).reverse(); return (
{list.map((tip) => { return (
handleRemoveItem(tip.id), child: t("dismiss") }} />
); })}
); } export function TipBanner() { const { t } = useLocale(); const [animationRef] = useAutoAnimate(); const bannerTips = [ { id: 1, img: "/team-banner-background-small.jpg", title: t("calcom_is_better_with_team"), subtitle: t("add_your_team_members"), href: `${WEBAPP_URL}/settings/teams/new`, learnMoreHref: "https://go.cal.com/teams-video", }, ]; const { list, handleRemoveItem } = useLocalList("removedBannerIds", bannerTips); return (
{list.map((tip) => { return (

{tip.title}

{tip.subtitle}

{tip.learnMoreHref && ( )}
); })}
); }