jellyflood/Swiftfin/Components/SettingsBarButton.swift

62 lines
2.0 KiB
Swift

//
// Swiftfin is subject to the terms of the Mozilla Public
// License, v2.0. If a copy of the MPL was not distributed with this
// file, you can obtain one at https://mozilla.org/MPL/2.0/.
//
// Copyright (c) 2024 Jellyfin & Jellyfin Contributors
//
import Factory
import SwiftUI
// Want the default navigation bar `Image(systemName:)` styling
// but using within `ImageView.placeholder/failure` ruins it.
// Need to do manual checking of image loading.
struct SettingsBarButton: View {
@State
private var isUserImage = false
let server: ServerState
let user: UserState
let action: () -> Void
var body: some View {
Button {
action()
} label: {
Image(systemName: "gearshape.fill")
.visible(!isUserImage)
.overlay {
ZStack {
Color.clear
RedrawOnNotificationView(.didChangeUserProfileImage) {
ImageView(user.profileImageSource(
client: server.client,
maxWidth: 120
))
.pipeline(.Swiftfin.branding)
.image { image in
image
.posterBorder(ratio: 1 / 2, of: \.width)
.onAppear {
isUserImage = true
}
}
.placeholder { _ in
Color.clear
}
.onDisappear {
isUserImage = false
}
}
}
.aspectRatio(contentMode: .fill)
.clipShape(.circle)
}
}
.accessibilityLabel(L10n.settings)
}
}