Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions DevLog/Resource/Localizable.xcstrings
Original file line number Diff line number Diff line change
Expand Up @@ -266,9 +266,6 @@
},
"검색어를 입력해 저장한 앱 컨텐츠를 찾아보세요." : {

},
"계정 삭제" : {

},
"계정 연동" : {

Expand Down Expand Up @@ -323,9 +320,6 @@
},
"상태 설정" : {

},
"새 계정 연동" : {

},
"생성일" : {

Expand All @@ -338,6 +332,9 @@
},
"설정에서의 푸시 알람 설정과 별개입니다." : {

},
"소셜 계정" : {

},
"수정" : {

Expand All @@ -351,10 +348,13 @@
"알림" : {

},
"연도" : {
"연결" : {

},
"연동된 계정" : {
"연결 해제" : {

},
"연도" : {

},
"오늘" : {
Expand Down
71 changes: 31 additions & 40 deletions DevLog/UI/Setting/AccountView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,58 +16,40 @@ struct AccountView: View {
Section("현재 계정") {
HStack {
if let provider = viewModel.state.currentProvider {
let formattedProvider = formattedProviderName(provider)
Image(formattedProvider)
.resizable()
.scaledToFit()
.frame(width: UIFont.labelFontSize)
Text(formattedProvider)
providerContent(provider)
}
}
}
Section("연동된 계정") {
ForEach(viewModel.state.connectedProviders, id: \.self) { provider in
Section("소셜 계정") {
let providers = AuthProvider.allCases.filter { $0 != viewModel.state.currentProvider }
ForEach(providers, id: \.self) { provider in
let isConnected = viewModel.state.connectedProviders.contains(provider)
HStack {
let formattedProvider = formattedProviderName(provider)
Image(formattedProvider)
.resizable()
.scaledToFit()
.frame(width: UIFont.labelFontSize)
Text(formattedProvider)
}
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
Button(role: .destructive, action: {
viewModel.send(.unlinkFromProvider(provider))
}) {
Label("계정 삭제", systemImage: "trash")
providerContent(provider)
Spacer()
Button {
if isConnected {
viewModel.send(.unlinkFromProvider(provider))
} else {
viewModel.send(.linkWithProvider(provider))
}
} label: {
Text(isConnected ? "연결 해제" : "연결")
.font(.caption.weight(.semibold))
.foregroundStyle(.white)
.padding(.horizontal, 12)
.padding(.vertical, 6)
.background(isConnected ? Color.red : .blue)
.clipShape(.capsule)
}
.buttonStyle(.plain)
}
}
}
}
.scrollDisabled(true)
.listStyle(.insetGrouped)
.navigationTitle("계정 연동")
.toolbar {
ToolbarItem(placement: .topBarTrailing) {
Menu("새 계정 연동", systemImage: "plus") {
ForEach(viewModel.state.disconnectedProviders, id: \.self) { provider in
Button(action: {
viewModel.send(.linkWithProvider(provider))
}) {
HStack {
let formattedProvider = formattedProviderName(provider)
Image(formattedProvider)
.resizable()
.scaledToFit()
.frame(width: UIFont.systemFontSize, height: UIFont.systemFontSize)
Text(formattedProvider)
}
}
}
}
}
}
.onAppear {
viewModel.send(.onAppear)
}
Expand Down Expand Up @@ -98,4 +80,13 @@ struct AccountView: View {
let providerSuffix = rawValue.dropFirst().prefix(while: { $0 != "." })
return providerPrefix + providerSuffix
}

@ViewBuilder
private func providerContent(_ provider: AuthProvider) -> some View {
Image(formattedProviderName(provider))
.resizable()
.scaledToFit()
.frame(width: UIFont.labelFontSize)
Text(formattedProviderName(provider))
Comment on lines +86 to +90
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

providerContent 함수 내에서 formattedProviderName(provider)가 두 번 호출되고 있습니다. 불필요한 중복 호출을 피하고 가독성을 높이기 위해, 결과를 한 번만 호출하여 지역 변수에 저장한 뒤 사용하는 것을 권장합니다.

        let name = formattedProviderName(provider)
        Image(name)
            .resizable()
            .scaledToFit()
            .frame(width: UIFont.labelFontSize)
        Text(name)

}
}