Skip to content

Commit ce73d20

Browse files
fix(ia): rerender subscription lists on esp provider update (#3815)
This PR fixes an issue where updating a provider does not always refresh the subscriptions lists associated with that provider until a page reload.
1 parent ed58e3f commit ce73d20

File tree

1 file changed

+58
-35
lines changed
  • src/wizards/newsletters/views/settings

1 file changed

+58
-35
lines changed

src/wizards/newsletters/views/settings/index.js

+58-35
Original file line numberDiff line numberDiff line change
@@ -36,45 +36,47 @@ import './style.scss';
3636

3737
export const Settings = ( {
3838
onUpdate,
39-
initialProvider,
4039
newslettersConfig,
4140
isOnboarding = true,
4241
authUrl = false,
43-
setInitialProvider = () => {},
42+
provider,
43+
setProvider = () => {},
4444
setAuthUrl = () => {},
4545
setLockedLists = () => {},
4646
} ) => {
4747
const [ inFlight, setInFlight ] = useState( false );
4848
const [ error, setError ] = useState( false );
4949
const [ config, updateConfig ] = hooks.useObjectState( {} );
50-
50+
// Handle provider updates.
5151
useEffect( () => {
52-
const provider = newslettersConfig?.newspack_newsletters_service_provider;
53-
if ( initialProvider && provider !== initialProvider ) {
54-
setLockedLists( true );
55-
} else {
56-
setLockedLists( false );
57-
}
58-
if ( ! initialProvider && provider ) {
59-
setInitialProvider( provider );
52+
const newProvider = newslettersConfig?.newspack_newsletters_service_provider || '';
53+
if ( provider !== newProvider ) {
54+
setError( false );
55+
setProvider( newProvider );
56+
// Don't lock lists if we are setting the initial provider and a key is already set.
57+
if ( ! provider && hasSelectedProviderKey() ) {
58+
setLockedLists( false );
59+
} else {
60+
setLockedLists( true );
61+
}
6062
}
6163
}, [ newslettersConfig?.newspack_newsletters_service_provider ] );
62-
64+
// Verify token for OAuth providers.
6365
useEffect( () => {
6466
verifyToken( newslettersConfig?.newspack_newsletters_service_provider );
6567
}, [ newslettersConfig?.newspack_newsletters_service_provider ] );
6668

67-
const verifyToken = provider => {
69+
const verifyToken = serviceProvider => {
6870
setAuthUrl( false );
69-
if ( ! provider ) {
71+
if ( ! serviceProvider ) {
7072
return;
7173
}
7274
// Constant Contact is the only provider using an OAuth strategy.
73-
if ( 'constant_contact' !== provider ) {
75+
if ( 'constant_contact' !== serviceProvider ) {
7476
return;
7577
}
7678
setInFlight( true );
77-
apiFetch( { path: `/newspack-newsletters/v1/${ provider }/verify_token` } )
79+
apiFetch( { path: `/newspack-newsletters/v1/${ serviceProvider }/verify_token` } )
7880
.then( response => {
7981
if ( ! response.valid && response.auth_url ) {
8082
setAuthUrl( response.auth_url );
@@ -109,6 +111,15 @@ export const Settings = ( {
109111
const value = configItem?.value;
110112
return configItem?.options?.find( option => option.value === value )?.name;
111113
};
114+
const hasSelectedProviderKey = () => {
115+
const selectedProvider = newslettersConfig?.newspack_newsletters_service_provider;
116+
if ( ! selectedProvider ) {
117+
return false
118+
}
119+
const regex = new RegExp( `${selectedProvider}.*key` );
120+
const configKeys = Object.keys( newslettersConfig ).filter( key => regex.test( key ) );
121+
return configKeys.some( key => !! newslettersConfig[ key ] );
122+
}
112123
const handleAuth = () => {
113124
if ( authUrl ) {
114125
const authWindow = window.open( authUrl, 'esp_oauth', 'width=500,height=600' );
@@ -127,7 +138,7 @@ export const Settings = ( {
127138
method: 'POST',
128139
data: newslettersConfig,
129140
} ).finally( () => {
130-
setInitialProvider( newslettersConfig?.newspack_newsletters_service_provider );
141+
setProvider( newslettersConfig?.newspack_newsletters_service_provider );
131142
verifyToken( newslettersConfig?.newspack_newsletters_service_provider );
132143
setLockedLists( false );
133144
setInFlight( false );
@@ -254,7 +265,7 @@ export const Settings = ( {
254265
);
255266
};
256267

257-
export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } ) => {
268+
export const SubscriptionLists = ( { lockedLists, onUpdate, provider } ) => {
258269
const [ error, setError ] = useState( false );
259270
const [ inFlight, setInFlight ] = useState( false );
260271
const [ lists, setLists ] = useState( [] );
@@ -291,7 +302,18 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
291302
newLists[ index ][ name ] = value;
292303
updateConfig( newLists );
293304
};
294-
useEffect( fetchLists, [ initialProvider ] );
305+
// Handle provider updates.
306+
useEffect(
307+
() => {
308+
setError( false );
309+
if ( provider && ! lockedLists ) {
310+
// Empty lists before fetching to prevent previous list from appearing while fetching.
311+
setLists( [] );
312+
fetchLists();
313+
}
314+
},
315+
[ provider, lockedLists ]
316+
);
295317

296318
if ( ! inFlight && ! lists?.length && ! error ) {
297319
return null;
@@ -305,6 +327,16 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
305327
);
306328
}
307329

330+
/* eslint-disable no-nested-ternary */
331+
const notification = lockedLists ?
332+
__(
333+
'Please save your ESP settings before changing your subscription lists.',
334+
'newspack-plugin'
335+
) :
336+
error ?
337+
error?.message || __( 'Something went wrong.', 'newspack-plugin' ) :
338+
null;
339+
308340
return (
309341
<ActionCard
310342
isMedium
@@ -313,16 +345,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
313345
'Manage the lists available to readers for subscription.',
314346
'newspack-plugin'
315347
) }
316-
notification={
317-
/* eslint-disable no-nested-ternary */
318-
error
319-
? error?.message || __( 'Something went wrong.', 'newspack-plugin' )
320-
: lockedLists
321-
? __(
322-
'Please save your ESP settings before changing your subscription lists.',
323-
'newspack-plugin'
324-
) : null
325-
}
348+
notification={ notification }
326349
notificationLevel={ error ? 'error' : 'warning' }
327350
hasGreyHeader
328351
actionContent={
@@ -343,7 +366,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
343366
}
344367
disabled={ inFlight || lockedLists }
345368
>
346-
{ ! lockedLists &&
369+
{ ! lockedLists && ! error &&
347370
lists.map( ( list, index ) => (
348371
<ActionCard
349372
key={ index }
@@ -392,7 +415,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
392415

393416
const NewslettersSettings = () => {
394417
const [ { newslettersConfig }, updateConfiguration ] = hooks.useObjectState( {} );
395-
const [ initialProvider, setInitialProvider ] = useState( '' );
418+
const [ provider, setProvider ] = useState( '' );
396419
const [ lockedLists, setLockedLists ] = useState( false );
397420
const [ authUrl, setAuthUrl ] = useState( false );
398421

@@ -403,13 +426,13 @@ const NewslettersSettings = () => {
403426
isOnboarding={ false }
404427
onUpdate={ config => updateConfiguration( { newslettersConfig: config } ) }
405428
authUrl={ authUrl }
406-
setAuthUrl={ setAuthUrl }
407429
newslettersConfig={ newslettersConfig }
430+
provider={ provider }
431+
setProvider={ setProvider }
432+
setAuthUrl={ setAuthUrl }
408433
setLockedLists={ setLockedLists }
409-
initialProvider={ initialProvider }
410-
setInitialProvider={ setInitialProvider }
411434
/>
412-
<SubscriptionLists lockedLists={ lockedLists } initialProvider={ initialProvider } />
435+
<SubscriptionLists lockedLists={ lockedLists } provider={ provider } />
413436
</>
414437
);
415438
};

0 commit comments

Comments
 (0)