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
|
|
|
|
2025-09-01 16:48:03 +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", {
|
2025-09-01 16:48:03 +02:00
|
|
|
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(
|
|
|
|
|
"flex flex-none items-center justify-center rounded-full bg-indigo-800 p-1.5 px-4 text-sm font-medium",
|
|
|
|
|
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
|
|
|
};
|