PluginProbe
Extendify / trunk
Extendify vtrunk
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 trunk, 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