@greatapps/common 1.1.71 → 1.1.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/components/layouts/AppNavBar.mjs +0 -2
  2. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  3. package/dist/components/layouts/NotificationsPopover.mjs +24 -14
  4. package/dist/components/layouts/NotificationsPopover.mjs.map +1 -1
  5. package/dist/components/pages/notifications/Notifications.mjs +106 -0
  6. package/dist/components/pages/notifications/Notifications.mjs.map +1 -0
  7. package/dist/components/widgets/notifications/NotificationCard.mjs +53 -0
  8. package/dist/components/widgets/notifications/NotificationCard.mjs.map +1 -0
  9. package/dist/index.mjs +177 -47
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/modules/auth/actions/login.action.mjs +1 -1
  12. package/dist/modules/auth/actions/login.action.mjs.map +1 -1
  13. package/dist/modules/auth/hooks/login.hook.mjs +5 -1
  14. package/dist/modules/auth/hooks/login.hook.mjs.map +1 -1
  15. package/dist/modules/auth/hooks/useUserQuery.mjs +2 -1
  16. package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
  17. package/dist/modules/auth/services/auth.service.mjs +2 -2
  18. package/dist/modules/auth/services/auth.service.mjs.map +1 -1
  19. package/dist/modules/users/action/list-messages.action.mjs +9 -0
  20. package/dist/modules/users/action/list-messages.action.mjs.map +1 -0
  21. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs +9 -0
  22. package/dist/modules/users/action/mark-all-messages-as-read.action.mjs.map +1 -0
  23. package/dist/modules/users/action/mark-message-as-read.action.mjs +9 -0
  24. package/dist/modules/users/action/mark-message-as-read.action.mjs.map +1 -0
  25. package/dist/modules/users/hooks/messages.hook.mjs +38 -0
  26. package/dist/modules/users/hooks/messages.hook.mjs.map +1 -0
  27. package/dist/modules/users/schema/messages.schema.mjs +21 -0
  28. package/dist/modules/users/schema/messages.schema.mjs.map +1 -0
  29. package/dist/modules/users/services/messages.service.mjs +35 -0
  30. package/dist/modules/users/services/messages.service.mjs.map +1 -0
  31. package/dist/providers/auth.provider.mjs +3 -5
  32. package/dist/providers/auth.provider.mjs.map +1 -1
  33. package/dist/utils/safeServerAction.mjs +22 -0
  34. package/dist/utils/safeServerAction.mjs.map +1 -0
  35. package/package.json +1 -1
  36. package/src/components/layouts/AppNavBar.tsx +0 -4
  37. package/src/components/layouts/NotificationsPopover.tsx +27 -24
  38. package/src/components/pages/notifications/Notifications.tsx +106 -0
  39. package/src/components/widgets/notifications/NotificationCard.tsx +66 -0
  40. package/src/index.ts +267 -117
  41. package/src/modules/auth/actions/login.action.ts +1 -1
  42. package/src/modules/auth/hooks/login.hook.tsx +6 -1
  43. package/src/modules/auth/hooks/useUserQuery.ts +2 -1
  44. package/src/modules/auth/schema.ts +6 -4
  45. package/src/modules/auth/services/auth.service.ts +2 -2
  46. package/src/modules/users/action/list-messages.action.ts +10 -0
  47. package/src/modules/users/action/mark-all-messages-as-read.action.ts +8 -0
  48. package/src/modules/users/action/mark-message-as-read.action.ts +8 -0
  49. package/src/modules/users/hooks/messages.hook.ts +39 -0
  50. package/src/modules/users/schema/messages.schema.ts +47 -0
  51. package/src/modules/users/services/messages.service.ts +48 -0
  52. package/src/providers/auth.provider.tsx +6 -9
  53. package/src/utils/safeServerAction.ts +27 -0
  54. package/dist/components/layouts/NotificationItem.mjs +0 -14
  55. package/dist/components/layouts/NotificationItem.mjs.map +0 -1
  56. package/src/components/layouts/NotificationItem.tsx +0 -26
