150 lines
4.4 KiB
Swift
Raw Normal View History

//
// ProfileView.swift
// Profile
//
// Created by Javier Cicchelli on 03/12/2022.
// Copyright © 2022 Röck+Cöde. All rights reserved.
//
import DataModels
import KeychainStorage
import SwiftUI
public struct ProfileView: View {
// MARK: Environments
@Environment(\.dismiss) private var dismiss
// MARK: Storages
@KeychainStorage(key: .KeychainStorage.account) var account: Account?
// 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 {
DismissableView {
ClearBackgroundList {
Section {
Image.photo
.resizable()
.scaledToFit()
.frame(width: 160)
.frame(maxWidth: .infinity)
}
.listRowBackground(Color.clear)
Group {
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)
)
]
)
}
.listRowBackground(Color.secondary.colorInvert())
Section {
Button {
Task { await logUserOut() }
} label: {
Text(
"profile.button.log_out.text",
bundle: .module
)
.font(.body)
.fontWeight(.semibold)
.frame(maxWidth: .infinity)
}
.tint(.red)
.controlSize(.large)
.buttonStyle(.borderedProminent)
.buttonBorderShape(.roundedRectangle(radius: 8))
}
.listRowBackground(Color.clear)
}
.background(Color.primary.colorInvert())
}
}
}
// MARK: - Helpers
private extension ProfileView {
func logUserOut() async {
account = nil
logout()
}
}
// MARK: - Images+Constants
private extension Image {
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.
}
}
}