yattee/Shared/Navigation/AccountsView.swift
2023-04-22 23:39:43 +02:00

116 lines
3.2 KiB
Swift

import SwiftUI
struct AccountsView: View {
@StateObject private var model = AccountsViewModel()
@Environment(\.presentationMode) private var presentationMode
var body: some View {
#if os(macOS)
VStack(alignment: .leading) {
closeButton
.padding([.leading, .top])
list
}
.frame(minWidth: 500, maxWidth: 800, minHeight: 700, maxHeight: 1200)
#else
NavigationView {
list
#if os(iOS)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
closeButton
}
}
#endif
.navigationTitle("Accounts")
}
#if os(tvOS)
.frame(maxWidth: 1000)
#endif
#endif
}
var list: some View {
List {
if !model.accounts.isEmpty {
Section(header: Text("Your Accounts")) {
ForEach(model.sortedAccounts) { account in
accountButton(account)
}
}
}
if !model.instances.isEmpty {
Section(header: Text("Browse without account")) {
ForEach(model.instances) { instance in
accountButton(instance.anonymousAccount)
}
}
}
if let account = model.publicAccount {
Section(header: Text("Public account")) {
accountButton(account)
}
}
}
}
func accountButton(_ account: Account) -> some View {
Button {
presentationMode.wrappedValue.dismiss()
AccountsModel.shared.setCurrent(account)
} label: {
HStack {
instanceImage(account.instance)
if !account.anonymous {
Text(account.description)
}
Text((account.anonymous ? "" : "@ ") + account.urlHost)
.lineLimit(1)
.truncationMode(.head)
.foregroundColor(account.anonymous ? .primary : .secondary)
Spacer()
Image(systemName: "checkmark")
.foregroundColor(.accentColor)
.opacity(account == model.currentAccount ? 1 : 0)
}
.contentShape(Rectangle())
}
.buttonStyle(.plain)
#if os(tvOS)
.padding(.horizontal, 50)
#endif
}
var closeButton: some View {
Button(action: { presentationMode.wrappedValue.dismiss() }) {
Label("Done", systemImage: "xmark")
}
#if os(macOS)
.labelStyle(.titleOnly)
#endif
#if !os(tvOS)
.keyboardShortcut(.cancelAction)
#endif
}
func instanceImage(_ instance: Instance) -> some View {
Image(instance.app.rawValue.capitalized)
.resizable()
.frame(width: 30, height: 30)
}
}
struct AccountsView_Previews: PreviewProvider {
static var previews: some View {
AccountsView()
}
}