@@ -16,58 +16,40 @@ struct AccountView: View {
1616 Section ( " 현재 계정 " ) {
1717 HStack {
1818 if let provider = viewModel. state. currentProvider {
19- let formattedProvider = formattedProviderName ( provider)
20- Image ( formattedProvider)
21- . resizable ( )
22- . scaledToFit ( )
23- . frame ( width: UIFont . labelFontSize)
24- Text ( formattedProvider)
19+ providerContent ( provider)
2520 }
2621 }
2722 }
28- Section ( " 연동된 계정 " ) {
29- ForEach ( viewModel. state. connectedProviders, id: \. self) { provider in
23+ Section ( " 소셜 계정 " ) {
24+ let providers = AuthProvider . allCases. filter { $0 != viewModel. state. currentProvider }
25+ ForEach ( providers, id: \. self) { provider in
26+ let isConnected = viewModel. state. connectedProviders. contains ( provider)
3027 HStack {
31- let formattedProvider = formattedProviderName ( provider)
32- Image ( formattedProvider)
33- . resizable ( )
34- . scaledToFit ( )
35- . frame ( width: UIFont . labelFontSize)
36- Text ( formattedProvider)
37- }
38- . swipeActions ( edge: . trailing, allowsFullSwipe: true ) {
39- Button ( role: . destructive, action: {
40- viewModel. send ( . unlinkFromProvider( provider) )
41- } ) {
42- Label ( " 계정 삭제 " , systemImage: " trash " )
28+ providerContent ( provider)
29+ Spacer ( )
30+ Button {
31+ if isConnected {
32+ viewModel. send ( . unlinkFromProvider( provider) )
33+ } else {
34+ viewModel. send ( . linkWithProvider( provider) )
35+ }
36+ } label: {
37+ Text ( isConnected ? " 연결 해제 " : " 연결 " )
38+ . font ( . caption. weight ( . semibold) )
39+ . foregroundStyle ( . white)
40+ . padding ( . horizontal, 12 )
41+ . padding ( . vertical, 6 )
42+ . background ( isConnected ? Color . red : . blue)
43+ . clipShape ( . capsule)
4344 }
45+ . buttonStyle ( . plain)
4446 }
4547 }
4648 }
4749 }
4850 . scrollDisabled ( true )
4951 . listStyle ( . insetGrouped)
5052 . navigationTitle ( " 계정 연동 " )
51- . toolbar {
52- ToolbarItem ( placement: . topBarTrailing) {
53- Menu ( " 새 계정 연동 " , systemImage: " plus " ) {
54- ForEach ( viewModel. state. disconnectedProviders, id: \. self) { provider in
55- Button ( action: {
56- viewModel. send ( . linkWithProvider( provider) )
57- } ) {
58- HStack {
59- let formattedProvider = formattedProviderName ( provider)
60- Image ( formattedProvider)
61- . resizable ( )
62- . scaledToFit ( )
63- . frame ( width: UIFont . systemFontSize, height: UIFont . systemFontSize)
64- Text ( formattedProvider)
65- }
66- }
67- }
68- }
69- }
70- }
7153 . onAppear {
7254 viewModel. send ( . onAppear)
7355 }
@@ -98,4 +80,13 @@ struct AccountView: View {
9880 let providerSuffix = rawValue. dropFirst ( ) . prefix ( while: { $0 != " . " } )
9981 return providerPrefix + providerSuffix
10082 }
83+
84+ @ViewBuilder
85+ private func providerContent( _ provider: AuthProvider ) -> some View {
86+ Image ( formattedProviderName ( provider) )
87+ . resizable ( )
88+ . scaledToFit ( )
89+ . frame ( width: UIFont . labelFontSize)
90+ Text ( formattedProviderName ( provider) )
91+ }
10192}
0 commit comments