// // ProfileView.swift // BeReal // // Created by Javier Cicchelli on 03/12/2022. // Copyright © 2022 Röck+Cöde. All rights reserved. // import DataModels import SwiftUI public struct ProfileView: View { // MARK: Environments @Environment(\.dismiss) private var dismiss // MARK: Properties private let user: User? private let logout: ActionClosure private let stringAdapter = StringAdapter() private let dateAdapter = DateAdapter() // MARK: Initialisers public init( user: User?, logout: @escaping ActionClosure ) { self.user = user self.logout = logout } // MARK: Body public var body: some View { ZStack { ClearBackgroundList { Section { Image.photo .resizable() .scaledToFit() .frame(width: 160) .frame(maxWidth: .infinity) } .listRowBackground(Color.clear) ProfileSection( header: "profile.sections.names.header.text", items: [ .init( key: "profile.sections.names.label.first_name.text", value: stringAdapter(value: user?.profile.firstName) ), .init( key: "profile.sections.names.label.last_name.text", value: stringAdapter(value: user?.profile.lastName) ) ] ) ProfileSection( header: "profile.sections.root_info.header.text", items: [ .init( key: "profile.sections.root_info.label.identifier.text", value: stringAdapter(value: user?.rootFolder.id) ), .init( key: "profile.sections.root_info.label.name.text", value: stringAdapter(value: user?.rootFolder.name) ), .init( key: "profile.sections.root_info.label.last_modified.text", value: dateAdapter(value: user?.rootFolder.lastModifiedAt) ) ] ) Section { Button { logout() } label: { Text( "profile.button.log_out.text", bundle: .module ) .fontWeight(.semibold) .foregroundColor(.primary) .frame(maxWidth: .infinity) } .tint(.orange) .buttonStyle(.borderedProminent) .buttonBorderShape(.roundedRectangle(radius: 8)) .controlSize(.large) } .listRowBackground(Color.clear) } .background(Color.red) VStack { Button { dismiss() } label: { Image.close .resizable() .frame(width: 32, height: 32) .foregroundColor(.secondary) } Spacer() } .frame(maxWidth: .infinity, alignment: .trailing) .padding([.top, .trailing], 24) } } } // MARK: - Images+Constants private extension Image { static let close = Image(systemName: "xmark.circle.fill") static let photo = Image(systemName: "person.crop.circle.fill") } // MARK: - Previews struct ProfileView_Previews: PreviewProvider { static var previews: some View { ProfileView(user: .init( profile: .init( firstName: "Some first name...", lastName: "Some last name..." ), rootFolder: .init( id: "1234567890", name: "Some folder name...", lastModifiedAt: .now ) )) { // closure for logout action. } } }