PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / content-guidelines-ai / store.js
jetpack / _inc / content-guidelines-ai Last commit date
components 1 week ago hooks 2 weeks ago lib 4 days ago constants.js 2 weeks ago store.js 1 week ago style.scss 4 days ago
store.js
113 lines
1 import apiFetch from '@wordpress/api-fetch';
2 import { createReduxStore, register } from '@wordpress/data';
3
4 // Per-user dismissed flag, persisted server-side so it follows the user across
5 // devices/browsers. The initial value is preloaded into the page by PHP (see
6 // _inc/content-guidelines-ai.php); dismissal is written via this REST route.
7 const DISMISS_PATH = '/wpcom/v2/jetpack-ai/guidelines-banner-dismissed';
8
9 const DEFAULT_STATE = {
10 loading: false,
11 loadingSections: {},
12 suggestions: {},
13 bannerDismissed: !! window.jetpackContentGuidelinesAi?.bannerDismissed,
14 };
15
16 const actions = {
17 startLoading() {
18 return { type: 'START_LOADING' };
19 },
20 stopLoading() {
21 return { type: 'STOP_LOADING' };
22 },
23 setSuggestion( slug, text ) {
24 return { type: 'SET_SUGGESTION', slug, text };
25 },
26 clearSuggestion( slug ) {
27 return { type: 'CLEAR_SUGGESTION', slug };
28 },
29 startSectionLoading( slug ) {
30 return { type: 'START_SECTION_LOADING', slug };
31 },
32 stopSectionLoading( slug ) {
33 return { type: 'STOP_SECTION_LOADING', slug };
34 },
35 dismissBanner() {
36 return ( { select, dispatch } ) => {
37 // One-way flag — skip the write if already dismissed.
38 if ( select.isBannerDismissed() ) {
39 return;
40 }
41 // Optimistic: update state now, persist per-user in the background.
42 // A failed write is ignored — re-syncs from the preloaded value on
43 // the next page load.
44 dispatch( { type: 'DISMISS_BANNER' } );
45 apiFetch( {
46 method: 'PUT',
47 path: DISMISS_PATH,
48 } ).catch( () => {} );
49 };
50 },
51 };
52
53 function reducer( state = DEFAULT_STATE, action ) {
54 switch ( action.type ) {
55 case 'START_LOADING':
56 return { ...state, loading: true };
57 case 'STOP_LOADING':
58 return { ...state, loading: false };
59 case 'SET_SUGGESTION':
60 return {
61 ...state,
62 suggestions: { ...state.suggestions, [ action.slug ]: action.text },
63 };
64 case 'CLEAR_SUGGESTION': {
65 const suggestions = { ...state.suggestions };
66 delete suggestions[ action.slug ];
67 return { ...state, suggestions };
68 }
69 case 'DISMISS_BANNER':
70 return { ...state, bannerDismissed: true };
71 case 'START_SECTION_LOADING':
72 return {
73 ...state,
74 loadingSections: { ...state.loadingSections, [ action.slug ]: true },
75 };
76 case 'STOP_SECTION_LOADING': {
77 const loadingSections = { ...state.loadingSections };
78 delete loadingSections[ action.slug ];
79 return { ...state, loadingSections };
80 }
81 default:
82 return state;
83 }
84 }
85
86 const selectors = {
87 isLoading( state ) {
88 return state.loading;
89 },
90 getSuggestion( state, slug ) {
91 return state.suggestions[ slug ] || '';
92 },
93 hasSuggestion( state, slug ) {
94 return !! state.suggestions[ slug ];
95 },
96 isSectionLoading( state, slug ) {
97 return state.loading || !! state.loadingSections[ slug ];
98 },
99 isBannerDismissed( state ) {
100 return state.bannerDismissed;
101 },
102 };
103
104 export const AI_STORE_NAME = 'jetpack/content-guidelines-ai';
105
106 const aiStore = createReduxStore( AI_STORE_NAME, {
107 reducer,
108 actions,
109 selectors,
110 } );
111
112 register( aiStore );
113