IceCubesApp/Packages/AppAccount/Sources/AppAccount/AppAccountView.swift
Thomas Ricouard 4189a59cf6
iOS 17+ only support + migrating to Observation framework (#1571)
* Initial iOS 17 + Observable migration

* More Observation

* More observation

* Checkpoint

* Checkpoint

* Bump version to 1.8.0

* SwiftFormat

* Fix home timeline switch on login

* Fix sidebar routerPath

* Fixes on detail view

* Remove print changes

* Simply detail view

* More opt

* Migrate DisplaySettingsLocalValues

* Better post detail transition

* Status detail animation finally right

* Cleanup
2023-09-18 07:01:23 +02:00

111 lines
3.4 KiB
Swift

import DesignSystem
import EmojiText
import Env
import SwiftUI
public struct AppAccountView: View {
@EnvironmentObject private var theme: Theme
@Environment(RouterPath.self) private var routerPath
@Environment(AppAccountsManager.self) private var appAccounts
@EnvironmentObject private var preferences: UserPreferences
@State var viewModel: AppAccountViewModel
public init(viewModel: AppAccountViewModel) {
self.viewModel = viewModel
}
public var body: some View {
Group {
if viewModel.isCompact {
compactView
} else {
fullView
}
}
.onAppear {
Task {
await viewModel.fetchAccount()
}
}
}
@ViewBuilder
private var compactView: some View {
HStack {
if let account = viewModel.account {
AvatarView(url: account.avatar)
} else {
ProgressView()
}
}
}
private var fullView: some View {
Button {
if appAccounts.currentAccount.id == viewModel.appAccount.id,
let account = viewModel.account
{
routerPath.navigate(to: .accountSettingsWithAccount(account: account, appAccount: viewModel.appAccount))
HapticManager.shared.fireHaptic(of: .buttonPress)
} else {
var transation = Transaction()
transation.disablesAnimations = true
withTransaction(transation) {
appAccounts.currentAccount = viewModel.appAccount
HapticManager.shared.fireHaptic(of: .notification(.success))
}
}
} label: {
HStack {
if let account = viewModel.account {
ZStack(alignment: .topTrailing) {
AvatarView(url: account.avatar)
if viewModel.appAccount.id == appAccounts.currentAccount.id {
Image(systemName: "checkmark.circle.fill")
.foregroundStyle(.white, .green)
.offset(x: 5, y: -5)
} else if viewModel.showBadge,
let token = viewModel.appAccount.oauthToken,
preferences.getNotificationsCount(for: token) > 0
{
let notificationsCount = preferences.getNotificationsCount(for: token)
ZStack {
Circle()
.fill(.red)
Text(notificationsCount > 99 ? "99+" : String(notificationsCount))
.foregroundColor(.white)
.font(.system(size: 9))
}
.frame(width: 20, height: 20)
.offset(x: 5, y: -5)
}
}
} else {
ProgressView()
Text(viewModel.appAccount.accountName ?? viewModel.acct)
.font(.scaledSubheadline)
.foregroundColor(.gray)
.padding(.leading, 6)
}
VStack(alignment: .leading) {
if let account = viewModel.account {
EmojiTextApp(.init(stringValue: account.safeDisplayName), emojis: account.emojis)
.foregroundColor(theme.labelColor)
Text("\(account.username)@\(viewModel.appAccount.server)")
.font(.scaledSubheadline)
.emojiSize(Font.scaledSubheadlineFont.emojiSize)
.emojiBaselineOffset(Font.scaledSubheadlineFont.emojiBaselineOffset)
.foregroundColor(.gray)
}
}
if viewModel.isInNavigation {
Spacer()
Image(systemName: "chevron.right")
.foregroundColor(.gray)
}
}
}
}
}