92 lines
3.5 KiB
Swift
92 lines
3.5 KiB
Swift
//
|
|
// https://mczachurski.dev
|
|
// Copyright © 2023 Marcin Czachurski and the repository contributors.
|
|
// Licensed under the Apache License 2.0.
|
|
//
|
|
|
|
import Foundation
|
|
import SwiftUI
|
|
import NukeUI
|
|
import EnvironmentKit
|
|
|
|
public struct ImageAvatar: View {
|
|
@Environment(ApplicationState.self) var applicationState
|
|
|
|
private let displayName: String?
|
|
private let avatarUrl: URL?
|
|
private let rebloggedAccountDisplayName: String?
|
|
private let rebloggedAccountAvatar: URL?
|
|
private let onTap: (Bool) -> Void
|
|
|
|
public init(displayName: String?, avatarUrl: URL?, rebloggedAccountDisplayName: String?, rebloggedAccountAvatar: URL?, onTap: @escaping (Bool) -> Void) {
|
|
self.displayName = displayName
|
|
self.avatarUrl = avatarUrl
|
|
self.rebloggedAccountAvatar = rebloggedAccountAvatar
|
|
self.rebloggedAccountDisplayName = rebloggedAccountDisplayName
|
|
self.onTap = onTap
|
|
}
|
|
|
|
public var body: some View {
|
|
if self.applicationState.showAvatarsOnTimeline {
|
|
VStack(alignment: .leading, spacing: 0){
|
|
HStack(alignment: .center, spacing: 0) {
|
|
HStack(alignment: .center, spacing: 4) {
|
|
UserAvatar(accountAvatar: avatarUrl, size: .mini)
|
|
Text(displayName ?? "")
|
|
.fontWeight(.semibold)
|
|
.lineLimit(1)
|
|
.padding(.trailing, 8)
|
|
}
|
|
.font(.footnote)
|
|
.foregroundColor(.white.opacity(0.8))
|
|
.background(.black.opacity(0.6))
|
|
.clipShape(Capsule())
|
|
.padding(.leading, 8)
|
|
.padding(.top, 8)
|
|
.onTapGesture {
|
|
self.onTap(true)
|
|
}
|
|
|
|
if let rebloggedAccountAvatar = self.rebloggedAccountAvatar,
|
|
let rebloggedAccountDisplayName = self.rebloggedAccountDisplayName {
|
|
HStack(alignment: .center, spacing: 4) {
|
|
UserAvatar(accountAvatar: rebloggedAccountAvatar, size: .mini)
|
|
Text(rebloggedAccountDisplayName)
|
|
.lineLimit(1)
|
|
Image("custom.rocket")
|
|
.padding(.trailing, 8)
|
|
}
|
|
.font(.footnote)
|
|
.foregroundColor(.white.opacity(0.8))
|
|
.background(.black.opacity(0.6))
|
|
.clipShape(Capsule())
|
|
.padding(.leading, 8)
|
|
.padding(.top, 8)
|
|
.onTapGesture {
|
|
self.onTap(false)
|
|
}
|
|
}
|
|
Spacer()
|
|
}
|
|
Spacer()
|
|
}
|
|
.padding(.trailing, 58)
|
|
}
|
|
}
|
|
|
|
@ViewBuilder
|
|
private func buildAvatar(image: Image? = nil) -> some View {
|
|
(image ?? Image("Avatar"))
|
|
.resizable()
|
|
.clipShape(applicationState.avatarShape.shape())
|
|
.aspectRatio(contentMode: .fit)
|
|
.frame(width: 24, height: 24)
|
|
.overlay(
|
|
applicationState.avatarShape.shape()
|
|
.stroke(Color.white.opacity(0.6), lineWidth: 1)
|
|
.frame(width: 24, height: 24)
|
|
)
|
|
.shadow(color: .black, radius: 2)
|
|
}
|
|
}
|