element-ios/RiotSwiftUI/Modules/UserSessions/Common/View/DeviceAvatarView.swift

84 lines
3.1 KiB
Swift
Raw Normal View History

2022-09-05 08:40:03 +00:00
//
// Copyright 2022 New Vector Ltd
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
import DesignKit
2022-09-27 07:17:22 +00:00
import SwiftUI
2022-09-05 08:40:03 +00:00
/// Avatar view for device
struct DeviceAvatarView: View {
@Environment(\.theme) var theme: ThemeSwiftUI
var viewData: DeviceAvatarViewData
var avatarSize: CGFloat = 40
var badgeSize: CGFloat = 24
2022-09-05 08:40:03 +00:00
var body: some View {
2022-09-07 09:09:22 +00:00
ZStack(alignment: .bottomTrailing) {
// Device image
VStack(alignment: .center) {
viewData.deviceType.image
2022-09-05 08:40:03 +00:00
}
2022-09-07 09:09:22 +00:00
.padding()
2022-09-05 08:40:03 +00:00
.frame(maxWidth: CGFloat(avatarSize), maxHeight: CGFloat(avatarSize))
.background(theme.colors.system)
.clipShape(Circle())
2022-09-07 09:09:22 +00:00
// Verification badge
2022-09-05 08:40:03 +00:00
if let isVerified = viewData.isVerified {
2022-09-07 09:09:22 +00:00
Image(isVerified ? Asset.Images.userSessionVerified.name : Asset.Images.userSessionUnverified.name)
.frame(maxWidth: CGFloat(badgeSize), maxHeight: CGFloat(badgeSize))
.shapedBorder(color: theme.colors.system, borderWidth: 1, shape: Circle())
.background(theme.colors.background)
.clipShape(Circle())
.offset(x: 10, y: 8)
2022-09-05 08:40:03 +00:00
}
}
.frame(maxWidth: CGFloat(avatarSize), maxHeight: CGFloat(avatarSize))
}
}
struct DeviceAvatarViewListPreview: View {
var viewDataList: [DeviceAvatarViewData] {
2022-09-27 07:17:22 +00:00
[
2022-09-05 08:40:03 +00:00
DeviceAvatarViewData(deviceType: .desktop, isVerified: true),
DeviceAvatarViewData(deviceType: .web, isVerified: true),
DeviceAvatarViewData(deviceType: .mobile, isVerified: true),
DeviceAvatarViewData(deviceType: .unknown, isVerified: true)
]
}
var body: some View {
HStack {
VStack(alignment: .center, spacing: 20) {
2022-09-27 07:17:22 +00:00
DeviceAvatarView(viewData: DeviceAvatarViewData(deviceType: .web, isVerified: true))
2022-09-05 08:40:03 +00:00
DeviceAvatarView(viewData: DeviceAvatarViewData(deviceType: .desktop, isVerified: false))
DeviceAvatarView(viewData: DeviceAvatarViewData(deviceType: .mobile, isVerified: true))
DeviceAvatarView(viewData: DeviceAvatarViewData(deviceType: .unknown, isVerified: false))
}
}
}
}
struct DeviceAvatarView_Previews: PreviewProvider {
static var previews: some View {
Group {
DeviceAvatarViewListPreview().theme(.light).preferredColorScheme(.light)
DeviceAvatarViewListPreview().theme(.dark).preferredColorScheme(.dark)
}
}
}