PluginProbe
Extendify / 3.2.3
Extendify v3.2.3
3.2.3 3.2.2 3.2.1 3.2.0 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.6 3.0.5 3.0.4 trunk 0.1.0 0.10.0 0.10.1 0.10.2 0.11.0 0.11.1 0.2.0 0.3.0 0.3.1 0.4.0 All 129 releases
extendify / src / Notifications / Notification.jsx

Notification.jsx in Extendify 3.2.3, at src/Notifications/Notification.jsx

64 lines 1.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 import { siteHost } from '@shared/lib/site-host';
2 import { track } from '@shared/lib/track';
3 import { useEffect, useState } from '@wordpress/element';
4 import { resolveNotificationLink } from './notification-link';
5 import { notificationFor } from './selection';
6 import { fillsSlot, ignoresDismissal, templateFor } from './slots';
7 import { useNotificationsStore } from './state';
8
9 export const Notification = ({ slot }) => {
10 const {
11 dismissBanner,
12 isDismissedBanner,
13 recordNotificationView,
14 recordNotificationClick,
15 } = useNotificationsStore();
16 const Template = templateFor(slot);
17
18 // Frozen at mount so dismissing doesn't reveal the next notification until reload.
19 const [notification] = useState(() => notificationFor(slot));
20
21 const slug = notification?.slug;
22 const source = notification?.source;
23 const dismissible = notification?.dismissible ?? false;
24 // Only wp-admin defines pagenow; frontend slots never mount there.
25 const page =
26 window.pagenow ?? (slot.startsWith('frontend-') ? 'frontend' : '');
27 const { href, external } = resolveNotificationLink(notification, siteHost());
28 const renders =
29 Boolean(Template && notification) &&
30 fillsSlot(slot, notification, href) &&
31 (ignoresDismissal(slot) || !isDismissedBanner(slug));
32
33 useEffect(() => {
34 if (!renders || !slug) return;
35 track('notification_view', { slug, slot, page, source });
36 recordNotificationView(slug);
37 }, [renders, slug, slot, page, source, recordNotificationView]);
38
39 if (!renders) return null;
40
41 const dismiss = () => {
42 track('notification_dismiss', { slug, slot, page, source });
43 dismissBanner(slug);
44 };
45
46 const click = () => {
47 track('notification_click', { slug, slot, page, source });
48 recordNotificationClick(slug);
49 };
50
51 return (
52 <div className="extendify-shared">
53 <Template
54 notification={notification}
55 href={href}
56 external={external}
57 dismissible={dismissible}
58 onDismiss={dismiss}
59 onClick={click}
60 />
61 </div>
62 );
63 };
64