infoalloggi-monorepo/apps/infoalloggi/src/components/banners.tsx

116 lines
3.2 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import Cookies from "js-cookie";
import { X } from "lucide-react";
2025-08-28 18:27:07 +02:00
import Link from "next/link";
import { type MouseEvent, useEffect, useState } from "react";
2025-08-04 17:45:44 +02:00
import { IconMatrix, type IconType } from "~/components/IconComponents";
2025-08-28 18:27:07 +02:00
import { cn } from "~/lib/utils";
import type { Banners } from "~/schemas/public/Banners";
2025-08-04 17:45:44 +02:00
const defaultHideDuration = 365; // days
2025-08-04 17:45:44 +02:00
export const BannerFactory = (bannerData: Banners) => {
2025-08-28 18:27:07 +02:00
const NEW_BANNER_KEY = `bannercookie_${bannerData.idbanner}`;
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
let bgColor = "";
let accentColor = "";
let closeHoverColor = "";
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
switch (bannerData.color) {
case "blu":
bgColor = "bg-blue-600";
accentColor = "bg-blue-800";
closeHoverColor = "hover:bg-blue-500";
break;
case "rosso":
bgColor = "bg-red-600";
accentColor = "bg-red-800";
closeHoverColor = "hover:bg-red-500";
break;
case "verde":
bgColor = "bg-green-600";
accentColor = "bg-green-800";
closeHoverColor = "hover:bg-green-500";
break;
case "indaco":
bgColor = "bg-indigo-600";
accentColor = "bg-indigo-800";
closeHoverColor = "hover:bg-indigo-500";
break;
default:
bgColor = "bg-indigo-600";
accentColor = "bg-indigo-800";
closeHoverColor = "hover:bg-indigo-500";
break;
}
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const NewBanner = () => {
const [isBannerToShow, setIsBannerToShow] = useState(false);
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
useEffect(() => {
if (bannerData.is_unskippable === false) {
const cookievalue = Cookies.get(NEW_BANNER_KEY) !== "true";
setIsBannerToShow(cookievalue);
}
}, []);
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const onClick = (e: MouseEvent<HTMLButtonElement>) => {
e.preventDefault();
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
Cookies.set(NEW_BANNER_KEY, "true", {
expires: bannerData.hide_duration || defaultHideDuration,
2025-08-28 18:27:07 +02:00
});
setIsBannerToShow(false);
};
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
if (!isBannerToShow && bannerData.is_unskippable === false) {
return null;
}
return (
<div className={cn("bg-indigo-600", bgColor)}>
<div className="mx-auto flex max-w-screen-xl items-start justify-between px-4 py-3 text-white sm:items-center md:px-8">
<div className="flex flex-1 items-start justify-center gap-x-4 sm:items-center">
<div
className={cn(
2025-10-10 16:18:43 +02:00
"flex flex-none items-center justify-center rounded-full bg-indigo-800 p-1.5 px-4 font-medium text-sm",
2025-08-28 18:27:07 +02:00
accentColor,
)}
>
{bannerData.titolo}{" "}
</div>
<p className="flex gap-2 p-2 font-medium">
<span> {bannerData.testo}</span>
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
{bannerData.has_cta &&
bannerData.cta_href &&
bannerData.cta_icon && (
<Link
className="inline-flex items-center gap-x-1 font-semibold underline duration-150 hover:text-indigo-100"
2025-08-29 16:18:32 +02:00
href={bannerData.cta_href}
2025-08-28 18:27:07 +02:00
>
{bannerData.cta_text}
<IconMatrix
className="size-4"
2025-08-29 16:18:32 +02:00
type={bannerData.cta_icon as IconType}
2025-08-28 18:27:07 +02:00
/>
</Link>
)}
</p>
</div>
{bannerData.is_unskippable === false && (
<button
className={cn(
"rounded-lg p-2 ring-offset-2 duration-150 hover:bg-indigo-500 focus:ring",
closeHoverColor,
)}
onClick={onClick}
2025-08-29 16:18:32 +02:00
type="button"
2025-08-28 18:27:07 +02:00
>
<X className="size-5" />
</button>
)}
</div>
</div>
);
};
return <NewBanner />;
2025-08-04 17:45:44 +02:00
};