PluginProbe ʕ •ᴥ•ʔ
Presto Player / trunk
Presto Player vtrunk
4.4.1 4.4.0 4.3.3 4.3.2 4.3.1 4.3.0 4.2.4 4.2.3 4.2.2 4.2.0 4.2.1 trunk 1.10.0 1.10.1 1.10.2 1.11.0 1.12.0 1.13.0 1.14.0 1.14.1 1.5.10 1.5.11 1.5.12 1.5.13 1.5.14 1.5.15 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.10 1.6.11 1.6.12 1.6.13 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.8.0 1.8.1 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.11 2.0.12 2.0.13 2.0.14 2.0.15 2.0.16 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.2.0 2.2.1 2.2.2 2.2.3 2.2.3-beta1 2.3.0 2.3.1 2.3.2 2.3.3 3.0.0 3.0.0-beta1 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.0.8 3.1.0 3.1.1 3.1.2 3.1.3 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4
presto-player / src / admin / dashboard / components / McpPromoBanner.js
presto-player / src / admin / dashboard / components Last commit date
Emails 3 months ago EngagementChart 3 months ago MediaHub 3 months ago Onboarding 3 months ago Popup 3 months ago Skeletons 2 months ago WhatsNew 3 months ago charts 3 months ago test 3 months ago AdminMenuSync.js 3 months ago ChartEmptyState.js 3 months ago ChooseDate.js 3 months ago ColorPicker.js 3 months ago ExtendPlugins.js 3 months ago Filters.js 3 months ago Link.js 3 months ago McpPromoBanner.js 1 week ago Navbar.js 2 months ago NoFound.js 3 months ago PageHeader.js 3 months ago PluginRecommendations.js 3 months ago PostScheduleField.js 3 months ago PrestoPlayerIcon.js 3 months ago ProGateOverlay.js 3 months ago QuickAccess.js 1 week ago RankedTable.js 3 months ago StatCard.js 3 months ago TopMedia.js 3 months ago TopPerformingMedia.js 3 months ago TopUsers.js 3 months ago TruncatedTitle.js 3 months ago UpgradeNotice.js 3 months ago UpgradeToPro.js 1 week ago VideoModal.js 3 months ago WelcomeBanner.js 3 months ago
McpPromoBanner.js
105 lines
1 import { __ } from '@wordpress/i18n';
2 import { useState } from 'react';
3 import { Sparkles, X, ArrowRight } from 'lucide-react';
4 import { useLocation } from '../router/router';
5
6 const STORAGE_KEY = 'prestoPlayerMcpPromoDismissed';
7
8 // Reading the window.localStorage property itself throws a SecurityError when
9 // site data is blocked, and this banner renders above the whole dashboard — so
10 // every touch goes through here.
11 const withStorage = ( callback ) => {
12 try {
13 return callback( window.localStorage );
14 } catch ( e ) {
15 return false;
16 }
17 };
18
19 const aiSettingsUrl = () =>
20 `${ window.location.pathname }?page=presto-dashboard&tab=Settings&section=mcp`;
21
22 const EXAMPLES = [
23 __( 'Create a video from a link', 'presto-player' ),
24 __( 'Ask for your video analytics', 'presto-player' ),
25 ];
26
27 /**
28 * Promo showcasing the AI capabilities, shown only on the Dashboard home
29 * (not every tab). Hidden once dismissed and when the WordPress version can't
30 * run the Abilities API.
31 */
32 const McpPromoBanner = () => {
33 const [ dismissed, setDismissed ] = useState( () =>
34 withStorage( ( store ) => store.getItem( STORAGE_KEY ) === '1' )
35 );
36
37 const ctx = window.prestoPlayer || {};
38 const location = useLocation();
39 const tab = location.params?.tab;
40 const onDashboardHome = ! tab || tab === 'Dashboard';
41
42 // canManageOptions: the section this promotes needs it, so anyone below that
43 // would just land on a screen that can't load.
44 if (
45 dismissed ||
46 ctx.abilitiesSupported === false ||
47 ctx.canManageOptions === false ||
48 ! onDashboardHome
49 ) {
50 return null;
51 }
52
53 const dismiss = () => {
54 withStorage( ( store ) => store.setItem( STORAGE_KEY, '1' ) );
55 setDismissed( true );
56 };
57
58 return (
59 <div className="relative flex flex-col gap-3 border-b border-brand-border-300 bg-gradient-to-r from-brand-background-50 to-white px-6 py-4 md:flex-row md:items-center md:gap-6">
60 <span className="flex size-9 shrink-0 items-center justify-center rounded-lg bg-brand-primary-50">
61 <Sparkles
62 className="size-5 text-brand-primary-600"
63 aria-hidden="true"
64 />
65 </span>
66
67 <div className="flex flex-1 flex-col gap-2">
68 <p className="m-0 text-sm font-semibold text-text-primary">
69 { __( 'Explore Presto Player AI Abilities', 'presto-player' ) }
70 </p>
71 <div className="flex flex-wrap gap-2">
72 { EXAMPLES.map( ( example ) => (
73 <span
74 key={ example }
75 className="inline-flex items-center rounded-full border border-brand-border-300 bg-white px-2.5 py-1 text-xs text-text-secondary"
76 >
77 { example }
78 </span>
79 ) ) }
80 </div>
81 </div>
82
83 <div className="flex shrink-0 items-center gap-2">
84 <a
85 href={ aiSettingsUrl() }
86 className="inline-flex items-center gap-1.5 rounded-md bg-brand-primary-600 px-3 py-1.5 text-sm font-semibold text-white no-underline hover:opacity-90"
87 >
88 { __( 'Set up AI', 'presto-player' ) }
89 <ArrowRight className="size-4" aria-hidden="true" />
90 </a>
91 <button
92 type="button"
93 onClick={ dismiss }
94 aria-label={ __( 'Dismiss', 'presto-player' ) }
95 className="shrink-0 cursor-pointer border-0 bg-transparent p-1 text-icon-secondary hover:text-icon-primary"
96 >
97 <X className="size-4" aria-hidden="true" />
98 </button>
99 </div>
100 </div>
101 );
102 };
103
104 export default McpPromoBanner;
105