PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 13.0.2
Jetpack – WP Security, Backup, Speed, & Growth v13.0.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 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 / extensions / store / wordpress-com / reducer.ts
jetpack / extensions / store / wordpress-com Last commit date
actions.ts 2 years ago constants.ts 2 years ago index.ts 2 years ago reducer.ts 2 years ago types.ts 2 years ago
reducer.ts
220 lines
1 /**
2 * Types & Constants
3 */
4 import {
5 ACTION_DECREASE_NEW_ASYNC_REQUEST_COUNTDOWN,
6 ACTION_ENQUEUE_ASYNC_REQUEST,
7 ACTION_INCREASE_AI_ASSISTANT_REQUESTS_COUNT,
8 ACTION_REQUEST_AI_ASSISTANT_FEATURE,
9 ACTION_SET_PLANS,
10 ACTION_SET_AI_ASSISTANT_FEATURE_REQUIRE_UPGRADE,
11 ACTION_STORE_AI_ASSISTANT_FEATURE,
12 ASYNC_REQUEST_COUNTDOWN_INIT_VALUE,
13 FREE_PLAN_REQUESTS_LIMIT,
14 UNLIMITED_PLAN_REQUESTS_LIMIT,
15 ACTION_SET_TIER_PLANS_ENABLED,
16 } from './constants';
17 import type { PlanStateProps } from './types';
18
19 const INITIAL_STATE: PlanStateProps = {
20 plans: [],
21 features: {
22 aiAssistant: {
23 hasFeature: true,
24 isOverLimit: false,
25 requestsCount: 0,
26 requestsLimit: FREE_PLAN_REQUESTS_LIMIT,
27 requireUpgrade: false,
28 errorMessage: '',
29 errorCode: '',
30 upgradeType: 'default',
31 currentTier: {
32 slug: 'ai-assistant-tier-free',
33 value: 0,
34 limit: 20,
35 },
36 usagePeriod: {
37 currentStart: '',
38 nextStart: '',
39 requestsCount: 0,
40 },
41 nextTier: null,
42 tierPlansEnabled: false,
43 _meta: {
44 isRequesting: false,
45 asyncRequestCountdown: ASYNC_REQUEST_COUNTDOWN_INIT_VALUE,
46 asyncRequestTimerId: 0,
47 },
48 },
49 },
50 };
51
52 export default function reducer( state = INITIAL_STATE, action ) {
53 switch ( action.type ) {
54 case ACTION_SET_PLANS:
55 return {
56 ...state,
57 plans: action.plans,
58 };
59
60 case ACTION_REQUEST_AI_ASSISTANT_FEATURE:
61 return {
62 ...state,
63 features: {
64 ...state.features,
65 aiAssistant: {
66 ...state.features.aiAssistant,
67 _meta: {
68 ...state.features.aiAssistant._meta,
69 isRequesting: true,
70 asyncRequestCountdown: ASYNC_REQUEST_COUNTDOWN_INIT_VALUE, // restore the countdown
71 asyncRequestTimerId: 0, // reset the timer id
72 },
73 },
74 },
75 };
76
77 case ACTION_STORE_AI_ASSISTANT_FEATURE: {
78 return {
79 ...state,
80 features: {
81 ...state.features,
82 aiAssistant: {
83 ...action.feature,
84 _meta: {
85 ...state.features.aiAssistant._meta,
86 isRequesting: false,
87 },
88 },
89 },
90 };
91 }
92
93 case ACTION_INCREASE_AI_ASSISTANT_REQUESTS_COUNT: {
94 // Usage Period data
95 const usagePeriod = state.features.aiAssistant.usagePeriod || { requestsCount: 0 };
96
97 // Increase requests counters
98 const requestsCount = state.features.aiAssistant.requestsCount + action.count;
99 usagePeriod.requestsCount += action.count;
100
101 // Current tier value
102 const currentTierValue = state.features.aiAssistant.currentTier?.value;
103
104 const isFreeTierPlan =
105 ( typeof currentTierValue === 'undefined' && ! state.features.aiAssistant.hasFeature ) ||
106 currentTierValue === 0;
107
108 const isUnlimitedTierPlan =
109 ( typeof currentTierValue === 'undefined' && state.features.aiAssistant.hasFeature ) ||
110 currentTierValue === 1;
111
112 // Request limit defined with the current tier limit by default.
113 let requestsLimit = state.features.aiAssistant.currentTier?.limit;
114
115 if ( isUnlimitedTierPlan ) {
116 requestsLimit = UNLIMITED_PLAN_REQUESTS_LIMIT;
117 } else if ( isFreeTierPlan ) {
118 requestsLimit = state.features.aiAssistant.requestsLimit;
119 }
120
121 const currentCount =
122 isUnlimitedTierPlan || isFreeTierPlan // @todo: update once tier data is available
123 ? requestsCount
124 : state.features.aiAssistant.usagePeriod?.requestsCount;
125
126 /**
127 * Compute the AI Assistant Feature data optimistically,
128 * based on the Jetpack_AI_Helper::get_ai_assistance_feature() helper.
129 *
130 * @see _inc/lib/class-jetpack-ai-helper.php
131 */
132 const isOverLimit = currentCount >= requestsLimit;
133
134 // highest tier holds a soft limit so requireUpgrade is false on that case (nextTier null means highest tier)
135 const requireUpgrade = isOverLimit && state.features.aiAssistant.nextTier !== null;
136
137 return {
138 ...state,
139 features: {
140 ...state.features,
141 aiAssistant: {
142 ...state.features.aiAssistant,
143 isOverLimit,
144 requestsCount,
145 requireUpgrade,
146 usagePeriod: { ...usagePeriod },
147 },
148 },
149 };
150 }
151
152 case ACTION_DECREASE_NEW_ASYNC_REQUEST_COUNTDOWN: {
153 return {
154 ...state,
155 features: {
156 ...state.features,
157 aiAssistant: {
158 ...state.features.aiAssistant,
159 _meta: {
160 ...state.features.aiAssistant._meta,
161 asyncRequestCountdown: state.features.aiAssistant._meta.asyncRequestCountdown - 1,
162 },
163 },
164 },
165 };
166 }
167
168 case ACTION_ENQUEUE_ASYNC_REQUEST: {
169 return {
170 ...state,
171 features: {
172 ...state.features,
173 aiAssistant: {
174 ...state.features.aiAssistant,
175 _meta: {
176 ...state.features.aiAssistant._meta,
177 asyncRequestTimerId: action.timerId,
178 },
179 },
180 },
181 };
182 }
183
184 case ACTION_SET_AI_ASSISTANT_FEATURE_REQUIRE_UPGRADE: {
185 /*
186 * If we require an upgrade, we are also over the limit;
187 * The opposite is not true, we can be over the limit without
188 * requiring an upgrade, for example when we are on the highest tier.
189 * In this case, we don't want to set isOverLimit to false.
190 */
191 return {
192 ...state,
193 features: {
194 ...state.features,
195 aiAssistant: {
196 ...state.features.aiAssistant,
197 requireUpgrade: action.requireUpgrade,
198 ...( action.requireUpgrade ? { isOverLimit: true } : {} ),
199 },
200 },
201 };
202 }
203
204 case ACTION_SET_TIER_PLANS_ENABLED: {
205 return {
206 ...state,
207 features: {
208 ...state.features,
209 aiAssistant: {
210 ...state.features.aiAssistant,
211 tierPlansEnabled: action.tierPlansEnabled,
212 },
213 },
214 };
215 }
216 }
217
218 return state;
219 }
220