File tree Expand file tree Collapse file tree
Application/DevLogPresentation Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -17,6 +17,7 @@ struct AccountFeature {
1717 var currentProvider : AuthProvider ?
1818 var connectedProviders : [ AuthProvider ] = [ ]
1919 var disconnectedProviders : [ AuthProvider ] = [ ]
20+ var activeLoadingProvider : AuthProvider ?
2021 var loading = LoadingFeature . State ( )
2122
2223 var isLoading : Bool {
@@ -56,8 +57,12 @@ struct AccountFeature {
5657 case . onAppear:
5758 return fetchProvidersEffect ( )
5859 case . linkWithProvider( let provider) :
60+ guard !state. isLoading else { return . none }
61+ state. activeLoadingProvider = provider
5962 return linkProviderEffect ( provider)
6063 case . unlinkFromProvider( let provider) :
64+ guard !state. isLoading else { return . none }
65+ state. activeLoadingProvider = provider
6166 return unlinkProviderEffect ( provider)
6267 case . setAlert( let type) :
6368 state. alert = Self . alertState ( for: type)
@@ -67,7 +72,9 @@ struct AccountFeature {
6772 state. disconnectedProviders = AuthProvider . allCases
6873 . filter { !allProviders. contains ( $0) }
6974 case . loading:
70- break
75+ if !state. isLoading {
76+ state. activeLoadingProvider = nil
77+ }
7178 }
7279 return . none
7380 }
Original file line number Diff line number Diff line change @@ -28,24 +28,29 @@ struct AccountView: View {
2828 HStack {
2929 providerContent ( provider)
3030 Spacer ( )
31- Button {
32- if isConnected {
33- store. send ( . unlinkFromProvider( provider) )
34- } else {
35- store. send ( . linkWithProvider( provider) )
36- }
37- } label: {
38- Text ( isConnected
39- ? String ( localized: " account_disconnect " )
40- : String ( localized: " account_connect " ) )
31+ if store. isLoading && store. activeLoadingProvider == provider {
32+ ProgressView ( )
33+ . id ( UUID ( ) )
34+ } else {
35+ Button {
36+ if isConnected {
37+ store. send ( . unlinkFromProvider( provider) )
38+ } else {
39+ store. send ( . linkWithProvider( provider) )
40+ }
41+ } label: {
42+ Text ( isConnected
43+ ? String ( localized: " account_disconnect " )
44+ : String ( localized: " account_connect " ) )
4145 . font ( . caption. weight ( . semibold) )
4246 . foregroundStyle ( . white)
4347 . padding ( . horizontal, 12 )
4448 . padding ( . vertical, 6 )
4549 . background ( isConnected ? Color . red : . blue)
4650 . clipShape ( . capsule)
51+ }
52+ . buttonStyle ( . plain)
4753 }
48- . buttonStyle ( . plain)
4954 }
5055 }
5156 }
@@ -55,11 +60,6 @@ struct AccountView: View {
5560 . navigationTitle ( String ( localized: " nav_account " ) )
5661 . onAppear { store. send ( . onAppear) }
5762 . alert ( $store. scope ( state: \. alert, action: \. alert) )
58- . overlay {
59- if store. isLoading {
60- LoadingView ( )
61- }
62- }
6363 }
6464
6565 private func formattedProviderName( _ provider: AuthProvider ) -> String {
Original file line number Diff line number Diff line change @@ -110,6 +110,7 @@ struct AccountFeatureTests {
110110 }
111111
112112 #expect( driver. isLoading)
113+ #expect( driver. activeLoadingProvider == . github)
113114
114115 linkSpy. resume ( )
115116
@@ -252,6 +253,10 @@ private struct AccountTestDriver {
252253 feature. state. isLoading
253254 }
254255
256+ var activeLoadingProvider : AuthProvider ? {
257+ feature. state. activeLoadingProvider
258+ }
259+
255260 var alert : AlertState < Never > ? {
256261 feature. state. alert
257262 }
You can’t perform that action at this time.
0 commit comments