PluginProbe
Extendify / 3.1.6
Extendify v3.1.6
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 0.5.0 0.6.0 All 127 releases
extendify / src / Notifications / Notification.jsx

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

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