@@ -36,45 +36,47 @@ import './style.scss';
36
36
37
37
export const Settings = ( {
38
38
onUpdate,
39
- initialProvider,
40
39
newslettersConfig,
41
40
isOnboarding = true ,
42
41
authUrl = false ,
43
- setInitialProvider = ( ) => { } ,
42
+ provider,
43
+ setProvider = ( ) => { } ,
44
44
setAuthUrl = ( ) => { } ,
45
45
setLockedLists = ( ) => { } ,
46
46
} ) => {
47
47
const [ inFlight , setInFlight ] = useState ( false ) ;
48
48
const [ error , setError ] = useState ( false ) ;
49
49
const [ config , updateConfig ] = hooks . useObjectState ( { } ) ;
50
-
50
+ // Handle provider updates.
51
51
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
+ }
60
62
}
61
63
} , [ newslettersConfig ?. newspack_newsletters_service_provider ] ) ;
62
-
64
+ // Verify token for OAuth providers.
63
65
useEffect ( ( ) => {
64
66
verifyToken ( newslettersConfig ?. newspack_newsletters_service_provider ) ;
65
67
} , [ newslettersConfig ?. newspack_newsletters_service_provider ] ) ;
66
68
67
- const verifyToken = provider => {
69
+ const verifyToken = serviceProvider => {
68
70
setAuthUrl ( false ) ;
69
- if ( ! provider ) {
71
+ if ( ! serviceProvider ) {
70
72
return ;
71
73
}
72
74
// Constant Contact is the only provider using an OAuth strategy.
73
- if ( 'constant_contact' !== provider ) {
75
+ if ( 'constant_contact' !== serviceProvider ) {
74
76
return ;
75
77
}
76
78
setInFlight ( true ) ;
77
- apiFetch ( { path : `/newspack-newsletters/v1/${ provider } /verify_token` } )
79
+ apiFetch ( { path : `/newspack-newsletters/v1/${ serviceProvider } /verify_token` } )
78
80
. then ( response => {
79
81
if ( ! response . valid && response . auth_url ) {
80
82
setAuthUrl ( response . auth_url ) ;
@@ -109,6 +111,15 @@ export const Settings = ( {
109
111
const value = configItem ?. value ;
110
112
return configItem ?. options ?. find ( option => option . value === value ) ?. name ;
111
113
} ;
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
+ }
112
123
const handleAuth = ( ) => {
113
124
if ( authUrl ) {
114
125
const authWindow = window . open ( authUrl , 'esp_oauth' , 'width=500,height=600' ) ;
@@ -127,7 +138,7 @@ export const Settings = ( {
127
138
method : 'POST' ,
128
139
data : newslettersConfig ,
129
140
} ) . finally ( ( ) => {
130
- setInitialProvider ( newslettersConfig ?. newspack_newsletters_service_provider ) ;
141
+ setProvider ( newslettersConfig ?. newspack_newsletters_service_provider ) ;
131
142
verifyToken ( newslettersConfig ?. newspack_newsletters_service_provider ) ;
132
143
setLockedLists ( false ) ;
133
144
setInFlight ( false ) ;
@@ -254,7 +265,7 @@ export const Settings = ( {
254
265
) ;
255
266
} ;
256
267
257
- export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } ) => {
268
+ export const SubscriptionLists = ( { lockedLists, onUpdate, provider } ) => {
258
269
const [ error , setError ] = useState ( false ) ;
259
270
const [ inFlight , setInFlight ] = useState ( false ) ;
260
271
const [ lists , setLists ] = useState ( [ ] ) ;
@@ -291,7 +302,18 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
291
302
newLists [ index ] [ name ] = value ;
292
303
updateConfig ( newLists ) ;
293
304
} ;
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
+ ) ;
295
317
296
318
if ( ! inFlight && ! lists ?. length && ! error ) {
297
319
return null ;
@@ -305,6 +327,16 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
305
327
) ;
306
328
}
307
329
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
+
308
340
return (
309
341
< ActionCard
310
342
isMedium
@@ -313,16 +345,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
313
345
'Manage the lists available to readers for subscription.' ,
314
346
'newspack-plugin'
315
347
) }
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 }
326
349
notificationLevel = { error ? 'error' : 'warning' }
327
350
hasGreyHeader
328
351
actionContent = {
@@ -343,7 +366,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
343
366
}
344
367
disabled = { inFlight || lockedLists }
345
368
>
346
- { ! lockedLists &&
369
+ { ! lockedLists && ! error &&
347
370
lists . map ( ( list , index ) => (
348
371
< ActionCard
349
372
key = { index }
@@ -392,7 +415,7 @@ export const SubscriptionLists = ( { lockedLists, onUpdate, initialProvider } )
392
415
393
416
const NewslettersSettings = ( ) => {
394
417
const [ { newslettersConfig } , updateConfiguration ] = hooks . useObjectState ( { } ) ;
395
- const [ initialProvider , setInitialProvider ] = useState ( '' ) ;
418
+ const [ provider , setProvider ] = useState ( '' ) ;
396
419
const [ lockedLists , setLockedLists ] = useState ( false ) ;
397
420
const [ authUrl , setAuthUrl ] = useState ( false ) ;
398
421
@@ -403,13 +426,13 @@ const NewslettersSettings = () => {
403
426
isOnboarding = { false }
404
427
onUpdate = { config => updateConfiguration ( { newslettersConfig : config } ) }
405
428
authUrl = { authUrl }
406
- setAuthUrl = { setAuthUrl }
407
429
newslettersConfig = { newslettersConfig }
430
+ provider = { provider }
431
+ setProvider = { setProvider }
432
+ setAuthUrl = { setAuthUrl }
408
433
setLockedLists = { setLockedLists }
409
- initialProvider = { initialProvider }
410
- setInitialProvider = { setInitialProvider }
411
434
/>
412
- < SubscriptionLists lockedLists = { lockedLists } initialProvider = { initialProvider } />
435
+ < SubscriptionLists lockedLists = { lockedLists } provider = { provider } />
413
436
</ >
414
437
) ;
415
438
} ;
0 commit comments