2023-02-27 05:39:07 +00:00
|
|
|
import Combine
|
2022-12-23 14:28:22 +00:00
|
|
|
import DesignSystem
|
2023-01-12 05:58:04 +00:00
|
|
|
import EmojiText
|
2023-01-17 10:36:01 +00:00
|
|
|
import Env
|
|
|
|
import Models
|
|
|
|
import Network
|
|
|
|
import SwiftUI
|
2022-12-23 14:28:22 +00:00
|
|
|
|
|
|
|
@MainActor
|
2022-12-23 17:47:19 +00:00
|
|
|
public class AccountsListRowViewModel: ObservableObject {
|
2022-12-23 14:28:22 +00:00
|
|
|
var client: Client?
|
2023-01-17 10:36:01 +00:00
|
|
|
|
2022-12-23 14:28:22 +00:00
|
|
|
@Published var account: Account
|
2023-01-25 12:02:28 +00:00
|
|
|
@Published var relationShip: Relationship?
|
2023-01-17 10:36:01 +00:00
|
|
|
|
2023-01-25 12:02:28 +00:00
|
|
|
public init(account: Account, relationShip: Relationship? = nil) {
|
2022-12-23 14:28:22 +00:00
|
|
|
self.account = account
|
|
|
|
self.relationShip = relationShip
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-12-23 17:47:19 +00:00
|
|
|
public struct AccountsListRow: View {
|
2023-02-26 07:59:49 +00:00
|
|
|
@EnvironmentObject private var theme: Theme
|
2022-12-27 09:04:39 +00:00
|
|
|
@EnvironmentObject private var currentAccount: CurrentAccount
|
2023-01-17 14:14:50 +00:00
|
|
|
@EnvironmentObject private var routerPath: RouterPath
|
2022-12-23 14:28:22 +00:00
|
|
|
@EnvironmentObject private var client: Client
|
2023-01-17 10:36:01 +00:00
|
|
|
|
2022-12-23 17:47:19 +00:00
|
|
|
@StateObject var viewModel: AccountsListRowViewModel
|
2023-03-13 12:38:28 +00:00
|
|
|
|
2023-02-26 07:59:49 +00:00
|
|
|
@State private var isEditingRelationshipNote: Bool = false
|
2023-03-13 12:38:28 +00:00
|
|
|
|
2023-01-25 12:02:28 +00:00
|
|
|
let isFollowRequest: Bool
|
|
|
|
let requestUpdated: (() -> Void)?
|
2023-01-17 10:36:01 +00:00
|
|
|
|
2023-01-25 12:02:28 +00:00
|
|
|
public init(viewModel: AccountsListRowViewModel, isFollowRequest: Bool = false, requestUpdated: (() -> Void)? = nil) {
|
2022-12-23 17:47:19 +00:00
|
|
|
_viewModel = StateObject(wrappedValue: viewModel)
|
2023-01-25 12:02:28 +00:00
|
|
|
self.isFollowRequest = isFollowRequest
|
|
|
|
self.requestUpdated = requestUpdated
|
2022-12-23 17:47:19 +00:00
|
|
|
}
|
2023-01-17 10:36:01 +00:00
|
|
|
|
2022-12-23 17:47:19 +00:00
|
|
|
public var body: some View {
|
2023-02-24 16:16:39 +00:00
|
|
|
HStack(alignment: .top) {
|
2022-12-23 14:28:22 +00:00
|
|
|
AvatarView(url: viewModel.account.avatar, size: .status)
|
|
|
|
VStack(alignment: .leading, spacing: 2) {
|
2023-01-20 17:27:00 +00:00
|
|
|
EmojiTextApp(.init(stringValue: viewModel.account.safeDisplayName), emojis: viewModel.account.emojis)
|
2023-01-17 18:41:46 +00:00
|
|
|
.font(.scaledSubheadline)
|
2023-03-06 14:21:26 +00:00
|
|
|
.emojiSize(Font.scaledSubheadlineFont.emojiSize)
|
|
|
|
.emojiBaselineOffset(Font.scaledSubheadlineFont.emojiBaselineOffset)
|
2022-12-23 14:28:22 +00:00
|
|
|
.fontWeight(.semibold)
|
|
|
|
Text("@\(viewModel.account.acct)")
|
2023-01-17 18:41:46 +00:00
|
|
|
.font(.scaledFootnote)
|
2022-12-23 14:28:22 +00:00
|
|
|
.foregroundColor(.gray)
|
2023-06-26 13:54:56 +00:00
|
|
|
|
|
|
|
// First parameter is the number for the plural
|
|
|
|
// Second parameter is the formatted string to show
|
|
|
|
Text("account.label.followers \(viewModel.account.followersCount) \(viewModel.account.followersCount, format: .number.notation(.compactName))")
|
2023-01-17 18:41:46 +00:00
|
|
|
.font(.scaledFootnote)
|
2023-06-26 13:54:56 +00:00
|
|
|
|
|
|
|
if let field = viewModel.account.fields.filter({ $0.verifiedAt != nil }).first {
|
|
|
|
HStack(spacing: 2) {
|
|
|
|
Image(systemName: "checkmark.seal")
|
|
|
|
.font(.scaledFootnote)
|
|
|
|
.foregroundColor(.green)
|
|
|
|
|
|
|
|
EmojiTextApp(field.value, emojis: viewModel.account.emojis)
|
|
|
|
.font(.scaledFootnote)
|
|
|
|
.emojiSize(Font.scaledFootnoteFont.emojiSize)
|
|
|
|
.emojiBaselineOffset(Font.scaledFootnoteFont.emojiBaselineOffset)
|
|
|
|
.environment(\.openURL, OpenURLAction { url in
|
|
|
|
routerPath.handle(url: url)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
EmojiTextApp(viewModel.account.note, emojis: viewModel.account.emojis, lineLimit: 2)
|
|
|
|
.font(.scaledCaption)
|
2023-03-06 14:21:26 +00:00
|
|
|
.emojiSize(Font.scaledFootnoteFont.emojiSize)
|
|
|
|
.emojiBaselineOffset(Font.scaledFootnoteFont.emojiBaselineOffset)
|
2022-12-23 14:28:22 +00:00
|
|
|
.environment(\.openURL, OpenURLAction { url in
|
2023-01-17 14:14:50 +00:00
|
|
|
routerPath.handle(url: url)
|
2022-12-23 14:28:22 +00:00
|
|
|
})
|
2023-04-08 11:31:43 +00:00
|
|
|
|
2023-01-25 12:02:28 +00:00
|
|
|
if isFollowRequest {
|
|
|
|
FollowRequestButtons(account: viewModel.account,
|
|
|
|
requestUpdated: requestUpdated)
|
|
|
|
}
|
2022-12-23 14:28:22 +00:00
|
|
|
}
|
|
|
|
Spacer()
|
2023-01-25 12:02:28 +00:00
|
|
|
if currentAccount.account?.id != viewModel.account.id,
|
|
|
|
let relationShip = viewModel.relationShip
|
|
|
|
{
|
2023-02-24 07:42:24 +00:00
|
|
|
VStack(alignment: .center) {
|
2023-02-26 05:45:57 +00:00
|
|
|
FollowButton(viewModel: .init(accountId: viewModel.account.id,
|
|
|
|
relationship: relationShip,
|
|
|
|
shouldDisplayNotify: false,
|
|
|
|
relationshipUpdated: { _ in }))
|
2023-02-24 07:42:24 +00:00
|
|
|
}
|
2022-12-27 09:04:39 +00:00
|
|
|
}
|
2022-12-23 14:28:22 +00:00
|
|
|
}
|
|
|
|
.onAppear {
|
|
|
|
viewModel.client = client
|
|
|
|
}
|
2022-12-26 07:47:41 +00:00
|
|
|
.contentShape(Rectangle())
|
2022-12-23 14:28:22 +00:00
|
|
|
.onTapGesture {
|
2023-01-17 14:14:50 +00:00
|
|
|
routerPath.navigate(to: .accountDetailWithAccount(account: viewModel.account))
|
2022-12-23 14:28:22 +00:00
|
|
|
}
|
2023-02-26 07:59:49 +00:00
|
|
|
.contextMenu {
|
|
|
|
AccountDetailContextMenu(viewModel: .init(account: viewModel.account))
|
|
|
|
} preview: {
|
|
|
|
List {
|
|
|
|
AccountDetailHeaderView(viewModel: .init(account: viewModel.account),
|
|
|
|
account: viewModel.account,
|
|
|
|
scrollViewProxy: nil)
|
2023-03-13 12:38:28 +00:00
|
|
|
.applyAccountDetailsRowStyle(theme: theme)
|
2023-02-26 07:59:49 +00:00
|
|
|
}
|
|
|
|
.listStyle(.plain)
|
|
|
|
.scrollContentBackground(.hidden)
|
|
|
|
.background(theme.primaryBackgroundColor)
|
|
|
|
.environmentObject(theme)
|
|
|
|
.environmentObject(currentAccount)
|
|
|
|
.environmentObject(client)
|
|
|
|
}
|
2022-12-23 14:28:22 +00:00
|
|
|
}
|
|
|
|
}
|