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 / hooks / useMcpAdapterInstall.js
presto-player / src / admin / dashboard / hooks Last commit date
test 2 months ago useAbilities.js 1 week ago useCompleteOnboarding.js 2 months ago useDateRangePicker.js 3 months ago useEmail.ts 3 months ago useEngagementChartData.js 3 months ago useLicenseSettings.js 3 months ago useLink.js 3 months ago useMcpAdapterInstall.js 1 week ago useMediaDetail.js 3 months ago useMediaLibrary.js 3 months ago useMediaList.ts 3 months ago usePerformanceSettings.js 3 months ago useRegisterActivePage.js 3 months ago useSettingOption.js 1 week ago useSimpleSettingsPage.js 1 week ago useTopPerforming.js 3 months ago useTopVideosPaginated.js 3 months ago useUpgradeCTA.js 3 months ago useUserDetail.js 3 months ago
useMcpAdapterInstall.js
135 lines
1 import { __ } from '@wordpress/i18n';
2 import apiFetch from '@wordpress/api-fetch';
3 import { useCallback, useEffect, useRef, useState } from 'react';
4 import { toast } from '@bsf/force-ui';
5
6 const ADAPTER_SLUG = 'mcp-adapter';
7
8 const deriveStatus = ( { installed, active } ) => {
9 if ( active ) {
10 return 'active';
11 }
12 if ( installed ) {
13 return 'inactive';
14 }
15 return 'not-installed';
16 };
17
18 /**
19 * Drives the MCP Adapter install/activate lifecycle for the AI Access page.
20 *
21 * Seeds from the page-load status and keeps it fresh by re-reading the
22 * plugin-status endpoint after a successful activate — no full page reload.
23 * On failure it surfaces a toast so the user can fall back to a manual download.
24 *
25 * @param {string} initialStatus Status from the page-load global.
26 * @return {{status: string, busy: boolean, install: Function, activate: Function}} Lifecycle state and actions.
27 */
28 const useMcpAdapterInstall = ( initialStatus ) => {
29 const [ status, setStatus ] = useState( initialStatus || 'not-installed' );
30 const [ busy, setBusy ] = useState( false );
31 const mountedRef = useRef( true );
32 const busyRef = useRef( false );
33
34 useEffect( () => {
35 mountedRef.current = true;
36 return () => {
37 mountedRef.current = false;
38 };
39 }, [] );
40
41 const refreshStatus = useCallback( async () => {
42 // Never let a status re-read failure bubble up: callers run this after a
43 // successful install/activate, so a failed GET must not masquerade as an
44 // install/activate error or escape as an unhandled rejection.
45 try {
46 const response = await apiFetch( {
47 path: `/presto-player/v1/plugin-status/${ ADAPTER_SLUG }`,
48 method: 'GET',
49 } );
50 if ( mountedRef.current ) {
51 setStatus( deriveStatus( response || {} ) );
52 }
53 } catch {
54 // Leave the last known status in place.
55 }
56 }, [] );
57
58 const activate = useCallback( async () => {
59 if ( busyRef.current ) {
60 return;
61 }
62 busyRef.current = true;
63 setBusy( true );
64 try {
65 await apiFetch( {
66 path: '/presto-player/v1/activate-plugin',
67 method: 'POST',
68 data: { plugin_slug: ADAPTER_SLUG },
69 } );
70 await refreshStatus();
71 } catch {
72 toast.error(
73 __( 'Could not activate the MCP Adapter plugin.', 'presto-player' ),
74 { autoDismiss: 5000 }
75 );
76 } finally {
77 busyRef.current = false;
78 if ( mountedRef.current ) {
79 setBusy( false );
80 }
81 }
82 }, [ refreshStatus ] );
83
84 const install = useCallback( async () => {
85 if ( busyRef.current ) {
86 return;
87 }
88 busyRef.current = true;
89 setBusy( true );
90 try {
91 await apiFetch( {
92 path: '/presto-player/v1/install-plugin',
93 method: 'POST',
94 data: { plugin: ADAPTER_SLUG },
95 } );
96 } catch {
97 toast.error(
98 __( 'Could not install the MCP Adapter plugin.', 'presto-player' ),
99 { autoDismiss: 5000 }
100 );
101 busyRef.current = false;
102 if ( mountedRef.current ) {
103 setBusy( false );
104 }
105 return;
106 }
107 try {
108 await apiFetch( {
109 path: '/presto-player/v1/activate-plugin',
110 method: 'POST',
111 data: { plugin_slug: ADAPTER_SLUG },
112 } );
113 await refreshStatus();
114 } catch {
115 toast.error(
116 __(
117 'Installed the MCP Adapter, but activation failed.',
118 'presto-player'
119 ),
120 { autoDismiss: 5000 }
121 );
122 await refreshStatus();
123 } finally {
124 busyRef.current = false;
125 if ( mountedRef.current ) {
126 setBusy( false );
127 }
128 }
129 }, [ refreshStatus ] );
130
131 return { status, busy, install, activate };
132 };
133
134 export default useMcpAdapterInstall;
135