@@ -17,7 +17,6 @@ function AppNavBar({
17
17
  onExpandClick,
18
18
  menuItems = [],
19
19
  onCreditsClick,
20
- notifications,
21
20
  onNotificationsViewAll
22
21
  }) {
23
22
  const router = useRouter();
@@ -53,7 +52,6 @@ function AppNavBar({
53
52
  /* @__PURE__ */ jsx(
54
53
  NotificationsPopover,
55
54
  {
56
- notifications,
57
55
  onViewAll: onNotificationsViewAll
58
56
  }
59
57
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/AppNavBar.tsx"],"sourcesContent":["'use client';\n\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { NavBar } from './NavBar';\nimport { ProfilePopover } from './ProfilePopover';\nimport { NotificationsPopover } from './NotificationsPopover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/overlay/Tooltip';\nimport { useAccountModals } from '../../store/useAccountModals';\nimport type { ProfileMenuItem } from './ProfilePopover';\nimport type { NotificationData } from './NotificationsPopover';\n\nexport interface AppNavBarProps {\n onLogoClick?: () => void;\n logoIndicatorClassName?: string;\n appIconHref?: string;\n appIconActive?: boolean;\n /** Controls the left-side indicator bar on the app icon (opacity transition) */\n appIconIndicator?: boolean;\n showExpandButton?: boolean;\n onExpandClick?: () => void;\n menuItems?: ProfileMenuItem[];\n onCreditsClick?: () => void;\n notifications?: NotificationData[];\n onNotificationsViewAll?: () => void;\n}\n\nexport function AppNavBar({\n onLogoClick,\n logoIndicatorClassName,\n appIconHref = '/',\n appIconActive = false,\n appIconIndicator = false,\n showExpandButton = false,\n onExpandClick,\n menuItems = [],\n onCreditsClick,\n notifications,\n onNotificationsViewAll,\n}: AppNavBarProps) {\n const router = useRouter();\n const { openConfigurations } = useAccountModals();\n\n const handleLogoClick = onLogoClick ?? (() => router.push('/'));\n const handleAppIconClick = () => router.push(appIconHref);\n\n return (\n <NavBar\n onLogoClick={handleLogoClick}\n logoIndicatorClassName={logoIndicatorClassName}\n showExpandButton={showExpandButton}\n onExpandClick={onExpandClick}\n appIconSlot={\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild onClick={handleAppIconClick}>\n <div\n className={`size-10 flex items-center justify-center rounded-lg hover:bg-pages-100 cursor-pointer transition-colors duration-300 ${\n appIconActive ? 'bg-pages-300' : 'bg-pages-50'\n }`}\n >\n <Image src=\"/icons/icon-navbar.svg\" alt=\"GreatPages\" width={24} height={24} />\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"right\">GreatPages</TooltipContent>\n </Tooltip>\n <div\n className={`absolute -left-4 top-1/2 -translate-y-1/2 w-[3px] h-5 bg-pages-300 rounded-r-xl transition-opacity duration-300 ${\n appIconIndicator ? 'opacity-100' : 'opacity-0'\n }`}\n />\n </div>\n }\n >\n <NotificationsPopover\n notifications={notifications}\n onViewAll={onNotificationsViewAll}\n />\n <ProfilePopover\n onEditProfile={() => openConfigurations()}\n onCreditsClick={onCreditsClick}\n menuItems={menuItems}\n />\n </NavBar>\n );\n}\n"],"mappings":";AAsDU,SAOM,KAPN;AApDV,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B;AACrC,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,wBAAwB;AAmB1B,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB;AAAA,EACA,YAAY,CAAC;AAAA,EACb;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,mBAAmB,IAAI,iBAAiB;AAEhD,QAAM,kBAAkB,gBAAgB,MAAM,OAAO,KAAK,GAAG;AAC7D,QAAM,qBAAqB,MAAM,OAAO,KAAK,WAAW;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,aACE,qBAAC,SAAI,WAAU,YACb;AAAA,6BAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MAAC,SAAS,oBAC/B;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,wHACT,gBAAgB,iBAAiB,aACnC;AAAA,cAEA,8BAAC,SAAM,KAAI,0BAAyB,KAAI,cAAa,OAAO,IAAI,QAAQ,IAAI;AAAA;AAAA,UAC9E,GACF;AAAA,UACA,oBAAC,kBAAe,MAAK,SAAQ,wBAAU;AAAA,WACzC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,mHACT,mBAAmB,gBAAgB,WACrC;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAGF;AAAA;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA,WAAW;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,eAAe,MAAM,mBAAmB;AAAA,YACxC;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/AppNavBar.tsx"],"sourcesContent":["'use client';\n\nimport Image from 'next/image';\nimport { useRouter } from 'next/navigation';\nimport { NavBar } from './NavBar';\nimport { ProfilePopover } from './ProfilePopover';\nimport { NotificationsPopover } from './NotificationsPopover';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../ui/overlay/Tooltip';\nimport { useAccountModals } from '../../store/useAccountModals';\nimport type { ProfileMenuItem } from './ProfilePopover';\n\nexport interface AppNavBarProps {\n onLogoClick?: () => void;\n logoIndicatorClassName?: string;\n appIconHref?: string;\n appIconActive?: boolean;\n /** Controls the left-side indicator bar on the app icon (opacity transition) */\n appIconIndicator?: boolean;\n showExpandButton?: boolean;\n onExpandClick?: () => void;\n menuItems?: ProfileMenuItem[];\n onCreditsClick?: () => void;\n onNotificationsViewAll?: () => void;\n}\n\nexport function AppNavBar({\n onLogoClick,\n logoIndicatorClassName,\n appIconHref = '/',\n appIconActive = false,\n appIconIndicator = false,\n showExpandButton = false,\n onExpandClick,\n menuItems = [],\n onCreditsClick,\n onNotificationsViewAll,\n}: AppNavBarProps) {\n const router = useRouter();\n const { openConfigurations } = useAccountModals();\n\n const handleLogoClick = onLogoClick ?? (() => router.push('/'));\n const handleAppIconClick = () => router.push(appIconHref);\n\n return (\n <NavBar\n onLogoClick={handleLogoClick}\n logoIndicatorClassName={logoIndicatorClassName}\n showExpandButton={showExpandButton}\n onExpandClick={onExpandClick}\n appIconSlot={\n <div className=\"relative\">\n <Tooltip>\n <TooltipTrigger asChild onClick={handleAppIconClick}>\n <div\n className={`size-10 flex items-center justify-center rounded-lg hover:bg-pages-100 cursor-pointer transition-colors duration-300 ${\n appIconActive ? 'bg-pages-300' : 'bg-pages-50'\n }`}\n >\n <Image src=\"/icons/icon-navbar.svg\" alt=\"GreatPages\" width={24} height={24} />\n </div>\n </TooltipTrigger>\n <TooltipContent side=\"right\">GreatPages</TooltipContent>\n </Tooltip>\n <div\n className={`absolute -left-4 top-1/2 -translate-y-1/2 w-[3px] h-5 bg-pages-300 rounded-r-xl transition-opacity duration-300 ${\n appIconIndicator ? 'opacity-100' : 'opacity-0'\n }`}\n />\n </div>\n }\n >\n <NotificationsPopover\n onViewAll={onNotificationsViewAll}\n />\n <ProfilePopover\n onEditProfile={() => openConfigurations()}\n onCreditsClick={onCreditsClick}\n menuItems={menuItems}\n />\n </NavBar>\n );\n}\n"],"mappings":";AAmDU,SAOM,KAPN;AAjDV,OAAO,WAAW;AAClB,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B;AACrC,SAAS,SAAS,gBAAgB,sBAAsB;AACxD,SAAS,wBAAwB;AAiB1B,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,mBAAmB;AAAA,EACnB,mBAAmB;AAAA,EACnB;AAAA,EACA,YAAY,CAAC;AAAA,EACb;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,mBAAmB,IAAI,iBAAiB;AAEhD,QAAM,kBAAkB,gBAAgB,MAAM,OAAO,KAAK,GAAG;AAC7D,QAAM,qBAAqB,MAAM,OAAO,KAAK,WAAW;AAExD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAa;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA,aACE,qBAAC,SAAI,WAAU,YACb;AAAA,6BAAC,WACC;AAAA,8BAAC,kBAAe,SAAO,MAAC,SAAS,oBAC/B;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,wHACT,gBAAgB,iBAAiB,aACnC;AAAA,cAEA,8BAAC,SAAM,KAAI,0BAAyB,KAAI,cAAa,OAAO,IAAI,QAAQ,IAAI;AAAA;AAAA,UAC9E,GACF;AAAA,UACA,oBAAC,kBAAe,MAAK,SAAQ,wBAAU;AAAA,WACzC;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW,mHACT,mBAAmB,gBAAgB,WACrC;AAAA;AAAA,QACF;AAAA,SACF;AAAA,MAGF;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA;AAAA,QACb;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,eAAe,MAAM,mBAAmB;AAAA,YACxC;AAAA,YACA;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -5,10 +5,12 @@ import { Bell } from "lucide-react";
5
5
  import * as PopoverPrimitive from "@radix-ui/react-popover";
6
6
  import { Popover } from "../ui/overlay/Popover";
7
7
  import { Button } from "../ui/buttons/Button";
8
- import { NotificationItem } from "./NotificationItem";
8
+ import NotificationCard from "../widgets/notifications/NotificationCard";
9
9
  import { cn } from "../../infra/utils/clsx";
10
+ import { useMessages, useMarkAllMessagesAsRead } from "../../modules/users/hooks/messages.hook";
11
+ import { formatDistanceToNow } from "date-fns";
12
+ import { ptBR } from "date-fns/locale";
10
13
  function NotificationsPopover({
11
- notifications = [],
12
14
  onViewAll,
13
15
  side,
14
16
  align,
@@ -16,10 +18,15 @@ function NotificationsPopover({
16
18
  badgeClassName = "bg-pages-400"
17
19
  }) {
18
20
  const [open, setOpen] = useState(false);
19
- const [hasNewNotifications, setHasNewNotifications] = useState(true);
21
+ const { data: messagesData } = useMessages({ limit: 5 });
22
+ const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();
23
+ const messages = messagesData?.data ?? [];
24
+ const totalUnread = messagesData?.totalUnread ?? 0;
20
25
  const handleOpenChange = (isOpen) => {
21
26
  setOpen(isOpen);
22
- if (isOpen) setHasNewNotifications(false);
27
+ if (isOpen && totalUnread > 0) {
28
+ markAllAsRead();
29
+ }
23
30
  };
24
31
  return /* @__PURE__ */ jsxs(Popover, { open, onOpenChange: handleOpenChange, children: [
25
32
  /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { className: "cursor-pointer", children: /* @__PURE__ */ jsxs(
@@ -28,7 +35,7 @@ function NotificationsPopover({
28
35
  className: `relative rounded-full p-2.5 ${open ? "bg-gray-100" : "hover:bg-gray-100"}`,
29
36
  children: [
30
37
  /* @__PURE__ */ jsx(Bell, { size: 20, className: "text-gray-500" }),
31
- hasNewNotifications && /* @__PURE__ */ jsx(
38
+ totalUnread > 0 && /* @__PURE__ */ jsx(
32
39
  "span",
33
40
  {
34
41
  className: cn(
@@ -44,7 +51,7 @@ function NotificationsPopover({
44
51
  PopoverPrimitive.Content,
45
52
  {
46
53
  className: cn(
47
- "absolute bottom-2 left-[26px] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
54
+ "absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200",
48
55
  contentClassName
49
56
  ),
50
57
  side,
@@ -52,16 +59,19 @@ function NotificationsPopover({
52
59
  sideOffset: 8,
53
60
  children: [
54
61
  /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-gray-950 px-4", children: "\xDAltimas notifica\xE7\xF5es" }),
55
- notifications.length > 0 ? notifications.map((notification, index) => /* @__PURE__ */ jsx(
56
- NotificationItem,
62
+ messages.length > 0 ? messages.map((message, index) => /* @__PURE__ */ jsx(
63
+ NotificationCard,
57
64
  {
58
- icon: notification.icon,
59
- iconBgColor: notification.iconBgColor,
60
- title: notification.title,
61
- time: notification.time,
62
- showBorder: index < notifications.length - 1
65
+ icon: /* @__PURE__ */ jsx(Bell, { size: 16 }),
66
+ iconBgColor: "bg-gray-100",
67
+ title: message.subject,
68
+ time: formatDistanceToNow(new Date(message.datetime_add), {
69
+ addSuffix: true,
70
+ locale: ptBR
71
+ }),
72
+ showBorder: index < messages.length - 1
63
73
  },
64
- index
74
+ message.id
65
75
  )) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]", children: [
66
76
  /* @__PURE__ */ jsx("div", { className: "bg-gray-50 rounded-md p-2.5", children: /* @__PURE__ */ jsx(Bell, { size: 20, color: "var(--color-gray-950)" }) }),
67
77
  /* @__PURE__ */ jsx("span", { className: "paragraph-small-medium text-gray-950", children: "Sem notifica\xE7\xF5es por enquanto" })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/layouts/NotificationsPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { ReactNode, useState } from \"react\";\r\nimport { Bell } from \"lucide-react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport { NotificationItem } from \"./NotificationItem\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\n\r\nexport interface NotificationData {\r\n icon: ReactNode;\r\n iconBgColor: string;\r\n title: string;\r\n time: string;\r\n}\r\n\r\nexport interface NotificationsPopoverProps {\r\n notifications?: NotificationData[];\r\n onViewAll?: () => void;\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n badgeClassName?: string;\r\n}\r\n\r\nfunction NotificationsPopover({\r\n notifications = [],\r\n onViewAll,\r\n side,\r\n align,\r\n contentClassName,\r\n badgeClassName = \"bg-pages-400\",\r\n}: NotificationsPopoverProps) {\r\n const [open, setOpen] = useState(false);\r\n const [hasNewNotifications, setHasNewNotifications] = useState(true);\r\n\r\n const handleOpenChange = (isOpen: boolean) => {\r\n setOpen(isOpen);\r\n if (isOpen) setHasNewNotifications(false);\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n <div\r\n className={`relative rounded-full p-2.5 ${open ? \"bg-gray-100\" : \"hover:bg-gray-100\"}`}\r\n >\r\n <Bell size={20} className=\"text-gray-500\" />\r\n {hasNewNotifications && (\r\n <span\r\n className={cn(\r\n \"absolute top-2 right-2 size-2.5 rounded-full\",\r\n badgeClassName,\r\n )}\r\n />\r\n )}\r\n </div>\r\n </PopoverPrimitive.Trigger>\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"absolute bottom-2 left-[26px] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <span className=\"paragraph-small-semibold text-gray-950 px-4\">\r\n Últimas notificações\r\n </span>\r\n\r\n {notifications.length > 0 ? (\r\n notifications.map((notification, index) => (\r\n <NotificationItem\r\n key={index}\r\n icon={notification.icon}\r\n iconBgColor={notification.iconBgColor}\r\n title={notification.title}\r\n time={notification.time}\r\n showBorder={index < notifications.length - 1}\r\n />\r\n ))\r\n ) : (\r\n <div className=\"flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]\">\r\n <div className=\"bg-gray-50 rounded-md p-2.5\">\r\n <Bell size={20} color=\"var(--color-gray-950)\" />\r\n </div>\r\n <span className=\"paragraph-small-medium text-gray-950\">\r\n Sem notificações por enquanto\r\n </span>\r\n </div>\r\n )}\r\n\r\n {onViewAll && (\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8! mt-2 mb-4 mx-4 paragraph-small-semibold\"\r\n onClick={onViewAll}\r\n >\r\n Todas as notificações\r\n </Button>\r\n )}\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport { NotificationsPopover };\r\n"],"mappings":";AA6CQ,SAGE,KAHF;AA3CR,SAAoB,gBAAgB;AACpC,SAAS,YAAY;AACrB,YAAY,sBAAsB;AAClC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,SAAS,wBAAwB;AACjC,SAAS,UAAU;AAkBnB,SAAS,qBAAqB;AAAA,EAC5B,gBAAgB,CAAC;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAA8B;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,SAAS,IAAI;AAEnE,QAAM,mBAAmB,CAAC,WAAoB;AAC5C,YAAQ,MAAM;AACd,QAAI,OAAQ,wBAAuB,KAAK;AAAA,EAC1C;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,wBAAC,iBAAiB,SAAjB,EAAyB,WAAU,kBAClC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+BAA+B,OAAO,gBAAgB,mBAAmB;AAAA,QAEpF;AAAA,8BAAC,QAAK,MAAM,IAAI,WAAU,iBAAgB;AAAA,UACzC,uBACC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,oBAAC,iBAAiB,QAAjB,EACC;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QAEZ;AAAA,8BAAC,UAAK,WAAU,+CAA8C,2CAE9D;AAAA,UAEC,cAAc,SAAS,IACtB,cAAc,IAAI,CAAC,cAAc,UAC/B;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,aAAa;AAAA,cACnB,aAAa,aAAa;AAAA,cAC1B,OAAO,aAAa;AAAA,cACpB,MAAM,aAAa;AAAA,cACnB,YAAY,QAAQ,cAAc,SAAS;AAAA;AAAA,YALtC;AAAA,UAMP,CACD,IAED,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,SAAI,WAAU,+BACb,8BAAC,QAAK,MAAM,IAAI,OAAM,yBAAwB,GAChD;AAAA,YACA,oBAAC,UAAK,WAAU,wCAAuC,iDAEvD;AAAA,aACF;AAAA,UAGD,aACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;","names":[]}
1
+ {"version":3,"sources":["../../../src/components/layouts/NotificationsPopover.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport { useState } from \"react\";\r\nimport { Bell } from \"lucide-react\";\r\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\r\nimport { Popover } from \"../ui/overlay/Popover\";\r\nimport { Button } from \"../ui/buttons/Button\";\r\nimport NotificationCard from \"../widgets/notifications/NotificationCard\";\r\nimport { cn } from \"../../infra/utils/clsx\";\r\nimport { useMessages, useMarkAllMessagesAsRead } from \"../../modules/users/hooks/messages.hook\";\r\nimport { formatDistanceToNow } from \"date-fns\";\r\nimport { ptBR } from \"date-fns/locale\";\r\n\r\nexport interface NotificationsPopoverProps {\r\n onViewAll?: () => void;\r\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\r\n align?: \"start\" | \"center\" | \"end\";\r\n contentClassName?: string;\r\n badgeClassName?: string;\r\n}\r\n\r\nfunction NotificationsPopover({\r\n onViewAll,\r\n side,\r\n align,\r\n contentClassName,\r\n badgeClassName = \"bg-pages-400\",\r\n}: NotificationsPopoverProps) {\r\n const [open, setOpen] = useState(false);\r\n const { data: messagesData } = useMessages({ limit: 5 });\r\n const { mutate: markAllAsRead } = useMarkAllMessagesAsRead();\r\n\r\n const messages = messagesData?.data ?? [];\r\n const totalUnread = messagesData?.totalUnread ?? 0;\r\n\r\n const handleOpenChange = (isOpen: boolean) => {\r\n setOpen(isOpen);\r\n if (isOpen && totalUnread > 0) {\r\n markAllAsRead();\r\n }\r\n };\r\n\r\n return (\r\n <Popover open={open} onOpenChange={handleOpenChange}>\r\n <PopoverPrimitive.Trigger className=\"cursor-pointer\">\r\n <div\r\n className={`relative rounded-full p-2.5 ${open ? \"bg-gray-100\" : \"hover:bg-gray-100\"}`}\r\n >\r\n <Bell size={20} className=\"text-gray-500\" />\r\n {totalUnread > 0 && (\r\n <span\r\n className={cn(\r\n \"absolute top-2 right-2 size-2.5 rounded-full\",\r\n badgeClassName,\r\n )}\r\n />\r\n )}\r\n </div>\r\n </PopoverPrimitive.Trigger>\r\n <PopoverPrimitive.Portal>\r\n <PopoverPrimitive.Content\r\n className={cn(\r\n \"absolute bottom-2 left-[26px] z-[9999] w-[308px] p-0 pt-4 bg-white rounded-2xl shadow-md border border-gray-200\",\r\n contentClassName,\r\n )}\r\n side={side}\r\n align={align}\r\n sideOffset={8}\r\n >\r\n <span className=\"paragraph-small-semibold text-gray-950 px-4\">\r\n Últimas notificações\r\n </span>\r\n\r\n {messages.length > 0 ? (\r\n messages.map((message, index) => (\r\n <NotificationCard\r\n key={message.id}\r\n icon={<Bell size={16} />}\r\n iconBgColor=\"bg-gray-100\"\r\n title={message.subject}\r\n time={formatDistanceToNow(new Date(message.datetime_add), {\r\n addSuffix: true,\r\n locale: ptBR,\r\n })}\r\n showBorder={index < messages.length - 1}\r\n />\r\n ))\r\n ) : (\r\n <div className=\"flex flex-col items-center gap-4 pt-[41.5px] pb-[33.5px]\">\r\n <div className=\"bg-gray-50 rounded-md p-2.5\">\r\n <Bell size={20} color=\"var(--color-gray-950)\" />\r\n </div>\r\n <span className=\"paragraph-small-medium text-gray-950\">\r\n Sem notificações por enquanto\r\n </span>\r\n </div>\r\n )}\r\n\r\n {onViewAll && (\r\n <Button\r\n variant=\"secondary\"\r\n className=\"h-8! mt-2 mb-4 mx-4 paragraph-small-semibold\"\r\n onClick={onViewAll}\r\n >\r\n Todas as notificações\r\n </Button>\r\n )}\r\n </PopoverPrimitive.Content>\r\n </PopoverPrimitive.Portal>\r\n </Popover>\r\n );\r\n}\r\n\r\nexport { NotificationsPopover };\r\n"],"mappings":";AA6CQ,SAGE,KAHF;AA3CR,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,YAAY,sBAAsB;AAClC,SAAS,eAAe;AACxB,SAAS,cAAc;AACvB,OAAO,sBAAsB;AAC7B,SAAS,UAAU;AACnB,SAAS,aAAa,gCAAgC;AACtD,SAAS,2BAA2B;AACpC,SAAS,YAAY;AAUrB,SAAS,qBAAqB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAA8B;AAC5B,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,EAAE,MAAM,aAAa,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC;AACvD,QAAM,EAAE,QAAQ,cAAc,IAAI,yBAAyB;AAE3D,QAAM,WAAW,cAAc,QAAQ,CAAC;AACxC,QAAM,cAAc,cAAc,eAAe;AAEjD,QAAM,mBAAmB,CAAC,WAAoB;AAC5C,YAAQ,MAAM;AACd,QAAI,UAAU,cAAc,GAAG;AAC7B,oBAAc;AAAA,IAChB;AAAA,EACF;AAEA,SACE,qBAAC,WAAQ,MAAY,cAAc,kBACjC;AAAA,wBAAC,iBAAiB,SAAjB,EAAyB,WAAU,kBAClC;AAAA,MAAC;AAAA;AAAA,QACC,WAAW,+BAA+B,OAAO,gBAAgB,mBAAmB;AAAA,QAEpF;AAAA,8BAAC,QAAK,MAAM,IAAI,WAAU,iBAAgB;AAAA,UACzC,cAAc,KACb;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,IACA,oBAAC,iBAAiB,QAAjB,EACC;AAAA,MAAC,iBAAiB;AAAA,MAAjB;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,QACA;AAAA,QACA;AAAA,QACA,YAAY;AAAA,QAEZ;AAAA,8BAAC,UAAK,WAAU,+CAA8C,2CAE9D;AAAA,UAEC,SAAS,SAAS,IACjB,SAAS,IAAI,CAAC,SAAS,UACrB;AAAA,YAAC;AAAA;AAAA,cAEC,MAAM,oBAAC,QAAK,MAAM,IAAI;AAAA,cACtB,aAAY;AAAA,cACZ,OAAO,QAAQ;AAAA,cACf,MAAM,oBAAoB,IAAI,KAAK,QAAQ,YAAY,GAAG;AAAA,gBACxD,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV,CAAC;AAAA,cACD,YAAY,QAAQ,SAAS,SAAS;AAAA;AAAA,YARjC,QAAQ;AAAA,UASf,CACD,IAED,qBAAC,SAAI,WAAU,4DACb;AAAA,gCAAC,SAAI,WAAU,+BACb,8BAAC,QAAK,MAAM,IAAI,OAAM,yBAAwB,GAChD;AAAA,YACA,oBAAC,UAAK,WAAU,wCAAuC,iDAEvD;AAAA,aACF;AAAA,UAGD,aACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,SAAS;AAAA,cACV;AAAA;AAAA,UAED;AAAA;AAAA;AAAA,IAEJ,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,106 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Bell, Check } from "lucide-react";
3
+ import { Button } from "../../ui/buttons/Button";
4
+ import {
5
+ Tabs,
6
+ TabsContent,
7
+ TabsList,
8
+ TabsTrigger
9
+ } from "../../ui/data-display/Tabs";
10
+ import { useMessages } from "../../../modules/users/hooks/messages.hook";
11
+ import NotificationCard from "../../widgets/notifications/NotificationCard";
12
+ import { formatDistanceToNow } from "date-fns";
13
+ import { ptBR } from "date-fns/locale";
14
+ function Notifications() {
15
+ const { data: unreadedNotifications } = useMessages({
16
+ page: 1,
17
+ limit: 10,
18
+ status: 1,
19
+ type: "notification",
20
+ order: "desc"
21
+ });
22
+ const { data: allNotifications } = useMessages({
23
+ page: 1,
24
+ limit: 10,
25
+ type: "notification",
26
+ order: "desc"
27
+ });
28
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6 lg:gap-10 px-4 py-6 lg:px-20 lg:py-14", children: [
29
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-4", children: [
30
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
31
+ /* @__PURE__ */ jsx("h1", { className: "paragraph-xlarge-semibold lg:title-large-semibold text-gray-950", children: "Notifica\xE7\xF5es" }),
32
+ /* @__PURE__ */ jsx("p", { className: "paragraph-medium-regular text-gray-600 hidden lg:block", children: "Tenha controle total sobre p\xE1ginas, experi\xEAncias e convers\xF5es." })
33
+ ] }),
34
+ /* @__PURE__ */ jsxs(Button, { variant: "secondary", className: "h-10! lg:h-12! shrink-0", children: [
35
+ /* @__PURE__ */ jsx(Check, { size: 20 }),
36
+ /* @__PURE__ */ jsx("span", { className: "lg:block hidden", children: "Marcar todos como lidos" }),
37
+ /* @__PURE__ */ jsx("span", { className: "lg:hidden", children: "Marcar como lidos" })
38
+ ] })
39
+ ] }),
40
+ /* @__PURE__ */ jsxs(
41
+ Tabs,
42
+ {
43
+ defaultValue: "all",
44
+ className: "flex flex-col w-full bg-transparent gap-6 lg:gap-8",
45
+ children: [
46
+ /* @__PURE__ */ jsxs(TabsList, { className: "h-auto pb-0 bg-transparent", children: [
47
+ /* @__PURE__ */ jsxs(TabsTrigger, { className: "gap-2", value: "all", children: [
48
+ "Todas as notifica\xE7\xF5es",
49
+ " ",
50
+ /* @__PURE__ */ jsxs("span", { className: "text-gray-500", children: [
51
+ "(",
52
+ allNotifications?.data.length,
53
+ ")"
54
+ ] })
55
+ ] }),
56
+ /* @__PURE__ */ jsxs(TabsTrigger, { className: "gap-2", value: "unreads", children: [
57
+ "N\xE3o lidas",
58
+ " ",
59
+ /* @__PURE__ */ jsxs("span", { className: "text-gray-500", children: [
60
+ "(",
61
+ unreadedNotifications?.data.length,
62
+ ")"
63
+ ] })
64
+ ] })
65
+ ] }),
66
+ /* @__PURE__ */ jsx(TabsContent, { value: "all", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col border border-gray-200 rounded-lg w-full bg-white", children: allNotifications?.data.map((notification, index) => /* @__PURE__ */ jsx(
67
+ NotificationCard,
68
+ {
69
+ icon: /* @__PURE__ */ jsx(Bell, { size: 20, className: "text-pages-600" }),
70
+ iconBgColor: "bg-pages-100",
71
+ title: notification.subject,
72
+ description: notification.message,
73
+ time: formatDistanceToNow(new Date(notification.datetime_add), {
74
+ addSuffix: true,
75
+ locale: ptBR
76
+ }),
77
+ isUnread: notification.status === 1,
78
+ showBorder: index < allNotifications.data.length - 1
79
+ },
80
+ notification.id
81
+ )) }) }),
82
+ /* @__PURE__ */ jsx(TabsContent, { value: "unreads", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col border border-gray-200 rounded-lg w-full bg-white", children: unreadedNotifications?.data.map((notification, index) => /* @__PURE__ */ jsx(
83
+ NotificationCard,
84
+ {
85
+ icon: /* @__PURE__ */ jsx(Bell, { size: 20, className: "text-pages-600" }),
86
+ iconBgColor: "bg-pages-100",
87
+ title: notification.subject,
88
+ description: notification.message,
89
+ time: formatDistanceToNow(new Date(notification.datetime_add), {
90
+ addSuffix: true,
91
+ locale: ptBR
92
+ }),
93
+ isUnread: notification.status === 1,
94
+ showBorder: index < unreadedNotifications.data.length - 1
95
+ },
96
+ notification.id
97
+ )) }) })
98
+ ]
99
+ }
100
+ )
101
+ ] });
102
+ }
103
+ export {
104
+ Notifications
105
+ };
106
+ //# sourceMappingURL=Notifications.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/pages/notifications/Notifications.tsx"],"sourcesContent":["import { Bell, Check } from \"lucide-react\";\nimport { Button } from \"../../ui/buttons/Button\";\nimport {\n Tabs,\n TabsContent,\n TabsList,\n TabsTrigger,\n} from \"../../ui/data-display/Tabs\";\nimport { useMessages } from \"../../../modules/users/hooks/messages.hook\";\nimport NotificationCard from \"../../widgets/notifications/NotificationCard\";\nimport { formatDistanceToNow } from \"date-fns\";\nimport { ptBR } from \"date-fns/locale\";\n\nexport function Notifications() {\n const { data: unreadedNotifications } = useMessages({\n page: 1,\n limit: 10,\n status: 1,\n type: \"notification\",\n order: \"desc\",\n });\n const { data: allNotifications } = useMessages({\n page: 1,\n limit: 10,\n type: \"notification\",\n order: \"desc\",\n });\n return (\n <div className=\"flex flex-col gap-6 lg:gap-10 px-4 py-6 lg:px-20 lg:py-14\">\n <div className=\"flex items-center justify-between gap-4\">\n <div className=\"flex flex-col gap-2\">\n <h1 className=\"paragraph-xlarge-semibold lg:title-large-semibold text-gray-950\">\n Notificações\n </h1>\n <p className=\"paragraph-medium-regular text-gray-600 hidden lg:block\">\n Tenha controle total sobre páginas, experiências e conversões.\n </p>\n </div>\n <Button variant={\"secondary\"} className=\"h-10! lg:h-12! shrink-0\">\n <Check size={20} />\n <span className=\"lg:block hidden\">Marcar todos como lidos</span>\n <span className=\"lg:hidden\">Marcar como lidos</span>\n </Button>\n </div>\n <Tabs\n defaultValue=\"all\"\n className=\"flex flex-col w-full bg-transparent gap-6 lg:gap-8\"\n >\n <TabsList className=\"h-auto pb-0 bg-transparent\">\n <TabsTrigger className=\"gap-2\" value=\"all\">\n Todas as notificações{\" \"}\n <span className=\"text-gray-500\">\n ({allNotifications?.data.length})\n </span>\n </TabsTrigger>\n <TabsTrigger className=\"gap-2\" value=\"unreads\">\n Não lidas{\" \"}\n <span className=\"text-gray-500\">\n ({unreadedNotifications?.data.length})\n </span>\n </TabsTrigger>\n </TabsList>\n\n <TabsContent value=\"all\">\n <div className=\"flex flex-col border border-gray-200 rounded-lg w-full bg-white\">\n {allNotifications?.data.map((notification, index) => (\n <NotificationCard\n key={notification.id}\n icon={<Bell size={20} className=\"text-pages-600\" />}\n iconBgColor=\"bg-pages-100\"\n title={notification.subject}\n description={notification.message}\n time={formatDistanceToNow(new Date(notification.datetime_add), {\n addSuffix: true,\n locale: ptBR,\n })}\n isUnread={notification.status === 1}\n showBorder={index < allNotifications.data.length - 1}\n />\n ))}\n </div>\n </TabsContent>\n\n <TabsContent value=\"unreads\">\n <div className=\"flex flex-col border border-gray-200 rounded-lg w-full bg-white\">\n {unreadedNotifications?.data.map((notification, index) => (\n <NotificationCard\n key={notification.id}\n icon={<Bell size={20} className=\"text-pages-600\" />}\n iconBgColor=\"bg-pages-100\"\n title={notification.subject}\n description={notification.message}\n time={formatDistanceToNow(new Date(notification.datetime_add), {\n addSuffix: true,\n locale: ptBR,\n })}\n isUnread={notification.status === 1}\n showBorder={index < unreadedNotifications.data.length - 1}\n />\n ))}\n </div>\n </TabsContent>\n </Tabs>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,53 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Clock } from "lucide-react";
3
+ import { cn } from "../../../infra/utils/clsx";
4
+ function NotificationCard({
5
+ icon,
6
+ iconBgColor,
7
+ title,
8
+ description,
9
+ time,
10
+ actions,
11
+ isUnread = false,
12
+ showBorder = true,
13
+ className
14
+ }) {
15
+ return /* @__PURE__ */ jsxs(
16
+ "div",
17
+ {
18
+ className: cn(
19
+ "flex flex-col lg:flex-row items-start p-4 lg:p-6 gap-4 lg:gap-5 relative",
20
+ showBorder && "border-b border-gray-200",
21
+ className
22
+ ),
23
+ children: [
24
+ /* @__PURE__ */ jsx(
25
+ "div",
26
+ {
27
+ className: cn(
28
+ "flex items-center justify-center size-10 rounded-full shrink-0",
29
+ iconBgColor
30
+ ),
31
+ children: icon
32
+ }
33
+ ),
34
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 flex-1", children: [
35
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
36
+ /* @__PURE__ */ jsx("span", { className: "paragraph-small-semibold text-gray-950", children: title }),
37
+ description && /* @__PURE__ */ jsx("span", { className: "paragraph-small-regular text-gray-600", children: description })
38
+ ] }),
39
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1.5", children: [
40
+ /* @__PURE__ */ jsx(Clock, { size: 14, className: "text-gray-400" }),
41
+ /* @__PURE__ */ jsx("span", { className: "paragraph-xsmall-medium text-gray-600", children: time })
42
+ ] }),
43
+ actions && /* @__PURE__ */ jsx("div", { className: "flex items-center gap-2", children: actions })
44
+ ] }),
45
+ isUnread && /* @__PURE__ */ jsx("div", { className: "size-2 bg-pages-400 rounded-full shrink-0 mt-1" })
46
+ ]
47
+ }
48
+ );
49
+ }
50
+ export {
51
+ NotificationCard as default
52
+ };
53
+ //# sourceMappingURL=NotificationCard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/components/widgets/notifications/NotificationCard.tsx"],"sourcesContent":["import { Clock } from 'lucide-react';\r\nimport { ReactNode } from 'react';\r\nimport { cn } from '../../../infra/utils/clsx';\r\n\r\ntype NotificationCardProps = {\r\n icon: ReactNode;\r\n iconBgColor?: string;\r\n title: string;\r\n description?: string;\r\n time: string;\r\n actions?: ReactNode;\r\n isUnread?: boolean;\r\n showBorder?: boolean;\r\n className?: string;\r\n};\r\n\r\nexport default function NotificationCard({\r\n icon,\r\n iconBgColor,\r\n title,\r\n description,\r\n time,\r\n actions,\r\n isUnread = false,\r\n showBorder = true,\r\n className,\r\n}: NotificationCardProps) {\r\n return (\r\n <div\r\n className={cn(\r\n 'flex flex-col lg:flex-row items-start p-4 lg:p-6 gap-4 lg:gap-5 relative',\r\n showBorder && 'border-b border-gray-200',\r\n className\r\n )}\r\n >\r\n <div\r\n className={cn(\r\n 'flex items-center justify-center size-10 rounded-full shrink-0',\r\n iconBgColor\r\n )}\r\n >\r\n {icon}\r\n </div>\r\n\r\n <div className=\"flex flex-col gap-4 flex-1\">\r\n <div className=\"flex flex-col gap-1\">\r\n <span className=\"paragraph-small-semibold text-gray-950\">{title}</span>\r\n {description && (\r\n <span className=\"paragraph-small-regular text-gray-600\">{description}</span>\r\n )}\r\n </div>\r\n\r\n <div className=\"flex items-center gap-1.5\">\r\n <Clock size={14} className=\"text-gray-400\" />\r\n <span className=\"paragraph-xsmall-medium text-gray-600\">{time}</span>\r\n </div>\r\n\r\n {actions && <div className=\"flex items-center gap-2\">{actions}</div>}\r\n </div>\r\n\r\n {isUnread && <div className=\"size-2 bg-pages-400 rounded-full shrink-0 mt-1\" />}\r\n </div>\r\n );\r\n}\r\n\r\nexport type { NotificationCardProps };\r\n"],"mappings":"AAmCM,cAUE,YAVF;AAnCN,SAAS,aAAa;AAEtB,SAAS,UAAU;AAcJ,SAAR,iBAAkC;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,aAAa;AAAA,EACb;AACF,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,cAAc;AAAA,QACd;AAAA,MACF;AAAA,MAEA;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,WAAW;AAAA,cACT;AAAA,cACA;AAAA,YACF;AAAA,YAEC;AAAA;AAAA,QACH;AAAA,QAEA,qBAAC,SAAI,WAAU,8BACb;AAAA,+BAAC,SAAI,WAAU,uBACb;AAAA,gCAAC,UAAK,WAAU,0CAA0C,iBAAM;AAAA,YAC/D,eACC,oBAAC,UAAK,WAAU,yCAAyC,uBAAY;AAAA,aAEzE;AAAA,UAEA,qBAAC,SAAI,WAAU,6BACb;AAAA,gCAAC,SAAM,MAAM,IAAI,WAAU,iBAAgB;AAAA,YAC3C,oBAAC,UAAK,WAAU,yCAAyC,gBAAK;AAAA,aAChE;AAAA,UAEC,WAAW,oBAAC,SAAI,WAAU,2BAA2B,mBAAQ;AAAA,WAChE;AAAA,QAEC,YAAY,oBAAC,SAAI,WAAU,kDAAiD;AAAA;AAAA;AAAA,EAC/E;AAEJ;","names":[]}